Aardvark es una API de AWS IAM Access Advisor de múltiples cuentas (y una capa de almacenamiento en caché).
Asegúrese de tener Python 3.6 o posterior. Python 2 ya no es compatible.
git clone https://github.com/Netflix-Skunkworks/aardvark.git
cd aardvark
python3 -m venv env
. env/bin/activate
python setup.py develop
El asistente de configuración de Aardvark lo guiará a través de la configuración.
% aardvark config
Aardvark can use SWAG to look up accounts. https://github.com/Netflix-Skunkworks/swag-client
Do you use SWAG to track accounts? [yN]: no
ROLENAME: Aardvark
DATABASE [sqlite:////home/github/aardvark/aardvark.db]:
# Threads [5]:
>> Writing to config.py
aardvark create_db
Aardvark necesita una función de IAM en cada cuenta que se consultará. Además, Aardvark debe iniciarse con un rol o usuario que pueda sts:AssumeRole
en los diferentes roles de la cuenta.
Perfil de instancia de Aardvark:
sts:AssumeRole
en todos los AardvarkRoleOso hormigueroPapel:
AardvarkInstanceProfile
. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
Entonces, si estás monitoreando n
cuentas, siempre necesitarás n+1
roles. ( n
AardvarkRoles y 1
AardvarkInstanceProfile).
Nota: Para ejecutar aardvark localmente, no es necesario ocuparse de AardvarkInstanceProfile. En su lugar, simplemente adjunte una política que contenga "sts:AssumeRole" al usuario que está utilizando en la CLI de AWS para asumir el rol de Aardvark. Además, el mismo usuario debe mencionarse en la política de confianza de Aardvark Role para la asignación adecuada de privilegios.
Probablemente desee actualizar los datos de Access Advisor periódicamente. Recomendamos ejecutar el comando update
aproximadamente una vez al día. Cron funciona muy bien para esto.
Si no tiene SWAG, puede pasar números de cuenta separados por comas:
aardvark update -a 123456789012,210987654321
Aardvark puede usar SWAG para buscar cuentas, por lo que puedes competir contra todos con:
aardvark update
o por nombre/etiqueta de cuenta con:
aardvark update -a dev,test,prod
aardvark start_api -b 0.0.0.0:5000
En producción, es probable que desee tener algo como un supervisor que inicie la API por usted.
Swagger está disponible para la API en <Aardvark_Host>/apidocs/#!
.
Aardvark responde a solicitudes de obtención/publicación. Todos los resultados están paginados y la paginación se puede controlar pasando argumentos count
y/o page
. A continuación se muestran algunos ejemplos de consultas:
curl localhost:5000/api/1/advisors
curl localhost:5000/api/1/advisors ? phrase=SecurityMonkey
curl localhost:5000/api/1/advisors ? arn=arn:aws:iam::000000000000:role/SecurityMonkey & arn=arn:aws:iam::111111111111:role/SecurityMonkey
curl localhost:5000/api/1/advisors ? regex=^. * Monkey$
Aardvark también se puede implementar con Docker y Docker Compose. Los servicios de Aardvark se basan en un contenedor compartido. Necesitará tener Docker y Docker Compose instalados para que esto funcione.
Para configurar los contenedores para su conjunto de cuentas, cree un archivo .env
en la raíz de este directorio. Defina las variables de entorno dentro de este archivo. Este ejemplo utiliza claves de acceso de AWS. Recomendamos utilizar roles de instancia en producción.
AARDVARK_ROLE=Aardvark
AARDVARK_ACCOUNTS=<account id>
AWS_DEFAULT_REGION=<aws region>
AWS_ACCESS_KEY_ID=<your access key>
AWS_SECRET_ACCESS_KEY=<you secret key>
Nombre | Servicio | Descripción |
---|---|---|
AARDVARK_ROLE | collector | El nombre del rol que debe asumir Aardvark para poder recopilar los datos. |
AARDVARK_ACCOUNTS | collector | Opcional si se usa SWAG; de lo contrario, se requiere. Establezca esto en una lista de etiquetas de nombre de cuenta SWAG o una lista de números de cuenta de AWS de los cuales recopilar registros de Access Advisor. |
AWS_ARN_PARTITION | collector | Obligatorio si no se utiliza una región comercial de AWS. Por ejemplo, aws-us-gov . De forma predeterminada, esto es aws . |
AWS_DEFAULT_REGION | collector | Requerido si no se ejecuta en una instancia EC2 con un perfil de instancia apropiado. Configúrelos con las credenciales de un usuario de AWS IAM con permiso para sts:AssumeRole para el rol de auditoría de Aardvark. |
AWS_ACCESS_KEY_ID | collector | Requerido si no se ejecuta en una instancia EC2 con un perfil de instancia apropiado. Configúrelos con las credenciales de un usuario de AWS IAM con permiso para sts:AssumeRole para el rol de auditoría de Aardvark. |
AWS_SECRET_ACCESS_KEY | collector | Requerido si no se ejecuta en una instancia EC2 con un perfil de instancia apropiado. Configúrelos con las credenciales de un usuario de AWS IAM con permiso para sts:AssumeRole para el rol de auditoría de Aardvark. |
AARDVARK_DATABASE_URI | collector y apiserver | Especifique un URI de base de datos personalizado compatible con SQL Alchemy. De forma predeterminada, esto utilizará el valor AARDVARK_DATA_DIR para crear una base de datos SQLLite. Ejemplo: sqlite:///$AARDVARK_DATA_DIR/aardvark.db |
Una vez creado este archivo, cree los contenedores e inicie los servicios. Aardvark consta de tres servicios:
# build the containers
docker-compose build
# start up the containers
docker-compose up
Finalmente, para limpiar el medio ambiente.
# bring down the containers
docker-compose down
# remove the containers
docker-compoes rm
Aardvark lanzará la cantidad de subprocesos especificados en la configuración. Cada uno de estos subprocesos recuperará datos de Access Advisor para una cuenta y luego conservará los datos.
La consulta de regex
solo es compatible con Postgres (de forma nativa) y SQLite (a través de alguna magia cortesía de Xion en el archivo sqla_regex
).
Recomendamos habilitar TLS para cualquier servicio. Las instrucciones para configurar TLS están fuera del alcance de este documento.
Nuevo en v0.3.1
Aardvark usa Blinker para señales en su proceso de actualización. Estas señales se pueden utilizar para cosas como emitir métricas, registros adicionales o realizar más acciones en las cuentas. Puede usarlos escribiendo un script que defina sus controladores y llame aardvark.manage.main()
. Por ejemplo, cree un archivo llamado signals_example.py
con el siguiente contenido:
import logging
from aardvark . manage import main
from aardvark . updater import AccountToUpdate
logger = logging . getLogger ( 'aardvark_signals' )
@ AccountToUpdate . on_ready . connect
def handle_on_ready ( sender ):
logger . info ( f"got on_ready from { sender } " )
@ AccountToUpdate . on_complete . connect
def handle_on_complete ( sender ):
logger . info ( f"got on_complete from { sender } " )
if __name__ == "__main__" :
main ()
Este archivo ahora se puede invocar de la misma manera que manage.py
:
python signals_example.py update -a cool_account
La salida del registro será similar a la siguiente:
INFO: getting bucket swag-bucket
INFO: Thread #1 updating account 123456789012 with all arns
INFO: got on_ready from <aardvark.updater.AccountToUpdate object at 0x10c379b50>
INFO: got on_complete from <aardvark.updater.AccountToUpdate object at 0x10c379b50>
INFO: Thread #1 persisting data for account 123456789012
INFO: Thread #1 FINISHED persisting data for account 123456789012
Clase | Señales |
---|---|
manage.UpdateAccountThread | on_ready , on_complete , on_failure |
updater.AccountToUpdate | on_ready , on_complete , on_error , on_failure |
Ver TODO