#!/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" </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 часов — после истечения откроется браузер."