Translated message

A translation of this page exists in English.

registry.redhat.io での認証問題のトラブルシューティング

更新 -

Red Hat でサポートされているコンテナーイメージは、既存の Red Hat レジストリー (registry.access.redhat.com) から新しいレジストリー (registry.redhat.io) に移動しています。この移行に伴い、コンテナーイメージをプルするのに必要な認証に変更が生じます。この記事では、認証の問題をトラブルシューティングする方法について説明します。

レジストリーアクセストークンの設定の詳細は、Red Hat Container Registry Authentication を参照してください。

サービスアカウントトークンログインを作成するには、Registry Service Accounts を参照してください。

認証のテスト

基本的なユーザー認証のテストは、次のコマンドで実行できます。

curl -Lv -u <username>:<password> "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull"

ここで、<username> および <password> は、Red Hat カスタマーポータルへのログインに通常使用するクレデンシャルです。<password> は省略でき、curl はインタラクティブにそれを要求します。

ユーザーが作成したトークンを使用した基本認証のテストは、次のコマンドで実行できます。

# curl -u $TOKENID:$SECRET "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull"

ここでは、以下のようになります。

  • $TOKENID は、カスタマーポータルのトークン管理インターフェイスに表示されるトークン名を含むシェル変数です。 これは、<account_number>|<name> の形式になります。 <name> は Red Hat アカウント番号であり、 はトークンに付けた名前です。
  • $SECRET は、非常に長いトークン値を含むシェル変数です。

認証が成功すると HTTP 200 OK となり、次のような JSON オブジェクトが生成されます。

{"token":"<access_token>","access_token":"<access_token>","expires_in":300,"issued_at":"2018-08-13T21:28:03Z"}

ここで、<access_token> は非常に長いアクセストークン値です。

次の HTTP 401 Unauthorized エラーは、間違ったクレデンシャルを使用してレジストリーにログインしようとしている可能性があることを示しています。

{"errors":[{"code":"UNAUTHORIZED","message":"Invalid username or password","detail":[{"type":"repository","name":"rhel","actions":["pull"]}]}]}

ユーザークレデンシャルを使用している場合は、Red Hat カスタマーポータル への新規ログインを試みて、ユーザークレデンシャルが正しいことを確認してください。トークンを使用する場合は、正しい ID とトークン値が設定されていることを確認してください。シークレット値を curl のインタラクティブなパスワードプロンプトに貼り付けようとすると、正しく入力されない場合があります。200 OK および 401 Unauthorized 以外のエラーまたは応答は、ファイアウォール、プロキシー、またはその他の一般的なネットワーク接続の問題などのネットワークの問題を示している可能性があります。

プロキシー/ファイアウォール

一部のシステムでは、インターネットにアクセスするために Web (HTTP/HTTPS) プロキシーを利用する必要があるか、すでに設定されている場合があります。

システムで外部サイト (registry.redhat.io など) にアクセスするために Web プロキシーを使用する必要がある場合は、次のことを確認してください。

  1. registry.redhat.io および sso.redhat.com は、プロキシーまたはネットワークファイアウォール、もしくはその両方によってホワイトリストに登録されている。
  2. システム全体のプロキシー設定 を使用するか プロキシーを使用するように Docker を直接設定 する。

プロキシー設定がシステム全体で設定されていると、docker、skopeo (atomic、podman、および buildah で使用)、および curl はこれらの設定を自動的に使用します。 それ以外の場合は、テストの目的で、テストコマンドに --proxy <proxy_address>:<proxy_port> を追加して、プロキシーを使用するように curl に明示的に指示する必要があります。 curl がプロキシーを使用していることを確認するには、出力で次を探すことができます。

* About to connect() to proxy proxy.example.com port 8080 (#0)
*   Trying 192.168.2.100...
* Connected to proxy.example.com (192.168.2.100) port 8080 (#0)
* Establish HTTP proxy tunnel to sso.redhat.com:443
> CONNECT registry.redhat.io:443 HTTP/1.1
> Host: registry.redhat.io:443
> User-Agent: curl/7.29.0
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 Connection established

curl がプロキシーへの接続に失敗するか、redhat.com へのトンネリングに失敗する場合は、プロキシーに問題があることを示している可能性があります。 使用中のプロキシーがないのにもかかわらず curl が sso.redhat.com に接続できない場合は、システムまたはネットワークにファイアウォールがあり、アクセスをアクティブにブロックしている可能性があります。 いずれの場合も、最初にネットワークチームに確認して、接続が許可されていることを確認してください。

レジストリー認証アクセストークンを使用して、レジストリーへの接続テスト

認証が成功すると、アクセストークンを使用してレジストリー自体への接続をテストできます。これは、ユーザーが生成した認証トークン を使用して コンテナーレジストリーアクセストークン を取得する例です。

curl -Lv -u $TOKENID:$SECRET "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" | python2 -m json.tool

SSO サーバーからの応答は次のようになります。

{
    "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwiandrIjogeyJrdHkiOiJSU0EiLCJhbGciOiJSUzI1NiIsInVzZSI6InNpZyIsIm4iOiIwZjd1Rk5CWW1wbE52S1ZES1I3cUtQVkZoWmg5ZllPQ1JkeWxxSi1jM0xSaEhXUGFDOU1ucjR6eUVXY25zaUxuTFcydmVicDFBTWpNWlVNMXhNeWQ4Z0pVdmE2YjgxUXlTcWpndDl5aWNhem5fZkY0M2VHcnNkYm5xZFpsQmYxUUl5LWhsd3hvdTNXUzhVVkJha3E4dHFCdDlISGc3VFRONFR1VHl2c18tODhFT3hZNklWeTI4Y3RxTTE2VzBXQmxFdU1yd1BPdGRXVGtEUkNjUzV0ZDhBa0Y4RlpMWV9nQ2M0WG5oVTI1Nnd3Y25MTUpGcGdaZjNMZ0k1NEJIMkR6LWVnSUc1RDNmQ0NLX0FOU1llNGZuZDRoM2hEQjBCWndhdzlYM0VyZkJHZjdGX0FQMlpnN1lKcUNhS0d0RGExNzBjb2J6MGxyRTI5Mjljd2p5dm9HbElfd2syWXlPMzJiZ3prZUJ4NndxVk4tNVFmV0syUjF5MFJFaWJGc3c2dGhQQkg5Q3lMR2I4VjdPdUdZZ0JIWkw3Q09ZdF9WdWZCRHRmMzlFamZOZ3FpdFZFelRQcWtWdldYQ1NOb2xUakk1RnJ3Wkh4VVJDQkpmUldYb3BKeE16Q3VDblMzM2ZSUG5FSm53WG84anZfTFA2NEhNcE93X0x5dEhKM0puZ1p0a3dtVzJ1TnM5c3pDOFcyUDNfOWFXWVhTMGl4YUlrMU5oSnBWZmRPeGlOb3lVSmhZYXl0THZKT2xSamgwZ3FtNm1UaFZXM3dkUzV1Qzh4TnB0LTE1b1BscWpHWEFfZXNRdENaendZdE5lUXdsTUJqOG1OTDNOMXB2bnZYd0NGTG1DOWpDcVRhNGhGdlpBUVU1c0RYM1VxU1JJZW1ZWk1iSEJpaXVsNnpLdXVXcyIsImUiOiJBUUFCIn19.eyJqdGkiOiJkNTc1MWE1NC02MTFkLTQyYzYtODIzNi03NzQ5NjE3ZjU1NTciLCJleHAiOjE1MzQxOTMwOTEsIm5iZiI6MTUzNDE5Mjc5MSwiaWF0IjoxNTM0MTkyNzkxLCJpc3MiOiJodHRwczovL3Nzby5zdGFnZS5yZWRoYXQuY29tL2F1dGgvcmVhbG1zL3JoY2MiLCJhdWQiOiJkb2NrZXItcmVnaXN0cnkiLCJzdWIiOiJ0ZXN0dXNlciIsInR5cCI6IkJlYXJlciIsImF6cCI6ImRvY2tlci1yZWdpc3RyeSIsImFjY2VzcyI6W119.wS0ytJ5ov0HB72Av8PwK74Ntwa6bDKFT_wqTbTVdYb_GOYSwE8WtQOECBavuKXLWfb3_mqhh7qroXHdDMMZhsqjgs8dNSD-mg2vv",
    "expires_in": 300,
    "issued_at": "2018-08-13T20:32:49Z",
    "token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwiandrIjogeyJrdHkiOiJSU0EiLCJhbGciOiJSUzI1NiIsInVzZSI6InNpZyIsIm4iOiIwZjd1Rk5CWW1wbE52S1ZES1I3cUtQVkZoWmg5ZllPQ1JkeWxxSi1jM0xSaEhXUGFDOU1ucjR6eUVXY25zaUxuTFcydmVicDFBTWpNWlVNMXhNeWQ4Z0pVdmE2YjgxUXlTcWpndDl5aWNhem5fZkY0M2VHcnNkYm5xZFpsQmYxUUl5LWhsd3hvdTNXUzhVVkJha3E4dHFCdDlISGc3VFRONFR1VHl2c18tODhFT3hZNklWeTI4Y3RxTTE2VzBXQmxFdU1yd1BPdGRXVGtEUkNjUzV0ZDhBa0Y4RlpMWV9nQ2M0WG5oVTI1Nnd3Y25MTUpGcGdaZjNMZ0k1NEJIMkR6LWVnSUc1RDNmQ0NLX0FOU1llNGZuZDRoM2hEQjBCWndhdzlYM0VyZkJHZjdGX0FQMlpnN1lKcUNhS0d0RGExNzBjb2J6MGxyRTI5Mjljd2p5dm9HbElfd2syWXlPMzJiZ3prZUJ4NndxVk4tNVFmV0syUjF5MFJFaWJGc3c2dGhQQkg5Q3lMR2I4VjdPdUdZZ0JIWkw3Q09ZdF9WdWZCRHRmMzlFamZOZ3FpdFZFelRQcWtWdldYQ1NOb2xUakk1RnJ3Wkh4VVJDQkpmUldYb3BKeE16Q3VDblMzM2ZSUG5FSm53WG84anZfTFA2NEhNcE93X0x5dEhKM0puZ1p0a3dtVzJ1TnM5c3pDOFcyUDNfOWFXWVhTMGl4YUlrMU5oSnBWZmRPeGlOb3lVSmhZYXl0THZKT2xSamgwZ3FtNm1UaFZXM3dkUzV1Qzh4TnB0LTE1b1BscWpHWEFfZXNRdENaendZdE5lUXdsTUJqOG1OTDNOMXB2bnZYd0NGTG1DOWpDcVRhNGhGdlpBUVU1c0RYM1VxU1JJZW1ZWk1iSEJpaXVsNnpLdXVXcyIsImUiOiJBUUFCIn19.eyJqdGkiOiJkNTc1MWE1NC02MTFkLTQyYzYtODIzNi03NzQ5NjE3ZjU1NTciLCJleHAiOjE1MzQxOTMwOTEsIm5iZiI6MTUzNDE5Mjc5MSwiaWF0IjoxNTM0MTkyNzkxLCJpc3MiOiJodHRwczovL3Nzby5zdGFnZS5yZWRoYXQuY29tL2F1dGgvcmVhbG1zL3JoY2MiLCJhdWQiOiJkb2NrZXItcmVnaXN0cnkiLCJzdWIiOiJ0ZXN0dXNlciIsInR5cCI6IkJlYXJlciIsImF6cCI6ImRvY2tlci1yZWdpc3RyeSIsImFjY2VzcyI6W119.wS0ytJ5ov0HB72Av8PwK74Ntwa6bDKFT_wqTbTVdYb_GOYSwE8WtQOECBavuKXLWfb3_mqhh7qroXHdDMMZhsqjgs8dNSD-mg2vv"
}

access_token 値を取得し、次のように Authorization: Bearer <access_token> ヘッダーを介して渡します。

curl -Lv -H "Authorization: Bearer $ACCESS_TOKEN" https://registry.redhat.io/v2/

テストが成功すると、HTTP 200 OK と空の JSON オブジェクトが生成されます。これにより、生成されたアクセストークンが有効であり、さらに重要なことに、システムがレジストリーエンドポイントにアクセスできることが確認されます。