gimme-aws-creds es una CLI que utiliza un IdP de Okta a través de SAML para adquirir credenciales temporales de AWS a través de AWS STS.
Okta es un proveedor de identidad (IdP) SAML que se puede configurar fácilmente para realizar SSO en su consola de AWS. Okta ofrece una herramienta OSS java CLI para obtener credenciales temporales de AWS, pero descubrí que necesita más información que la que tendría el usuario promedio de Okta y no escala bien si tiene más de una aplicación Okta.
Con gimme-aws-creds, todo lo que necesita saber es su nombre de usuario, contraseña, URL de Okta y token MFA, si MFA está habilitado. gimme-aws-creds le brinda la opción de seleccionar para qué aplicación y rol de Okta AWS desea obtener credenciales. Alternativamente, puede preconfigurar la aplicación y el nombre del rol pasando -c o editando el archivo de configuración. Todo esto está cubierto en la sección de uso.
Okta es una marca registrada de Okta, Inc. y esta herramienta no tiene afiliación ni patrocinio de Okta, Inc.
Integración de Okta SAML a AWS mediante la aplicación AWS
Pitón 3.7+
gimme-aws-creds
depende de la biblioteca ctap-keyring-device para la compatibilidad con WebAuthn. Todas las versiones publicadas de ctap-keyring-device requieren winRT en Windows, que solo funciona en Python 3.9 y versiones anteriores y ya no se mantiene. Hasta que se lance a PyPi una versión de ctap-keyring-device que admita winSDK
(el reemplazo de winRT), o se encuentre alguna otra solución, la compatibilidad con WebAuthn no estará disponible para las personas que ejecutan Python 3.10+ en Windows.
Gimme-creds-lambda se puede utilizar como proxy de las API de Okta que necesita gimme-aws-creds. Esto elimina el requisito de una clave API de Okta. Gimme-aws-creds se autentica en gimme-creds-lambda mediante OpenID Connect y lambda maneja todas las interacciones con las API de Okta. Como alternativa, puede configurar la variable de entorno OKTA_API_KEY
y el valor de configuración gimme_creds_server
en "interno" para llamar a las API de Okta directamente desde gimme-aws-creds.
Este es un proyecto de Python 3.
Instalar/Actualizar desde PyPi:
pip3 install --upgrade gimme-aws-creds
O
Instale/actualice el último paquete gimme-aws-creds directamente desde GitHub:
pip3 install --upgrade git+git://github.com/Nike-Inc/gimme-aws-creds.git
O
Instale el paquete gimme-aws-creds si ya ha clonado la fuente:
python -m pip install .
O
usar cerveza casera
brew install gimme-aws-creds
O
Usar con hojuelas 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} ] ;
} ;
}
) ;
}
O
Usar con 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)
] ;
}
O
Cree la imagen de la ventana acoplable localmente:
docker build -t gimme-aws-creds .
Para hacerlo más fácil, también puedes crear un alias para el comando gimme-aws-creds con 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 "
¡Con esta configuración, podrás ejecutar más comandos sin problemas!
Si está utilizando Bash o Zsh, puede agregar el autocompletado para las opciones de línea de comandos y los nombres de perfil de gimme-aws-creds. Para agregar la configuración de autocompletar, agregue lo siguiente al final de su .bashrc o .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
Hay dos opciones para utilizar gimme-aws-creds con un dominio de la OIE:
Este es el método recomendado para la autenticación ante la OIE. Coincide con el flujo utilizado por el cliente AWS de Okta. Cuando utilice gimme-aws-creds con el flujo de autorización del dispositivo, se autenticará mediante su navegador. NO ES POSIBLE almacenar credenciales en un llavero o pasar códigos MFA a través de la línea de comandos.
Para utilizar gimme-aws-creds con un dominio Okta Identity Engine (OIE), debe crear una nueva aplicación nativa OIDC y conectarla a sus aplicaciones de integración de AWS.
La aplicación nativa OIDC requiere Authorization Code
de tipos de concesión, Device Authorization
e Token Exchange
. Estas configuraciones se encuentran en la interfaz de usuario de Okta Admin en Applications > [the OIDC app] > General Settings > Grant type
.
El emparejamiento con la aplicación de federación de AWS se logra en la configuración de inicio de sesión de la aplicación Fed. Estas configuraciones se encuentran en la interfaz de usuario de Okta Admin en Applications > [the AWS Fed app] > Sign On
. Asegúrese de establecer el valor Allowed Web SSO Client
en el ID de cliente de la aplicación nativa OIDC. Repita esa configuración para cada aplicación de AWS a la que desee acceder con gimme-aws-creds.
Finalmente, configure el ID del cliente en gimme-aws-creds ( gimme-aws-creds --action-configure
o actualice el parámetro client_id
en su archivo de configuración)
Asegúrese de utilizar la misma política de autenticación tanto para la aplicación de federación de AWS como para la aplicación OIDC (o al menos utilice reglas de política equivalentes para ambas). De lo contrario, recibirá una respuesta 400 Bad Request
cuando solicite el token de SSO web.
El flujo de inicio de sesión utilizado en Okta Classic actualmente todavía funciona con los dominios de Okta Identity Engine, PERO hay un par de advertencias:
stateToken
cuando solicita autenticación "intensiva". Esta capacidad se eliminó en OIE, por lo que si la política de autenticación en sus aplicaciones de AWS requiere MFA pero la Política de sesión global no (o si se requiere un nivel más alto de factor MFA para acceder a AWS), no puede autenticarse usando el método clásico. flujo de inicio de sesión.Para configurar la ejecución, ejecute:
gimme-aws-creds --action-configure
También puede configurar diferentes perfiles de configuración de Okta, esto es útil si tiene varias cuentas o entornos de Okta para los que necesita credenciales. Puede utilizar el asistente de configuración o ejecutar:
gimme-aws-creds --action-configure --profile profileName
Un asistente de configuración le pedirá que ingrese los parámetros de configuración necesarios para que se ejecute la herramienta; el único requerido es okta_org_url
. El archivo de configuración está escrito en ~/.okta_aws_login_config
, pero puede cambiar la ubicación con la variable de entorno OKTA_CONFIG
.
https://companyname.okta.com
.OKTA_API_KEY
)~/.aws/credentials
; de lo contrario, se escribirán en la salida estándar.role
utilizará el componente de nombre del rol arn como nombre del perfil. es decir, arn:aws:iam::123456789012:role/okta-1234-role se convierte en la sección [okta-1234-role] en el archivo de credenciales de AWSacc
utilizará el número de cuenta (o alias si resolve_aws_alias
está configurado en y) como nombre del perfil. es decir, arn:aws:iam::123456789012:role/okta-1234-role se convierte en la sección [arn:aws:iam::123456789012] o si resolve_aws_alias
[okta-1234-role] en el archivo de credenciales de AWS.acc-role
utilizará el componente de nombre del rol antepuesto por el número de cuenta (o alias si resolve_aws_alias
está configurado en y) para evitar colisiones, es decir, arn:aws:iam::123456789012:role/okta-1234-role se convierte en la sección [123456789012-okta-1234-role], o si resolve_aws_alias
[okta-1234-role] en el archivo de credenciales de AWSdefault
, las credenciales temporales se almacenarán en el perfil predeterminado.default
se sobrescribirá varias veces y prevalecerá el último rol. Lo mismo sucede cuando se selecciona role
y tienes muchas cuentas con los mismos nombres de rol. Considere usar acc-role
si esto sucede.OKTA_MFA_CODE
o --mfa-code
si está configurado, o solicita al usuario el código de acceso (OTP).Duo Push
(predeterminado)Passcode
Phone Call
-r
o --resolve
y
: -/some/path/administrator
. Si n
: -administrator
-m
o --remember-device
json
, export
o windows
, determina el formato de salida de credenciales predeterminado, también se puede especificar mediante --output-format FORMAT
y -o FORMAT
.El archivo de configuración sigue un formato de archivo de configuración. De forma predeterminada, se encuentra en $HOME/.okta_aws_login_config
Archivo de ejemplo:
[myprofile]
client_id = myclient_id
Las configuraciones pueden heredar de otras configuraciones para compartir parámetros de configuración comunes.
[my-base-profile]
client_id = myclient_id
[myprofile]
inherits = my-base-profile
aws_rolename = my-role
Si no está utilizando gimme-creds-lambda ni la configuración de appurl, asegúrese de configurar la variable de entorno OKTA_API_KEY.
Después de ejecutar --action-configure, simplemente ejecute gimme-aws-creds. Se le solicitará la información necesaria.
$ ./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
Puede automatizar la creación de variables de entorno ejecutando $(gimme-aws-creds)
en Linux o gimme-aws-creds | iex
usando Windows Powershell
Puede ejecutar un perfil de configuración específico con el parámetro --profile
:
./gimme-aws-creds --profile profileName
El nombre de usuario y la contraseña que se le solicita son con los que inicia sesión en Okta. Puede predefinir su nombre de usuario configurando la variable de entorno OKTA_USERNAME
o utilizando el parámetro -u username
.
Si no ha configurado una aplicación o función de Okta, se le pedirá que seleccione una.
Si todo va bien, obtendrá su acceso temporal a AWS, su clave secreta y su token, que se escribirán en stdout o ~/.aws/credentials
.
Siempre puedes ejecutar gimme-aws-creds --help
para todas las opciones disponibles.
Alternativamente, puede sobrescribir los valores en la sección de configuración con variables de entorno en los casos en los que, por ejemplo, desee cambiar la duración de su token. Una lista de valores para cambiar con variables de entorno es:
AWS_DEFAULT_DURATION
: corresponde a la configuración de aws_default_duration
AWS_SHARED_CREDENTIALS_FILE
: archivo para escribir credenciales, apunta a ~/.aws/credentials
de forma predeterminadaGIMME_AWS_CREDS_CLIENT_ID
: corresponde a la configuración client_id
GIMME_AWS_CREDS_CRED_PROFILE
: corresponde a la configuración cred_profile
GIMME_AWS_CREDS_OUTPUT_FORMAT
: corresponde a la configuración de output_format
y la opción CLI --output-format
OKTA_AUTH_SERVER
: corresponde a la configuración de okta_auth_server
OKTA_DEVICE_TOKEN
: corresponde a la configuración device_token
, se puede usar en CIOKTA_MFA_CODE
: corresponde a la opción CLI --mfa-code
OKTA_PASSWORD
: proporciona una contraseña durante la autenticación, se puede usar en CIOKTA_USERNAME
: corresponde a la configuración okta_username
y a la opción CLI --username
AWS_STS_REGION
: fuerza el uso de STS en una región específica ( us-east-1
, eu-north-1
, etc.) Ejemplo: GIMME_AWS_CREDS_CLIENT_ID='foobar' AWS_DEFAULT_DURATION=12345 gimme-aws-creds
Para cambiar variables fuera de esto, deberá crear un perfil completamente separado con gimme-aws-creds --action-configure --profile profileName
gimme-aws-creds --action-list-profiles
irá a su archivo de configuración de okta e imprimirá todos los perfiles creados y sus configuraciones.
gimme-aws-creds --action-list-roles
imprimirá todos los roles disponibles en STDOUT sin recuperar sus credenciales.
Escribir en el archivo de credenciales de AWS incluirá el valor x_security_token_expires
en formato RFC3339. Esto permite que las herramientas validen si las credenciales están caducando o caducan pronto y advierten al usuario o activan una actualización.
gimme-aws-creds -o json
imprimirá las credenciales en formato JSON: 1 entrada por línea
gimme-aws-creds --action-store-json-creds
almacenará las credenciales con formato JSON desde stdin
al archivo de credenciales de aws, por ejemplo: gimme-aws-creds -o json | gimme-aws-creds --action-store-json-creds
. Los datos se pueden modificar mediante scripts en el camino.
La configuración y las interacciones se pueden configurar usando gimme_aws_creds.ui
. Las interfaces de usuario admiten todo tipo de interacciones dentro de la biblioteca, incluidas: solicitud de entrada, anulaciones sys.argv
y 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 en organizaciones habilitadas para FIDO1 como en organizaciones habilitadas para WebAuthN
Tenga en cuenta que FIDO1 probablemente quedará obsoleto en un futuro próximo a medida que los estándares avancen hacia WebAuthN.
La compatibilidad con WebAuthN está disponible para claves de seguridad USB (gimme-aws-creds se basa en la biblioteca yubico fido2).
Para usar su máquina local como autenticador, junto con Touch ID o Windows Hello, si está disponible, debe registrar un nuevo autenticador a través de gimme-aws-creds, usando:
gimme-aws-creds --action-setup-fido-authenticator
Luego, puede elegir el autenticador recién registrado de la lista de factores.
Puede ejecutar todas las pruebas unitarias usando pytest. Se burlan de la mayoría de las pruebas.
pytest -vv tests
Este proyecto es mantenido por Eric Pierce.
Encontré okta_aws_login escrito por Joe Keegan, cuando estaba buscando una herramienta CLI que genera tokens de AWS a través de Okta. Desafortunadamente, no se ha actualizado desde 2015 y no parecía funcionar con la versión actual de Okta. Pero todavía había un código excelente que pude reutilizar bajo la licencia del MIT para gimme-aws-creds. He anotado en los comentarios dónde utilicé su código para asegurarme de que reciba el crédito adecuado.
okta-aws-cli
okta-aws-cli-asumir-rol
AWS: cómo implementar el acceso CLI y API federado mediante SAML 2.0 y AD FS
Gimme AWS Creds se publica bajo la licencia Apache, versión 2.0