Aardvark est une API AWS IAM Access Advisor multi-comptes (et une couche de mise en cache).
Assurez-vous que vous disposez de Python 3.6 ou version ultérieure. Python 2 n'est plus pris en charge.
git clone https://github.com/Netflix-Skunkworks/aardvark.git
cd aardvark
python3 -m venv env
. env/bin/activate
python setup.py develop
L'assistant de configuration d'Aardvark vous guidera tout au long de la configuration.
% 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 a besoin d'un rôle IAM dans chaque compte qui sera interrogé. De plus, Aardvark doit être lancé avec un rôle ou un utilisateur qui peut sts:AssumeRole
dans les différents rôles de compte.
Profil d'instance d'Aardvark :
sts:AssumeRole
dans tous les AardvarkRoleAardvarkRôle :
AardvarkInstanceProfile
. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
Ainsi, si vous surveillez n
comptes, vous aurez toujours besoin de n+1
rôles. ( n
AardvarkRoles et 1
AardvarkInstanceProfile).
Remarque : Pour un oryctérope exécuté localement, vous n'avez pas à vous occuper du profil AardvarkInstanceProfile. Au lieu de cela, attachez simplement une stratégie contenant « sts:AssumeRole » à l'utilisateur que vous utilisez sur l'AWS CLI pour assumer le rôle Aardvark. En outre, le même utilisateur doit être mentionné dans la politique de confiance du rôle Aardvark pour une attribution correcte des privilèges.
Vous souhaiterez probablement actualiser régulièrement les données Access Advisor. Nous vous recommandons d'exécuter la commande update
environ une fois par jour. Cron fonctionne très bien pour cela.
Si vous n'avez pas SWAG, vous pouvez transmettre des numéros de compte séparés par des virgules :
aardvark update -a 123456789012,210987654321
Aardvark peut utiliser SWAG pour rechercher des comptes, afin que vous puissiez vous mesurer à tous avec :
aardvark update
ou par nom de compte/tag avec :
aardvark update -a dev,test,prod
aardvark start_api -b 0.0.0.0:5000
En production, vous souhaiterez probablement que quelque chose comme un superviseur démarre l'API pour vous.
Swagger est disponible pour l'API sur <Aardvark_Host>/apidocs/#!
.
Aardvark répond aux demandes d’obtention/publication. Tous les résultats sont paginés et la pagination peut être contrôlée en passant des arguments count
et/ou page
. Voici quelques exemples de requêtes :
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 peut également être déployé avec Docker et Docker Compose. Les services Aardvark sont construits sur un conteneur partagé. Vous aurez besoin de Docker et Docker Compose installés pour que cela fonctionne.
Pour configurer les conteneurs pour votre ensemble de comptes, créez un fichier .env
à la racine de ce répertoire. Définissez les variables d'environnement dans ce fichier. Cet exemple utilise les clés d'accès AWS. Nous vous recommandons d'utiliser des rôles d'instance en production.
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>
Nom | Service | Description |
---|---|---|
AARDVARK_ROLE | collector | Le nom du rôle que Aardvark doit assumer pour pouvoir collecter les données. |
AARDVARK_ACCOUNTS | collector | Facultatif si vous utilisez SWAG, sinon requis. Définissez ceci sur une liste de balises de nom de compte SWAG ou une liste de numéros de compte AWS à partir desquels collecter les enregistrements Access Advisor. |
AWS_ARN_PARTITION | collector | Obligatoire si vous n'utilisez pas de région commerciale AWS. Par exemple, aws-us-gov . Par défaut, il s'agit aws . |
AWS_DEFAULT_REGION | collector | Obligatoire s’il n’est pas exécuté sur une instance EC2 avec un profil d’instance approprié. Définissez-les sur les informations d'identification d'un utilisateur AWS IAM disposant de l'autorisation sts:AssumeRole pour le rôle d'audit Aardvark. |
AWS_ACCESS_KEY_ID | collector | Obligatoire s’il n’est pas exécuté sur une instance EC2 avec un profil d’instance approprié. Définissez-les sur les informations d'identification d'un utilisateur AWS IAM disposant de l'autorisation sts:AssumeRole pour le rôle d'audit Aardvark. |
AWS_SECRET_ACCESS_KEY | collector | Obligatoire s’il n’est pas exécuté sur une instance EC2 avec un profil d’instance approprié. Définissez-les sur les informations d'identification d'un utilisateur AWS IAM disposant de l'autorisation sts:AssumeRole pour le rôle d'audit Aardvark. |
AARDVARK_DATABASE_URI | collector et apiserver | Spécifiez un URI de base de données personnalisé pris en charge par SQL Alchemy. Par défaut, cela utilisera la valeur AARDVARK_DATA_DIR pour créer une base de données SQLLite. Exemple : sqlite:///$AARDVARK_DATA_DIR/aardvark.db |
Une fois ce fichier créé, créez les conteneurs et démarrez les services. Aardvark se compose de trois services :
# build the containers
docker-compose build
# start up the containers
docker-compose up
Enfin, pour assainir l’environnement
# bring down the containers
docker-compose down
# remove the containers
docker-compoes rm
Aardvark lancera le nombre de threads spécifié dans la configuration. Chacun de ces threads récupérera les données Access Advisor pour un compte, puis conservera les données.
La requête regex
n'est prise en charge que dans Postgres (nativement) et SQLite (via un peu de magie grâce à Xion dans le fichier sqla_regex
).
Nous vous recommandons d'activer TLS pour n'importe quel service. Les instructions de configuration de TLS sortent du cadre de ce document.
Nouveau dans la v0.3.1
Aardvark utilise Blinker pour les signaux dans son processus de mise à jour. Ces signaux peuvent être utilisés pour des choses comme l'émission de métriques, une journalisation supplémentaire ou la réalisation de davantage d'actions sur les comptes. Vous pouvez les utiliser en écrivant un script qui définit vos gestionnaires et appelle aardvark.manage.main()
. Par exemple, créez un fichier appelé signals_example.py
avec le contenu suivant :
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 ()
Ce fichier peut désormais être invoqué de la même manière que manage.py
:
python signals_example.py update -a cool_account
La sortie du journal sera similaire à ce qui suit :
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
Classe | Signaux |
---|---|
manage.UpdateAccountThread | on_ready , on_complete , on_failure |
updater.AccountToUpdate | on_ready , on_complete , on_error , on_failure |
Voir À FAIRE