Aardvark ist eine AWS IAM Access Advisor-API (und Caching-Schicht) für mehrere Konten.
Stellen Sie sicher, dass Sie Python 3.6 oder höher haben. Python 2 wird nicht mehr unterstützt.
git clone https://github.com/Netflix-Skunkworks/aardvark.git
cd aardvark
python3 -m venv env
. env/bin/activate
python setup.py develop
Der Aardvark-Konfigurationsassistent führt Sie durch die Einrichtung.
% 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 benötigt in jedem Konto, das abgefragt wird, eine IAM-Rolle. Darüber hinaus muss Aardvark mit einer Rolle oder einem Benutzer gestartet werden, der sts:AssumeRole
in die verschiedenen Kontorollen übernehmen kann.
AardvarkInstanceProfile:
sts:AssumeRole
in allen AardvarkRole aufzurufenAardvarkRolle:
AardvarkInstanceProfile
zulässt. iam:GenerateServiceLastAccessedDetails
iam:GetServiceLastAccessedDetails
iam:listrolepolicies
iam:listroles
iam:ListUsers
iam:ListPolicies
iam:ListGroups
Wenn Sie also n
Konten überwachen, benötigen Sie immer n+1
Rollen. ( n
AardvarkRoles und 1
AardvarkInstanceProfile).
Hinweis: Für die lokale Ausführung von aardvark müssen Sie sich nicht um das AardvarkInstanceProfile kümmern. Hängen Sie stattdessen einfach eine Richtlinie an, die „sts:AssumeRole“ enthält, an den Benutzer, den Sie in der AWS CLI verwenden, um die Aardvark-Rolle zu übernehmen. Außerdem sollte derselbe Benutzer in der Vertrauensrichtlinie der Aardvark-Rolle erwähnt werden, um die ordnungsgemäße Zuweisung der Berechtigungen zu gewährleisten.
Wahrscheinlich möchten Sie die Access Advisor-Daten regelmäßig aktualisieren. Wir empfehlen, den update
-Befehl etwa einmal täglich auszuführen. Cron eignet sich hervorragend dafür.
Wenn Sie kein SWAG haben, können Sie durch Kommas getrennte Kontonummern übergeben:
aardvark update -a 123456789012,210987654321
Aardvark kann SWAG verwenden, um nach Konten zu suchen, sodass Sie gegen alle antreten können mit:
aardvark update
oder nach Kontoname/Tag mit:
aardvark update -a dev,test,prod
aardvark start_api -b 0.0.0.0:5000
In der Produktion möchten Sie wahrscheinlich so etwas wie einen Supervisor haben, der die API für Sie startet.
Swagger ist für die API unter <Aardvark_Host>/apidocs/#!
.
Aardvark antwortet auf Get/Post-Anfragen. Alle Ergebnisse sind paginiert und die Paginierung kann durch die Übergabe count
und/oder page
gesteuert werden. Hier einige Beispielabfragen:
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 kann auch mit Docker und Docker Compose bereitgestellt werden. Die Aardvark-Dienste basieren auf einem gemeinsam genutzten Container. Damit dies funktioniert, müssen Docker und Docker Compose installiert sein.
Um die Container für Ihren Kontensatz zu konfigurieren, erstellen Sie eine .env
Datei im Stammverzeichnis dieses Verzeichnisses. Definieren Sie die Umgebungsvariablen in dieser Datei. In diesem Beispiel werden AWS-Zugriffsschlüssel verwendet. Wir empfehlen die Verwendung von Instanzrollen in der Produktion.
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>
Name | Service | Beschreibung |
---|---|---|
AARDVARK_ROLE | collector | Der Name der Rolle, die Aardvark übernehmen soll, damit es die Daten sammeln kann. |
AARDVARK_ACCOUNTS | collector | Optional bei Verwendung von SWAG, andernfalls erforderlich. Legen Sie dies auf eine Liste von SWAG-Kontonamen-Tags oder eine Liste von AWS-Kontonummern fest, von denen Access Advisor-Datensätze erfasst werden sollen. |
AWS_ARN_PARTITION | collector | Erforderlich, wenn Sie keine kommerzielle AWS-Region verwenden. Zum Beispiel aws-us-gov . Standardmäßig ist dies aws . |
AWS_DEFAULT_REGION | collector | Erforderlich, wenn es nicht auf einer EC2-Instanz mit einem entsprechenden Instanzprofil ausgeführt wird. Legen Sie diese auf die Anmeldeinformationen eines AWS IAM-Benutzers mit der Berechtigung sts:AssumeRole für die Audit-Rolle Aardvark fest. |
AWS_ACCESS_KEY_ID | collector | Erforderlich, wenn es nicht auf einer EC2-Instanz mit einem entsprechenden Instanzprofil ausgeführt wird. Legen Sie diese auf die Anmeldeinformationen eines AWS IAM-Benutzers mit der Berechtigung sts:AssumeRole für die Audit-Rolle Aardvark fest. |
AWS_SECRET_ACCESS_KEY | collector | Erforderlich, wenn es nicht auf einer EC2-Instanz mit einem entsprechenden Instanzprofil ausgeführt wird. Legen Sie diese auf die Anmeldeinformationen eines AWS IAM-Benutzers mit der Berechtigung sts:AssumeRole für die Audit-Rolle Aardvark fest. |
AARDVARK_DATABASE_URI | collector und apiserver | Geben Sie einen benutzerdefinierten Datenbank-URI an, der von SQL Alchemy unterstützt wird. Standardmäßig wird der Wert AARDVARK_DATA_DIR verwendet, um eine SQLLite-Datenbank zu erstellen. Beispiel: sqlite:///$AARDVARK_DATA_DIR/aardvark.db |
Sobald diese Datei erstellt ist, erstellen Sie die Container und starten Sie die Dienste. Aardvark besteht aus drei Diensten:
# build the containers
docker-compose build
# start up the containers
docker-compose up
Schließlich geht es darum, die Umwelt zu reinigen
# bring down the containers
docker-compose down
# remove the containers
docker-compoes rm
Aardvark startet die in der Konfiguration angegebene Anzahl von Threads. Jeder dieser Threads ruft Access Advisor-Daten für ein Konto ab und behält die Daten dann bei.
Die regex
Abfrage wird nur in Postgres (nativ) und SQLite (mit freundlicher Genehmigung von Xion in der Datei sqla_regex
) unterstützt.
Wir empfehlen, TLS für jeden Dienst zu aktivieren. Anweisungen zum Einrichten von TLS sind in diesem Dokument nicht enthalten.
Neu in v0.3.1
Aardvark verwendet Blinker für Signale in seinem Update-Prozess. Diese Signale können für Dinge wie die Ausgabe von Metriken, zusätzliche Protokollierung oder die Durchführung weiterer Aktionen für Konten verwendet werden. Sie können sie verwenden, indem Sie ein Skript schreiben, das Ihre Handler definiert und aardvark.manage.main()
aufruft. Erstellen Sie beispielsweise eine Datei namens signals_example.py
mit folgendem Inhalt:
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 ()
Diese Datei kann nun auf die gleiche Weise wie manage.py
aufgerufen werden:
python signals_example.py update -a cool_account
Die Protokollausgabe sieht in etwa wie folgt aus:
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
Klasse | Signale |
---|---|
manage.UpdateAccountThread | on_ready , on_complete , on_failure |
updater.AccountToUpdate | on_ready , on_complete , on_error , on_failure |
Siehe TODO