Por Rodrigo Montoro e time de pesquisadores da Tempest

O AWS Identity and Access Management (IAM) é um serviço em que você pode controlar o acesso aos mais variados recursos da AWS usando o produto para estabelecer regras de autenticação e autorização.

Neste universo do IAM há mais de 12 mil ações catalogadas, as quais possuem vínculo com as centenas de serviços oferecidos pela AWS. Associadas a essas ações, as políticas de acesso geralmente são atreladas aos recursos que podem ser acessados e às suas condicionais. Ou seja, para que um usuário acesse um determinado recurso, é necessário que haja regras que especifiquem as condições em que este acesso pode ser feito e essas regras são fruto da determinação de qual ação é possível ser feita por aquele usuário naquele recurso.

O fluxo básico de autenticação e autorização (figura abaixo) funciona da seguinte maneira:

1-) O “Principal”, que pode ser um usuário, uma função ou uma aplicação se autentica no control plane da AWS de forma direta ou via IdP, Cross Account e SSO.

2-) Após a autenticação, é verificada a permissão do Principal, sendo que essa permissão tem origem nas políticas associadas a ele, as quais podem ser de sessão, de recursos, baseadas em identidade, dentre outras.

3-) Validadas as permissões, bem como suas condições, o Principal poderá executar as ações permitidas nos recursos atribuídos a ele.Geralmente essa configuração pode ser marcada com “*”, ou seja, todos.

Fluxo de autenticação e autorização no AWS IAM. Imagem: AWS

Agora que entendemos como funciona o controle para acessar algum recurso na AWS, vamos ao grande desafio, que se resume no uso das políticas na AWS se baseando no conceito de privilégio mínimo. É muito comum em integrações com parceiros, como serviços de SaaS e consultorias, que se crie uma relação de confiança entre os ambientes se baseando em alguma chave de acesso, muitas vezes usando a opção AWS Managed Policy conhecida como ReadOnlyAccess. Os testes aqui são relacionados à versão 86 (v86) da política, que pode ser encontrada neste link

Política ReadOnlyAccess. Imagem: Tempest

Baseando-se nesse modo de controle de acesso aos serviços e em como essas interações entre terceiros acontecem, resolvemos nos aprofundar no estudo dessa política, salientando que os problemas que reportamos neste artigo não estão na política ReadOnlyAccess em si, mas sim no entendimento equivocado que os administradores geralmente fazem dela, utilizando-a como quem copia e cola um conteúdo sem analisar com detalhes as ações para as quais se está concedendo acesso e seus possíveis impactos. Usar a ReadOnlyAccess desta maneira pode trazer impactos para a segurança, especialmente caso uma pessoa com más intenções tenha acesso a algum Principal com esses privilégios.

Usando nossa ferramenta preferida, adotada em várias de nossas apresentações e pesquisas, a Cloudsplaining, identificamos 13 (treze) ações que são encontradas e mapeadas em alguma categoria que pode causar dano ou risco à empresa que adotar a política sem a devida revisão dos acessos.

  1. cognito-identity:GetCredentialsForIdentity – Grants permission to return credentials for the provided identity ID.
  2. cognito-identity:GetOpenIdToken – Grants permission to get an OpenID token, using a known Cognito ID.
  3. cognito-identity:GetOpenIdTokenForDeveloperIdentity – Grants permission to register (or retrieve) a Cognito IdentityId and an OpenID Connect token for a user authenticated by your backend authentication process.
  4. cognito-idp:GetSigningCertificate – Returns the signing certificate.
  5. connect:GetFederationToken – Grants permission to federate into an Amazon Connect instance when using SAML-based authentication for identity management.
  6. ec2:GetPasswordData – Grants permission to retrieve the encrypted administrator password for a running Windows instance.
  7. ecr:GetAuthorizationToken – Grants permission to retrieve a token that is valid for a specified registry for 12 hours.
  8. gamelift:GetInstanceAccess – Grants permission to request remote access to a specified fleet instance.
  9. s3:GetObject – Grants permission to retrieve objects from Amazon S3.
  10. ssm:GetParameter – Grants permission to view information about a specified parameter.
  11. ssm:GetParameters – Grants permission to view information about multiple specified parameters.
  12. ssm:GetParametersByPath – Grants permission to view information about parameters in a specified hierarchy.
  13. sts:GetSessionToken – Grants permission to obtain a set of temporary security credentials (consisting of an access key ID, a secret access key, and a security token) for an AWS account or IAM user.

Pensando sobre a possibilidade de identificarmos mais ações de risco, além das 13 acima, aprofundamos a investigação e mapeamos outras 28 ações que podem ser abusadas no curso de um ataque.

  1. apigateway:GET – Grants permission to read a particular resource.
  2. athena:GetDatabase – Grants permission to get a database for a given datacatalog. (athena:Get*)
  3. athena:GetQueryExecution – Grants permission to get information about the specified query execution. (athena:Get*)
  4. athena:GetQueryResults – Grants permission to get the query results. (athena:Get*)
  5. cassandra:Select – Grants permission to SELECT data from a table.
  6. chime:Retrieve* – Grants permission to download the file containing links to all user attachments returned as part of the “Request attachments” action.
  7. cloudtrail:LookupEvents – Grants permission to look up API activity events captured by CloudTrail that create, update, or delete resources in your account.
  8. codeartifact:GetAuthorizationToken – Grants permission to generate a temporary authentication token for accessing repositories in a domain.
  9. config:SelectResourceConfig – Grants permission to accept a structured query language (SQL) SELECT command, performs the corresponding search, and returns resource configurations matching the properties.
  10. datapipeline:QueryObjects – Grants permission to query the specified pipeline for the names of objects that match the specified set of conditions.
  11. dax:Query – Grants permission to use the primary key of a table or a secondary index to directly access items from that table or index.
  12. dax:Scan – Grants permission to return one or more items and item attributes by accessing every item in a table or a secondary index.
  13. dynamodb:GetRecords Grants permission to retrieve the stream records from a given shard. (dynamodb:Get*)
  14. dynamodb:Query – Grants permission to use the primary key of a table or a secondary index to directly access items from that table or index.
  15. dynamodb:Scan – Grants permission to return one or more items and item attributes by accessing every item in a table or a secondary index.
  16. ec2:DescribeInstanceAttribute – Grants permission to describe the attributes of an instance (userdata information). (ec2:Describe*)
  17. ec2:GetConsoleOutput – Grants permission to get the console output for an instance.
  18. ec2:GetConsoleScreenshot – Grants permission to retrieve a JPG-format screenshot of a running instance.
  19. es:ESHttpGet – Grants permission to send HTTP GET requests to the OpenSearch APIs.
  20. glue:GetDatabase – Grants permission to retrieve a database.
  21. glue:GetDatabases – Grants permission to retrieve all databases.
  22. glue:GetTable – Grants permission to retrieve a table.
  23. glue:GetTables – Grants permission to retrieve the tables in a database
  24. kendra:Query – Grants permission to query documents and faqs.
  25. lambda:GetFunction – Grants permission to view details about an AWS Lambda function. (lambda:Get*)
  26. logs:StartQuery – Grants permissions to schedule a query of a log group using CloudWatch Logs Insights.
  27. s3-object-lambda:GetObject – Grants permission to retrieve objects from Amazon S3.
  28. ssm:GetDocument Grants permission to view the contents of a specified SSM document. (ssm:Get*)

As informações de descrição foram retiradas do site https://aws.permissions.cloud/iam/

Com essa análise inicial, os pesquisadores da Tempest identificaram pelo menos 41 ações que podem levar ao acesso indevido aos dados, em especial quando essa política é utilizada para controlar o acesso de pessoas de fora da organização. Essa listagem de 28 (vinte e oito) novas ações poderá ser adicionada ao Cloudsplaining (após envio, análise e aprovação dos responsáveis), pois assim os responsáveis pelo ambiente sempre serão alertados quando elas estiverem em atividade pois elas não se encontram somente na política de ReadOnlyAccess.

Reiteramos que o problema não se resume à política ReadOnlyAccess e sim à falta de entendimento sobre os níveis de acesso e autorização, bem como as consequentes ameaças que ela proporciona, especialmente quando estamos falando de acesso a terceiros, situação em que a política em questão é comumente utilizada. 

Finalmente, sempre que for utilizar uma política pronta (AWS Managed Policy) como a ReadOnlyAccess ou criar algo customizado, procure ter um cuidado adicional às ações que inclui às políticas. Ter como boa prática a concessão de  privilégio mínimo é mandatório neste novo mundo de cloud. IAM é um serviço super complexo mas de suma importância para o sucesso de uma postura de segurança em ambientes como este.

Lista Completa das actions (41):

  1. apigateway:GET – Grants permission to read a particular resource.
  2. athena:GetDatabase – Grants permission to get a database for a given datacatalog. (athena:Get*)
  3. athena:GetQueryExecution – Grants permission to get information about the specified query execution. (athena:Get*)
  4. athena:GetQueryResults – Grants permission to get the query results. (athena:Get*)
  5. cassandra:Select – Grants permission to SELECT data from a table.
  6. chime:Retrieve* – Grants permission to download the file containing links to all user attachments returned as part of the “Request attachments” action.
  7. cloudtrail:LookupEvents – Grants permission to look up API activity events captured by CloudTrail that create, update, or delete resources in your account.
  8. codeartifact:GetAuthorizationToken – Grants permission to generate a temporary authentication token for accessing repositories in a domain.
  9. cognito-identity:GetCredentialsForIdentity – Grants permission to return credentials for the provided identity ID
  10. cognito-identity:GetOpenIdToken – Grants permission to get an OpenID token, using a known Cognito ID.
  11. cognito-identity:GetOpenIdTokenForDeveloperIdentity – Grants permission to register (or retrieve) a Cognito IdentityId and an OpenID Connect token for a user authenticated by your backend authentication process
  12. cognito-idp:GetSigningCertificate – Returns the signing certificate.
  13. config:SelectResourceConfig – Grants permission to accept a structured query language (SQL) SELECT command, performs the corresponding search, and returns resource configurations matching the properties. *
  14. connect:GetFederationToken – Grants permission to federate into an Amazon Connect instance when using SAML-based authentication for identity management.
  15. datapipeline:QueryObjects – Grants permission to query the specified pipeline for the names of objects that match the specified set of conditions.
  16. dax:Query – Grants permission to use the primary key of a table or a secondary index to directly access items from that table or index.
  17. dax:Scan – Grants permission to return one or more items and item attributes by accessing every item in a table or a secondary index.
  18. dynamodb:Get* – dynamodb:GetRecords Grants permission to retrieve the stream records from a given shard.
  19. dynamodb:Query – Grants permission to use the primary key of a table or a secondary index to directly access items from that table or index.
  20. dynamodb:Scan – Grants permission to return one or more items and item attributes by accessing every item in a table or a secondary index.
  21. ec2:DescribeInstanceAttribute – Grants permission to describe the attributes of an instance (userdata). (ec2:Describe*)
  22. ec2:GetConsoleOutput – Grants permission to get the console output for an instance.
  23. ec2:GetConsoleScreenshot – Grants permission to retrieve a JPG-format screenshot of a running instance.
  24. ec2:GetPasswordData – Grants permission to retrieve the encrypted administrator password for a running Windows instance.
  25. ecr:GetAuthorizationToken – Grants permission to retrieve a token that is valid for a specified registry for 12 hours.
  26. es:ESHttpGet – Grants permission to send HTTP GET requests to the OpenSearch APIs.
  27. gamelift:GetInstanceAccess – Grants permission to request remote access to a specified fleet instance.
  28. glue:GetDatabase – Grants permission to retrieve a database.
  29. glue:GetDatabases – Grants permission to retrieve all databases.
  30. glue:GetTable – Grants permission to retrieve a table.
  31. glue:GetTables – Grants permission to retrieve the tables in a database
  32. kendra:Query – Grants permission to query documents and faqs.
  33. lambda:GetFunction – Grants permission to view details about an AWS Lambda function. (lambda:Get*)
  34. logs:StartQuery – Grants permissions to schedule a query of a log group using CloudWatch Logs Insights.
  35. s3:GetObject – Grants permission to retrieve objects from Amazon S3.
  36. s3-object-lambda:GetObject – Grants permission to retrieve objects from Amazon S3.
  37. ssm:GetDocument Grants permission to view the contents of a specified SSM document. (ssm:Get*)
  38. ssm:GetParameter – Grants permission to view information about a specified parameter.
  39. ssm:GetParameters – Grants permission to view information about multiple specified parameters.
  40. ssm:GetParametersByPath – Grants permission to view information about parameters in a specified hierarchy.
  41. sts:GetSessionToken – Grants permission to obtain a set of temporary security credentials (consisting of an access key ID, a secret access key, and a security token) for an AWS account or IAM user.

Referências:

AWS User Guide. Understanding how IAM works. Disponível em https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html Acesso em 21 de Abril de

2022. AWS User Guide. What is IAM? Disponível em https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html Acesso em 21 de Abril de 2022.

GRENU, Victor (Z0ph). MAMIP Bot. Disponível em https://github.com/z0ph/MAMIP/blob/master/policies/ReadOnlyAccess. Acesso em 20 de Abril de

2022 HOTNOPS. AWS ReadOnlyAccess: Not Even Once. Disponível em https://posts.specterops.io/aws-readonlyaccess-not-even-once-ffbceb9fc908. Acesso em 10 de Março de

2022. SALESFORCE. Cloudsplaining GitHub. Disponível em https://github.com/salesforce/cloudsplaining. Acesso em 05 de Maio de 2022.