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 プロバイダーに応じて、これらの手順は異なります。

手順

  1. Red Hat Single Sign-On UI の場合は、以下を行います。

    1. Clients をクリックし、ユーザーの認証を要求できるアプリケーションまたはサービスの名前をクリックします。
    2. クライアントの Settings ページで、次のオプションが設定または有効化されていることを確認します。

      • クライアント ID
      • 有効なリダイレクト URI
      • クライアント認証
      • 認可
      • Standard flow
      • Direct access grants

        注記

        設定はセットアップによって異なる場合があります。

    3. Credentials ページで、今後使用する時のために クライアントシークレット を保存します。
    4. Users ページで、Add user をクリックし、ユーザー名 (例: service-account-quaydev) を入力します。次に、Create をクリックします。
    5. Users ページで、ユーザーの名前 (例: service-account-quaydev) をクリックします。
    6. Credentials タブ Set password をクリックし、ユーザーのパスワードを入力します。必要に応じて、Temporary オプションを選択して、このパスワードを一時的なものにすることができます。
    7. Realm settings タブ OpenID Endpoint Configuration をクリックします。/protocol/openid-connect/token エンドポイントを保存します。以下に例を示します。

      http://localhost:8080/realms/master/protocol/openid-connect/token
  2. Web ブラウザーで、次の URL に移動します。

    http://<keycloak_url>/realms/<realm_name>/protocol/openid-connect/auth?response_type=code&client_id=<client_id>
  3. プロンプトが表示されたら、service-account-quaydev ユーザーと設定した一時パスワードを使用してログインします。必要な情報を入力し、必要に応じて永続的なパスワードを設定してログインを完了します。
  4. クライアントに提供された 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 に再度アクセスして別のコードを取得できます。

  5. ターミナルで、次の 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
    1
    Red Hat Single Sign-On UI の Realm settings ページにある protocol/openid-connect/token エンドポイント。
    2
    この手順で使用されるクライアント ID。
    3
    クライアント ID のクライアントシークレット。
    4
    リダイレクト URI から返されたコード。

    出力例

    {"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"}

  6. 前の手順の 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 を使用します。

手順

  1. Red Hat Single Sign-On のメインページで、以下を行います。

    1. Red Hat Quay で使用するために認証された適切なレルムを選択します。issuer URL を保存します (例: https://keycloak-auth-realm.quayadmin.org/realms/quayrealm)。
    2. Users →「認証のためにロボットアカウントにリンクするユーザーの名前」をクリックします。OAuth2 アクセストークンを生成するときに使用したのと同じユーザーアカウントを使用する必要があります。
    3. Details ページで、ユーザーの ID (例: 449e14f8-9eb5-4d59-a63e-b7a77c75f770) を保存します。

      注記

      このステップで収集される情報は、OIDC プロバイダーによって異なります。たとえば、Red Hat Single Sign-On では、ユーザーの IDSubject として使用され、後続のステップでロボットアカウントフェデレーションがセットアップされます。Microsoft Entra ID などの別の OIDC プロバイダーの場合、この情報は Subject として保存されます。

  2. Red Hat Quay レジストリーの場合、以下を行います。

    1. Organizations に移動し、組織の名前 (例: fed_test) をクリックします。
    2. Robot Accounts をクリックします。
    3. 縦の省略記号メニュー Set robot federation をクリックします。
    4. + 記号をクリックします。
    5. ポップアップウィンドウに次の情報を入力します。

      • 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 を使用している場合、SubjectSubject または Entra ID ユーザーになります。
    6. 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 ツールがインストールされている。

手順

  1. 次の 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 フラグが含まれます。
  2. OAuth2 アクセストークンを TOKEN としてエクスポートします。以下に例を示します。

    $ export TOKEN = eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTVmExVHZ6eDd2cHVmc1dkZmc1SHdua1ZDcVlOM01DN1N5T016R0QwVGhVIn0...
  3. 次のコマンドを入力して robot_fed_token_auth.py スクリプトを実行します。

    $ python3 robot_fed_token_auth.py

    出力例

    <Response [200]>
    {"token": "291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ..."}

    重要

    このトークンは 1 時間が経過すると期限切れになります。1 時間後、新しいトークンを生成する必要があります。

  4. ロボットアカウントアクセストークンを QUAY_TOKEN としてエクスポートします。以下に例を示します。

    $ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ

7.5.4. イメージのプッシュとプル

新しいロボットアカウントアクセストークンを生成してエクスポートしたら、アクセストークンを使用してロボットアカウントにログインし、イメージをプッシュおよびプルできます。

前提条件

  • OAuth2 アクセストークンを新しいロボットアカウントアクセストークンにエクスポートしている。

手順

  1. fest_test+robot1 ロボットアカウントと QUAY_TOKEN アクセストークンを使用して、Red Hat Quay レジストリーにログインします。以下に例を示します。

    $ podman login <quay-server.example.com> -u fed_test+robot1 -p $QUAY_TOKEN
  2. ロボットアカウントに適切な権限がある 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

  3. ロボットアカウントに適切な権限が ない 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 時間後に期限切れになるよう設定されています。その後、このロボットアカウントの新しいアクセストークンを生成する必要があります。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.