本文目录导读:

- Docker容器数据卷加密(使用LUKS)
- 使用Docker的密钥管理
- 使用Podman和系统层加密(叠加文件系统)
- 使用TLS/SSL加密容器通信
- 完整的自动化部署脚本(使用Docker Compose + 加密)
- 最佳实践建议
在Shell脚本中配置容器数据加密,主要涉及存储加密和传输加密两个维度,以下是几种主流的方法和对应的Shell脚本配置示例:
Docker容器数据卷加密(使用LUKS)
LUKS(Linux Unified Key Setup)是Linux下最常用的磁盘加密方案。
创建加密数据卷
#!/bin/bash # 配置变量 DATA_DIR="/data/encrypted-data" KEY_FILE="/root/keys/container.key" PASSWORD="your-strong-password-here" # 创建加密文件(例如创建10GB的加密文件) mkdir -p /data dd if=/dev/zero of=$DATA_DIR bs=1M count=10240 # 使用LUKS格式化 echo -n "$PASSWORD" | cryptsetup luksFormat $DATA_DIR --key-file=- --batch-mode # 打开加密设备 echo -n "$PASSWORD" | cryptsetup open --key-file=- $DATA_DIR encrypted_vol # 格式化为ext4文件系统 mkfs.ext4 /dev/mapper/encrypted_vol # 挂载 mkdir -p /mnt/encrypted mount /dev/mapper/encrypted_vol /mnt/encrypted # 使用加密卷运行容器 docker run -d \ --name encrypted-app \ -v /mnt/encrypted:/data:Z \ nginx:latest
使用Docker的密钥管理
创建并管理Docker密钥
#!/bin/bash # 创建密钥文件 echo "my-super-secret-db-password" | docker secret create db_password - # 创建加密配置文件 cat > config.sh << 'EOF' #!/bin/bash # 在Swarm模式下使用密钥 docker service create \ --name encrypted-service \ --secret db_password \ --env DB_PASSWORD_FILE=/run/secrets/db_password \ -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_password \ mysql:8.0 EOF # 运行脚本 chmod +x config.sh ./config.sh
使用Podman和系统层加密(叠加文件系统)
使用fscrypt或eCryptfs
#!/bin/bash # 安装fscrypt(需要内核支持) apt-get install fscrypt -y # Debian/Ubuntu # yum install fscrypt -y # RHEL/CentOS # 设置加密保护策略 mkdir -p /var/lib/containers/storage fscrypt setup /var/lib/containers/storage # 为特定目录启用加密 fscrypt encrypt /var/lib/containers/storage/encrypted-layer # 创建使用加密目录的Podman容器 podman run -d \ --name encrypted-podman \ -v /var/lib/containers/storage/encrypted-layer:/data \ nginx:latest
使用TLS/SSL加密容器通信
生成自签名证书并配置
#!/bin/bash # 配置变量 CERTS_DIR="/etc/docker/certs.d" DOMAIN="myregistry.internal" PASSWORD="cert-password" # 生成CA证书 openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-private.key 4096 openssl req -new -x509 -days 365 -key ca-private.key -passin pass:$PASSWORD \ -out ca.pem -subj "/CN=My CA" # 生成服务器证书 openssl genrsa -out server.key 4096 openssl req -new -key server.key -out server.csr -subj "/CN=$DOMAIN" openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-private.key \ -passin pass:$PASSWORD -CAcreateserial -out server.crt # 部署证书到Docker配置 cp ca.pem server.crt server.key /etc/docker/certs.d/$DOMAIN:5000/ # 重启Docker服务 systemctl restart docker # 启动加密的私人仓库 docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /etc/docker/certs.d:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/$DOMAIN:5000/server.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/$DOMAIN:5000/server.key \ registry:2
完整的自动化部署脚本(使用Docker Compose + 加密)
#!/bin/bash
set -e
# 配置
ENCRYPTION_KEY=$(openssl rand -hex 32)
STORAGE_PATH="/opt/encrypted-containers"
DB_PASSWORD=$(openssl rand -base64 24)
# 创建加密存储
create_encrypted_storage() {
local size=${1:-10G}
local mount_point=${2:-/mnt/encrypted}
dd if=/dev/zero of=$STORAGE_PATH bs=1 count=0 seek=$size
# 使用密钥加密
echo "$ENCRYPTION_KEY" | cryptsetup luksFormat $STORAGE_PATH --key-file=-
echo "$ENCRYPTION_KEY" | cryptsetup open --key-file=- $STORAGE_PATH encrypted_volume
mkfs.ext4 /dev/mapper/encrypted_volume
mount /dev/mapper/encrypted_volume $mount_point
}
# 生成docker-compose文件
generate_compose() {
cat > docker-compose.encrypted.yml << EOF
version: '3.8'
services:
app:
image: nginx:alpine
volumes:
- encrypted_data:/usr/share/nginx/html
secrets:
- db_password
environment:
- DB_PASSWORD_FILE=/run/secrets/db_password
volumes:
encrypted_data:
driver: local
driver_opts:
type: ext4
device: /dev/mapper/encrypted_volume
secrets:
db_password:
file: ./secrets/db_password.txt
EOF
}
# 实现加密配置文件
create_encrypted_config() {
mkdir -p secrets
echo "$DB_PASSWORD" > secrets/db_password.txt
chmod 600 secrets/db_password.txt
# 可选:使用gpg加密配置文件
gpg --symmetric --cipher-algo AES256 --batch --passphrase "$ENCRYPTION_KEY" \
secrets/db_password.txt secrets/db_password.enc
}
# 部署加密容器
deploy_encrypted() {
docker stack deploy -c docker-compose.encrypted.yml encrypted-app
}
# 清理函数
cleanup() {
umount /mnt/encrypted
cryptsetup close encrypted_volume
rm -f $STORAGE_PATH
}
# 主流程
main() {
echo "配置容器数据加密..."
create_encrypted_storage "5G" "/mnt/encrypted"
generate_compose
create_encrypted_config
deploy_encrypted
echo "加密部署完成!"
echo "加密密钥: $ENCRYPTION_KEY(请安全保存)"
}
main "$@"
最佳实践建议
-
密钥管理:
- 使用硬件安全模块(HSM)或密钥管理服务(KMS)
- 定期轮换密钥
- 使用环境变量或Secret文件而非硬编码
-
性能考虑:
- 使用硬件加速(如Intel AES-NI)
- 选择合适的加密块大小
- 考虑使用dm-crypt的no_read_workqueue和no_write_workqueue优化
-
备份策略:
# 加密备份脚本 tar czf - /encrypted/data | gpg --symmetric --cipher-algo AES256 \ --batch --passphrase "$BACKUP_PASSPHRASE" -o backup.tar.gz.gpg
-
审计与监控:
# 配置审计规则 auditctl -w /etc/docker -p wa -k docker_config auditctl -w /var/lib/docker -p wa -k docker_data
这些脚本可以根据具体需求调整,生产环境中建议使用专门的密钥管理系统(如HashiCorp Vault)来管理加密密钥,而非直接存储在脚本中。