
AWS Menor Privilégio para Implantação Distribuída e de Alta Velocidade
O Repokid usa o Access Advisor fornecido pelo Aardvark para remover permissões que concedem acesso a serviços não utilizados das políticas inline de funções IAM em uma conta AWS.
mkvirtualenv repokid
git clone [email protected]:Netflix/repokid.git
cd repokid
pip install -e .
repokid config config.json
Você precisará de uma tabela DynamoDB chamada repokid_roles (especifique conta e endpoint em dynamo_db no arquivo de configuração).
A tabela deve ter as seguintes propriedades:
RoleId (string) como chave de partição primária, sem chave de ordenação primáriaAccount com uma chave de partição primária Account e RoleId e Account como atributos projetadosRoleName com uma chave de partição primária RoleName e RoleId e RoleName como atributos projetadosPara desenvolvimento, você pode executar o dynamo localmente.
Para executar localmente:
docker-compose up
O endpoint para o DynamoDB será http://localhost:8000. Um painel de administração do DynamoDB pode ser encontrado em http://localhost:8001.
Se você executar a versão de desenvolvimento, a tabela e o índice serão criados automaticamente para você.
O Repokid precisa de uma função IAM em cada conta que será consultada. Além disso, o Repokid precisa ser iniciado com uma função ou usuário que possa chamar sts:AssumeRole nas funções das diferentes contas.
RepokidInstanceProfile:
sts:AssumeRole em todas as RepokidRoles.repokid_roles e todos os índices (especificados na subseção assume_role de dynamo_db no config) e a capacidade de executar dynamodb:ListTablesRepokidRole:
RepokidInstanceProfile.connection_iam no arquivo de configuração.{
"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": "*"
}
]
}
Portanto, se você está monitorando n contas, sempre precisará de n+1 funções. (n RepokidRoles e 1 RepokidInstanceProfile).
Executar repokid config config.json cria um arquivo que você precisará editar. Encontre e atualize estes campos:
dynamodb: Se estiver usando dynamo localmente, defina o endpoint como http://localhost:8010. Se estiver usando dynamo hospedado na AWS, defina region, assume_role e account_number.aardvark_api_location: A localização da sua API REST Aardvark. Algo como https://aardvark.yourcompany.net/api/1/advisorsconnection_iam: Defina assume_role como RepokidRole, ou como você a chamou.O Repokid usa filtros para decidir quais funções são candidatas a serem reduzidas. Os filtros podem ser configurados para se adequar ao seu ambiente, conforme descrito abaixo.
Funções podem ser excluídas adicionando-as ao filtro Blocklist. Uma razão comum para excluir uma função é se a carga de trabalho correspondente realiza ações ocasionais que podem não ter sido observadas, mas são conhecidas como necessárias. Há duas maneiras de excluir uma função:
filter_config.BlocklistFilter.allfilter_config.BlocklistFilter.<NUMERO_DA_CONTA>As listas de bloqueio também podem ser mantidas em um arquivo S3 blocklist. Elas devem estar no seguinte formato:
{
"arns": ["arn1", "arn2"],
"names": {"role_name_1": ["all", "account_number_1"], "role_name_2": ["account_number_2", "account_number_3"]}
}
Se você preferir reduzir apenas determinadas funções, pode usar o Filtro Exclusivo. Talvez você queira considerar apenas funções usadas em produção ou por certas equipes.
Para selecionar funções para redução, você pode listar seus nomes nos arquivos de configuração. Padrões glob no estilo Shell também são suportados.
A seleção de funções pode ser especificada por conta individual ou globalmente.
Para ativar este filtro, coloque "repokid.filters.exclusive:ExclusiveFilter" na seção active_filters do arquivo de configuração.
Para configurá-lo, você pode começar com o arquivo de configuração gerado automaticamente, que possui um exemplo de configuração na seção "filter_config":
"ExclusiveFilter": {
"all": [
"<PADRAO_GLOB>"
],
"<NUMERO_DA_CONTA>": [
"<PADRAO_GLOB>"
]
}
Por padrão, o filtro de idade exclui funções com menos de 90 dias. Para alterar isso, edite a configuração:
filter_config.AgeFilter.minimum_age.
Novos filtros podem ser criados para apoiar a lógica interna. Na Netflix, temos vários que são específicos para nossos
casos de uso. Para ativá-los, certifique-se de que estejam no caminho Python e adicione-os no config à lista na
seção active_filters.
O Repokid é extensível através de hooks que são chamados antes, durante e depois de várias operações, conforme listado abaixo.
| Nome do Hook | Contexto |
|---|---|
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 |
Os hooks devem aderir à seguinte interface:
from repokid.hooks import implements_hook
from repokid.types import RepokidHookInput, RepokidHookOutput
@implements_hook("TARGET_HOOK_NAME", 1)
def custom_hook(input_dict: RepokidHookInput) -> RepokidHookOutput:
"""As funções de hook são chamadas com um dicionário contendo as chaves listadas acima com base no hook alvo.
Quaisquer mutações feitas na entrada e retornadas na saída serão passadas para funções de hook subsequentes.
"""
...