亚马逊网络服务 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隧道到本地运行的临时网络服务器(例如 flask 或 bottle 的实例),以便 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/