6.8. ロボットアカウントによるキーレス認証
Red Hat Quay の以前のバージョンでは、ロボットアカウントトークンは、削除または再生成されない限り、トークンの有効期間中有効でした。有効期限のないトークンは、長期的なパスワードの保存や、削除、再生成、新規認証トークンを管理を望まないユーザーにとって、セキュリティー上の問題を引き起こす可能性があります。
Red Hat Quay 3 では、Red Hat Quay 管理者は、Red Hat Single Sign-On (Keycloak プロジェクトに基づく) または Microsoft Entra ID を使用して、外部 OIDC トークンを短命または 一時的な ロボットアカウントトークンと交換できるようになります。これにより、ロボットアカウントは 1 時間有効のトークンを活用できるようになります。このようなトークンは定期的に更新され、個々のトランザクションの認証に使用できます。
この機能により、トークンを 1 時間後に削除することで、ロボットトークンの漏洩の可能性を軽減し、Red Hat Quay レジストリーのセキュリティーが大幅に向上します。
ロボットアカウントを使用したキーレス認証の設定には、ロボットフェデレーションの設定、OIDC プロバイダーからの OAuth2 トークンの生成、および OAuth2 トークンとロボットアカウントアクセストークンの交換を必要とする複数の手順があります。
6.8.1. Red Hat Sign Sign-On による OAuth2 トークンの生成 リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、Red Hat Single Sign-On を使用して OAuth2 トークンを生成する方法を示します。OIDC プロバイダーに応じて、これらの手順は異なります。
手順
Red Hat Single Sign-On UI の場合は、以下を行います。
- Clients をクリックし、ユーザーの認証を要求できるアプリケーションまたはサービスの名前をクリックします。
クライアントの Settings ページで、次のオプションが設定または有効化されていることを確認します。
- クライアント ID
- 有効なリダイレクト URI
- クライアント認証
- 認可
- Standard flow
Direct access grants
注記設定はセットアップによって異なる場合があります。
- Credentials ページで、今後使用する時のために クライアントシークレット を保存します。
-
Users ページで、Add user をクリックし、ユーザー名 (例:
service-account-quaydev
) を入力します。次に、Create をクリックします。 - Users ページで、ユーザーの名前 (例: service-account-quaydev) をクリックします。
-
Credentials タブ
Set password をクリックし、ユーザーのパスワードを入力します。必要に応じて、Temporary オプションを選択して、このパスワードを一時的なものにすることができます。 Realm settings タブ
OpenID Endpoint Configuration をクリックします。 /protocol/openid-connect/token
エンドポイントを保存します。以下に例を示します。http://localhost:8080/realms/master/protocol/openid-connect/token
http://localhost:8080/realms/master/protocol/openid-connect/token
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Web ブラウザーで、次の URL に移動します。
http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - プロンプトが表示されたら、service-account-quaydev ユーザーと設定した一時パスワードを使用してログインします。必要な情報を入力し、必要に応じて永続的なパスワードを設定してログインを完了します。
クライアントに提供された URI アドレスにリダイレクトされます。以下に例を示します。
https://localhost:3000/cb?session_state=5c9bce22-6b85-4654-b716-e9bbb3e755bc&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Fmaster&code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
https://localhost:3000/cb?session_state=5c9bce22-6b85-4654-b716-e9bbb3e755bc&iss=http%3A%2F%2Flocalhost%3A8080%2Frealms%2Fmaster&code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
Copy to Clipboard Copied! Toggle word wrap Toggle overflow アドレスに記載されている
code
をメモしてください。以下に例を示します。code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記これは 1 回のみ使用できる一時コードです。必要に応じて、ページを更新するか、URL に再度アクセスして別のコードを取得できます。
ターミナルで、次の
curl -X POST
コマンドを使用して一時的な OAuth2 アクセストークンを生成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...", "expires_in":60,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiNTBlZTVkMS05OTc1LTQwMzUtYjNkNy1lMWQ5ZTJmMjg0MTEifQ.oBDx6B3pUkXQO8m-M3hYE7v-w25ak6y70CQd5J8f5EuldhvTwpWrC1K7yOglvs09dQxtq8ont12rKIoCIi4WXw","token_type":"Bearer","not-before-policy":0,"session_state":"5c9bce22-6b85-4654-b716-e9bbb3e755bc","scope":"profile email"}
{"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...", "expires_in":60,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJiNTBlZTVkMS05OTc1LTQwMzUtYjNkNy1lMWQ5ZTJmMjg0MTEifQ.oBDx6B3pUkXQO8m-M3hYE7v-w25ak6y70CQd5J8f5EuldhvTwpWrC1K7yOglvs09dQxtq8ont12rKIoCIi4WXw","token_type":"Bearer","not-before-policy":0,"session_state":"5c9bce22-6b85-4654-b716-e9bbb3e755bc","scope":"profile email"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
前の手順の
access_token
を保存します。これは次の手順で Red Hat Quay ロボットアカウントトークンと交換されます。
6.8.2. Red Hat Quay v2 UI を使用してロボットアカウントフェデレーションを設定する リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、Red Hat Quay v2 UI を使用してロボットアカウントフェデレーションをセットアップする方法を示します。この手順では、Keycloak プロジェクトに基づく Red Hat Single Sign-On を使用します。これらの手順と、ロボットアカウントフェデレーションのセットアップに使用される情報は、OIDC プロバイダーによって異なります。
前提条件
-
組織を作成している。次の例では
fed_test
を使用します。 -
ロボットアカウントを作成している。次の例では、
fest_test+robot1
を使用します。 - Red Hat Quay デプロイメント用に OIDC を設定している。次の例では、Red Hat Single Sign-On を使用します。
手順
Red Hat Single Sign-On のメインページで、以下を行います。
-
Red Hat Quay で使用するために認証された適切なレルムを選択します。issuer URL を保存します (例:
https://keycloak-auth-realm.quayadmin.org/realms/quayrealm
)。 - Users →認証のためにロボットアカウントにリンクするユーザーの名前をクリックします。OAuth2 アクセストークンを生成するときに使用したのと同じユーザーアカウントを使用する必要があります。
Details ページで、ユーザーの ID (例:
449e14f8-9eb5-4d59-a63e-b7a77c75f770
) を保存します。注記このステップで収集される情報は、OIDC プロバイダーによって異なります。たとえば、Red Hat Single Sign-On では、ユーザーの ID が Subject として使用され、後続のステップでロボットアカウントフェデレーションがセットアップされます。Microsoft Entra ID などの別の OIDC プロバイダーの場合、この情報は Subject として保存されます。
-
Red Hat Quay で使用するために認証された適切なレルムを選択します。issuer URL を保存します (例:
Red Hat Quay レジストリーの場合、以下を行います。
- Organizations に移動し、組織の名前 (例: fed_test) をクリックします。
- Robot Accounts をクリックします。
-
縦の省略記号メニュー
Set robot federation をクリックします。 - + 記号をクリックします。
ポップアップウィンドウに次の情報を入力します。
-
Issuer URL:
https://keycloak-auth-realm.quayadmin.org/realms/quayrealm
。Red Hat Single Sign-On の場合、これは Red Hat Single Sign-On レルムの URL になります。これは、OIDC プロバイダーによって異なる場合があります。 -
Subject:
449e14f8-9eb5-4d59-a63e-b7a77c75f770
。Red Hat Single Sign-On の場合、Subject は Red Hat Single Sign-On ユーザーの ID になります。これは OIDC プロバイダーによって異なります。たとえば、Microsoft Entra ID を使用している場合、Subject は Subject または Entra ID ユーザーになります。
-
Issuer URL:
- Save をクリックします。
6.8.3. OAuth2 アクセストークンを Red Hat Quay ロボットアカウントトークンと交換する リンクのコピーリンクがクリップボードにコピーされました!
次の手順では、前の手順で生成された access token
を利用して、新しい Red Hat Quay ロボットアカウントトークンを作成します。新しい Red Hat Quay ロボットアカウントトークンは、OIDC プロバイダーと Red Hat Quay 間の認証に使用されます。
次の例では、Python スクリプトを使用して、OAuth2 アクセストークンを Red Hat Quay ロボットアカウントトークンと交換します。
前提条件
-
python3
CLI ツールがインストールされている。
手順
次の Python スクリプトを
.py
ファイル (例:robot_fed_token_auth.py
) に保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Red Hat Quay デプロイメントでカスタム SSL/TLS 証明書を使用している場合、応答は
response = requests.get(URL,auth=(robot_user,fed_token),verify=False)
ある必要があり、これにはverify=False
フラグが含まれます。
OAuth2 アクセストークンを
TOKEN
としてエクスポートします。以下に例を示します。export TOKEN = eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...
$ export TOKEN = eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して
robot_fed_token_auth.py
スクリプトを実行します。python3 robot_fed_token_auth.py
$ python3 robot_fed_token_auth.py
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
<Response [200]> {"token": "string..."}
<Response [200]> {"token": "string..."}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要このトークンは 1 時間が経過すると期限切れになります。1 時間後、新しいトークンを生成する必要があります。
ロボットアカウントアクセストークンを
QUAY_TOKEN
としてエクスポートします。以下に例を示します。export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ
$ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
6.8.4. イメージのプッシュとプル リンクのコピーリンクがクリップボードにコピーされました!
新しいロボットアカウントアクセストークンを生成してエクスポートしたら、アクセストークンを使用してロボットアカウントにログインし、イメージをプッシュおよびプルできます。
前提条件
- OAuth2 アクセストークンを新しいロボットアカウントアクセストークンにエクスポートしている。
手順
fest_test+robot1
ロボットアカウントとQUAY_TOKEN
アクセストークンを使用して、Red Hat Quay レジストリーにログインします。以下に例を示します。podman login <quay-server.example.com> -u fed_test+robot1 -p $QUAY_TOKEN
$ podman login <quay-server.example.com> -u fed_test+robot1 -p $QUAY_TOKEN
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ロボットアカウントに適切な権限がある Red Hat Quay リポジトリーからイメージをプルします。以下に例を示します。
podman pull <quay-server.example.com/<repository_name>/<image_name>>
$ podman pull <quay-server.example.com/<repository_name>/<image_name>>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ロボットアカウントに適切な権限が ない Red Hat Quay リポジトリーからイメージをプルしようとしました。以下に例を示します。
podman pull <quay-server.example.com/<different_repository_name>/<image_name>>
$ podman pull <quay-server.example.com/<different_repository_name>/<image_name>>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Error: initializing source docker://quay-server.example.com/example_repository/busybox:latest: reading manifest in quay-server.example.com/example_repository/busybox: unauthorized: access to the requested resource is not authorized
Error: initializing source docker://quay-server.example.com/example_repository/busybox:latest: reading manifest in quay-server.example.com/example_repository/busybox: unauthorized: access to the requested resource is not authorized
Copy to Clipboard Copied! Toggle word wrap Toggle overflow このロボットアカウントの認証情報は、1 時間後に期限切れになるよう設定されています。その後、このロボットアカウントの新しいアクセストークンを生成する必要があります。