5

Amazon Web Services API 提供AssumeRoleWithSAML终端节点,以允许用户将 SAML 断言交换为来自 AWS Security Token Service 的一组临时 API 凭证。

SAML 提供者(如Okta)将在用户登录其 Web UI 后生成 SAML 断言,并且 Okta 在该用户的企业后端(例如企业 LDAP)上对用户进行身份验证。

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

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

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

4 回答 4

2

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
  • 在目录中安装和配置 okta-cli$HOME/.okta
  • 配置功能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 令牌

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

$ 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
于 2019-09-06T23:45:24.447 回答
0

您可能会对即将在 BSidesSF 上发表的演讲感兴趣。 https://bsidessf2015.sched.org/event/5ea95560183883cbd6d40c7d1d1d8922#.VSvuRxPF9v0

我正在开发一个守护进程,希望是一个 Mac 应用程序,它可以利用您选择的 IdP 来提取短期凭证。守护程序和应用程序可以配置为自动更新您的凭据。

-保罗

于 2015-04-13T16:28:57.300 回答
0

我还没有尝试过,但你可以看看 GitHub 上的trueaccord/aws-saml-broker项目是如何实现这一点的。他们构建了一个小型 web 应用程序,它代表 Okta 联合用户调用 STS AssumeRole API,并在屏幕上返回凭据。

有趣的是,他们似乎没有使用 AssumeRoleWithSAML 调用;相反,webapp 本身就是 SAML 端点。您可能会更新应用程序以使用该调用和/或提供更好的界面来将凭据传递给用户,而不是剪切和粘贴。

于 2015-03-02T15:50:21.160 回答
0

这似乎是一个死帖,但如果有人遇到这个问题,Okta 发布了一个 CLI 实用程序来帮助解决这个问题:https ://github.com/oktadeveloper/okta-aws-cli-assume-role

OP 最初的想法是启动 Web 浏览器并在使用 AWS API 获取 STS 令牌之前获取 SAML 断言,这也是一种有效的方法,但可能比使用已发布的客户端需要更多的努力。

于 2018-12-04T23:57:23.463 回答