跳至内容

kOps 与 MFA

您可以通过创建一个需要 MFA 才能访问 KOPS_STATE_STORE 存储桶的 AWS 角色和策略来保护 kops。不幸的是,Go AWS SDK 不透明地支持使用必需的 MFA 假设角色。这可能会在将来的版本中更改。kops 计划最终支持此行为。您可以在此 Github 问题 中跟踪进度。如果您想使用 kops 的 MFA,则需要在解决之前使用解决方法。

解决方法 #1

解决方法使用 aws sts assume-role 结合 MFA 提示来检索临时 AWS 访问密钥。这将提供 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 环境变量,这些变量会由 Go AWS SDK 自动获取。您提供 MFA 和角色 ARN,然后调用 kops

以下是一个示例包装脚本

#!/usr/bin/env bash

set -euo pipefail

main() {
    local role_arn="${KOPS_MFA_ROLE_ARN:-}"
    local serial_number="${KOPS_MFA_ARN:-}"
    local token_code

    if [ -z "${role_arn}" ]; then
        echo "Set the KOPS_MFA_ROLE_ARN environment variable" 1>&2
        return 1
    fi

    if [ -z "${serial_number}" ]; then
        echo "Set the KOPS_MFA_ARN environment variable" 1>&2
        return 1
    fi

    echo -n "Enter MFA Code: "
    read -s token_code

    # NOTE: The keys should not be exported as AWS_ACCESS_KEY_ID
    # or AWS_SECRET_ACCESS_KEY_ID. This will not work. They
    # should be exported as other names which can be used below. This prevents
    # them from incorrectly being picked up from libraries or commands.
    temporary_credentials="$(aws \
        sts assume-role \
        --role-arn="${role_arn}" \
        --serial-number="${serial_number}" \
        --token-code="${token_code}" \
        --role-session-name="kops-access"
    )"

    unset AWS_PROFILE

    export "AWS_ACCESS_KEY_ID=$(echo "${temporary_credentials}" | jq -re '.Credentials.AccessKeyId')"
    export "AWS_SECRET_ACCESS_KEY=$(echo "${temporary_credentials}" | jq -re '.Credentials.SecretAccessKey')"
    export "AWS_SESSION_TOKEN=$(echo "${temporary_credentials}" | jq -re '.Credentials.SessionToken')"

    exec kops "$@"
}

main "$@"

用法

将脚本下载为 kops-mfa,使其可执行,将其放入 $PATH,设置 KOPS_MFA_ARNKOPS_MFA_ROLE_ARN 环境变量。运行 kops-mfa 后跟任何 kops 命令。

解决方法 #2

使用 awsudo 生成临时凭据。这与之前类似,但更短。

pip install awsudo
env $(awsudo ${AWS_PROFILE} | grep AWS | xargs) kops ...

解决方法 #3

使用 aws-vault 生成临时会话凭据。设置 aws-vault 后,使用别名为 kops 命令。这样,每次凭据会话过期时,终端都会询问 MFA。命令将是

AWS_PROFILE=sandbox
aws-vault add $AWS_PROFILE
alias kops="aws-vault exec ${AWS_PROFILE} -- kops"