gimme-aws-creds 是一个 CLI,它通过 SAML 利用 Okta IdP 通过 AWS STS 获取临时 AWS 凭证。
Okta 是一个 SAML 身份提供商 (IdP),可以轻松设置为对您的 AWS 控制台进行 SSO。 Okta 确实提供了一种 OSS java CLI 工具来获取临时 AWS 凭证,但我发现它需要比普通 Okta 用户更多的信息,并且如果拥有多个 Okta 应用程序,则无法很好地扩展。
使用 gimme-aws-creds,您只需知道您的用户名、密码、Okta url 和 MFA 令牌(如果启用了 MFA)。 gimme-aws-creds 使您可以选择要为其提供凭证的 Okta AWS 应用程序和角色。或者,您可以通过传递 -c 或编辑配置文件来预先配置应用程序和角色名称。使用部分涵盖了所有这些内容。
Okta 是 Okta, Inc. 的注册商标,此工具与 Okta, Inc. 没有任何隶属关系或赞助。
使用 AWS 应用程序将 Okta SAML 集成到 AWS
Python 3.7+
gimme-aws-creds
依赖于 ctap-keyring-device 库来支持 WebAuthn。所有已发布版本的 ctap-keyring-device 都需要 Windows 上的 winRT,它仅适用于 Python 3.9 及更低版本,并且不再维护。在支持winSDK
(winRT 的替代品)的 ctap-keyring-device 版本发布到 PyPi 或找到其他解决方案之前,WebAuthn 支持将不适用于在 Windows 上运行 Python 3.10+ 的用户。
Gimme-creds-lambda 可以用作 gimme-aws-creds 所需的 Okta API 的代理。这消除了对 Okta API 密钥的要求。 Gimme-aws-creds 使用 OpenID Connect 向 gimme-creds-lambda 进行身份验证,并且 lambda 处理与 Okta API 的所有交互。或者,您可以将OKTA_API_KEY
环境变量和gimme_creds_server
配置值设置为“internal”,以直接从 gimme-aws-creds 调用 Okta API。
这是一个 Python 3 项目。
从 PyPi 安装/升级:
pip3 install --upgrade gimme-aws-creds
或者
直接从 GitHub 安装/升级最新的 gimme-aws-creds 包:
pip3 install --upgrade git+git://github.com/Nike-Inc/gimme-aws-creds.git
或者
如果您已经克隆了源,请安装 gimme-aws-creds 包:
python -m pip install .
或者
使用自制软件
brew install gimme-aws-creds
或者
与 nix 片一起使用
# flake.nix
# Use by running `nix develop`
{
description = " Shell example " ;
inputs.flake-utils.url = " github:numtide/flake-utils " ;
inputs.nixpkgs.url = " github:nixos/nixpkgs/nixos-unstable " ;
inputs.gimme-aws-creds.url = " github:Nike-Inc/gimme-aws-creds " ;
outputs = {
self,
nixpkgs,
flake-utils,
gimme-aws-creds,
...
} @ inputs:
flake-utils.lib.eachDefaultSystem
(
system: let
pkgs = nixpkgs.legacyPackages. ${system} ;
in {
devShells.default = pkgs.mkShell {
packages = [pkgs.bash gimme-aws-creds.defaultPackage. ${system} ] ;
} ;
}
) ;
}
或者
与原装 nix 一起使用
# shell.nix
# Use by running `nix-shell`
{pkgs ? import < nixpkgs > {}, ...}:
with pkgs ; let
gimme-src = fetchgit {
name = " gimme-aws-creds " ;
url = " https://github.com/Nike-Inc/gimme-aws-creds " ;
branchName = " master " ;
sha256 = " " ; # nix-prefetch-url --unpack https://github.com/Nike-Inc/gimme-aws-creds/archive/master.tar.gz
} ;
gimme-aws-creds = import gimme-src ;
in
mkShell rec {
name = " gimme-aws-creds " ;
buildInputs = [
bash
(gimme-aws-creds.default)
] ;
}
或者
在本地构建 docker 镜像:
docker build -t gimme-aws-creds .
为了方便起见,您还可以使用 docker 为 gimme-aws-creds 命令创建别名:
# make sure you have the "~/.okta_aws_login_config" locally first!
touch ~ /.okta_aws_login_config &&
alias gimme-aws-creds= " docker run -it --rm
-v ~/.aws/credentials:/root/.aws/credentials
-v ~/.okta_aws_login_config:/root/.okta_aws_login_config
gimme-aws-creds "
通过此配置,您将能够无缝运行更多命令!
如果您使用的是 Bash 或 Zsh,则可以为 gimme-aws-creds 命令行选项和配置文件名称添加自动完成功能。要添加自动完成配置,请将以下内容添加到 .bashrc 或 .zshrc 的末尾:
.bashrc
INSTALL_DIR= $( dirname $( which gimme-aws-creds ) )
source ${INSTALL_DIR} /gimme-aws-creds-autocomplete.sh "
.zshrc
INSTALL_DIR= $( dirname $( which gimme-aws-creds ) )
autoload bashcompinit
bashcompinit
source ${INSTALL_DIR} /gimme-aws-creds-autocomplete.sh
将 gimme-aws-creds 与 OIE 域结合使用有两个选项:
这是 OIE 认证的推荐方法。它与 Okta 的 AWS 客户端使用的流程相匹配。将 gimme-aws-creds 与设备授权流程结合使用时,您将使用浏览器进行身份验证。在钥匙串中存储凭据或通过命令行传递 MFA 代码是不可能的。
要将 gimme-aws-creds 与 Okta Identity Engine (OIE) 域结合使用,您必须创建一个新的 OIDC 本机应用程序并将其连接到您的 AWS 集成应用程序。
OIDC 本机应用程序需要授权类型Authorization Code
、 Device Authorization
和Token Exchange
。这些设置位于 Okta 管理 UI 中的Applications > [the OIDC app] > General Settings > Grant type
。
与 AWS 联合应用程序的配对是在 Fed 应用程序的登录设置中实现的。这些设置位于 Okta 管理 UI 中的Applications > [the AWS Fed app] > Sign On
。确保将Allowed Web SSO Client
值设置为 OIDC 本机应用程序的客户端 ID。对您想要使用 gimme-aws-creds 访问的每个 AWS 应用程序重复该设置。
最后,在 gimme-aws-creds 中设置客户端 ID( gimme-aws-creds --action-configure
或更新配置文件中的client_id
参数)
确保对 AWS 联合应用程序和 OIDC 应用程序使用相同的身份验证策略(或至少对两者使用等效的策略规则)。如果没有,您在请求 Web SSO 令牌时将收到400 Bad Request
响应。
Okta Classic 中使用的登录流程目前仍然适用于 Okta Identity Engine 域,但有一些注意事项:
stateToken
参数。此功能已在 OIE 中删除,因此,如果您的 AWS 应用程序上的身份验证策略需要 MFA,但全局会话策略不需要(或者如果需要更高级别的 MFA 因素才能访问 AWS),则您无法使用经典身份验证登录流程。要设置配置运行:
gimme-aws-creds --action-configure
您还可以设置不同的 Okta 配置文件,如果您有多个 Okta 帐户或需要凭据的环境,这非常有用。您可以使用配置向导或运行:
gimme-aws-creds --action-configure --profile profileName
配置向导将提示您输入运行该工具所需的配置参数,唯一需要的参数是okta_org_url
。配置文件写入~/.okta_aws_login_config
,但您可以使用环境变量OKTA_CONFIG
更改位置。
https://companyname.okta.com
。OKTA_API_KEY
环境变量)~/.aws/credentials
,否则将写入 stdout。role
将使用角色 arn 的名称部分作为配置文件名称。即 arn:aws:iam::123456789012:role/okta-1234-role 成为 aws 凭证文件中的 [okta-1234-role] 部分acc
将使用帐号(如果resolve_aws_alias
设置为 y,则使用别名)作为配置文件名称。即 arn:aws:iam::123456789012:role/okta-1234-role 成为 aws 凭证文件中的 [arn:aws:iam::123456789012] 部分,或者resolve_aws_alias
[okta-1234-role] 。acc-role
将使用角色 arn 的名称组件,并在前面加上帐号(如果resolve_aws_alias
设置为 y,则为别名)以避免冲突,即 arn:aws:iam::123456789012:role/okta-1234-role成为部分 [123456789012-okta-1234-role],或者如果aws 凭证文件中的resolve_aws_alias
[okta-1234-role]default
,则临时信用将存储在默认配置文件中default
则会被多次覆盖,最后一个角色获胜。当选择role
并且您有许多具有相同角色名称的帐户时,也会发生同样的情况。如果发生这种情况,请考虑使用acc-role
。OKTA_MFA_CODE
或--mfa-code
(如果设置),或提示用户输入密码 (OTP)。Duo Push
(默认)Passcode
Phone Call
-r
或--resolve
参数在命令行中以交互方式设置此选项y
: -/some/path/administrator
。如果n
: -administrator
-m
或--remember-device
在命令行中以交互方式设置此选项json
、 export
或windows
,确定默认凭证输出格式,也可以通过--output-format FORMAT
和-o FORMAT
指定。配置文件遵循配置文件格式。默认情况下,它位于 $HOME/.okta_aws_login_config
示例文件:
[myprofile]
client_id = myclient_id
配置可以继承其他配置以共享通用配置参数。
[my-base-profile]
client_id = myclient_id
[myprofile]
inherits = my-base-profile
aws_rolename = my-role
如果您不使用 gimme-creds-lambda 也不使用 appurl 设置,请确保设置 OKTA_API_KEY 环境变量。
运行 --action-configure 后,只需运行 gimme-aws-creds。系统将提示您输入必要的信息。
$ ./gimme-aws-creds
Username: [email protected]
Password for [email protected]:
Authentication Success ! Calling Gimme-Creds Server...
Pick an app:
[ 0 ] AWS Test Account
[ 1 ] AWS Prod Account
Selection: 1
Pick a role:
[ 0 ]: OktaAWSAdminRole
[ 1 ]: OktaAWSReadOnlyRole
Selection: 1
Multi-factor Authentication required.
Pick a factor:
[ 0 ] Okta Verify App: SmartPhone_IPhone: iPhone
[ 1 ] token:software:totp: [email protected]
Selection: 0
Okta Verify push sent...
export AWS_ACCESS_KEY_ID=AQWERTYUIOP
export AWS_SECRET_ACCESS_KEY=T ! # $JFLOJlsoddop1029405-P
您可以通过在 Linux 上运行$(gimme-aws-creds)
或gimme-aws-creds | iex
来自动创建环境变量。使用 Windows Powershell 的gimme-aws-creds | iex
您可以使用--profile
参数运行特定的配置文件:
./gimme-aws-creds --profile profileName
系统提示您输入的用户名和密码是您登录 Okta 时使用的用户名和密码。您可以通过设置OKTA_USERNAME
环境变量或使用-u username
参数来预定义用户名。
如果您尚未配置 Okta 应用程序或角色,系统将提示您选择一项。
如果一切顺利,您将获得临时 AWS 访问权限、密钥和令牌,这些将被写入 stdout 或~/.aws/credentials
。
您始终可以运行gimme-aws-creds --help
以获取所有可用选项。
或者,您可以使用环境变量覆盖配置部分中的值,例如您可能想要更改令牌的持续时间。要随环境变量更改的值列表如下:
AWS_DEFAULT_DURATION
- 对应于aws_default_duration
配置AWS_SHARED_CREDENTIALS_FILE
- 用于写入凭证的文件,默认指向~/.aws/credentials
GIMME_AWS_CREDS_CLIENT_ID
- 对应于client_id
配置GIMME_AWS_CREDS_CRED_PROFILE
- 对应于cred_profile
配置GIMME_AWS_CREDS_OUTPUT_FORMAT
- 对应于output_format
配置和--output-format
CLI 选项OKTA_AUTH_SERVER
- 对应于okta_auth_server
配置OKTA_DEVICE_TOKEN
- 对应device_token
配置,可以在CI中使用OKTA_MFA_CODE
- 对应于--mfa-code
CLI 选项OKTA_PASSWORD
- 在身份验证期间提供密码,可在 CI 中使用OKTA_USERNAME
- 对应于okta_username
配置和--username
CLI 选项AWS_STS_REGION
- 强制在特定区域( us-east-1
、 eu-north-1
等)使用 STS示例: GIMME_AWS_CREDS_CLIENT_ID='foobar' AWS_DEFAULT_DURATION=12345 gimme-aws-creds
要更改此之外的变量,您需要使用gimme-aws-creds --action-configure --profile profileName
一起创建一个单独的配置文件
gimme-aws-creds --action-list-profiles
将转到您的 okta 配置文件并打印出创建的所有配置文件及其设置。
gimme-aws-creds --action-list-roles
将把所有可用角色打印到 STDOUT,而不检索其凭证。
写入 AWS 凭证文件将包含 RFC3339 格式的x_security_token_expires
值。这允许工具验证凭据是否即将过期或即将过期,并警告用户或触发刷新。
gimme-aws-creds -o json
将以 JSON 格式打印凭证 - 每行 1 个条目
gimme-aws-creds --action-store-json-creds
会将 JSON 格式的凭证从stdin
存储到 aws 凭证文件,例如: gimme-aws-creds -o json | gimme-aws-creds --action-store-json-creds
。数据可以通过脚本在途中修改。
可以使用gimme_aws_creds.ui
配置配置和交互,UserInterfaces 支持库内的所有类型的交互,包括:请求输入、 sys.argv
和os.environ
覆盖。
import sys
import gimme_aws_creds . main
import gimme_aws_creds . ui
account_ids = sys . argv [ 1 :] or [
'123456789012' ,
'120123456789' ,
]
pattern = "|" . join ( sorted ( set ( account_ids )))
pattern = '/:({}):/' . format ( pattern )
ui = gimme_aws_creds . ui . CLIUserInterface ( argv = [ sys . argv [ 0 ], '--roles' , pattern ])
creds = gimme_aws_creds . main . GimmeAWSCreds ( ui = ui )
# Print out all selected roles:
for role in creds . aws_selected_roles :
print ( role )
# Generate credentials overriding profile name with `okta-`
for data in creds . iter_selected_aws_credentials ():
arn = data [ 'role' ][ 'arn' ]
account_id = None
for piece in arn . split ( ':' ):
if len ( piece ) == 12 and piece . isdigit ():
account_id = piece
break
if account_id is None :
raise ValueError ( "Didn't find aws_account_id (12 digits) in {}" . format ( arn ))
data [ 'profile' ][ 'name' ] = 'okta-{}' . format ( account_id )
creds . write_aws_creds_from_data ( data )
gimme-aws-creds 适用于启用 FIDO1 的组织和启用 WebAuthN 的组织
请注意,随着标准转向 WebAuthN,FIDO1 可能会在不久的将来被弃用
WebAuthN 支持可用于 USB 安全密钥(gimme-aws-creds 依赖于 yubico fido2 lib)。
要将本地计算机与 Touch ID 或 Windows Hello(如果可用)一起用作身份验证器,您必须通过 gimme-aws-creds 注册新的身份验证器,使用:
gimme-aws-creds --action-setup-fido-authenticator
然后,您可以从因素列表中选择新注册的验证器。
您可以使用 pytest 运行所有单元测试。大多数测试都是嘲笑的。
pytest -vv tests
该项目由 Eric Pierce 维护
当我搜索通过 Okta 生成 AWS 令牌的 CLI 工具时,我遇到了 Joe Keegan 编写的 okta_aws_login。不幸的是,它自 2015 年以来就没有更新过,并且似乎不适用于当前的 Okta 版本。但在 MIT 许可下,我仍然可以重用一些很棒的代码作为 gimme-aws-creds。我在评论中指出了我使用他的代码的地方,以确保他获得适当的信用。
okta-aws-cli
okta-aws-cli-承担角色
AWS - 如何使用 SAML 2.0 和 AD FS 实施联合 API 和 CLI 访问
Gimme AWS Creds 是根据 Apache 许可证版本 2.0 发布的