docs: SSH onboarding through Vault CA

This commit is contained in:
redjx 2026-02-25 16:22:32 +00:00
parent f3b726f21c
commit ca9a7af7e4

102
README.md
View file

@ -1,3 +1,103 @@
# git-ssh-setup
SSH onboarding через Vault CA
Автоматическая настройка 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`