Como exportar automaticamente os logs de auditoria do AWS RDS para a instância do bucket do S3?
Publicados: 2022-03-05Antes de aprendermos a exportar automaticamente os logs de auditoria do RDS para o S3, você sabia que o AWS CloudWatch armazena automaticamente os logs de banco de dados do RDS? Sim, eles fazem, mas eles armazenam apenas os logs gerais da sua instância de banco de dados. Agora, e se você quiser encontrar uma consulta ou dados específicos do log? Qual usuário executou uma consulta específica ou de qual endereço IP? Quem excluiu determinados registros de suas tabelas de banco de dados?
Além disso, de alguma forma você conseguiu exportar todos os logs de auditoria da sua instância do RDS para o CloudWatch, o que é ótimo. Mas, você sabe? O CloudWatch reterá esses logs por apenas 30 dias!! Para mantê-los por mais tempo, você precisa exportar os logs do CloudWatch para o bucket do S3. Você pode fazer isso manualmente no painel do CloudWatch. Mas, e se você quiser ter automação para isso?
Este guia o guiará por todas as etapas necessárias para registrar todos esses eventos automaticamente!
Este guia inclui:
1) Ajuste as configurações do RDS para enviar logs de auditoria ao CloudWatch
2) Crie um bucket do S3 (para armazenar logs de auditoria do CloudWatch)
3) Criar função do IAM (vamos usar isso para automação do Lambda)
4) Lambda (função para automatizar a exportação do CloudWatch Logs para o S3)
Vamos começar!
Ajuste as configurações do RDS para enviar logs de auditoria ao CloudWatch
Antes de tudo, precisamos ajustar o RDS para enviar logs específicos ao CloudWatch. Para fazer isso, vamos criar um Option Group e um Parameter Group.
Criar grupo de opções
⇒ Visite o painel do Amazon RDS.
⇒ Vá para o Grupo de Opções.
⇒ Clique no botão Criar Grupo.
⇒ Insira o Nome e Descrição para este grupo.
⇒ Selecione Engine: mysql e Engine Version: 8.0. Clique em Criar.
⇒ Clique no Grupo de Opções que você criou.
⇒ Na seção Opções, clique no botão Adicionar opção.
⇒ Na opção “SERVER_AUDIT_EVENTS*”, digite os valores que você deseja auditar, ou seja, CONNECT, QUERY, QUERY_DDL, QUERY_DML, QUERY_DCL, QUERY_DML_NO_SELECT. Se você deseja registrar todas as consultas executadas em suas tabelas, basta digitar QUERY neste campo.
⇒ Defina “Sim” para Aplicar Imediatamente. Clique em Adicionar Opção.
Criar grupo de parâmetros
⇒ Vamos abrir o Amazon RDS Dashboard.
⇒ Clique no Grupo de Parâmetros.
⇒ Clique no botão Criar Grupo de Parâmetros.
⇒ Selecione “Família do grupo de parâmetros”: mysql8.0
⇒ Selecione “Tipo”: Grupo de Parâmetros DB
⇒ Digite o Nome e a Descrição do Grupo. Clique em Criar.
⇒ Agora, clique no grupo de parâmetros que você criou.
⇒ Em Parâmetro, editaremos determinados parâmetros e definiremos os seguintes valores:
⇒ Editar parâmetro: “log_output” ⇒ Mudar seu valor de TABLE para FILE
⇒ Editar parâmetro: “slow_query_log” ⇒ Alterar seu valor de BLANK para 1
⇒ Editar parâmetro: “general_log” ⇒ Alterar seu valor de BLANK para 1
Agora, estamos todos configurados com nosso Grupo de Opções e Grupo de Parâmetros. Agora, vamos alocar esses grupos ao nosso RDS.
⇒ Vá para o seu Painel RDS.
⇒ Clique no RDS que você criou.
⇒ Clique em Modificar.
⇒ Role a página para baixo e vá para a seção “Opções do banco de dados”.
⇒ Em “Grupo de parâmetros DB”, selecione o grupo de parâmetros que você criou.
⇒ Em “Grupo de opções”, selecione o grupo de opções que você criou.
Agora estamos todos prontos com o RDS. Depois de concluir as etapas acima, aguarde de 20 a 30 minutos para preencher os dados no CloudWatch (OBSERVAÇÃO: pode levar mais tempo dependendo do tamanho dos logs).
Depois que o CloudWatch reunir todos os logs, você verá os logs de auditoria em seu painel do CloudWatch. Ficará como a imagem a seguir:
Criar um bucket do S3 (para armazenar logs de auditoria do CloudWatch)
⇒ Vá para o Painel do Amazon S3.
⇒ Crie um novo Balde.
⇒ Depois de criar um bucket, abra-o e navegue até a guia Permissões.
⇒ Precisaremos permitir que o CloudWatch coloque objetos no bucket (Write Access)
⇒ Clique no botão Editar para Política de bucket. Digite o seguinte código:
{
“Versão”: “2012-10-17”,
"Declaração": [
{
“Efeito”: “Permitir”,
"Diretor": {
“Serviço”: “logs.YOUR-REGION.amazonaws.com” // ou seja, logs.us-east-1.amazonaws.com
},
“Ação”: “s3:GetBucketAcl”,
“Recurso”: “arn:aws:s3:::BUCKET_NAME_HERE”
},
{
“Efeito”: “Permitir”,
"Diretor": {
“Serviço”: “logs.YOUR-REGION.amazonaws.com”
},
“Ação”: “s3:ColocarObjeto”,
“Recurso”: “arn:aws:s3:::BUCKET_NAME_HERE/*”,
"Doença": {
“StringEquals”: {
“s3:x-amz-acl”: “bucket-proprietário-controle total”
}
}
}
] }
Criar função do IAM (usaremos isso para automação do Lambda)
Agora, criaremos a função do IAM que será usada na configuração da função Lambda. O serviço AWS Lambda exigirá permissão para registrar eventos e gravar no bucket do S3 que criamos.
Criaremos a função do IAM “Export-RDS-CloudWatch-to-S3-Lambda” com as políticas “AmazonS3FullAccess”, “CloudWatchLogsFullAccess” e “CloudWatchEventsFullAccess”.
⇒ Abra seu AWS IAM Dashboard.
⇒ Mude para as Funções e clique no botão Criar Função.
⇒ Em “Use case”, selecione Lambda e clique em Next.
⇒ Procure por “AmazonS3FullAccess” e selecione-o.
⇒ Procure por “CloudWatchLogsFullAccess” e selecione-o.
⇒ Procure por “CloudWatchEventsFullAccess” e selecione-o.
⇒ Defina o Nome da Função: “Export-RDS-CloudWatch-to-S3-Lambda” e clique em Criar função.
Lambda (função para automatizar a exportação do CloudWatch Logs para o S3)
A função Lambda permite que você coloque seu código na função e execute-o em gatilhos. Você não precisa ter nenhum servidor ou configurado para isso. Muito fácil e eficiente!
⇒ Mude para o AWS Lambda Dashboard.
⇒ Clique em Funções e depois clique no botão Criar função.
⇒ Mantenha “Autor para Scratch” selecionado.
⇒ Defina “Nome da função”: Export-RDS-CloudWatch-Logs-To-S3
⇒ Em “Runtime”, selecione Python 3.x.
⇒ Em “Permissões”, selecione “Usar uma função existente” e selecione a função do IAM que criamos na etapa anterior.
⇒ Clique na função Create e navegue até Code view e digite o seguinte script:
importar boto3
importar SO
importar data e horaGROUP_NAME = os.environ['GROUP_NAME'] DESTINATION_BUCKET = os.environ['DESTINATION_BUCKET'] PREFIX = os.environ['PREFIX'] NDAYS = os.environ['NDAYS'] nDays = int(NDAYS)
currentTime = datetime.datetime.now()
StartDate = currentTime – datetime.timedelta(days=nDays)
EndDate = currentTime – datetime.timedelta(days=nDays – 1)fromDate = int(StartDate.timestamp() * 1000)
toDate = int(EndDate.timestamp() * 1000)BUCKET_PREFIX = os.path.join(PREFIX, StartDate.strftime('%Y{0}%m{0}%d').format(os.path.sep))
def lambda_handler(evento, contexto):
cliente = boto3.client('logs')
client.create_export_task(
logGroupName=GROUP_NAME,
fromTime=fromDate,
to=toData,
destino=DESTINATION_BUCKET,
destinationPrefix=BUCKET_PREFIX
)
⇒ Agora, clique em Configuração ⇒ Variáveis de Ambiente.
⇒ Precisamos criar 4 variáveis:
⇒ DESTINATION_BUCKET: <Nome do seu bucket do S3>
⇒ GROUP_NAME: <Nome do grupo de log que você está exportando>
⇒ NDAYS: 1
⇒ PREFIX: logs exportados
⇒ Tudo bem, você está definido agora. Salve a função.
Agora, vamos definir a automação para executar esta função lambda.
⇒ Agora, visite seu painel do CloudWatch.
⇒ Vá para Eventos ⇒ Regras.
⇒ Clique em Criar Regra.
⇒ Em Origem do Evento, selecione Agendar.
⇒ Defina Taxa fixa ou expressão cron para executar automaticamente nossa função lambda.
⇒ Em Destino, selecione Função Lambda.
⇒ Em Função, selecione a função que criamos no passo anterior.
Isso é tudo. Agora, você configurou um ambiente para exportar logs do RDS para o S3 automaticamente. Você pode reter os logs pelo tempo que desejar. Mas, se você ainda enfrentar algum problema, sinta-se à vontade para postar um comentário aqui. Gostaríamos muito de ouvir de você!!