
repokid v0.19.8
AWS Least Privilege für verteilte, schnelle Bereitstellung
Repokid
Repokid verwendet den Access Advisor von Aardvark, um Berechtigungen zu entfernen, die Zugriff auf ungenutzte Dienste gewähren, und zwar aus den Inline-Richtlinien von IAM-Rollen in einem AWS-Konto.
Erste Schritte
Installation
mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json
DynamoDB
Sie benötigen eine DynamoDB-Tabelle namens repokid_roles (geben Sie Konto und Endpunkt im dynamo_db-Abschnitt der Konfigurationsdatei an).
Die Tabelle sollte folgende Eigenschaften haben:
RoleId(string) als primären Partitionsschlüssel, ohne primären Sortierschlüssel- Einen globalen Sekundärindex namens
Accountmit einem primären Partitionsschlüssel vonAccountundRoleIdundAccountals projizierte Attribute - Einen globalen Sekundärindex namens
RoleNamemit einem primären Partitionsschlüssel vonRoleNameundRoleIdundRoleNameals projizierte Attribute
Für die Entwicklung können Sie DynamoDB lokal ausführen.
Für den lokalen Betrieb:
docker-compose up
Der Endpunkt für DynamoDB ist http://localhost:8000. Ein Administrationspanel für DynamoDB finden Sie unter http://localhost:8001.
Wenn Sie die Entwicklungsversion ausführen, werden die Tabelle und der Index automatisch für Sie erstellt.
IAM-Berechtigungen
Repokid benötigt eine IAM-Rolle in jedem Konto, das abgefragt wird. Zusätzlich muss Repokid mit einer Rolle oder einem Benutzer gestartet werden, die/das sts:AssumeRole in die verschiedenen Kontorollen aufrufen kann.
RepokidInstanceProfile:
- Nur eines erstellen.
- Muss die Fähigkeit besitzen,
sts:AssumeRolein alle RepokidRoles aufzurufen. - DynamoDB-Berechtigungen für die Tabelle
repokid_rolesund alle Indizes (angegeben im Unterabschnittassume_rolevondynamo_dbin der Konfigurationsdatei) sowie die Fähigkeit,dynamodb:ListTablesauszuführen.
RepokidRole:
- Muss in jedem Konto vorhanden sein, das von Repokid verwaltet wird.
- Muss eine Vertrauensrichtlinie haben, die
RepokidInstanceProfileerlaubt. - Der Name muss in
connection_iamin der Konfigurationsdatei angegeben werden. - Hat diese Berechtigungen:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:DeleteInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetAccountAuthorizationDetails",
"iam:GetInstanceProfile",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListInstanceProfiles",
"iam:ListInstanceProfilesForRole",
"iam:ListRolePolicies",
"iam:PutRolePolicy",
"iam:UpdateRoleDescription"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Wenn Sie also n Konten überwachen, benötigen Sie immer n+1 Rollen (n RepokidRoles und 1 RepokidInstanceProfile).
Bearbeiten der config.json
Das Ausführen von repokid config config.json erstellt eine Datei, die Sie bearbeiten müssen. Suchen und aktualisieren Sie folgende Felder:
dynamodb: Wenn Sie DynamoDB lokal verwenden, setzen Sie den Endpunkt aufhttp://localhost:8010. Wenn Sie AWS-gehostetes DynamoDB verwenden, setzen Sieregion,assume_roleundaccount_number.aardvark_api_location: Der Speicherort Ihrer Aardvark-REST-API. Etwahttps://aardvark.yourcompany.net/api/1/advisorsconnection_iam: Setzen Sieassume_roleaufRepokidRoleoder wie auch immer Sie es genannt haben.
Optionale Konfiguration
Repokid verwendet Filter, um zu entscheiden, welche Rollen für das Repoen in Frage kommen. Filter können wie unten beschrieben an Ihre Umgebung angepasst werden.
Blocklist-Filter
Rollen können ausgeschlossen werden, indem sie dem Blocklist-Filter hinzugefügt werden. Ein häufiger Grund, eine Rolle auszuschließen, ist, wenn die entsprechende Arbeitslast gelegentlich Aktionen durchführt, die möglicherweise nicht beobachtet wurden, aber bekanntermaßen erforderlich sind. Es gibt zwei Möglichkeiten, eine Rolle auszuschließen:
- Rollennamen für alle Konten ausschließen: Fügen Sie ihn einer Liste im Konfigurationsabschnitt
filter_config.BlocklistFilter.allhinzu. - Rollennamen für ein bestimmtes Konto ausschließen: Fügen Sie ihn einer Liste im Konfigurationsabschnitt
filter_config.BlocklistFilter.<ACCOUNT_NUMBER>hinzu.
Blocklists können auch in einer S3-Blocklist-Datei gepflegt werden. Sie sollten folgendes Format haben:
{
"arns": ["arn1", "arn2"],
"names": {"role_name_1": ["all", "account_number_1"], "role_name_2": ["account_number_2", "account_number_3"]}
}
Exklusiv-Filter
Wenn Sie lieber nur bestimmte Rollen repo-en möchten, können Sie den Exklusiv-Filter verwenden. Vielleicht möchten Sie nur Rollen berücksichtigen, die in der Produktion oder von bestimmten Teams verwendet werden.
Um Rollen zum Repoen auszuwählen, können Sie deren Namen in der Konfigurationsdatei auflisten. Shell-ähnliche Glob-Muster werden ebenfalls unterstützt.
Die Rollenauswahl kann pro Konto oder global festgelegt werden.
Um diesen Filter zu aktivieren, setzen Sie "repokid.filters.exclusive:ExclusiveFilter" im Abschnitt active_filters der Konfigurationsdatei.
Zur Konfiguration können Sie mit der automatisch generierten Konfigurationsdatei beginnen, die im Abschnitt "filter_config" eine Beispielkonfiguration enthält:
"ExclusiveFilter": {
"all": [
"<GLOB_PATTERN>"
],
"<ACCOUNT_NUMBER>": [
"<GLOB_PATTERN>"
]
}
Altersfilter
Standardmäßig schließt der Altersfilter Rollen aus, die jünger als 90 Tage sind. Um dies zu ändern, bearbeiten Sie die Konfigurationseinstellung:
filter_config.AgeFilter.minimum_age.
Aktive Filter
Neue Filter können erstellt werden, um interne Logik zu unterstützen. Bei Netflix haben wir mehrere, die für unsere Anwendungsfälle spezifisch sind.
Um sie zu aktivieren, stellen Sie sicher, dass sie sich im Python-Pfad befinden, und fügen Sie sie im Konfigurationsabschnitt active_filters zur Liste hinzu.
Erweiterung von Repokid
Hooks
Repokid ist über Hooks erweiterbar, die vor, während und nach verschiedenen Operationen aufgerufen werden, wie unten aufgeführt.
| Hook-Name | Kontext |
|---|---|
AFTER_REPO | role, errors |
AFTER_REPO_ROLES | roles, errors |
BEFORE_REPO_ROLES | account_number, roles |
AFTER_SCHEDULE_REPO | roles |
DURING_REPOABLE_CALCULATION | role_id, arn, account_number, role_name, potentially_repoable_permissions, minimum_age |
DURING_REPOABLE_CALCULATION_BATCH | role_batch, potentially_repoable_permissions, minimum_age |
Hooks müssen folgendem Interface entsprechen:
from repokid.hooks import implements_hook
from repokid.types import RepokidHookInput, RepokidHookOutput