7.4 KiB
ssh
SSH keys, agent configuration, and remote access for poppy.
как работает ssh-agent
на macOS ssh-agent запускается через launchd (com.openssh.ssh-agent).
- сокет:
/private/tmp/com.apple.launchd.*/Listeners(берётся изlaunchctl getenv SSH_AUTH_SOCK) ssh-add ~/.ssh/<key>— добавляет ключ в agentssh-add -l— список загруженных ключейssh-add -d <key>— удалить ключssh-add -D— удалить все
переменная SSH_AUTH_SOCK должна указывать на launchd socket, не на
/Users/michaotic/.gnupg/S.gpg-agent.ssh (это от gpg-agent — для pass, не для SSH).
если что-то сломалось:
unset SSH_AUTH_SOCK
launchctl start com.openssh.ssh-agent
ssh-add -l
ключи на poppy
| файл | comment | для чего | алгоритм |
|---|---|---|---|
~/.ssh/id_ed25519 |
poppy-legacy | github (isogonalconjugate) | ed25519 |
~/.ssh/id_ed25519_forgejo |
forgejo-iscg | git.iscg.dev (port 2222) | ed25519 |
~/.ssh/poppy |
— | git.sol.moe (user: mikl) | ed25519 |
~/.ssh/id_ed25519_sk_ledger |
ledger@iscg.dev | TODO: FIDO2 (Ledger) | ed25519-sk |
конфигурация
управляется в home/ssh.nix через programs.ssh.matchBlocks:
"git.iscg.dev" = {
identityFile = "~/.ssh/id_ed25519_forgejo";
port = 2222;
identitiesOnly = true;
addKeysToAgent = "yes";
};
"github.com" = {
identityFile = "~/.ssh/id_ed25519";
identitiesOnly = true;
addKeysToAgent = "yes";
};
"git.sol.moe" = {
identityFile = "~/.ssh/poppy";
user = "mikl";
identitiesOnly = true;
addKeysToAgent = "yes";
};
identitiesOnly = true — критично: ssh-agent предлагает серверу только указанный
ключ, не пробует все подряд.
addKeysToAgent = "yes" — при первом использовании ключ автоматически добавляется в ssh-agent.
генерируется в ~/.ssh/config (можно посмотреть: cat ~/.ssh/config).
создание нового ключа
# обычный ed25519
ssh-keygen -t ed25519 -C "comment" -f ~/.ssh/<name>
# с passphrase ОБЯЗАТЕЛЬНО для безопасности
# ssh-agent кэширует passphrase на defaultCacheTtl (1 час)
после создания:
- загрузить публичный ключ (
.pub) на forge через web UI:- github: https://github.com/settings/keys
- forgejo: https://git.iscg.dev/user/settings/keys
- gitea/sol.moe: аналогично
- добавить в
home/ssh.nixmatchBlocks если новый хост darwin-rebuild switchssh-add ~/.ssh/<name>чтобы добавить в agent
подключение
# тест подключения (ничего не делает, только проверка auth)
ssh -T git@github.com
ssh -T git@git.iscg.dev -p 2222
ssh -T git@git.sol.moe
# клонирование
git clone git@github.com:user/repo.git
git clone ssh://git@git.iscg.dev:2222/user/repo.git
git clone git@git.sol.moe:user/repo.git
macOS Keychain (опционально)
чтобы не вводить passphrase каждый раз:
ssh-add --apple-use-keychain ~/.ssh/<key>
или в ~/.ssh/config:
Host *
UseKeychain yes
AddKeysToAgent yes
ключи хранятся в Keychain (зашифровано, привязано к логину).
FIDO2 (Ledger Security Key)
Ledger поддерживает FIDO2 через app-security-key (открытый исходник — LedgerHQ/app-security-key).
создание
# через nix shell (нужен libfido2)
nix shell nixpkgs#libfido2 nixpkgs#openssh --command \
ssh-keygen -t ed25519-sk -C "ledger@iscg.dev" -f ~/.ssh/id_ed25519_sk_ledger
опции:
-O resident— приватный ключ хранится на токене (переносимый)-O verify-required— требует PIN при подписании- по умолчанию
touch required— Ledger требует физическое нажатие
использование
# добавить в agent (нажать кнопку при load)
nix shell nixpkgs#libfido2 nixpkgs#openssh --command \
ssh-add ~/.ssh/id_ed25519_sk_ledger
# подписать challenge (нажать кнопку на Ledger)
nix shell nixpkgs#libfido2 nixpkgs#openssh --command \
ssh-keygen -Y sign -f ~/.ssh/id_ed25519_sk_ledger -n ssh <file>
# проверить подпись
nix shell nixpkgs#libfido2 nixpkgs#openssh --command \
ssh-keygen -Y verify -f <file.pub> -n ssh -I <identity> -s <file.sig>
ограничения
- нативный
/usr/bin/ssh-keygenне умеет FIDO2 — только nix openssh - macOS ssh-agent хранит FIDO2 ключи, но подпись через нативный ssh-keygen не работает
- нужен nix openssh для
ssh-keygen -Y signи других sign-операций
factory reset recovery
перед reset:
- скопировать
~/.ssh/(или хотя бы файлыid_ed25519*,poppy,id_ed25519_sk_ledger) на USB/cloud - записать какие ключи на каких forge (чтобы не забыть)
после reset:
- восстановить
~/.ssh/ chmod 600 ~/.ssh/*(без этого ssh откажется работать)chmod 644 ~/.ssh/*.pubssh-add ~/.ssh/<key>(ввести passphrase)ssh -T git@<forge>для проверки
для FIDO2 ключа: см. секцию выше, нужен nix shell nixpkgs#libfido2 nixpkgs#openssh.
tasks (TODO)
- FIDO2 в nix-config — добавить
libfido2иopensshвhome/cli.nix- сейчас нужно каждый раз
nix shell nixpkgs#libfido2 nixpkgs#openssh --command ... - хочется чтобы работало нативно
- сейчас нужно каждый раз
- nix ssh-agent — заменить macOS ssh-agent на nix версию
- macOS ssh-agent не поддерживает FIDO2 sign через нативный ssh-keygen
- нужно
nix shell nixpkgs#libfido2 nixpkgs#openssh --command ssh-agent
- FIDO2 ключ с
resident— пересоздатьid_ed25519_sk_ledgerс-O resident- сейчас без resident — файл обязателен для восстановления
- с resident — можно восстановить через
ssh-keygen -Kпосле factory reset
- FIDO2 ключ на github/forgejo — добавить
id_ed25519_sk_ledger.pubна github- для тестирования и использования
- сейчас не добавлен
- backups ключей — сохранить
id_ed25519_backup.pub(отдельный, обычный)- страховка если Ledger сломается
- сейчас нет запасного ключа
SSH_AUTH_SOCKfix — добавитьunset SSH_AUTH_SOCKв shell init- если gpg-agent когда-то снова его перехватит
- не критично сейчас
- pass-store origins — настроить remotes для
~/.password-store(отдельная задача вgarden.md)