Initial release

master
svkalinin 2022-07-06 14:56:20 +03:00
parent 1156246ca1
commit c0ad5382c1
3 changed files with 113 additions and 0 deletions

View File

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

View File

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

View File

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