
Moindre privilège AWS pour un déploiement distribué et à haute vélocité
Repokid utilise Access Advisor fourni par Aardvark pour supprimer les autorisations donnant accès à des services inutilisés des politiques inline des rôles IAM dans un compte AWS.
mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json
Vous aurez besoin d'une table DynamoDB appelée repokid_roles (spécifiez le compte et le point de terminaison dans dynamo_db du fichier de configuration).
La table doit avoir les propriétés suivantes :
RoleId (string) comme clé de partition primaire, pas de clé de tri primaireAccount avec une clé de partition primaire Account et les attributs projetés RoleId et AccountRoleName avec une clé de partition primaire RoleName et les attributs projetés RoleId et RoleNamePour le développement, vous pouvez exécuter Dynamo localement.
Pour exécuter localement :
docker-compose up
Le point de terminaison pour DynamoDB sera http://localhost:8000. Un panneau d'administration DynamoDB se trouve à http://localhost:8001.
Si vous exécutez la version de développement, la table et l'index seront créés automatiquement pour vous.
Repokid a besoin d'un rôle IAM dans chaque compte qui sera interrogé. De plus, Repokid doit être lancé avec un rôle ou un utilisateur capable d'utiliser sts:AssumeRole pour accéder aux différents rôles des comptes.
RepokidInstanceProfile :
sts:AssumeRole sur tous les RepokidRoles.repokid_roles et tous les index (spécifiés dans la sous-section assume_role de dynamo_db dans la configuration) et la capacité d'exécuter dynamodb:ListTablesRepokidRole :
RepokidInstanceProfile.connection_iam du fichier de configuration.{
"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": "*"
}
]
}
Donc si vous surveillez n comptes, vous aurez toujours besoin de n+1 rôles. (n RepokidRoles et 1 RepokidInstanceProfile).
L'exécution de repokid config config.json crée un fichier que vous devrez modifier. Trouvez et mettez à jour ces champs :
dynamodb : Si vous utilisez Dynamo localement, définissez le point de terminaison sur http://localhost:8010. Si vous utilisez Dynamo hébergé par AWS, définissez region, assume_role et account_number.aardvark_api_location : L'emplacement de votre API REST Aardvark. Quelque chose comme https://aardvark.yourcompany.net/api/1/advisorsconnection_iam : Définissez assume_role sur RepokidRole, ou le nom que vous lui avez donné.Repokid utilise des filtres pour décider quels rôles sont candidats à être repoés. Les filtres peuvent être configurés pour s'adapter à votre environnement comme décrit ci-dessous.
Les rôles peuvent être exclus en les ajoutant au filtre de blocage. Une raison courante d'exclure un rôle est si la charge de travail correspondante effectue des actions occasionnelles qui n'ont peut-être pas été observées mais qui sont connues comme étant nécessaires. Il y a deux façons d'exclure un rôle :
filter_config.BlocklistFilter.allfilter_config.BlocklistFilter.<NUMERO_COMPTE>Les listes de blocage peuvent également être maintenues dans un fichier de blocage S3. Elles doivent être sous la forme suivante :
{
"arns": ["arn1", "arn2"],
"names": {"role_name_1": ["all", "account_number_1"], "role_name_2": ["account_number_2", "account_number_3"]}
}
Si vous préférez ne repoer que certains rôles, vous pouvez utiliser le filtre exclusif. Vous voudrez peut-être ne considérer que les rôles utilisés en production ou par certaines équipes. Pour sélectionner les rôles à repoer, vous pouvez lister leurs noms dans les fichiers de configuration. Les motifs glob de type shell sont également pris en charge. La sélection des rôles peut être spécifiée par compte individuel ou globalement. Pour activer ce filtre, mettez "repokid.filters.exclusive:ExclusiveFilter" dans la section active_filters du fichier de configuration. Pour le configurer, vous pouvez commencer par le fichier de configuration autogénéré, qui contient un exemple de configuration dans la section "filter_config" :
"ExclusiveFilter": {
"all": [
"<GLOB_PATTERN>"
],
"<ACCOUNT_NUMBER>": [
"<GLOB_PATTERN>"
]
}
Par défaut, le filtre d'âge exclut les rôles de moins de 90 jours. Pour modifier cela, modifiez le paramètre de configuration : filter_config.AgeFilter.minimum_age.
De nouveaux filtres peuvent être créés pour prendre en charge la logique interne. Chez Netflix, nous en avons plusieurs qui sont spécifiques à nos cas d'utilisation. Pour les rendre actifs, assurez-vous qu'ils sont dans le chemin Python et ajoutez-les dans la configuration à la liste de la section active_filters.
Repokid est extensible via des hooks qui sont appelés avant, pendant et après diverses opérations comme listé ci-dessous.
| Nom du hook | Contexte |
|---|---|
AFTER_REPO | rôle, erreurs |
AFTER_REPO_ROLES | rôles, erreurs |
BEFORE_REPO_ROLES | numéro_compte, rôles |
AFTER_SCHEDULE_REPO | rôles |
DURING_REPOABLE_CALCULATION | role_id, arn, numéro_compte, nom_rôle, permissions_potentiellement_repoables, âge_minimum |
DURING_REPOABLE_CALCULATION_BATCH | lot_rôles, permissions_potentiellement_repoables, âge_minimum |
Les hooks doivent adhérer à l'interface suivante :
from repokid.hooks import implements_hook
from repokid.types import RepokidHookInput, RepokidHookOutput