git-ssh-setup/README.md

103 lines
4.3 KiB
Markdown
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.

# git-ssh-setup
Автоматическая настройка SSH-доступа к `git.lokeo.ru` через Vault SSH Certificate Authority.
## Как это работает
```
Сотрудник Vault Authentik Forgejo
│ │ │ │
├─ vault login (OIDC) ────►├──── redirect ────────►│ │
│◄─── vault token ────────┤◄─── auth ok ──────────┤ │
│ │ │ │
├─ vault write (sign) ────►│ │ │
│◄─── SSH certificate ────┤ │ │
│ │ │ │
├─ git push ──────────────────────────────────────────────────────────►│
│ (cert auto-verified) │ │ │
```
- **Vault** подписывает SSH-ключ сотрудника, выдавая сертификат (TTL 1 час)
- **Forgejo** доверяет CA Vault — проверяет сертификат при SSH-подключении
- **Authentik** — OIDC-провайдер для авторизации в Vault
- **Скрипт** автоматически обновляет сертификат при каждом `git push/pull`
## Быстрый старт
### Требования
- [Vault CLI](https://developer.hashicorp.com/vault/install)
- `jq` (`sudo apt install jq` / `brew install jq`)
- SSH-ключ ed25519 (скрипт сгенерирует, если нет)
### Установка
```bash
curl -sL https://git.lokeo.ru/infra/git-ssh-setup/raw/branch/main/setup.sh | bash
```
Или вручную:
```bash
git clone https://git.lokeo.ru/infra/git-ssh-setup.git
cd git-ssh-setup
bash setup.sh
```
### Что делает setup.sh
1. Проверяет зависимости (vault, jq, ssh-keygen)
2. Генерирует SSH-ключ, если отсутствует
3. Устанавливает `vault-ssh-renew.sh` в `~/.local/bin/`
4. Настраивает `~/.ssh/config` с автообновлением сертификата
5. Добавляет `VAULT_ADDR` в shell rc
6. Выполняет первый OIDC-логин и получает сертификат
### После установки
```bash
# Клонировать репозиторий
git clone ssh://git@git.lokeo.ru:222/org/repo.git
# Пушить
git push origin main
# Сертификат обновляется автоматически
```
## Ручное использование
```bash
export VAULT_ADDR=https://vault.lokeo.ru
# Логин через Authentik (откроется браузер)
vault login -method=oidc role=reader
# Подписать ключ
vault write -field=signed_key \
ssh-client-signer/sign/git-user \
public_key=@~/.ssh/id_ed25519.pub \
valid_principals="$(vault token lookup -format=json | jq -r '.data.display_name')" \
> ~/.ssh/id_ed25519-cert.pub
# Проверить сертификат
ssh-keygen -Lf ~/.ssh/id_ed25519-cert.pub
```
## Сроки действия
| Что | TTL |
|-----|-----|
| SSH-сертификат | 1 час |
| Vault token | 8 часов |
| Обновление | автоматически при git-операции |
## Troubleshooting
**«vault: command not found»** — установи [Vault CLI](https://developer.hashicorp.com/vault/install)
**«OIDC-логин не удался»** — проверь доступность `https://vault.lokeo.ru` и `https://auth.lokeo.ru`
**«Не удалось подписать ключ»** — vault token истёк, выполни `vault login -method=oidc role=reader`
**«Permission denied (publickey)»** — сертификат не совпадает с username в Forgejo. Проверь `valid_principals` в сертификате: `ssh-keygen -Lf ~/.ssh/id_ed25519-cert.pub`