Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

modificado tmeplate para meu caso de uso #34

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Metadata:
- AdminEmailAddress
- ResourceOwnerTag
- AWSOrgID
- EnvironmentName
- EmailTemplateAudit
- EmailTemplateEnforce
- SMTPUserParamName
Expand Down Expand Up @@ -82,6 +83,8 @@ Metadata:
default: Resource Owner Tag
AWSOrgID:
default: AWS Organization ID
EnvironmentName:
default: AWS Environment name
EmailTemplateEnforce:
default: 'Email Template File Name [Enforce Mode]'
EmailTemplateAudit:
Expand Down Expand Up @@ -123,6 +126,10 @@ Parameters:
Description: "Enter your AWS Organization ID, this will be used to restricted execution permissions to only approved AWS Accounts within your AWS Organization."
Type: String
Default: ""
EnvironmentName:
Description: "Enter your EnvironmentName, this will be used to restrict execution permissions to only approved AWS functions in your AWS organization."
Type: String
Default: ""
IAMExemptionGroup:
Description: "Manage IAM Key Rotation exemptions via an IAM Group. Enter the IAM Group name being used to facilitate IAM accounts excluded from auto-key rotation."
Type: String
Expand Down Expand Up @@ -330,10 +337,18 @@ Resources:
- sts:AssumeRole
Resource:
- !Sub 'arn:${AWS::Partition}:iam::*:role/${IAMRoleName}' # All accounts in Org
- !Sub 'arn:${AWS::Partition}:iam::*:role/${OrgListRole}' # All accounts in Org
Condition:
StringEquals:
aws:PrincipalOrgID: !Ref AWSOrgID
aws:ResourceTag/environment: !Ref EnvironmentName
- Effect: Allow
Action:
- sts:AssumeRole
Resource:
- !Sub 'arn:${AWS::Partition}:iam::*:role/${OrgListRole}' # All accounts in Org
Condition:
StringEquals:
aws:PrincipalOrgID: !Ref AWSOrgID
- Effect: Allow
Action:
- lambda:InvokeFunction
Expand Down
27 changes: 18 additions & 9 deletions CloudFormation/ASA-iam-key-auto-rotation-list-accounts-role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@ Metadata:
- IAMRoleName
- AccountExecutionRoleName
- RotationExecutionRoleName
- PrimaryAccountID
- InfraestructureAccountIDDEV
- InfraestructureAccountIDPRD
ParameterLabels:
IAMRoleName:
default: Assumed IAM Role Name
AccountExecutionRoleName:
default: IAM Execution Role Name for Account Lambda
RotationExecutionRoleName:
default: IAM Execution Role Name for rotation Lambda
PrimaryAccountID:
default: Primary AWS Account ID
InfraestructureAccountIDDEV:
default: Infraestructure AWS Account ID DEV
InfraestructureAccountIDPRD:
default: Infraestructure AWS Account ID PRD
Parameters:
IAMRoleName:
Description: "Enter the name of IAM Role that the main ASA-iam-key-auto-rotation-and-notifier-solution.yaml CloudFormation template will assume."
Expand All @@ -36,10 +39,14 @@ Parameters:
Description: "Enter the name of the Rotation Lambda Execution Role that will assume the role to list accounts."
Type: String
Default: "asa-iam-key-rotation-lambda-execution-role"
PrimaryAccountID:
Description: "Enter the primary/deployment AWS Account ID that will you will be deploying the ASA-iam-key-auto-rotation-and-notifier-solution.yaml CloudFormation template to."
InfraestructureAccountIDDEV:
Description: "Enter the Infraestructure/deployment AWS Account ID that will you will be deploying the ASA-iam-key-auto-rotation-and-notifier-solution.yaml CloudFormation template to."
Type: String
Default: ""
InfraestructureAccountIDPRD:
Description: "Enter the Infraestructure/deployment AWS Account ID that will you will be deploying the ASA-iam-key-auto-rotation-and-notifier-solution.yaml CloudFormation template to."
Type: String
Default: ""

Resources:
##################################################################
Expand All @@ -50,15 +57,17 @@ Resources:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref IAMRoleName
Description: !Sub "IAM Assume Role used by ${PrimaryAccountID}'s ASA-Account-Inventory Lambda. This role is used to list accounts in the Organization."
Description: !Sub "IAM Assume Role used by ${InfraestructureAccountIDDEV} and ${InfraestructureAccountIDPRD} ASA-Account-Inventory Lambda. This role is used to list accounts in the Organization."
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS:
- !Sub arn:${AWS::Partition}:iam::${PrimaryAccountID}:role/${AccountExecutionRoleName}
- !Sub arn:${AWS::Partition}:iam::${PrimaryAccountID}:role/${RotationExecutionRoleName}
- !Sub arn:${AWS::Partition}:iam::${InfraestructureAccountIDDEV}:role/${AccountExecutionRoleName}
- !Sub arn:${AWS::Partition}:iam::${InfraestructureAccountIDDEV}:role/${RotationExecutionRoleName}
- !Sub arn:${AWS::Partition}:iam::${InfraestructureAccountIDPRD}:role/${AccountExecutionRoleName}
- !Sub arn:${AWS::Partition}:iam::${InfraestructureAccountIDPRD}:role/${RotationExecutionRoleName}
Action: sts:AssumeRole
Policies:
- PolicyName: AllowListOrgAccounts
Expand All @@ -85,4 +94,4 @@ Resources:
- secretsmanager:ReplicateSecretToRegions
Resource:
- !Sub "arn:${AWS::Partition}:secretsmanager:*:${AWS::AccountId}:secret:*"
Path: /
Path: /
85 changes: 85 additions & 0 deletions README-COMPLEMENT.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# IAM Key Rotation Runbook - Customizado

## Introdução

Este documento fornece orientações detalhadas sobre como configurar a rotação de chaves IAM utilizando AWS CloudFormation, Lambda Functions, e AWS Secrets Manager. Antes de continuar,[ **leia a documentação original fornecida**](Docs/ASA%20IAM%20Key%20Rotation%20Runbook(v3).pdf) para entender o contexto completo e a arquitetura utilizada para a rotação das chaves IAM.

### Alterações Importantes

Nesta versão do template, foram realizadas algumas mudanças importantes na estrutura e no funcionamento do sistema de rotação de chaves IAM. Essas mudanças foram projetadas para aprimorar o gerenciamento das credenciais centralizadas na conta de auditoria e o controle de permissões com base em tags.
![Diagrama](diagrama.PNG)

## Visão Geral da Arquitetura

A arquitetura é composta por três contas principais:

- **Conta de Infraestrutura-Dev:** Responsável pela rotação de credenciais nas contas de desenvolvimento (DEV) e homologação (HML).
- **Conta de Infraestrutura-PRD:** Responsável pela rotação de credenciais na conta de produção (PRD).
- **Conta de Auditoria:** Centraliza todas as credenciais rotacionadas das contas DEV, HML, e PRD.

A função Lambda de rotação será executada separadamente em ambas as contas de infraestrutura (DEV e PRD), mas as credenciais serão armazenadas de forma centralizada na **Conta de Auditoria**.

### Regras de Rotação por Tag

- A conta de **Infraestrutura-Dev** rotacionará as credenciais das contas DEV e HML. Nessas contas, as **roles** a serem assumidas para rotação precisam possuir a tag `tag-dev`.
- A conta de **Infraestrutura-PRD** rotacionará as credenciais da conta PRD, e as **roles** a serem assumidas devem possuir a tag `tag-prd`.

## Pré-requisitos para IAM Existente

Se uma credencial IAM já existir em uma conta, é necessário criar um **secret** correspondente no AWS Secrets Manager antes de iniciar a rotação. Siga este padrão ao criar os segredos:

- **Nome:** `Account_(IDACCOUNT)_User(USERNAME)_AccessKey`
- **Descrição:** `Auto-created secret`
- **Chave-Valor:**
- **UserName:** `(USERNAME)`

A política padrão que deve ser aplicada a esses segredos é a seguinte:

```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::(AccountID):user/(UserName)"
},
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:ListSecretVersionIds",
"secretsmanager:ListSecrets"
],
"Resource": "*"
}
]
}
```
## Delegação de Permissões

A conta de auditoria será designada como administradora delegada para o **StackSets** de CloudFormation, para que possa listar e gerenciar as credenciais IAM das outras contas.

## Centralização do Secrets Manager

Caso queira centralizar o **Secrets Manager** em contas diferentes, será necessário aplicar o template de listagem de contas separadas por ambiente, ou seja, **audit-dev** e **audit-prd**, e realizar o mesmo processo de segregação de permissão por **tag de ambiente** conforme feito no processo de **assume role**. Isso garantirá que as permissões para as rotinas de rotação de credenciais estejam corretamente aplicadas para cada ambiente.

## Templates de Terraform

Para facilitar a criação das contas com as configurações corretas, disponibilizamos um template de [Terraform](terraformForAFT/main.tf)
que cria automaticamente as **roles** com suas respectivas tags para as novas contas. Esse template deve está localizado na pasta `customization` dentro do ambiente desejado do AFT.

Certifique-se de que todas as novas contas recebam as **roles** adequadas e que estejam configuradas para serem gerenciadas corretamente pelas funções de rotação.

## Próximos Passos

1. Verifique se todas as **roles** e permissões necessárias foram criadas nas contas corretas.
2. Aplique os templates de Terraform nas novas contas para garantir que as tags e configurações estejam corretas.
3. Inicie a rotação e verifique se as credenciais estão sendo centralizadas na conta de auditoria conforme o esperado.


### Pontos principais abordados no README:
1. **Arquitetura dividida** entre contas de DEV/HML e PRD, com as credenciais sendo centralizadas na conta de auditoria.
2. **Regras de rotação baseadas em tags** (tag-dev para DEV/HML e tag-prd para PRD).
3. **Criação de segredos no Secrets Manager** para credenciais já existentes, com uma política específica.
4. **Uso de templates de Terraform** para garantir que as novas contas sejam criadas com as permissões e roles corretas.
5. **Delegação de permissões** através de StackSets para a conta de auditoria.
Binary file added diagrama.PNG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
99 changes: 99 additions & 0 deletions terraformForAFT/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}

# Configure the AWS Provider
provider "aws" {
region = "us-east-1"
}
data "aws_caller_identity" "current" {}
resource "aws_iam_role" "test_role" {
name = "asa-iam-key-rotation-lambda-assumed-role"

# Terraform's "jsonencode" function converts a
# Terraform expression result to valid JSON syntax.
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Sid = ""
Principal = {
AWS = "arn:aws:iam::(account_infra):role/asa-iam-key-rotation-lambda-execution-role" # Informar account id do ambiente desejado
}
},
]
})

tags = {
environment = "dev"
}
}
resource "aws_iam_role_policy" "test_policy" {
name = "AllowRotationFunctionPermissions"
role = aws_iam_role.test_role.id

# Terraform's "jsonencode" function converts a
# Terraform expression result to valid JSON syntax.
policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:List*",
"iam:CreatePolicy",
"iam:CreateAccessKey",
"iam:DeleteAccessKey",
"iam:UpdateAccessKey",
"iam:PutUserPolicy",
"iam:GetUserPolicy",
"iam:GetAccessKeyLastUsed",
"iam:GetUser"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"iam:AttachUserPolicy"
],
"Resource": [
"arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/*"
],
"Effect": "Allow"
},
{
"Action": [
"secretsmanager:PutResourcePolicy",
"secretsmanager:PutSecretValue",
"secretsmanager:DescribeSecret",
"secretsmanager:CreateSecret",
"secretsmanager:GetResourcePolicy",
"secretsmanager:ReplicateSecretToRegions"
],
"Resource": [
"arn:aws:secretsmanager:*:${data.aws_caller_identity.current.account_id}:secret:*"
],
"Effect": "Allow"
},
{
"Action": [
"iam:GetGroup"
],
"Resource": [
"arn:aws:iam::${data.aws_caller_identity.current.account_id}:group/IAMKeyRotationExemptionGroup"
],
"Effect": "Allow"
}
]
})
}
resource "aws_iam_group" "developers" {
name = "IAMKeyRotationExemptionGroup"
}