5.8. 使用机器人帐户进行无密钥身份验证
在以前的 Red Hat Quay 版本中,机器人帐户令牌在令牌生命周期内有效,除非删除或重新生成。对于不想存储长期密码或管理删除、重新生成或新的身份验证令牌的用户,没有过期的令牌。
使用 Red Hat Quay 3.13 时,Red Hat Quay 管理员提供了与 Red Hat Single Sign-On (基于 Keycloak 项目)或 Microsoft Entra ID 交换外部 OIDC 令牌的功能。这允许机器人帐户利用上一小时的令牌,这些令牌定期刷新,并可用于验证单个事务。
此功能通过降低机器人令牌在一小时后删除令牌暴露的可能性,从而大大增强了 Red Hat Quay registry 的安全性。
使用机器人帐户配置无密钥身份验证是一个多步骤流程,需要设置机器人联合,从 OIDC 提供程序生成 OAuth2 令牌,并为机器人帐户访问令牌交换 OAuth2 令牌。
5.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
- 客户端身份验证
- 授权
- 标准流程
直接访问授予
注意根据您的设置,设置可能会有所不同。
- 在 Credentials 页面中,存储 Client Secret 以备将来使用。
-
在 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
在网页浏览器中,导航到以下 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=ea5b76eb-47a5-4e5d-8f71-0892178250db.5c9bce22-6b85-4654-b716-e9bbb3e755bc.cdffafbc-20fb-42b9-b254-866017057f43
注意这是只能一次使用的临时代码。如果需要,您可以刷新页面或重新访问 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 机器人帐户令牌交换。
5.8.2. 使用 Red Hat Quay v2 UI 设置机器人帐户联邦
以下流程演示了如何使用 Red Hat Quay v2 UI 设置机器人帐户联合。此流程使用 Red Hat Single Sign-On,它基于 Keycloak 项目。这些步骤以及设置机器人帐户联邦的信息会根据 OIDC 供应商的不同而有所不同。
先决条件
-
您已创建了一个机构。以下示例使用
fed_test
。 -
您已创建了机器人帐户。以下示例使用
fest_test+robot1
。 - 您已为 Red Hat Quay 部署配置了 OIDC。以下示例使用 Red Hat Single Sign-On。
流程
在 Red Hat Single Sign-On 主页中:
-
选择用于验证用于 Red Hat Quay 的适当域。存储签发者 URL,例如
https://keycloak-auth-realm.quayadmin.org/realms/quayrealm
。 -
点 Users
要与机器人帐户关联的用户名称进行身份验证。您必须使用生成 OAuth2 访问令牌时所用的同一用户帐户。 在 Details 页面中,存储用户的 ID,例如
449e14f8-9ebeb5-4d59-a63e-b7a77c75f770
。注意此步骤中收集的信息会根据您的 OIDC 供应商的不同而有所不同。例如,在 Red Hat Single Sign-On 中,用户的 ID 用作 Subject 来在后续步骤中设置机器人帐户联合。对于不同的 OIDC 供应商,如 Microsoft Entra ID,此信息存储为 主题。
-
选择用于验证用于 Red Hat Quay 的适当域。存储签发者 URL,例如
在 Red Hat Quay registry 中:
- 导航到 Organizations,再单击组织的名称,例如 fed_test。
- 单击 Robot Accounts。
-
点菜单 kebab
Set robot federation。 - 点 + 符号。
在弹出窗口中包括以下信息:
-
签发者 URL:
https://keycloak-auth-realm.quayadmin.org/realms/quayrealm
.对于 Red Hat Single Sign-On,这是 Red Hat Single Sign-On 域的 URL。这根据您的 OIDC 供应商可能会有所不同。 -
主题:
449e14f8-9eb5-4d59-a63e-b7a77c75f770
.对于 Red Hat Single Sign-On,主题 是 Red Hat Single Sign-On 用户的 ID。这根据您的 OIDC 供应商的不同而有所不同。例如,如果您使用 Microsoft Entra ID,则 主题 将是 主题 或您的 Entra ID 用户。
-
签发者 URL:
- 点击 Save。
5.8.3. 为 Red Hat Quay 机器人令牌交换 OAuth2 访问令牌
以下流程利用 上一步中生成的访问令牌
来创建新的 Red Hat Quay 机器人帐户令牌。新的 Red Hat Quay 机器人帐户令牌用于您的 OIDC 供应商和 Red Hat Quay 间的身份验证。
以下示例使用 Python 脚本为 Red Hat Quay 机器人令牌交换 OAuth2 访问令牌。
先决条件
-
已安装
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..."}
重要此令牌在一小时后过期。一小时后,必须生成新的令牌。
将机器人帐户访问令牌导出为
QUAY_TOKEN
。例如:$ export QUAY_TOKEN=291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6InByb2ZpbGUgZW1haWwiLCJlbWFpbF92ZXJpZ
5.8.4. 推送和拉取镜像
在生成了新的机器人帐户访问令牌并导出后,您可以使用访问令牌登录和机器人帐户,并推送和拉取镜像。
先决条件
- 您已将 OAuth2 访问令牌导出到新的机器人帐户访问令牌。
流程
使用
fest_test+robot1
机器人帐户和QUAY_TOKEN
访问令牌登录到您的 Red Hat Quay registry。例如:$ 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
一小时后,机器人帐户的凭据被设为过期。之后,您必须为此机器人帐户生成新的访问令牌。