7.5. ロボットアカウントによるキーレス認証
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 トークンとロボットアカウントアクセストークンの交換を必要とする複数の手順があります。
7.5.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
Web ブラウザーで、次の URL に移動します。
http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
- プロンプトが表示されたら、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
アドレスに記載されている
code
をメモしてください。以下に例を示します。code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
注記これは 1 回のみ使用できる一時コードです。必要に応じて、ページを更新するか、URL に再度アクセスして別のコードを取得できます。
ターミナルで、次の
curl -X POST
コマンドを使用して一時的な OAuth2 アクセストークンを生成します。$ curl -X POST "http://localhost:8080/realms/master/protocol/openid-connect/token" 1 -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=quaydev" 2 -d "client_secret=g8gPsBLxVrLo2PjmZkYBdKvcB9C7fmBz" 3 -d "grant_type=authorization_code" -d "code=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43" 4
出力例
{"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
を保存します。これは次の手順で Red Hat Quay ロボットアカウントトークンと交換されます。
7.5.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 をクリックします。
7.5.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
) に保存します。import requests import os TOKEN=os.environ.get('TOKEN') robot_user = "fed-test+robot1" def get_quay_robot_token(fed_token): URL = "https://<quay-server.example.com>/oauth2/federation/robot/token" response = requests.get(URL, auth=(robot_user,fed_token)) 1 print(response) print(response.text) if __name__ == "__main__": get_quay_robot_token(TOKEN)
- 1
- Red Hat Quay デプロイメントでカスタム SSL/TLS 証明書を使用している場合、応答は
response = requests.get(URL,auth=(robot_user,fed_token),verify=False)
ある必要があり、これにはverify=False
フラグが含まれます。
OAuth2 アクセストークンを
TOKEN
としてエクスポートします。以下に例を示します。$ export TOKEN = eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...
次のコマンドを入力して
robot_fed_token_auth.py
スクリプトを実行します。$ python3 robot_fed_token_auth.py
出力例
<Response [200]> {"token": "291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ..."}
重要このトークンは 1 時間が経過すると期限切れになります。1 時間後、新しいトークンを生成する必要があります。
ロボットアカウントアクセストークンを
QUAY_TOKEN
としてエクスポートします。以下に例を示します。$ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ
7.5.4. イメージのプッシュとプル
新しいロボットアカウントアクセストークンを生成してエクスポートしたら、アクセストークンを使用してロボットアカウントにログインし、イメージをプッシュおよびプルできます。
前提条件
- OAuth2 アクセストークンを新しいロボットアカウントアクセストークンにエクスポートしている。
手順
fest_test+robot1
ロボットアカウントとQUAY_TOKEN
アクセストークンを使用して、Red Hat Quay レジストリーにログインします。以下に例を示します。$ podman login <quay-server.example.com> -u fed_test+robot1 -p $QUAY_TOKEN
ロボットアカウントに適切な権限がある Red Hat Quay リポジトリーからイメージをプルします。以下に例を示します。
$ podman pull <quay-server.example.com/<repository_name>/<image_name>>
出力例
Getting image source signatures Copying blob 900e6061671b done Copying config 8135583d97 done Writing manifest to image destination Storing signatures 8135583d97feb82398909c9c97607159e6db2c4ca2c885c0b8f590ee0f9fe90d 0.57user 0.11system 0:00.99elapsed 68%CPU (0avgtext+0avgdata 78716maxresident)k 800inputs+15424outputs (18major+6528minor)pagefaults 0swaps
ロボットアカウントに適切な権限が ない Red Hat Quay リポジトリーからイメージをプルしようとしました。以下に例を示します。
$ podman pull <quay-server.example.com/<different_repository_name>/<image_name>>
出力例
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
このロボットアカウントの認証情報は、1 時間後に期限切れになるよう設定されています。その後、このロボットアカウントの新しいアクセストークンを生成する必要があります。