gimme-aws-creds é uma CLI que utiliza um IdP Okta via SAML para adquirir credenciais temporárias da AWS por meio do AWS STS.
Okta é um provedor de identidade SAML (IdP), que pode ser facilmente configurado para fazer SSO em seu console AWS. Okta oferece uma ferramenta OSS java CLI para obter credenciais temporárias da AWS, mas descobri que ela precisa de mais informações do que o usuário médio do Okta teria e não escala bem se tiver mais de um aplicativo Okta.
Com gimme-aws-creds tudo que você precisa saber é seu nome de usuário, senha, url Okta e token MFA, se o MFA estiver habilitado. gimme-aws-creds oferece a opção de selecionar para qual aplicativo e função Okta AWS você deseja credenciais. Alternativamente, você pode pré-configurar o aplicativo e o nome da função passando -c ou editando o arquivo de configuração. Tudo isso é abordado na seção de uso.
Okta é uma marca registrada da Okta, Inc. e esta ferramenta não tem afiliação ou patrocínio da Okta, Inc.
Integração Okta SAML com AWS usando o aplicativo AWS
Python 3.7+
gimme-aws-creds
depende da biblioteca ctap-keyring-device para suporte WebAuthn. Todas as versões lançadas do ctap-keyring-device requerem winRT no Windows, que funciona apenas no Python 3.9 e inferior e não é mais mantido. Até que uma versão do ctap-keyring-device que suporte winSDK
(o substituto do winRT) seja lançada para PyPi, ou alguma outra solução seja encontrada, o suporte WebAuthn não estará disponível para pessoas que executam Python 3.10+ no Windows.
Gimme-creds-lambda pode ser usado como um proxy para as APIs Okta necessárias para gimme-aws-creds. Isso remove o requisito de uma chave de API Okta. Gimme-aws-creds autentica-se para gimme-creds-lambda usando OpenID Connect e o lambda lida com todas as interações com as APIs Okta. Como alternativa, você pode definir a variável de ambiente OKTA_API_KEY
e o valor de configuração gimme_creds_server
como 'internal' para chamar as APIs Okta diretamente de gimme-aws-creds.
Este é um projeto Python 3.
Instalar/atualizar do PyPi:
pip3 install --upgrade gimme-aws-creds
OU
Instale/atualize o pacote gimme-aws-creds mais recente direto do GitHub:
pip3 install --upgrade git+git://github.com/Nike-Inc/gimme-aws-creds.git
OU
Instale o pacote gimme-aws-creds se você já tiver clonado a fonte:
python -m pip install .
OU
Usar cerveja caseira
brew install gimme-aws-creds
OU
Use com flocos 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} ] ;
} ;
}
) ;
}
OU
Use com nix original
# 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)
] ;
}
OU
Crie a imagem do Docker localmente:
docker build -t gimme-aws-creds .
Para facilitar, você também pode criar um alias para o comando gimme-aws-creds com docker:
# 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 "
Com esta configuração, você poderá executar outros comandos perfeitamente!
Se estiver usando Bash ou Zsh, você pode adicionar preenchimento automático para as opções de linha de comando gimme-aws-creds e nomes de perfil. Para adicionar a configuração de preenchimento automático, adicione o seguinte ao final do seu .bashrc ou .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
Existem duas opções para usar gimme-aws-creds com um domínio OIE:
Este é o método recomendado para autenticação junto à OIE. Corresponde ao fluxo usado pelo cliente AWS da Okta. Ao usar gimme-aws-creds com o fluxo de autorização de dispositivo, você autenticará usando seu navegador. Armazenar credenciais nas chaves ou passar códigos MFA pela linha de comando NÃO É POSSÍVEL.
Para usar gimme-aws-creds com um domínio Okta Identity Engine (OIE), você deve criar um novo aplicativo nativo OIDC e conectá-lo ao(s) seu(s) aplicativo(s) de integração AWS.
O aplicativo nativo OIDC requer Authorization Code
tipos de concessão, Device Authorization
e Token Exchange
. Essas configurações estão na UI do administrador do Okta em Applications > [the OIDC app] > General Settings > Grant type
.
O emparelhamento com o aplicativo da Federação AWS é obtido nas configurações de login do aplicativo Fed. Essas configurações estão na UI do administrador do Okta em Applications > [the AWS Fed app] > Sign On
. Certifique-se de definir o valor Allowed Web SSO Client
como o ID do Cliente do Aplicativo Nativo OIDC. Repita essa configuração para cada aplicativo AWS que você deseja acessar com gimme-aws-creds.
Por fim, defina o ID do cliente em gimme-aws-creds ( gimme-aws-creds --action-configure
ou atualize o parâmetro client_id
em seu arquivo de configuração)
Certifique-se de usar a mesma política de autenticação para o aplicativo de Federação AWS e o aplicativo OIDC (ou pelo menos use regras de política equivalentes para ambos). Caso contrário, você receberá uma resposta 400 Bad Request
ao solicitar o token Web SSO.
O fluxo de login usado no Okta Classic atualmente ainda funciona com domínios do Okta Identity Engine, MAS há algumas ressalvas:
stateToken
ao solicitar autenticação "step-up". Esse recurso foi removido no OIE, portanto, se a política de autenticação em seu(s) aplicativo(s) AWS exigir MFA, mas a Política de Sessão Global não (ou se um nível mais alto de fator MFA for necessário para acessar a AWS), você não poderá autenticar usando o clássico fluxo de login.Para definir a configuração, execute:
gimme-aws-creds --action-configure
Você também pode configurar diferentes perfis de configuração do Okta, o que é útil se você tiver várias contas ou ambientes do Okta para os quais precisa de credenciais. Você pode usar o assistente de configuração ou executar:
gimme-aws-creds --action-configure --profile profileName
Um assistente de configuração solicitará que você insira os parâmetros de configuração necessários para a execução da ferramenta, o único necessário é okta_org_url
. O arquivo de configuração é gravado em ~/.okta_aws_login_config
, mas você pode alterar o local com a variável de ambiente OKTA_CONFIG
.
https://companyname.okta.com
.OKTA_API_KEY
necessária)~/.aws/credentials
, caso contrário, serão gravadas em stdout.role
usará o componente name da função arn como o nome do perfil. ou seja, arn:aws:iam::123456789012:role/okta-1234-role torna-se a seção [okta-1234-role] no arquivo de credenciais do awsacc
usará o número da conta (ou alias se resolve_aws_alias
estiver definido como y) como nome do perfil. ou seja, arn:aws:iam::123456789012:role/okta-1234-role torna-se a seção [arn:aws:iam::123456789012] ou se resolve_aws_alias
[okta-1234-role] no arquivo de credenciais do aws.acc-role
usará o componente de nome da função arn precedido pelo número da conta (ou alias se resolve_aws_alias
estiver definido como y) para evitar colisões, ou seja, arn:aws:iam::123456789012:role/okta-1234-role torna-se seção [123456789012-okta-1234-role], ou se resolve_aws_alias
[okta-1234-role] no arquivo de credenciais do awsdefault
, os créditos temporários serão armazenados no perfil padrãodefault
for selecionado, ele será substituído diversas vezes e a última função vencerá. O mesmo acontece quando role
é selecionada e você tem muitas contas com os mesmos nomes de função. Considere usar acc-role
se isso acontecer.OKTA_MFA_CODE
ou --mfa-code
se definido, ou solicita a senha do usuário (OTP).Duo Push
(padrão)Passcode
Phone Call
-r
ou --resolve
y
: -/some/path/administrator
. Se n
: -administrator
-m
ou --remember-device
json
, export
ou windows
, determina o formato de saída da credencial padrão, também pode ser especificado por --output-format FORMAT
e -o FORMAT
.O arquivo de configuração segue um formato de arquivo de configuração. Por padrão, ele está localizado em $HOME/.okta_aws_login_config
Arquivo de exemplo:
[myprofile]
client_id = myclient_id
As configurações podem herdar de outras configurações para compartilhar parâmetros de configuração comuns.
[my-base-profile]
client_id = myclient_id
[myprofile]
inherits = my-base-profile
aws_rolename = my-role
Se você não estiver usando gimme-creds-lambda nem configurações appurl, certifique-se de definir a variável de ambiente OKTA_API_KEY.
Depois de executar --action-configure, basta executar gimme-aws-creds. Você será solicitado a fornecer as informações necessárias.
$ ./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
Você pode automatizar a criação de variáveis de ambiente executando $(gimme-aws-creds)
no Linux ou gimme-aws-creds | iex
usando Windows Powershell
Você pode executar um perfil de configuração específico com o parâmetro --profile
:
./gimme-aws-creds --profile profileName
O nome de usuário e a senha solicitados são aqueles com os quais você faz login no Okta. Você pode predefinir seu nome de usuário definindo a variável de ambiente OKTA_USERNAME
ou usando o parâmetro -u username
.
Se você não configurou um aplicativo ou função Okta, será solicitado que você selecione um.
Se tudo correr bem, você obterá acesso temporário à AWS, chave secreta e token, que serão gravados em stdout ou ~/.aws/credentials
.
Você sempre pode executar gimme-aws-creds --help
para todas as opções disponíveis.
Como alternativa, você pode substituir os valores na seção de configuração por variáveis de ambiente para instâncias em que você deseja alterar a duração do seu token. Uma lista de valores a serem alterados com variáveis de ambiente são:
AWS_DEFAULT_DURATION
- corresponde à configuração aws_default_duration
AWS_SHARED_CREDENTIALS_FILE
- arquivo para gravar credenciais, aponta para ~/.aws/credentials
por padrãoGIMME_AWS_CREDS_CLIENT_ID
- corresponde à configuração client_id
GIMME_AWS_CREDS_CRED_PROFILE
- corresponde à configuração cred_profile
GIMME_AWS_CREDS_OUTPUT_FORMAT
- corresponde à configuração output_format
e à opção CLI --output-format
OKTA_AUTH_SERVER
- corresponde à configuração okta_auth_server
OKTA_DEVICE_TOKEN
- corresponde à configuração device_token
, pode ser usado em CIOKTA_MFA_CODE
- corresponde à opção CLI --mfa-code
OKTA_PASSWORD
- fornece senha durante a autenticação, pode ser usado em CIOKTA_USERNAME
- corresponde à configuração okta_username
e à opção --username
CLIAWS_STS_REGION
- força o uso do STS em uma região específica ( us-east-1
, eu-north-1
, etc.) Exemplo: GIMME_AWS_CREDS_CLIENT_ID='foobar' AWS_DEFAULT_DURATION=12345 gimme-aws-creds
Para alterar variáveis fora disso, você precisará criar um perfil separado com gimme-aws-creds --action-configure --profile profileName
gimme-aws-creds --action-list-profiles
irá para o seu arquivo de configuração okta e imprimirá todos os perfis criados e suas configurações.
gimme-aws-creds --action-list-roles
imprimirá todas as funções disponíveis em STDOUT sem recuperar suas credenciais.
A gravação no arquivo de credenciais da AWS incluirá o valor x_security_token_expires
no formato RFC3339. Isso permite que as ferramentas validem se as credenciais estão expirando ou expirando em breve e avisem o usuário ou acionem uma atualização.
gimme-aws-creds -o json
imprimirá credenciais no formato JSON - 1 entrada por linha
gimme-aws-creds --action-store-json-creds
armazenará credenciais formatadas JSON de stdin
para arquivo de credenciais aws, por exemplo: gimme-aws-creds -o json | gimme-aws-creds --action-store-json-creds
. Os dados podem ser modificados por scripts no caminho.
A configuração e as interações podem ser configuradas usando gimme_aws_creds.ui
. UserInterfaces suportam todos os tipos de interações dentro da biblioteca, incluindo: solicitação de entrada, substituições de sys.argv
e 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 funciona tanto em organizações habilitadas para FIDO1 quanto em organizações habilitadas para WebAuthN
Observe que o FIDO1 provavelmente será descontinuado em um futuro próximo, à medida que os padrões avançam para WebAuthN
O suporte WebAuthN está disponível para chaves de segurança USB (gimme-aws-creds depende da lib yubico fido2).
Para usar sua máquina local como autenticador, junto com Touch ID ou Windows Hello, se disponível, você deve registrar um novo autenticador via gimme-aws-creds, usando:
gimme-aws-creds --action-setup-fido-authenticator
Então, você pode escolher o autenticador recém-registrado na lista de fatores.
Você pode executar todos os testes de unidade usando pytest. A maioria dos testes é ridicularizada.
pytest -vv tests
Este projeto é mantido por Eric Pierce
Me deparei com okta_aws_login escrito por Joe Keegan, quando estava procurando uma ferramenta CLI que gerasse tokens AWS via Okta. Infelizmente, ele não é atualizado desde 2015 e parece não funcionar com a versão atual do Okta. Mas ainda havia alguns códigos excelentes que pude reutilizar sob a licença do MIT para gimme-aws-creds. Anotei nos comentários onde usei o código dele, para garantir que ele receba o devido crédito.
okta-aws-cli
okta-aws-cli-assumir-role
AWS - Como implementar API federada e acesso CLI usando SAML 2.0 e AD FS
Gimme AWS Creds é lançado sob a licença Apache, versão 2.0