python - 通过 Okta 使用 SAML 联合登录获取 STS 凭据以用于本地命令行工具的好方法是什么?

标签 python amazon-web-services boto saml okta

亚马逊网络服务 API 提供了 AssumeRoleWithSAML端点以允许用户从 AWS Security Token Service 交换 SAML 断言以获得一组临时 API 凭证。

SAML 提供商,例如 Okta , 将 generate a SAML assertion after a user logs into their web UI Okta 在该用户的企业后端(例如企业 LDAP)上对该用户进行身份验证。

通常此断言然后从用户浏览器中继到另一个接受 SAML 断言的 Web 服务,即依赖方,以便向该第三方验证用户身份(例如,当使用 Okta 联合登录使用户能够登录时进入 AWS 网络控制台)

使联合用户能够使用 Okta 进行身份验证、获取断言、将该断言传递给 STS 并取回一组临时 AWS API 凭据的最佳方法是什么,用户随后可以将这些凭据与 AWS 命令​​行工具一起使用,还是使用本地 python boto 脚本?

  • 使用 Python webbrowser 从 python 工具启动网络浏览器模块?
  • 将网络浏览器中的断言转化为命令行工具可用的表单的流畅方法是什么?
  • 创建临时 ngrok隧道到本地运行的临时网络服务器(例如 flaskbottle 的实例),以便 Okta 将用户的网络浏览器重定向到,以便将断言传递给某些本地代码?
  • 人们通常如何连接交互式网页和本地命令行工具的世界?

最佳答案

GitHub 上的这个项目名为:okta-aws-cli-assume-role 是迄今为止我发现的完成此任务的最简单方法。

设置脚本

我创建了这个 shell 脚本来将它拉下来并进行设置:

$ cat okta_setup.sh
#!/bin/bash
​
print_usage() {
  echo "Usage: $(basename $0) -a <aws_account> [-h] -r <aws_role> -u <octa_username>" >&2
}
​
print_help() {
  cat <<EOF
Setup Script for Octa AWS CLI tool
==================================
​
To Execute:
​
    $(basename $0) -a <aws_account> -r <aws_role> -u <octa_username>
​
Parameters:
  -a: AWS Account to have setup with octa
  -h: Option to get help
  -r: The role to be assumed when logging into AWS
  -u: The Octa username to be used to log in

EOF
}
​
while getopts ":a:hr:u:" opt; do
  case ${opt} in
    a  )
      awsAcct=$OPTARG;;
    h  )
      print_help
      exit 0
      ;;
    r  ) awsRole=$OPTARG;;
    u  ) octaUser=$OPTARG;;
    \? )
      print_usage
      exit 1
      ;;
  esac
done
​
if [ -z "${awsAcct}" ]; then
  echo "AWS Account is required, use the -a option" >&2
  exit 2
fi
​
if [ -z "${awsRole}" ]; then
  echo "AWS Role is required, use the -r option" >&2
  exit 3
fi
​
if [ -z "${octaUser}" ]; then
  echo "Octa user is required, use the -u option" >&2
  exit 4
fi
​
########################################
### Setup AWS CLI
########################################
echo 'Setting up ~/.aws/config'
echo '------------------------'
echo ''
aws configure set credential_process "okta-credential_process arn:aws:iam::${awsAcct}:role/${awsRole}" \
    --profile "${awsRole}_${awsAcct}"
aws configure set region us-east-1 --profile "${awsRole}_${awsAcct}"
echo ''
echo "Here's the contents..."
echo '----------------------'
cat ~/.aws/config
echo ''
echo ''

########################################
### Setup Okta CLI
########################################
echo 'Setting up Okta CLI'
echo '-------------------'
echo ''
PREFIX=~/.okta bash <(curl -fsSL https://raw.githubusercontent.com/slmingol/okta-aws-cli-assume-role/master/bin/install.sh) -i
echo ''

########################################
### Create My config.properties for Okta
########################################
echo 'Setting up Okta CLI config.properties'
echo '-------------------------------------'
echo ''
cat << EOF > ~/.okta/config.properties
#OktaAWSCLI
OKTA_ORG=myurl.okta.com
OKTA_AWS_APP_URL=https://myurl.okta.com/...
OKTA_USERNAME=${octaUser}
OKTA_BROWSER_AUTH=false
OKTA_ENV_MODE=true
#OKTA_MFA_CHOICE=GOOGLE.token:software:totp
OKTA_STS_DURATION=43200
OKTA_AWS_REGION=us-east-1
OKTA_AWS_ROLE_TO_ASSUME=arn:aws:iam::${awsAcct}:role/${awsRole}
OKTA_PASSWORD_CMD=lpass show --password mydom.com
#OKTA_PASSWORD_CMD=echo "mypassword"
EOF
echo ''
echo "Here's the contents...."
echo '-----------------------'
cat ~/.okta/config.properties
echo ''
echo ''

例子

当你运行这个脚本时:

$ ./okta_setup.sh -a 1234567890 -r MySystemsAdminAccess -u smingolelli
Setting up ~/.aws/config
------------------------


Here's the contents...
----------------------
[profile MySystemsAdminAccess_1234567890]
credential_process = okta-credential_process arn:aws:iam::1234567890:role/MySystemsAdminAccess
region = us-east-1


Setting up Okta CLI
-------------------

Installing into ~/.okta
Latest release JAR file: https://github.com/oktadeveloper/okta-aws-cli-assume-role/releases/download/v2.0.4/okta-aws-cli-2.0.4.jar
Fetching JAR file → ~/.okta/okta-aws-cli-2.0.4.jar
Symlinking ~/.okta/okta-aws-cli.jar → okta-aws-cli-2.0.4.jar
Creating example ~/.okta/config.properties

Add the following to ~/.bash_profile or ~/.profile:

#OktaAWSCLI
if [[ -f "$HOME/.okta/bash_functions" ]]; then
    . "$HOME/.okta/bash_functions"
fi
if [[ -d "$HOME/.okta/bin" && ":$PATH:" != *":$HOME/.okta/bin:"* ]]; then
    PATH="$HOME/.okta/bin:$PATH"
fi

Setting up Okta CLI config.properties
-------------------------------------


Here's the contents....
-----------------------
#OktaAWSCLI
OKTA_ORG=myurl.okta.com
OKTA_AWS_APP_URL=https://myurl.okta.com/......
OKTA_USERNAME=smingolelli
OKTA_BROWSER_AUTH=false
OKTA_ENV_MODE=true
#OKTA_MFA_CHOICE=GOOGLE.token:software:totp
OKTA_STS_DURATION=43200
OKTA_AWS_REGION=us-east-1
OKTA_AWS_ROLE_TO_ASSUME=arn:aws:iam::1234567890:role/MySystemsAdminAccess
OKTA_PASSWORD_CMD=lpass show --password mydom.com
#OKTA_PASSWORD_CMD=echo "mypassword"

发生了什么事?

上面做了几件事:

  • 添加配置文件以使用 okta-cli 的 jar 作为 credential_process
  • 在目录 $HOME/.okta 中安装和配置 okta-cli
  • 配置一个正常运行的 config.properties 文件

您需要将此目录添加到您的 $HOME/.bash_profile$HOME/.bashrc 中,以便显示在您的 $PATH 中。

if [[ -d "$HOME/.okta/bin" && ":$PATH:" != *":$HOME/.okta/bin:"* ]]; then
    PATH="$HOME/.okta/bin:$PATH"
fi

获取您的 STS token

有了它,您现在可以运行 AWS CLI 命令或 Boto3 Python 脚本,它们将以交互方式提示您登录 Okta,或者这样做并为您检索 STS token 。

$ withokta "env" | grep TOK
AWS_SESSION_TOKEN=FQoGZX................5W4sIwW66bYJn9AEh6XeXO2aGKKrcy+sF

-或-

$ aws --profile MySystemsAdminAccess_1234567890 sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXX:smingolelli",
    "Account": "1234567890",
    "Arn": "arn:aws:sts::1234567890:assumed-role/MySystemsAdminAccess/smingolelli"
}

请记住,withokta "<cmd>" 可以包含您希望传统环境变量可用的任何命令:

  • AWS_SECRET_ACCESS_KEY
  • AWS_ACCESS_KEY_ID
  • AWS_SESSION_TOKEN

上面我直接调用 aws CLI 的方法使用了 Okta CLI 中包含的另一个帮助程序脚本 okta-credential_process 。这将添加到您的 $HOME/.aws/config 文件中,并引用您要承担的 AWS 角色。您可以交互式地运行它以更好地查看它在调用时返回给 aws 的内容:

$ okta-credential_process arn:aws:iam::1234567890:role/MySystemsAdminAccess
{"Expiration":"2019-09-08T00:49:45.615579Z","Version":1,"SessionToken":"XXXXXXXX","AccessKeyId":"XXXXXXXXXX","SecretAccessKey":"XXXXXXXXXX"}

有效负载是 3 个组件:

  • AWS_SECRET_ACCESS_KEY
  • AWS_ACCESS_KEY_ID
  • AWS_SESSION_TOKEN

关于python - 通过 Okta 使用 SAML 联合登录获取 STS 凭据以用于本地命令行工具的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776817/

相关文章:

python - 尽管测试重试并返回 true,断言仍失败

amazon-web-services - Dynamodb 自动缩放 terraform 导入

python - 如何使用 boto 和 python 从存储桶中删除 s3 版本

python - 如何使用 python boto 获取亚马逊 S3 中唯一文件夹的列表?

Python模块 "twill"——变量赋值期间的HTML泛滥

python - 找到等于的运行平均值

amazon-web-services - 亚马逊重新识别 : How to compare face from one image to multiple images in batch?

ios - 升级到 AWS iOS SDK 到 2.2.3 后,AWS SNS createPlatformEndpoint 返回 nil endpointArn

python - 使用 boto 在 s3 上上传图像

python - 在Watson Speech to Text API中不返回说话者标签/歧义