feat: add vault-ssh-renew.sh auto-renewal script
This commit is contained in:
parent
b8238facc3
commit
8ecb9cd2c5
1 changed files with 73 additions and 0 deletions
73
vault-ssh-renew.sh
Normal file
73
vault-ssh-renew.sh
Normal 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
|
||||
Loading…
Add table
Reference in a new issue