第 12 章 使用机器人帐户进行无密钥身份验证
在以前的 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 令牌。
12.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 机器人帐户令牌交换。