Retour aux mises à jour
New releaseAug 20, 2026

repokid v0.19.8

Moindre privilège AWS pour un déploiement distribué et à haute vélocité

Partager

Repokid

NetflixOSS Lifecycle Build Status PyPI version Coverage Status Discord chat

Logo Repokid

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.

Pour commencer

Installation

mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json

DynamoDB

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 primaire
  • Un index secondaire global nommé Account avec une clé de partition primaire Account et les attributs projetés RoleId et Account
  • Un index secondaire global nommé RoleName avec une clé de partition primaire RoleName et les attributs projetés RoleId et RoleName

Pour 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.

Permissions IAM

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 :

  • Créez-en un seul.
  • Doit être capable d'appeler sts:AssumeRole sur tous les RepokidRoles.
  • Permissions DynamoDB pour la table 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:ListTables

RepokidRole :

  • Doit exister dans chaque compte géré par repokid.
  • Doit avoir une politique de confiance autorisant RepokidInstanceProfile.
  • Le nom doit être spécifié dans connection_iam du fichier de configuration.
  • Possède ces autorisations :
{
 "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).

Modification de config.json

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/advisors
  • connection_iam : Définissez assume_role sur RepokidRole, ou le nom que vous lui avez donné.

Configuration optionnelle

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.

Filtre de blocage

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 :

  • Exclure le nom du rôle pour tous les comptes : ajoutez-le à une liste dans la configuration filter_config.BlocklistFilter.all
  • Exclure le nom du rôle pour un compte spécifique : ajoutez-le à une liste dans la configuration filter_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"]}
}

Filtre exclusif

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>"
                    ]
                   }

Filtre d'âge

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.

Filtres actifs

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.

Étendre Repokid

Hooks

Repokid est extensible via des hooks qui sont appelés avant, pendant et après diverses opérations comme listé ci-dessous.

Nom du hookContexte
AFTER_REPOrôle, erreurs
AFTER_REPO_ROLESrôles, erreurs
BEFORE_REPO_ROLESnuméro_compte, rôles
AFTER_SCHEDULE_REPOrôles
DURING_REPOABLE_CALCULATIONrole_id, arn, numéro_compte, nom_rôle, permissions_potentiellement_repoables, âge_minimum
DURING_REPOABLE_CALCULATION_BATCHlot_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

Catégories