From c0ad5382c11e13a41bd921535a7ca4ff283995cf Mon Sep 17 00:00:00 2001 From: svkalinin Date: Wed, 6 Jul 2022 14:56:20 +0300 Subject: [PATCH] Initial release --- scripts/backup_vault_data.sh | 4 +++ scripts/generate_gitlab_token.sh | 60 ++++++++++++++++++++++++++++++++ scripts/renew_vault_token.sh | 49 ++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 scripts/backup_vault_data.sh create mode 100644 scripts/generate_gitlab_token.sh create mode 100644 scripts/renew_vault_token.sh diff --git a/scripts/backup_vault_data.sh b/scripts/backup_vault_data.sh new file mode 100644 index 0000000..7fc86d6 --- /dev/null +++ b/scripts/backup_vault_data.sh @@ -0,0 +1,4 @@ +#!/usr/bin/bash + +CUR_DATETIME=$(/usr/bin/date +'%d%m%Y_%H%M%S') +/usr/bin/docker exec -t consul consul snapshot save /consul/backup/${CUR_DATETIME}_backup.snap diff --git a/scripts/generate_gitlab_token.sh b/scripts/generate_gitlab_token.sh new file mode 100644 index 0000000..003b395 --- /dev/null +++ b/scripts/generate_gitlab_token.sh @@ -0,0 +1,60 @@ +#!/bin/bash +###################################################################################### +# Получение токена в hashicorp vault и запись его +# в переменную в gitlab в соответствующий проект +# Сергей Калинин, 2022 +###################################################################################### +# Формат входного файла: +# ----------------------------------------------------------------------------------- +# Идентификатор_проекта_в_gitlab;Имя_переменной;Политика_в_vault;Время_жизни_токена +# 12;VAULT_TOKEN;some_policy_ro;24 +# 33;TOKEN_VAULT_SOME;other_policy_rw;72 +# +###################################################################################### + +TOKENS_LIST=${1:-"/etc/vault/create_tokens"} +GITLAB_API_URL=${GITLAB_API_URL:-"https://gitlab/api/v4"} +GITLAB_API_TOKEN=$(docker exec -t vault vault kv get -format=json secret/gitlab | jq -r ".data.data.token") + +CUR_DATETIME=$(/usr/bin/date +'%d.%m.%Y_%H:%M:%S') + +while read LINE; do + GITLAB_PROJECT_ID=$(echo $LINE | cut -d ";" -f1) + # echo "$GITLAB_PROJECT_ID" + TOKEN_VARIABLE_NAME=$(echo $LINE | cut -d ";" -f2) + # echo "$TOKEN_VARIABLE_NAME" + VAULT_POLICY_NAME=$(echo $LINE | cut -d ";" -f3) + # echo "$VAULT_POLICY_NAME" + VAULT_TOKEN_TTL=$(echo $LINE | cut -d ";" -f4) + # echo "$VAULT_TOKEN_TTL" + GITLAB_PROJECT_URL="${GITLAB_API_URL}/projects/${GITLAB_PROJECT_ID}/variables" + # echo "$GITLAB_PROJECT_URL" + + # Получаем существующий токен из гитлаба + # echo "curl -s --request GET --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${GITLAB_PROJECT_URL}/${TOKEN_VARIABLE_NAME}" | jq -r .value" + CURRENT_TOKEN=$(curl -s --request GET --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${GITLAB_PROJECT_URL}/${TOKEN_VARIABLE_NAME}" | jq -r .value ) + # echo "$CURRENT_TOKEN" + + TOKEN_DATA=$(docker exec -t vault vault token lookup ${CURRENT_TOKEN}) + #echo "$TOKEN_DATA" + if [[ -n $(echo "$TOKEN_DATA" | grep "Error looking up token") ]]; then + # генерим токен для требуемой политики. + TOKEN=$(docker exec -t vault vault token create -policy=${VAULT_POLICY_NAME} -ttl=${VAULT_TOKEN_TTL}h -explicit-max-ttl=${VAULT_TOKEN_TTL}h -format=json | jq -r ".auth.client_token") + + # обновляем переменную в проекте в гитлаб + RESULT=$(curl -s --request PUT --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${GITLAB_PROJECT_URL}/${TOKEN_VARIABLE_NAME}" --form "value=${TOKEN}") + # Если переменной нет, то она будет создана + if (echo ${RESULT} | grep -i "variable not found"); then + RESULT=$(curl -s --request POST --header "PRIVATE-TOKEN: ${GITLAB_API_TOKEN}" "${GITLAB_PROJECT_URL}" --form "key=${TOKEN_VARIABLE_NAME}" --form "value=${TOKEN}") + + fi + # Меняем токен на * в выводе (для маскировки) + RESULT=$(echo "$RESULT" | sed -e 's/value\":\"[a-zA-Z0-9.]*\"/\"value\":\"******\"/g') + echo "$CUR_DATETIME: Token for \"$GITLAB_PROJECT_URL $TOKEN_VARIABLE_NAME\" was recreated" + echo "$CUR_DATETIME: Gitlab return a result: $RESULT" + else + TOKEN_RENEW_PERIOD=$(echo "${TOKEN_DATA}" | grep -E -i "^period\s+[0-9]+h" | grep -E -o "[0-9]+") + TOKEN_TTL=$(echo "${TOKEN_DATA}" | grep -E -i -o "^ttl\s+[0-9]+h" | grep -E -o "[0-9]+") + echo "$CUR_DATETIME: Token for \"$GITLAB_PROJECT_URL $TOKEN_VARIABLE_NAME\" just alive with TOKEN_TTL: $TOKEN_TTL" + fi +done < $TOKENS_LIST \ No newline at end of file diff --git a/scripts/renew_vault_token.sh b/scripts/renew_vault_token.sh new file mode 100644 index 0000000..ac1efa9 --- /dev/null +++ b/scripts/renew_vault_token.sh @@ -0,0 +1,49 @@ +#!/bin/bash +################################################### +# Обновление TTL токенов в hashicorp vault +# из списка. Список токенов в формате csv: +# Сергей Калинин, 2022 +#-------------------------------------------------- +# путь к записи;имя токена +# secret-some/service-1/secret-1;vault_token +# secret-other/service-2;token +################################################### + +CUR_DATETIME=$(/usr/bin/date +'%d.%m.%Y_%H:%M:%S') + +# Файл со списком токенов, по умолчанию /etc/vault/renew_tokens +TOKENS_LIST=${1:-/etc/vault/renew_tokens} + +# Оставшееся время жизни токена в часах. +# Если разница между периодом обновления и TTL (временем жизни) +# меньше этого значения, то токен требует обновления +TIME_REMAIN=24 + +while read LINE; do + TOKEN_URL=$(echo $LINE | cut -d ";" -f1) + #echo "$TOKEN_URL" + TOKEN_NAME=$(echo $LINE | cut -d ";" -f2) + #echo "$TOKEN_NAME" + TOKEN=$(docker exec -t vault vault kv get -format=json ${TOKEN_URL} | jq -r ".data.data.${TOKEN_NAME}") + #echo "$TOKEN" + TOKEN_DATA=$(docker exec -t vault vault token lookup ${TOKEN}) + #echo "$TOKEN_DATA" + TOKEN_RENEW_PERIOD=$(echo "${TOKEN_DATA}" | grep -E -i "^period\s+[0-9]+h" | grep -E -o "[0-9]+") + TOKEN_TTL=$(echo "${TOKEN_DATA}" | grep -E -i -o "^ttl\s+[0-9]+h" | grep -E -o "[0-9]+") + DELTA=$(expr ${TOKEN_RENEW_PERIOD} - ${TOKEN_TTL}) + + echo "${CUR_DATETIME}: Renew period of token ${TOKEN_URL}/${TOKEN_NAME} is a ${TOKEN_RENEW_PERIOD}, remain TTL: ${TOKEN_TTL}, delta: ${DELTA}" + + RESULT="" + if [[ $TOKEN_TTL -lt $TIME_REMAIN ]]; then + RESULT=$(docker exec -t vault vault token renew $TOKEN) + else + echo "${CUR_DATETIME}: Token ${TOKEN_URL}/${TOKEN_NAME} renew not needed" + fi + + if [[ $(echo "$RESULT" | grep -E "${TOKEN}") ]]; then + echo "${CUR_DATETIME}: Token ${TOKEN_URL}/${TOKEN_NAME} was renewed" + else + echo "${CUR_DATETIME}: ${RESULT}" + fi +done < $TOKENS_LIST