git-ssh-setup/setup.sh

128 lines
4.1 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# setup.sh — онбординг: настройка SSH для работы с git.lokeo.ru через Vault
# Запуск: curl -sL https://git.lokeo.ru/infra/git-ssh-setup/raw/branch/main/setup.sh | bash
set -euo pipefail
echo "=== Настройка SSH для git.lokeo.ru ==="
echo ""
# --- 1. Проверка зависимостей ---
for cmd in vault jq ssh-keygen; do
if ! command -v "$cmd" &>/dev/null; then
echo "Не найден: $cmd"
case "$cmd" in
vault) echo " Установи: https://developer.hashicorp.com/vault/install" ;;
jq) echo " Установи: sudo apt install jq / brew install jq" ;;
esac
exit 1
fi
done
echo "✅ Зависимости: vault, jq, ssh-keygen"
# --- 2. SSH-ключ ---
KEY="$HOME/.ssh/id_ed25519"
if [[ ! -f "$KEY" ]]; then
echo "🔑 SSH-ключ не найден, генерирую..."
ssh-keygen -t ed25519 -f "$KEY" -N "" -C "$(whoami)@$(hostname)"
fi
echo "✅ SSH-ключ: $KEY"
# --- 3. Скрипт обновления сертификата ---
SCRIPT_DIR="$HOME/.local/bin"
SCRIPT="$SCRIPT_DIR/vault-ssh-renew.sh"
mkdir -p "$SCRIPT_DIR"
SCRIPT_URL="https://git.lokeo.ru/infra/git-ssh-setup/raw/branch/main/vault-ssh-renew.sh"
if curl -sfL "$SCRIPT_URL" -o "$SCRIPT" 2>/dev/null; then
chmod +x "$SCRIPT"
echo "✅ Скрипт: $SCRIPT (скачан с git.lokeo.ru)"
else
echo "⚠️ Не удалось скачать скрипт, копирую встроенную версию..."
# Fallback — скрипт уже должен быть рядом
if [[ -f "$(dirname "$0")/vault-ssh-renew.sh" ]]; then
cp "$(dirname "$0")/vault-ssh-renew.sh" "$SCRIPT"
chmod +x "$SCRIPT"
echo "✅ Скрипт: $SCRIPT (из локальной копии)"
else
echo "❌ vault-ssh-renew.sh не найден"
exit 1
fi
fi
# --- 4. SSH config ---
SSH_CONFIG="$HOME/.ssh/config"
MARKER="# --- git.lokeo.ru (auto-managed) ---"
if grep -qF "$MARKER" "$SSH_CONFIG" 2>/dev/null; then
echo "✅ SSH config: уже настроен"
else
mkdir -p "$HOME/.ssh"
cat >> "$SSH_CONFIG" <<EOF
$MARKER
Match host git.lokeo.ru exec "$SCRIPT"
User git
Port 222
IdentityFile ~/.ssh/id_ed25519
CertificateFile ~/.ssh/id_ed25519-cert.pub
# --- end git.lokeo.ru ---
EOF
chmod 600 "$SSH_CONFIG"
echo "✅ SSH config: добавлен блок для git.lokeo.ru"
fi
# --- 5. VAULT_ADDR ---
SHELL_RC="$HOME/.bashrc"
[[ -f "$HOME/.zshrc" ]] && SHELL_RC="$HOME/.zshrc"
if ! grep -qF "VAULT_ADDR" "$SHELL_RC" 2>/dev/null; then
echo '' >> "$SHELL_RC"
echo 'export VAULT_ADDR=https://vault.lokeo.ru' >> "$SHELL_RC"
echo "✅ VAULT_ADDR добавлен в $SHELL_RC"
else
echo "✅ VAULT_ADDR: уже настроен"
fi
export VAULT_ADDR=https://vault.lokeo.ru
# --- 6. Первый логин ---
echo ""
echo "=== Первый вход ==="
echo "Сейчас откроется браузер для авторизации через Authentik."
echo ""
read -p "Нажми Enter для продолжения..." _
vault login -method=oidc role=reader -no-print || {
echo "❌ Логин не удался"
exit 1
}
# --- 7. Первый сертификат ---
USERNAME=$(vault token lookup -format=json | jq -r '.data.display_name')
vault write -field=signed_key \
ssh-client-signer/sign/git-user \
public_key=@"$KEY.pub" \
valid_principals="$USERNAME" \
> "$KEY-cert.pub"
echo ""
echo "✅ SSH-сертификат получен для $USERNAME"
ssh-keygen -Lf "$KEY-cert.pub" 2>/dev/null | grep -E "Type|Valid|Principals"
echo ""
echo "=== Готово! ==="
echo ""
echo "Теперь можно работать с git:"
echo " git clone ssh://git@git.lokeo.ru:222/org/repo.git"
echo " git push origin main"
echo ""
echo "Сертификат обновляется автоматически при каждом подключении."
echo "Vault token живёт 8 часов — после истечения откроется браузер."