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.


  1. Yerel ortamınızda genel, özel ve base64 kodlu PGP anahtarları oluşturun.

  2. Base64 kodlu PGP anahtarını, belirli çıktıları şifrelemek için gerekli olduğu yerde Terraform bildirimlerine kopyalayın. Örneğin: aws_iam_user_login_profile.pgp_key

  3. Şifrelenmiş terraform apply çıktısının şifresini çözün.

  4. AWS profiline giriş yapın ve şifreyi değiştirin.

Kurulum


.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.


Genel, özel ve base64 PGP anahtarları oluşturun


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.


Bir şeyi şifreleyin (isteğe bağlı)


Bu, bu gönderiye özgü değildir, o nedenle bilgilendirici bir adım olarak kabul edin.



Bir şeyin şifresini çöz (isteğe bağlı)


Bu, bu gönderiye özgü değildir, o nedenle bilgilendirici bir adım olarak kabul edin.



Terraform'un şifrelenmiş çıktının şifresini çözün


Bu açıkça bizim paylaşımımızla ilgilidir.



Dosyalar


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

.env.dist


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"

.gitignore


/tmp/*
!/tmp/.gitignore
.env

Dockerfile


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

Makefile


.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

decrypt.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"

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"
cat ${ENCRYPTED_INPUT} | base64 -d | gpg2 --decrypt > ${DECRYPTED_INPUT}
echo "done"

printf "${CYAN}> FINISHED ----------------------------------------------------------------------------------${CLEAR}\n"

encrypt.sh


#!/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"

keys.sh


#!/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"

pgp.cfg


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