DevSecOpsARTIGO

Protegendo credenciais e configurações com contêiner criptografado.

Protegendo credenciais e configurações com contêiner criptografado.
Imagem: Cesar Gimenes

Eu uso um pequeno computador de bolso na mochila. Esse dispositivo serve para testes e desenvolvimento, e armazena informações sensíveis como credenciais, senhas e chaves de acesso. Eu não quero que esses dados caiam em mãos erradas. Diferentemente do notebook, que tem o HD criptografado, meu computador de bolso não usa criptografia no HD. A criptografia consome muito processamento e requer desativar o TRIM do SSD, o que prejudica o desempenho.

Então para contornar o problema resolvi criar um contêiner criptografado para guardar apenas as informações sensíveis. Esse contêiner é montado somente quando necessário, o que aumenta a segurança do sistema.

Criando um contêiner criptografado

Você precisa instalar o pacote cryptsetup. Para isso, execute como root:

bash
sudo apt install cryptsetup

Depois, crie o contêiner criptografado. Primeiro, gere um arquivo de 200MB (como exemplo):

bash
dd if=/dev/urandom of=secure_container.img bs=1M count=200

Inicialize o LUKS:

bash
cryptsetup luksFormat secure_container.img

Abra o contêiner:

bash
cryptsetup open secure_container.img secure_container

Formate (ext4 como exemplo):

bash
mkfs.ext4 /dev/mapper/secure_container

Monte o contêiner:

bash
mkdir -p /mnt/secure_container
mount /dev/mapper/secure_container /mnt/secure_container

Agora o diretório /mnt/secure_container está pronto para uso. Você pode mover seus arquivos sensíveis para lá e criar links simbólicos (por exemplo, do diretório ~/.ssh ou de chaves de acesso ~/.aws).

Desmontando o contêiner

Para desmontar, desmonte o diretório e feche o contêiner:

bash
umount /mnt/secure_container
cryptsetup close secure_container

Automatizando a montagem e desmontagem

Como montar e desmontar o contêiner é muito repetitivo vale a pena crie scripts e automatizandor essa tarefa. Os scripts precisam de permissão de root para funcionar. Você pode configurar o sudo para não pedir senha para esses scripts, facilitando o uso.

Script de montagem (mount_secure_container.sh)

bash
#!/bin/sh

[ "root" != "$USER" ] && exec sudo $0 "$@"

# Caminhos de exemplo.
IMAGE_PATH="/home/user/secure_container.img"
MAPPER_NAME="secure_container"
MOUNT_POINT="/mnt/secure_container"

# Abre o contêiner.
cryptsetup open "$IMAGE_PATH" "$MAPPER_NAME" || {
    echo "Falha ao abrir o contêiner."
    exit 1
}

# Monta o contêiner.
mount "/dev/mapper/$MAPPER_NAME" "$MOUNT_POINT" || {
    echo "Falha ao montar o contêiner."
    cryptsetup close "$MAPPER_NAME"
    exit 1
}

echo "Contêiner montado em: $MOUNT_POINT"
exit 0

Script de desmontagem (umount_secure_container.sh)

bash
#!/bin/sh

[ "root" != "$USER" ] && exec sudo $0 "$@"

IMAGE_PATH="/home/user/secure_container.img"
MAPPER_NAME="secure_container"
MOUNT_POINT="/mnt/secure_container"

# Desmonta o contêiner.
umount "$MOUNT_POINT" || {
    echo "Falha ao desmontar. Verifique se algum arquivo ainda está em uso."
    exit 1
}

# Fecha o contêiner.
cryptsetup close "$MAPPER_NAME" || {
    echo "Falha ao fechar o contêiner LUKS."
    exit 1
}

echo "Contêiner desmontado e fechado."
exit 0

Script para desligar (off)

Crie um script chamado off para garantir que o contêiner seja desmontado antes de desligar:

bash
#!/bin/sh

[ "root" != "$USER" ] && exec sudo $0 "$@"

sync
/home/user/bin/umount_encrypted.sh
poweroff

Em seguida, configure o sudo para não pedir senha ao executar esses scripts:

bash
sudo visudo

Adicione as linhas:

bash
user ALL=(ALL) NOPASSWD: /home/user/bin/mount_encrypted.sh
user ALL=(ALL) NOPASSWD: /home/user/bin/umount_encrypted.sh
user ALL=(ALL) NOPASSWD: /home/user/bin/off

Lembre de substituir user nos scripts pelo seu nome de usuário.

Conclusão

Esse método mantém dados sensíveis seguros e acessíveis apenas quando necessário. O contêiner criptografado simplifica backups e facilita a transferência para outro computador. Assim, você combina segurança e praticidade no seu sistema.

Cesar GimenesAutor

Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.

Ver perfil