Um projeto para acelerar o processo de revisão de permissões do IAM (Identity and Access Management) da conta da Amazon Web Services (AWS).
Propósito
O objetivo do sistema de autenticação da AWS IAM é aplicar e forçar controles de acesso a ações e recursos na AWS. Essa ferramenta ajuda a identificar se as políticas implementadas cumprirão as intenções dos proprietários da conta.
A AWS já possui ferramentas para verificar se as políticas anexadas a um recurso permitirão uma ação. Essa ferramenta baseia-se nessa funcionalidade para identificar outros caminhos possíveis para um usuário obter acesso a um recurso. Isso significa verificar o acesso a outros usuários, funções e serviços como formas de dinamizar.
Como Utilizar
- Faça o download do repositório e instale suas dependências com
pip install -r requirements.txt
- Certifique-se de ter graphviz instalado em seu host.
- Configure um usuário do IAM em sua conta da AWS com uma política que conceda a permissão necessária para executar essa ferramenta (veja o arquivo
mapper-policy.json
para um exemplo). A política gerenciada do ReadOnlyAccess funciona para essa finalidade. Pegue as chaves de acesso criadas para este usuário. - No AWS CLI, configure um perfil para esse usuário do IAM com o comando:
aws configure --profile _profile_name_
, onde_profile_name_
é um nome único. - Execute o comando
python pmapper.py --profile _profile_name_ graph
para começar a extrair os dados da sua conta para seu computador.
Representação Gráfica
O Principal Mapper possui um subcomando graph
que faz o trabalho pesado de passar por cada principal em uma conta e encontrar quaisquer outros princípios que ele possa acessar. Os resultados são armazenados em ~/.principalmap
e usados por outros subcomandos.
Consultando
O Principal Mapper tem um subcomando query
que executa uma consulta definida pelo usuário. As consultas podem verificar se um ou mais principais podem executar uma determinada ação com um determinado recurso. As consultas suportadas são:
"can _Principal_ do _Action_ [with _Resource_]"
"who can do _Action_ [with _Resource_]"
"preset _preset_query_name_ _preset_query_args_"
O primeiro formulário verifica se um principal ou qualquer outro principal acessível a ele pode executar uma ação com um recurso (default wildcard). A segunda forma enumera todos os principais que são capazes de executar uma ação com um recurso.
Observe as aspas ao redor da consulta completa, para que o argument parser saiba que a string inteira deve ser usada.
Observe que _Principal_
pode ser o ARN completo de um principal ou a última parte desse ARN (user/… ou role/…).
Predefinições
A predefinição existente é priv_esc
ou change_perms
, que possuem a mesma função. Eles descrevem quais principais têm a capacidade de alterar suas próprias permissões. Se um principal é capaz de alterar suas próprias permissões, então ele efetivamente tem permissões ilimitadas.
Visualizando
O subcomando visualize
produz um arquivo DOT e SVG que representa os nós e arestas que foram representados graficamente.
Para criar os arquivos DOT e SVG, execute o comando: python pmapper.py visualize
Atualmente, a saída é um gráfico direcionado, que agrupa todas as arestas com os mesmos nós de origem e destino. Não desenha arestas onde a fonte é um administrador. Nós para administradores são de cor azul. Os nós para usuários com a capacidade de acessar administradores são de cor vermelha (risco potencial de priv-esc).
Amostra de Saída
Puxando um gráfico
esteringer@ubuntu:~/Documents/projects/Skywalker$ python pmapper.py graph
Using profile: default
Pulling data for account [REDACTED]
Using principal with ARN arn:aws:iam::[REDACTED]:user/TestingSkywalker
[+] Pulling info on IAM users and roles, finding admins.
Principals Checked: 100%|##############################################################| 43/43 [00:24<00:00, 1.72it/s]
[+] Finished finding admins.
[+] Started EC2 checks.
Principals Checked: 100%|##############################################################| 43/43 [00:24<00:00, 1.78it/s]
[+] Finished EC2 checks.
[+] Started IAM checks.
Principals Checked: 100%|##############################################################| 43/43 [05:34<00:00, 7.77s/it]
[+] Finished IAM checks.
[+] Starting Lambda checks.
Regions Checked for Lambda Functions: 100%|############################################| 15/15 [00:15<00:00, 1.02s/it]
Principals Checked: 100%|##############################################################| 43/43 [01:44<00:00, 2.44s/it]
[+] Finished Lambda checks.
[+] Starting CloudFormation checks.
CloudFormation Regions Checked: 100%|##################################################| 15/15 [00:16<00:00, 1.07s/it]
Principals Checked: 100%|##############################################################| 43/43 [00:20<00:00, 2.13it/s]
[+] Finished CloudFormation checks.
Created an AWS Graph with 43 nodes and 258 edges
Consultando com o gráfico
esteringer@ubuntu:~/Documents/projects/Skywalker$ ./pmapper.py --profile skywalker query "who can do s3:GetObject with *"
user/AdminUser can do s3:GetObject with *
user/EC2Manager can do s3:GetObject with * through role/EC2Role-Admin
user/EC2Manager can create an EC2 instance and use an existing instance profile to access role/EC2Role-Admin
role/EC2Role-Admin can do s3:GetObject with *
user/LambdaFullAccess can do s3:GetObject with *
user/PowerUser can do s3:GetObject with *
user/S3ManagementUser can do s3:GetObject with *
user/S3ReadOnly can do s3:GetObject with *
user/TestingSkywalker can do s3:GetObject with *
role/EC2-Fleet-Manager can do s3:GetObject with * through role/EC2Role-Admin
role/EC2-Fleet-Manager can create an EC2 instance and use an existing instance profile to access role/EC2Role-Admin
role/EC2Role-Admin can do s3:GetObject with *
role/EC2Role-Admin can do s3:GetObject with *
role/EC2WithS3ReadOnly can do s3:GetObject with *
role/EMR-Service-Role can do s3:GetObject with *
role/LambdaRole-S3ReadOnly can do s3:GetObject with *
role/UpdateCredentials can do s3:GetObject with * through user/AdminUser
role/UpdateCredentials can create access keys with IAM to access user/AdminUser
user/AdminUser can do s3:GetObject with *
Identificando o escalonamento potencial de privilégios
esteringer@ubuntu:~/Documents/projects/Skywalker$ ./pmapper.py --profile skywalker query "preset priv_esc user/PowerUser"
Discovered a potential path to change privileges:
user/PowerUser can change privileges because:
user/PowerUser can access role/EC2Role-Admin because:
user/PowerUser can create an EC2 instance and use an existing instance profile to access role/EC2Role-Admin
and role/EC2Role-Admin can change its own privileges.
Amostra de Visualização
Planned TODOs
- Conclua e verifique o suporte a Python 3;
- Controle mais inteligente da taxa de solicitações de API (fila, gerenciamento de regulagens);
- Melhor relatório de progresso;
- Valide e adicione mais verificações para obter credenciais. Vários serviços usam service roles que concedem ao serviço permissão para executar uma ação na conta de um usuário. Isso pode permitir que um usuário obtenha acesso a privilégios adicionais;
- Melhorar chamadas simuladas (condições globais);
- Completando priv esc checks (editando políticas anexadas, anexando a um grupo);
- Adicionando opções para visualização (tipo de saída, agrupamento de arestas);
- Adicionando mais caching;
- Avaliação de política local?
- Cross-account subcommand(s);
- Uma predefinição para verificar se um principal está conectado a outro;
- Tratamento de políticas para buckets ou chaves com serviços como S3 ou KMS ao consultar.
Download do PMapper – Revisão de permissões do IAM da AWS
Para efetuar download da ferramenta, baixe diretamente por este link (173 kb) ou acesse o repositório do projeto no Github.
.
Disclaimer: Todas as informações aqui contidas são para fins didáticos e não para causar danos e prejuízos para alguém, usem sempre o conhecimento aqui compartilhado com ética e responsabilidade. Não nos responsabilizamos pela utilização indevida do conteúdo aqui exposto. Leia mais no aviso legal em nosso site.
.