Pular para o conteúdo

Avaliar permissões do IAM na AWS – Principal Mapper

    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

    1. Faça o download do repositório e instale suas dependências com pip install -r requirements.txt
    2. Certifique-se de ter graphviz instalado em seu host.
    3. 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.
    4. 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.
    5. 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

    Principal_Mapper_exemplo_saida

    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.

    .

    Deixe um comentário

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

    Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.