deploy-templates/aws/scripts/userdata.tpl (169 lines of code) (raw):
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0
--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"
#cloud-config
cloud_final_modules:
- [scripts-user, always]
--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"
#!/usr/bin/env bash
logger "Install prerequisites"
apt-get update && apt-get install -y unzip libtool libltdl-dev || logger "Installation of the prerequisites has failed"
USER="vault"
GROUP="vault"
COMMENT="Hashicorp vault user"
HOME="/srv/vault"
# Detect package management system.
APT_GET=$(which apt-get 2>/dev/null)
user_ubuntu() {
# UBUNTU user setup
if ! getent group $${GROUP} >/dev/null
then
sudo addgroup --system $${GROUP} >/dev/null
fi
if ! getent passwd $${USER} >/dev/null
then
sudo adduser \
--system \
--disabled-login \
--ingroup $${GROUP} \
--home $${HOME} \
--no-create-home \
--gecos "$${COMMENT}" \
--shell /bin/false \
$${USER} >/dev/null
fi
}
if [[ ! -z $${APT_GET} ]]; then
logger "Setting up user $${USER} for Debian/Ubuntu"
user_ubuntu
else
logger "$${USER} user not created due to OS detection failure"
exit 1;
fi
logger "User setup complete"
logger "Mount ebs volume ${vault_volume_mount_path} into ${vault_local_mount_path}"
VAULT_VOLUME_FS=`blkid -o value -s TYPE ${vault_volume_mount_path}`
if [[ -z $${VAULT_VOLUME_FS} ]] ; then
if cat /etc/fstab | grep "${vault_volume_mount_path} ${vault_local_mount_path}" > /dev/null ; then
logger "The volume ${vault_volume_mount_path} already mounted to ${vault_local_mount_path}. No formating required."
else
logger "Formating the volume ${vault_volume_mount_path}."
mkfs.xfs ${vault_volume_mount_path}
fi
fi
if [[ -d ${vault_local_mount_path} ]] ; then
logger "The mount point directory ${vault_local_mount_path} already exist"
else
logger "Creating mount point directory ${vault_local_mount_path}"
mkdir -p ${vault_local_mount_path}
fi
# check if exist in fstab and then mount if not already mounted
if cat /etc/fstab | grep ${vault_volume_mount_path}; then
logger "Device ${vault_volume_mount_path} is present in /etc/fstab"
else
logger "Adding ${vault_volume_mount_path} to /etc/fstab"
echo "${vault_volume_mount_path} ${vault_local_mount_path} xfs defaults 0 0" | sudo tee -a /etc/fstab
fi
if mount | grep ${vault_volume_mount_path} ; then
logger "Mounting point ${vault_volume_mount_path} is already mounted"
else
logger "Mounting ${vault_local_mount_path}"
mount ${vault_local_mount_path} || logger "Mounting volume ${vault_volume_mount_path} to point ${vault_local_mount_path} has been failed"
chown $${USER}:$${GROUP} ${vault_local_mount_path}
fi
logger "Initialazing vault configuration prerequisites"
VAULT_ZIP="vault.zip"
VAULT_URL="${vault_url}"
curl --silent --output /tmp/$${VAULT_ZIP} $${VAULT_URL}
unzip -o /tmp/$${VAULT_ZIP} -d /usr/local/bin/
chmod 0755 /usr/local/bin/vault
chown $${USER}:$${GROUP} /usr/local/bin/vault
mkdir -pm 0755 /etc/vault.d
mkdir -pm 0755 "${vault_local_mount_path}/vault"
chown $${USER}:$${GROUP} "${vault_local_mount_path}/vault"
logger "Creating Vault service"
cat << EOF > /lib/systemd/system/vault.service
[Unit]
Description=Vault Agent
Requires=network-online.target
After=network-online.target
[Service]
Restart=on-failure
PermissionsStartOnly=true
ExecStartPre=/sbin/setcap 'cap_ipc_lock=+ep' /usr/local/bin/vault
ExecStart=/usr/local/bin/vault server -config /etc/vault.d
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGTERM
User=$${USER}
Group=$${GROUP}
[Install]
WantedBy=multi-user.target
EOF
logger "Configuring Vault"
cat << EOF > /etc/vault.d/vault.hcl
storage "file" {
path = "${vault_local_mount_path}/vault"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
seal "awskms" {
region = "${aws_region}"
kms_key_id = "${kms_key}"
}
ui=true
EOF
sudo chmod 0664 /lib/systemd/system/vault.service
systemctl daemon-reload
sudo chown -R $${USER}:$${GROUP} /etc/vault.d
sudo chmod -R 0644 /etc/vault.d/*
cat << EOF > /etc/profile.d/vault.sh
export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_SKIP_VERIFY=true
EOF
logger "Configuring Encryption policy"
cat << EOF > /home/ubuntu/autounseal.hcl
path "transit/encrypt/autounseal" {
capabilities = [ "update" ]
}
path "transit/decrypt/autounseal" {
capabilities = [ "update" ]
}
EOF
cat << EOF > /home/ubuntu/kes-policy.hcl
path "kv/*" {
capabilities = [ "create", "read", "delete" ]
}
EOF
logger "Starting Vault service"
systemctl enable vault
systemctl restart vault
sleep 60
export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_SKIP_VERIFY=true
if [ ! -f "${vault_local_mount_path}/vault/token" ]; then
logger "Initializing Vault"
vault operator init > "${vault_local_mount_path}/vault/keys"
export VAULT_TOKEN="$(cat ${vault_local_mount_path}/vault/keys | grep Root | awk -F : {'print $2'} | cut -c2-)"
vault secrets enable transit
vault secrets enable kv
vault auth enable approle
vault policy write kes-policy /home/ubuntu/kes-policy.hcl
vault write auth/approle/role/kes-role token_num_uses=0 secret_id_num_uses=0 period=5m
vault write auth/approle/role/kes-role policies=kes-policy
vault read auth/approle/role/kes-role/role-id
vault write -f auth/approle/role/kes-role/secret-id
vault write -f transit/keys/autounseal
vault policy write autounseal /home/ubuntu/autounseal.hcl
vault token create -policy="autounseal" -wrap-ttl=120 > "${vault_local_mount_path}/vault/token"
fi
systemctl is-active vault && touch /tmp/signal