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 發布的