feat: add vault-ssh-renew.sh auto-renewal script

This commit is contained in:
redjx 2026-02-25 16:22:59 +00:00
parent b8238facc3
commit 8ecb9cd2c5

73
vault-ssh-renew.sh Normal file
View file

@ -0,0 +1,73 @@
#!/bin/bash
# vault-ssh-renew.sh — автоматическое обновление SSH-сертификата через Vault
# Вызывается из ~/.ssh/config через Match exec
# При истечении сертификата или vault token — откроет браузер для OIDC-логина
set -euo pipefail
CERT="${SSH_CERT_FILE:-$HOME/.ssh/id_ed25519-cert.pub}"
KEY="${SSH_KEY_FILE:-$HOME/.ssh/id_ed25519.pub}"
export VAULT_ADDR="${VAULT_ADDR:-https://vault.lokeo.ru}"
ROLE="${VAULT_SSH_ROLE:-git-user}"
MIN_REMAINING="${MIN_REMAINING:-300}" # обновлять если < 5 мин до истечения
# --- Проверка текущего сертификата ---
if [[ -f "$CERT" ]]; then
EXPIRY=$(ssh-keygen -Lf "$CERT" 2>/dev/null | awk '/Valid:/{print $5}')
if [[ -n "$EXPIRY" ]]; then
EXPIRY_TS=$(date -d "$EXPIRY" +%s 2>/dev/null || date -jf "%Y-%m-%dT%H:%M:%S" "$EXPIRY" +%s 2>/dev/null || echo 0)
NOW_TS=$(date +%s)
REMAINING=$((EXPIRY_TS - NOW_TS))
if [[ $REMAINING -gt $MIN_REMAINING ]]; then
exit 0 # сертификат ещё живой
fi
fi
fi
# --- Проверка vault CLI ---
if ! command -v vault &>/dev/null; then
echo "vault CLI не найден. Установи: https://developer.hashicorp.com/vault/install" >&2
exit 1
fi
# --- Проверка vault token ---
USERNAME=$(vault token lookup -format=json 2>/dev/null | jq -r '.data.display_name // empty' 2>/dev/null || true)
if [[ -z "$USERNAME" ]]; then
echo "Vault token отсутствует или истёк. Логинимся через Authentik..." >&2
vault login -method=oidc role=reader -no-print 2>/dev/null || {
echo "OIDC-логин не удался" >&2
exit 1
}
USERNAME=$(vault token lookup -format=json 2>/dev/null | jq -r '.data.display_name // empty')
fi
if [[ -z "$USERNAME" ]]; then
echo "Не удалось определить username из vault token" >&2
exit 1
fi
# --- Проверка SSH-ключа ---
if [[ ! -f "$KEY" ]]; then
echo "SSH-ключ не найден: $KEY" >&2
echo "Сгенерируй: ssh-keygen -t ed25519" >&2
exit 1
fi
# --- Подписание ---
vault write -field=signed_key \
"ssh-client-signer/sign/$ROLE" \
public_key=@"$KEY" \
valid_principals="$USERNAME" \
> "$CERT" 2>/dev/null || {
echo "Не удалось подписать ключ" >&2
exit 1
}
echo "SSH-сертификат обновлён для $USERNAME ($(ssh-keygen -Lf "$CERT" 2>/dev/null | grep 'Valid:' | xargs))" >&2
exit 0