本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Slurm REST API 中进行身份验证 AWS 个
AWS PCS 中的 Slurm REST API 使用 JSON 网络令牌 (JWT) 身份验证来确保对集群资源的安全访问。 AWS PCS 提供存储在 Secrets Manager 中的托管签名 AWS 密钥,您可以使用该密钥生成包含特定用户身份声明的 JWT 令牌。
先决条件
在使用 Slurm REST API 进行身份验证之前,请确保您已具备以下条件:
-
集群配置:启用 Slurm 25.05+ 且启用 REST API 的 AWS PCS 集群。
-
AWS 权限:访问 S AWS ecrets Manager 以获取 JWT 签名密钥。
-
用户信息:您的集群账户的用户名、POSIX 用户 ID 以及一个或多个 POSIX 组 ID。
-
网络访问:通过允许端口 6820 的安全组在集群的 VPC 内进行连接。
过程
检索 Slurm REST API 端点地址
检索 JWT 签名密钥
-
打开 AWS PCS 控制台,网址为https://console.aws.amazon.com/pcs/
。 -
从列表中选择您的集群。
-
在集群配置详细信息中,找到 “调度程序身份验证” 部分。
-
注意 JSON 网络令牌 (JWT) 密钥 ARN 和版本。
-
使用从 Sec AWS CLI rets Manager 中检索签名密钥:
aws secretsmanager get-secret-value --secret-idarn:aws:secretsmanager:region:account:secret:name--version-idversion
生成 JWT 令牌
-
使用以下必填声明创建 JWT:
-
exp— 自 1970 年以来 JWT 的到期时间(以秒为单位) -
iat— 自 1970 年以来的当前时间(以秒为单位) -
sun— 用于身份验证的用户名 -
uid— POSIX 用户 ID -
gid— POSIX 群组 ID -
id— 其他 POSIX 身份属性-
gecos— 用户评论字段,通常用于存储人类可读的名称 -
dir— 用户的主目录 -
shell— 用户的默认外壳 -
gids— 用户所在的其他 POSIX 群组 ID 列表
-
-
-
使用从 Secrets Manager 中检索到的签名密钥对 JWT 进行签名。
-
为令牌设置适当的到期时间。
注意
作为sun索赔的替代方案,您可以提供以下任何内容:
-
username -
您通过
userclaimfield中的定义的自定义字段名称AuthAltParameters Slurm custom settings -
id索赔中的一个name字段
对 API 请求进行身份验证
-
使用以下方法之一将 JWT 令牌包含在您的 HTTP 请求中:
-
不记名代币-添加
Authorization: Bearer标题<jwt> -
Slurm 标题 — 添加标题
X-SLURM-USER-TOKEN:<jwt>
-
-
向 REST API 端点发出 HTTP 请求:
以下是使用 curl 和
Authorized: Bearer标头访问/pingAPI 的示例。curl -X GET -H "Authorization: Bearer<jwt>" \ http://<privateIpAddress>:6820/slurm/v0.0.43/ping
JWT 生成示例
获取 AWS PCS 集群 JWT 签名密钥并将其存储为本地文件。将 aw s-region 、 secret-arn 和密钥版本的值替换为适合您的集群的值。
#!/bin/bash SECRET_KEY=$(aws secretsmanager get-secret-value \ --regionaws-region\ --secret-idsecret-arn\ --version-stagesecret-version\ --query 'SecretString' \ --output text) echo "$SECRET_KEY" | base64 --decode > jwt.key
此 Python 示例说明了如何使用签名密钥生成 JWT 令牌:
#!/usr/bin/env python3 import sys import os import pprint import json import time from datetime import datetime, timedelta, timezone from jwt import JWT from jwt.jwa import HS256 from jwt.jwk import jwk_from_dict from jwt.utils import b64decode,b64encode if len(sys.argv) != 3: sys.exit("Usage: gen_jwt.py [jwt_key_file] [expiration_time_seconds]") SIGNING_KEY = sys.argv[1] EXPIRATION_TIME = int(sys.argv[2]) with open(SIGNING_KEY, "rb") as f: priv_key = f.read() signing_key = jwk_from_dict({ 'kty': 'oct', 'k': b64encode(priv_key) }) message = { "exp": int(time.time() + EXPIRATION_TIME), "iat": int(time.time()), "sun": "ec2-user", "uid": 1000, "gid": 1000, "id": { "gecos": "EC2 User", "dir": "/home/ec2-user", "gids": [1000], "shell": "/bin/bash" } } a = JWT() compact_jws = a.encode(message, signing_key, alg='HS256') print(compact_jws)
该脚本会将 JWT 打印到屏幕上。
abcdefgtjwttoken...