对适用于 RabbitMQ 的亚马逊 MQ 使用 IAM 身份验证和授权 - Amazon MQ

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

对适用于 RabbitMQ 的亚马逊 MQ 使用 IAM 身份验证和授权

以下过程演示如何为 Amazon MQ for RabbitMQ 代理启用 AWS IAM 身份验证和授权。启用 IAM 后,用户可以使用 AWS IAM 凭证进行身份验证,以访问 RabbitMQ 管理 API 并通过 AMQP 进行连接。有关 IAM 身份验证如何与适用于 RabbitMQ 的 Amazon MQ 配合使用的详细信息,请参阅。适用于 RabbitMQ 的亚马逊 MQ 的 IAM 身份验证和授权

先决条件

  • AWS 拥有 Amazon MQ for RabbitMQ 经纪商的 AWS 账户的管理员证书

  • 使用这些管理员凭据(使用 AWS CLI 配置文件或环境变量)配置的 shell 环境

  • AWS 已安装并配置 CLI

  • jq已安装命令行 JSON 处理器

  • curl已安装命令行工具

使用配置 IAM 身份验证和授权 AWS CLI

  1. 设置环境变量

    为您的经纪商设置所需的环境变量:

    export AWS_DEFAULT_REGION=<region> export BROKER_ID=<broker-id>
  2. 启用出站 JWT 令牌

    为您的 AWS 账户启用出站 Web 联合身份验证:

    ISSUER_IDENTIFIER=$(aws iam enable-outbound-web-identity-federation --query 'IssuerIdentifier' --output text) echo $ISSUER_IDENTIFIER

    输出以以下格式显示您账户的唯一发行人标识符网址https://<id>.tokens.sts.global.api.aws

  3. 创建 IAM 策略文档

    创建授予获取 Web 身份令牌权限的策略文档:

    cat > policy.json << 'EOF' { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "sts:GetWebIdentityToken", "sts:TagGetWebIdentityToken" ], "Resource": "*" } ] } EOF
  4. 创建信任策略

    检索您的来电者身份并创建信任策略文档:

    CALLER_ARN=$(aws sts get-caller-identity --query Arn --output text) cat > trust-policy.json << EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "$CALLER_ARN" }, "Action": "sts:AssumeRole" } ] } EOF
  5. 创建 IAM 角色

    创建 IAM 角色并附加策略:

    aws iam create-role --role-name RabbitMqAdminRole --assume-role-policy-document file://trust-policy.json aws iam put-role-policy --role-name RabbitMqAdminRole --policy-name RabbitMqAdminRolePolicy --policy-document file://policy.json
  6. 配置 RabbitMQ OAuth2 设置

    使用 OAuth2 身份验证和授权设置创建 RabbitMQ 配置文件:

    cat > rabbitmq.conf << EOF auth_backends.1 = oauth2 auth_backends.2 = internal auth_oauth2.jwks_url = ${ISSUER_IDENTIFIER}/.well-known/jwks.json auth_oauth2.resource_server_id = rabbitmq auth_oauth2.scope_prefix = rabbitmq/ auth_oauth2.additional_scopes_key = sub auth_oauth2.scope_aliases.1.alias = arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/RabbitMqAdminRole auth_oauth2.scope_aliases.1.scope = rabbitmq/tag:administrator rabbitmq/read:*/* rabbitmq/write:*/* rabbitmq/configure:*/* auth_oauth2.https.hostname_verification = wildcard management.oauth_enabled = true EOF
  7. 更新代理配置

    将新配置应用于您的经纪商:

    # Retrieve the configuration ID CONFIG_ID=$(aws mq describe-broker --broker-id $BROKER_ID --query 'Configurations[0].Id' --output text) # Create a new configuration revision REVISION=$(aws mq update-configuration --configuration-id $CONFIG_ID --data "$(cat rabbitmq.conf | base64 --wrap=0)" --query 'LatestRevision.Revision' --output text) # Apply the configuration to the broker aws mq update-broker --broker-id $BROKER_ID --configuration Id=$CONFIG_ID,Revision=$REVISION # Reboot the broker to apply changes aws mq reboot-broker --broker-id $BROKER_ID

    等待代理状态恢复到RUNNING后再继续下一步。

  8. 获取 JWT 代币

    担任 IAM 角色并获取 Web 身份令牌:

    # Assume the RabbitMqAdminRole ROLE_CREDS=$(aws sts assume-role --role-arn arn:aws:iam::$(aws sts get-caller-identity --query Account --output text):role/RabbitMqAdminRole --role-session-name rabbitmq-session) # Configure the session with temporary credentials export AWS_ACCESS_KEY_ID=$(echo "$ROLE_CREDS" | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo "$ROLE_CREDS" | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo "$ROLE_CREDS" | jq -r '.Credentials.SessionToken') # Obtain the web identity token TOKEN_RESPONSE=$(aws sts get-web-identity-token \ --audience "rabbitmq" \ --signing-algorithm ES384 \ --duration-seconds 300 \ --tags Key=scope,Value="rabbitmq/tag:administrator") # Extract the token TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r '.WebIdentityToken')
  9. 访问 RabbitMQ 管理 API

    使用 JWT 令牌访问 RabbitMQ 管理 API:

    BROKER_URL=<broker-id>.mq.<region>.on.aws curl -u ":$TOKEN" \ -X GET https://${BROKER_URL}/api/overview \ -H "Content-Type: application/json"

    成功的响应确认 IAM 身份验证工作正常。响应包含 JSON 格式的经纪商概述信息。

  10. 使用 JWT 令牌通过 AMQP 进行连接

    使用带有性能测试工具的 JWT 令牌测试 AMQP 连接:

    BROKER_DNS=<broker-endpoint> CONNECTION_STRING=amqps://:${TOKEN}@${BROKER_DNS}:5671 docker run -it --rm --ulimit nofile=40960:40960 pivotalrabbitmq/perf-test:latest \ --queue-pattern 'test-queue-%d' --queue-pattern-from 1 --queue-pattern-to 1 \ --producers 1 --consumers 1 \ --uri ${CONNECTION_STRING} \ --flag persistent --rate 1

    如果您收到ACCESS_REFUSED错误,则可以使用代理 CloudWatch 日志对配置设置进行故障排除。您可以在 Amazon MQ 控制台中找到您的代理的 CloudWatch 日志日志组链接。