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