16/04/2023 - AWS, DOCKER, TERRAFORM
Bunu Terraform için geçici bir PGP kullanım yöntemi olarak düşünün. CI/CD ardışık düzeni için kullanılması amaçlanmış olan, terminalde AWS IAM kullanıcı oturum açma profili parolası oluşturma, şifreleme ve çıktı alma yöntemidir. AWS konsol oturumu için gerçek parolayı almak üzere, yerel ortamınızda çıkan parolanın şifresini çözeceksiniz. Buradaki tüm amaç bu. Bunun "geçici" olarak değerlendirilmesinin nedeni, bir parola kullanılmamasıdır. Bu nedenle, şifresi çözülmüş şifreyi alır almaz değiştirmelisiniz.
Docker üzerine kurulu olan bir çözüm kullanacağız. Kişisel olarak, aynı sonuca ulaşmak için belirli çevrimiçi hesaplara kaydolmayı veya cihazıma bir defaya mahsus üçüncü şahıs araçları yüklemeyi sevmiyorum. Buna Keybase, gpg komutu vb. dahildir. Kötü olduklarını söylemiyorum ama gereksiz buluyorum.
Hatta bunun için bir GitHub deposu oluşturabilir ve tüm mühendislerin sisteme dahil edilirken bunu kullanmasına izin verebilirsiniz. Bu örneğin basit izlenecek yolu aşağıdaki gibidir.
aws_iam_user_login_profile.pgp_key
terraform apply
çıktısının şifresini çözün..env.dist
dosyasından .env
oluşturun ve işaretli değişkenleri kendi verilerinizi kullanarak güncelleyin. Docker görüntüsünü oluşturmak için $ make build
komutunu çalıştırın.
Her şeyi yapan $ make keys
komutunu çalıştırın. Genel ve özel anahtarlarla doğrudan bir şey yapmayacaksınız ama PGP anahtarı, pgp_key
alanının gerekli olduğu Terraform kaynaklarında kullanacağınız anahtardır. Bununla birlikte, aşağıdaki isteğe bağlı adımları kullanarak genel ve özel anahtarları başka herhangi bir iş için kullanmaya devam edebilirsiniz.
Bu, bu gönderiye özgü değildir, o nedenle bilgilendirici bir adım olarak kabul edin.
tmp/plain_input.txt
dosyası oluşturun.tmp/encrypted_input.txt
dosyası oluşturun.$ make encrypt
komutunu çalıştırın.Bu, bu gönderiye özgü değildir, o nedenle bilgilendirici bir adım olarak kabul edin.
tmp/encrypted_input.txt
dosyası oluşturun.tmp/decrypted_input.txt
dosyası oluşturun.$ make decrypt
komutunu çalıştırın.Bu açıkça bizim paylaşımımızla ilgilidir.
tmp/encrypted_input.txt
dosyası oluşturun.tmp/decrypted_input.txt
dosyası oluşturun.$ make decrypt-base64
komutunu çalıştırın.Burada en güzel çözüme odaklanmıyoruz. Bunun yerine sonuca yönelik davranıyoruz. İsterseniz, tüm bash dosyalarını tek başına çalışan parametreleştirilmiş komutta birleştirebilirsiniz. Bunu geliştirmek için her türlü şeyi yapabilirsiniz.
├── .env.dist
├── .gitignore
├── Dockerfile
├── Makefile
├── decrypt.sh
├── decrypt_base64.sh
├── encrypt.sh
├── keys.sh
├── pgp.cfg
└── tmp
└── .gitkeep
PGP_DIR="/root/.gnupg"
PGP_CFG="/pgp.cfg"
PUB_KEY="/tmp/public.key"
PRV_KEY="/tmp/private.key"
B64_KEY="/tmp/base64.key"
PLAIN_INPUT="/tmp/plain_input.txt"
ENCRYPTED_INPUT="/tmp/encrypted_input.txt"
DECRYPTED_INPUT="/tmp/decrypted_input.txt"
# Updated with your own data
NAME="Your name"
EMAIL="your email"
COMMENT="Key purpose"
/tmp/*
!/tmp/.gitignore
.env
FROM alpine:3.17.0
COPY .env .env
COPY pgp.cfg pgp.cfg
COPY keys.sh keys.sh
COPY encrypt.sh encrypt.sh
COPY decrypt.sh decrypt.sh
COPY decrypt_base64.sh decrypt_base64.sh
RUN apk update && \
apk fetch gnupg && \
apk add gnupg && \
chmod +x keys.sh && \
chmod +x encrypt.sh && \
chmod +x decrypt.sh && \
chmod +x decrypt_base64.sh
.PHONY: help
help: ## Display available commands
@awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
.PHONY: build
build: ## Build docker image
@DOCKER_BUILDKIT=0 docker build --no-cache --tag inanzzz/pgp:latest .
.PHONY: keys
keys: ## Generate public, private and base64 encoded public key.
docker run --rm --env ENV_FILE=".env" --volume `pwd`/tmp:/tmp:rw --name inanzzz-pgp inanzzz/pgp:latest sh -c ./keys.sh
.PHONY: encrypt
encrypt: ## Encrypt plain text.
docker run --rm --env ENV_FILE=".env" --volume `pwd`/tmp:/tmp:rw --name inanzzz-pgp inanzzz/pgp:latest sh -c ./encrypt.sh
.PHONY: decrypt
decrypt: ## Decrypt encrypt text
docker run --rm --env ENV_FILE=".env" --volume `pwd`/tmp:/tmp:rw --name inanzzz-pgp inanzzz/pgp:latest sh -c ./decrypt.sh
.PHONY: decrypt-base64
decrypt-base64: ## Decrypt base64 encrypted text
docker run --rm --env ENV_FILE=".env" --volume `pwd`/tmp:/tmp:rw --name inanzzz-pgp inanzzz/pgp:latest sh -c ./decrypt_base64.sh
#!/bin/sh
CYAN="\033[0;36m"
CLEAR="\033[0m"
printf "${CYAN}> DECRYPT INPUT -----------------------------------------------------------------------------${CLEAR}\n"
printf "${CYAN}Export all variables from dot env file into environment${CLEAR}\n"
set -o allexport
source ${ENV_FILE}
set +o allexport
echo "done"
printf "${CYAN}Create pgp directory and get into it${CLEAR}\n"
gpg2 --list-keys
cd ${PGP_DIR}
echo "done"
printf "${CYAN}Restore public and private key${CLEAR}\n"
gpg2 --import-options import-restore --import ${PUB_KEY}
gpg2 --import-options import-restore --import ${PRV_KEY}
echo "done"
printf "${CYAN}Decrypt input${CLEAR}\n"
gpg2 --decrypt ${ENCRYPTED_INPUT} > ${DECRYPTED_INPUT}
echo "done"
printf "${CYAN}> FINISHED ----------------------------------------------------------------------------------${CLEAR}\n"
#!/bin/sh
CYAN="\033[0;36m"
CLEAR="\033[0m"
printf "${CYAN}> DECRYPT INPUT -----------------------------------------------------------------------------${CLEAR}\n"
printf "${CYAN}Export all variables from dot env file into environment${CLEAR}\n"
set -o allexport
source ${ENV_FILE}
set +o allexport
echo "done"
printf "${CYAN}Create pgp directory and get into it${CLEAR}\n"
gpg2 --list-keys
cd ${PGP_DIR}
echo "done"
printf "${CYAN}Restore public and private key${CLEAR}\n"
gpg2 --import-options import-restore --import ${PUB_KEY}
gpg2 --import-options import-restore --import ${PRV_KEY}
echo "done"
printf "${CYAN}Decrypt input${CLEAR}\n"
cat ${ENCRYPTED_INPUT} | base64 -d | gpg2 --decrypt > ${DECRYPTED_INPUT}
echo "done"
printf "${CYAN}> FINISHED ----------------------------------------------------------------------------------${CLEAR}\n"
#!/bin/sh
CYAN="\033[0;36m"
CLEAR="\033[0m"
printf "${CYAN}> ENCRYPT INPUT -----------------------------------------------------------------------------${CLEAR}\n"
printf "${CYAN}Export all variables from dot env file into environment${CLEAR}\n"
set -o allexport
source ${ENV_FILE}
set +o allexport
echo "done"
printf "${CYAN}Create pgp directory and get into it${CLEAR}\n"
gpg2 --list-keys
cd ${PGP_DIR}
echo "done"
printf "${CYAN}Restore public and private key${CLEAR}\n"
gpg2 --import-options import-restore --import ${PUB_KEY}
gpg2 --import-options import-restore --import ${PRV_KEY}
echo "done"
printf "${CYAN}Auto trust and verify keys${CLEAR}\n"
echo -e "5\ny\n" | gpg2 --no-tty --command-fd 0 --expert --edit-key ${EMAIL} trust
echo "done"
printf "${CYAN}Encrypt input${CLEAR}\n"
gpg2 --batch --yes --output ${ENCRYPTED_INPUT} --encrypt --sign --armor -r ${EMAIL} ${PLAIN_INPUT}
echo "done"
printf "${CYAN}> FINISHED ----------------------------------------------------------------------------------${CLEAR}\n"
#!/bin/sh
CYAN="\033[0;36m"
CLEAR="\033[0m"
printf "${CYAN}> GENERATE KEYS -----------------------------------------------------------------------------${CLEAR}\n"
printf "${CYAN}Export all variables from dot env file into environment${CLEAR}\n"
set -o allexport
source ${ENV_FILE}
set +o allexport
echo "done"
printf "${CYAN}Prepare configuration file${CLEAR}\n"
sed -i -e 's/${NAME}/'"${NAME}"'/g' -e 's/${COMMENT}/'"${COMMENT}"'/g' -e 's/${EMAIL}/'"${EMAIL}"'/g' ${PGP_CFG}
echo "done"
printf "${CYAN}Create pgp directory and get into it${CLEAR}\n"
gpg2 --list-keys
cd ${PGP_DIR}
echo "done"
printf "${CYAN}Generate keys${CLEAR}\n"
gpg2 --verbose --batch --gen-key ${PGP_CFG}
echo "done"
printf "${CYAN}Backup public and private keys${CLEAR}\n"
gpg2 --yes --output ${PUB_KEY} --armor --export-options export-backup --export ${EMAIL}
gpg2 --yes --output ${PRV_KEY} --armor --export-options export-backup --export-secret-keys ${EMAIL}
echo "done"
printf "${CYAN}Export base64 encoded public key${CLEAR}\n"
gpg2 --export ${EMAIL} | base64 -w 0 > ${B64_KEY}
echo "done"
printf "${CYAN}> FINISHED ----------------------------------------------------------------------------------${CLEAR}\n"
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: ${NAME}
Name-Email: ${EMAIL}
Name-Comment: ${COMMENT}
Expire-Date: 0
%no-protection