Práticas Recomendadas de segurança do EC2 Image Builder - EC2 Image Builder

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Práticas Recomendadas de segurança do EC2 Image Builder

O EC2 Image Builder oferece uma série de recursos de segurança a serem considerados no desenvolvimento e na implementação das suas próprias políticas de segurança. As melhores práticas a seguir são diretrizes gerais e não representam uma solução completa de segurança. Como essas melhores práticas podem não ser adequadas ou suficientes para o seu ambiente, trate-as como considerações úteis em vez de prescrições.

  • Não use grupos de segurança excessivamente permissivos nas fórmulas do Image Builder.

  • Não compartilhe imagens com contas nas quais você não confia.

  • Não torne públicas imagens que tenham dados privados ou confidenciais.

  • Aplique todos os patches de segurança disponíveis para Windows ou Linux durante a criação de imagens.

É altamente recomendável que você teste suas imagens para validar a postura de segurança e os níveis de conformidade de segurança aplicáveis. Soluções como o Amazon Inspector podem ajudar a validar a postura de segurança e conformidade das imagens.

IMDSv2 para pipelines do Image Builder

Quando seu pipeline do Image Builder é executado, ele envia solicitações HTTP para iniciar instâncias do EC2 que o Image Builder usa para criar e testar sua imagem. Para configurar a versão do IMDS que seu pipeline usa para as solicitações de lançamento, defina o httpTokens parâmetro nas configurações de metadados da instância de configuração da infraestrutura do Image Builder.

nota

Recomendamos que você configure todas as instâncias do EC2 que o Image Builder executa a partir de um pipeline criado para usar o IMDSv2, de forma que as solicitações de recuperação de metadados da instância exijam um cabeçalho de token assinado.

Para obter mais informações sobre a configuração da infraestrutura do Image Builder, consulteGerencie a configuração da infraestrutura do EC2 Image Builder. Para obter mais informações sobre as opções de metadados de instâncias do EC2 para imagens Linux, consulte Configurar as opções de metadados da instância no Guia do usuário do Amazon EC2. Para imagens do Windows, consulte Configurar as opções de metadados da instância no Guia do usuário do Amazon EC2.

Limpeza necessária após a construção

Depois que o Image Builder concluir todas as etapas de criação da sua imagem personalizada, o Image Builder prepara a instância de compilação para testes e criação de imagens. Antes de encerrar a instância de compilação para criar o snapshot, o Image Builder executa a seguinte limpeza para garantir a segurança da sua imagem:

Linux

O pipeline do Image Builder executa um script de limpeza para ajudar a garantir que a imagem final siga as melhores práticas de segurança e para remover quaisquer artefatos ou configurações de construção que não devam ser transferidos para seu snapshot. No entanto, você pode pular seções do script ou substituir totalmente os dados do usuário. Portanto, as imagens produzidas pelos pipelines do Image Builder não estão necessariamente em conformidade com nenhum critério regulatório específico.

Quando o pipeline conclui seus estágios de criação e teste, o Image Builder executa automaticamente o script de limpeza a seguir antes de criar a imagem de saída.

Importante

Se você substituir os dados do usuário em sua fórmula, o script não será executado. Nesse caso, certifique-se de incluir um comando nos dados do usuário que crie um arquivo vazio chamadoperform_cleanup. O Image Builder detecta esse arquivo e executa o script de limpeza antes de criar a nova imagem.

#!/bin/bash if [[ ! -f {{workingDirectory}}/perform_cleanup ]]; then echo "Skipping cleanup" exit 0 else sudo rm -f {{workingDirectory}}/perform_cleanup fi function cleanup() { FILES=("$@") for FILE in "${FILES[@]}"; do if [[ -f "$FILE" ]]; then echo "Deleting $FILE"; sudo shred -zuf $FILE; fi; if [[ -f $FILE ]]; then echo "Failed to delete '$FILE'. Failing." exit 1 fi; done }; # Clean up for cloud-init files CLOUD_INIT_FILES=( "/etc/sudoers.d/90-cloud-init-users" "/etc/locale.conf" "/var/log/cloud-init.log" "/var/log/cloud-init-output.log" ) if [[ -f {{workingDirectory}}/skip_cleanup_cloudinit_files ]]; then echo "Skipping cleanup of cloud init files" else echo "Cleaning up cloud init files" cleanup "${CLOUD_INIT_FILES[@]}" if [[ $( sudo find /var/lib/cloud -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting files within /var/lib/cloud/*" sudo find /var/lib/cloud -type f -exec shred -zuf {} \; fi; if [[ $( sudo ls /var/lib/cloud | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/lib/cloud/*" sudo rm -rf /var/lib/cloud/* || true fi; fi; # Clean up for temporary instance files INSTANCE_FILES=( "/etc/.updated" "/etc/aliases.db" "/etc/hostname" "/var/lib/misc/postfix.aliasesdb-stamp" "/var/lib/postfix/master.lock" "/var/spool/postfix/pid/master.pid" "/var/.updated" "/var/cache/yum/x86_64/2/.gpgkeyschecked.yum" ) if [[ -f {{workingDirectory}}/skip_cleanup_instance_files ]]; then echo "Skipping cleanup of instance files" else echo "Cleaning up instance files" cleanup "${INSTANCE_FILES[@]}" fi; # Clean up for ssh files SSH_FILES=( "/etc/ssh/ssh_host_rsa_key" "/etc/ssh/ssh_host_rsa_key.pub" "/etc/ssh/ssh_host_ecdsa_key" "/etc/ssh/ssh_host_ecdsa_key.pub" "/etc/ssh/ssh_host_ed25519_key" "/etc/ssh/ssh_host_ed25519_key.pub" "/root/.ssh/authorized_keys" ) if [[ -f {{workingDirectory}}/skip_cleanup_ssh_files ]]; then echo "Skipping cleanup of ssh files" else echo "Cleaning up ssh files" cleanup "${SSH_FILES[@]}" USERS=$(ls /home/) for user in $USERS; do echo Deleting /home/"$user"/.ssh/authorized_keys; sudo find /home/"$user"/.ssh/authorized_keys -type f -exec shred -zuf {} \; done for user in $USERS; do if [[ -f /home/"$user"/.ssh/authorized_keys ]]; then echo Failed to delete /home/"$user"/.ssh/authorized_keys; exit 1 fi; done; fi; # Clean up for instance log files INSTANCE_LOG_FILES=( "/var/log/audit/audit.log" "/var/log/boot.log" "/var/log/dmesg" "/var/log/cron" ) if [[ -f {{workingDirectory}}/skip_cleanup_instance_log_files ]]; then echo "Skipping cleanup of instance log files" else echo "Cleaning up instance log files" cleanup "${INSTANCE_LOG_FILES[@]}" fi; # Clean up for TOE files if [[ -f {{workingDirectory}}/skip_cleanup_toe_files ]]; then echo "Skipping cleanup of TOE files" else echo "Cleaning TOE files" if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within {{workingDirectory}}/TOE_*" sudo find {{workingDirectory}}/TOE_* -type f -exec shred -zuf {} \; fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete {{workingDirectory}}/TOE_*" exit 1 fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then echo "Deleting {{workingDirectory}}/TOE_*" sudo rm -rf {{workingDirectory}}/TOE_* fi if [[ $( sudo find {{workingDirectory}}/TOE_* -type d | sudo wc -l) -gt 0 ]]; then echo "Failed to delete {{workingDirectory}}/TOE_*" exit 1 fi fi # Clean up for ssm log files if [[ -f {{workingDirectory}}/skip_cleanup_ssm_log_files ]]; then echo "Skipping cleanup of ssm log files" else echo "Cleaning up ssm log files" if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within /var/log/amazon/ssm/*" sudo find /var/log/amazon/ssm -type f -exec shred -zuf {} \; fi if [[ $( sudo find /var/log/amazon/ssm -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete /var/log/amazon/ssm" exit 1 fi if [[ -d "/var/log/amazon/ssm" ]]; then echo "Deleting /var/log/amazon/ssm/*" sudo rm -rf /var/log/amazon/ssm fi if [[ -d "/var/log/amazon/ssm" ]]; then echo "Failed to delete /var/log/amazon/ssm" exit 1 fi fi if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/log/sa/sa*" sudo shred -zuf /var/log/sa/sa* fi if [[ $( sudo find /var/log/sa/sa* -type f | sudo wc -l ) -gt 0 ]]; then echo "Failed to delete /var/log/sa/sa*" exit 1 fi if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/lib/dhclient/dhclient*.lease" sudo shred -zuf /var/lib/dhclient/dhclient*.lease fi if [[ $( sudo find /var/lib/dhclient/dhclient*.lease -type f | sudo wc -l ) -gt 0 ]]; then echo "Failed to delete /var/lib/dhclient/dhclient*.lease" exit 1 fi if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then echo "Deleting files within /var/tmp/*" sudo find /var/tmp -type f -exec shred -zuf {} \; fi if [[ $( sudo find /var/tmp -type f | sudo wc -l) -gt 0 ]]; then echo "Failed to delete /var/tmp" exit 1 fi if [[ $( sudo ls /var/tmp | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/tmp/*" sudo rm -rf /var/tmp/* fi # Shredding is not guaranteed to work well on rolling logs if [[ -f "/var/lib/rsyslog/imjournal.state" ]]; then echo "Deleting /var/lib/rsyslog/imjournal.state" sudo shred -zuf /var/lib/rsyslog/imjournal.state sudo rm -f /var/lib/rsyslog/imjournal.state fi if [[ $( sudo ls /var/log/journal/ | sudo wc -l ) -gt 0 ]]; then echo "Deleting /var/log/journal/*" sudo find /var/log/journal/ -type f -exec shred -zuf {} \; sudo rm -rf /var/log/journal/* fi sudo touch /etc/machine-id
Windows

Depois que o pipeline do Image Builder personalizar as imagens do Windows, ele executará o utilitário Sysprep da Microsoft. Essas ações seguem as AWS melhores práticas para endurecer e limpar a imagem.

Substitua o script de limpeza do Linux

O Image Builder cria imagens que são seguras por padrão e seguem nossas melhores práticas de segurança. No entanto, alguns casos de uso mais avançados podem exigir que você pule uma ou mais seções do script de limpeza integrado. Se você precisar pular parte da limpeza, é altamente recomendável testar sua AMI de saída para garantir a segurança da sua imagem.

Importante

Ignorar seções no script de limpeza pode resultar na inclusão de informações confidenciais, como detalhes da conta do proprietário ou chaves SSH, na imagem final e, em qualquer instância, na execução dessa imagem. Você também pode ter problemas com o lançamento em diferentes zonas de disponibilidade, regiões ou contas.

A tabela a seguir descreve as seções do script de limpeza, os arquivos que são excluídos nessa seção e os nomes dos arquivos que você pode usar para sinalizar uma seção que o Image Builder deve ignorar. Para ignorar uma seção específica do script de limpeza, você pode usar o módulo de ação do CreateFile componente ou um comando nos dados do usuário (se estiver substituindo) para criar um arquivo vazio com o nome especificado na coluna Ignorar nome do arquivo da seção.

nota

Os arquivos que você cria para ignorar uma seção do script de limpeza não devem incluir uma extensão de arquivo. Por exemplo, se você quiser pular a CLOUD_INIT_FILES seção do script, mas criar um arquivo chamadoskip_cleanup_cloudinit_files.txt, o Image Builder não reconhecerá o arquivo ignorado.

Entrada

Seção de limpeza

Arquivos removidos

Ignorar nome do arquivo da seção

CLOUD_INIT_FILES

/etc/sudoers.d/90-cloud-init-users

/etc/locale.conf

/var/log/cloud-init.log

/var/log/cloud-init-output.log

skip_cleanup_cloudinit_files

INSTANCE_FILES

/etc/.updated

/etc/aliases.db

/etc/hostname

/var/lib/misc/postfix.aliasesdb-stamp

/var/lib/postfix/master.lock

/var/spool/postfix/pid/master.pid

/var/.updated

/var/cache/yum/x86_64/2/.gpgkeyschecked.yum

skip_cleanup_instance_files

SSH_FILES

/etc/ssh/ssh_host_rsa_key

/etc/ssh/ssh_host_rsa_key.pub

/etc/ssh/ssh_host_ecdsa_key

/etc/ssh/ssh_host_ecdsa_key.pub

/etc/ssh/ssh_host_ed25519_key

/etc/ssh/ssh_host_ed25519_key.pub

/root/.ssh/authorized_keys

/home/<all users>/.ssh/authorized_keys;

skip_cleanup_ssh_files

INSTANCE_LOG_FILES

/var/log/audit/audit.log

/var/log/boot.log

/var/log/dmesg

/var/log/cron

skip_cleanup_instance_log_files

TOE_FILES

{{workingDirectory}}/TOE_*

skip_cleanup_toe_files

SSM_LOG_FILES

/var/log/amazon/ssm/*

skip_cleanup_ssm_log_files