Як отримати запит на прохідну фразу ключа SSH один раз і лише за потреби?


15

(Я прочитав багато питань на цьому веб-сайті, які виглядають пов'язаними, і я вважаю, що це справді нове питання.)

У мене є багато ключів на багатьох серверах, і всі вони захищені парольними фразами.

Мені подобається вводити паролі приблизно стільки, скільки мені подобається вводити паролі - це справжнє зниження продуктивності.

  • Команди ssh-agent + ssh-add можуть використовуватися в оболонці для входу, що означає, що вам потрібно вводити свою парольну фразу лише один раз під час входу

  • keychain можна використовувати, щоб увімкнути ssh-агент поза виходом, тому, наприклад, ви можете його мати, щоб вам було потрібно вводити парольну фразу лише один раз під час завантаження, або ви можете залишати її живою протягом години або близько того.

Проблема, яку я маю, полягає в тому, що обидва ці рішення зазвичай ініціюються у вході в оболонку (наприклад .zshrc), покладаючись на те, щоб я вводив свою парольну фразу під час входу в систему, навіть якщо мені не потрібно буде її розблокувати. (Я не задоволений тим, що брелок підтримує агента живим нескінченно.)

Мені б хотілося, щоб запит про фразу (для агента) був запропонований лише за потреби .

Тож я можу увійти на сервер A, зробити якісь речі, потім ssh на сервер B і в цей момент попросять пройти пароль. Виконайте якісь речі на сервері B, вийдіть із системи. Поверніться на A, зробіть ще декілька речей, натисніть на B ще раз і не знадобиться моя парольна фраза (її тримає агент).

Зауважу, що це можливо на графічних настільних комп’ютерах, таких як Gnome - у вас з’являється спливаюче вікно з проханням, щоб парольна фраза розблокувала ваш приватний ключ, як тільки ви спробуєте ssh. Отже, це те, що я хочу, але з консолі.


Чому б просто не генерувати ssh-ключі без парольних фраз? Якщо ти все одно переживеш всю цю неприємність?
devnull

1
Якщо хтось увірветься, і там є ключі без пароля (або активний ssh-агент), він також може отримати доступ до багатьох інших серверів. Також ключі без пароля можуть бути викрадені та використані в інших місцях.
artfulrobot

Наскільки я знаю, немає способу зробити те, що ви хочете, не приносячи шкоди певному рівню безпеки, який здається, що ви цього не хочете робити. Тут з’явилась поглиблена відповідь Томаса Німана, яка розглядає багато можливостей, якщо ви її ще не читали: unix.stackexchange.com/a/90869/82289 . Мені це подобається у моїй компанії за допомогою проміжного сервера, який управляє ssh сесіями з Tmux.
devnull

@DevNull здається дивним, що це можна зробити на робочому столі, але не з терміналом, ні? Напевно, йому просто потрібен агент, щоб перейти до Tty, якщо не було додано жодних ключів? Мабуть, так працюють гуї?
artfulrobot

Ви можете подивитися на мою відповідь тут: unix.stackexchange.com/a/184160/89706 (посилання на питання: unix.stackexchange.com/questions/90853/… )
Джонні Вонг,

Відповіді:


16

Не додайте нічого до будь-якого сценарію запуску оболонки, це зайве хакерство.

Натомість додайте

AddKeysToAgent yes

до вашого .ssh / config

Так, ssh-add запускається автоматично під час першого введення в іншу скриньку. Повторне введення ключа потрібно лише після закінчення терміну дії ssh-агента або після перезавантаження.


Я б хотів, щоб люди коментували голосування. Якщо це неправильно, важливо, ми знаємо, чому це не так. Дякую за публікацію, я не встиг сам спробувати вашу пропозицію.
artfulrobot

Я теж замислювався, може, через мої перехресні пости?
Тобі

Це працює для мене. Однак це зовсім недавнє доповнення до openssh (7.2). Якщо це допомагає комусь, відкриття 7.3 доступне в Debian Sid.
artfulrobot

@artfulrobot: Дивно, як я мав цю саму поведінку (auto-ssh-add при першому дзвінку ssh) працюючи роками, поки вона нарешті не припинилася. Шукаючи причину, я знайшов AddKeysToAgent і припустив, що причиною його зупинки стало те, що я випадково повинен був очистити свій .ssh / config та AddKeysToAgent разом із ним. Тепер мені цікаво, чому він працював задовго до виходу OpenSSH 7.2? Я не уявляю цього :-)
Тобі

@Тобі саме це мені потрібно. На жаль, схоже, що ssh-агент не запускається автоматично в kubuntu, тому це наступне, що мені потрібно вирішити.
Огадай

7

Zsh має preexecгачок, який виконує функцію до виконання команди, введеної в командний рядок. Ось гачок, який шукається sshу вашому командному рядку, і якщо його знайдено, перевіряє наявність ssh-агента. Якщо цього не знайти, він запускає брелок.

Таким чином, keychain запускається лише перед командами ssh, а потім лише за потреби.

Помістіть це у своєму ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Тут відбувається щоразу, коли команда вводиться, check_sshвикликається перед виконанням команди.

Перший рядок функції перевіряє розгорнуту команду для sshвикористання регулярного виразу Zsh. sshповинні мати межі слів з \bобох боків. Якщо цього не знайти, функція повертається.

Наступний рядок перевіряє, чи є в агенті змінну середовище процес SSH-агента, і що цей процес все ще існує в таблиці процесів, а потім, що щонайменше один ключ був доданий до агента. Якщо все це в порядку, тоді ssh-агент встановлюється, і нам нічого не потрібно робити, тому він повертається.

Нарешті ми починаємо брелок, з агентом, який повинен залишатися живим протягом години.

Це все ще залишає проблему з вбудованими матеріалами ssh, як- gitнебудь rsyncабо scpяк, що не запустить функцію (ви можете додати їх у регулярний вираз).


Навіть без zshцього можна створити короткий сценарій з тим же ефектом і розмістити його PATHперед реальним sshклієнтом. Можна навіть працювати з rsyncспівавторами, якщо вони читають, PATHа не бігають /usr/bin/sshбезпосередньо.
ilkkachu

2

Для zsh я написав набір утиліт та обгортки, щоб зробити більш-менш те, що ви хочете: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

Насправді це робить ще більше, тому що ssh-agentспільний доступ буде поділятися всіма сеансами входу (на робочому столі або через SSH, і GNU Screen також підтримується, якщо ви запускаєте в нього оболонки для входу, наприклад, shell -zshу ~/.screenrcфайл), і він вийде лише після останній сеанс припиняється.

Примітка. Я використовую лише одну парольну фразу для всіх своїх ключів. Я не впевнений у поведінці для різних парольних фраз; можуть знадобитися деякі зміни.


Нічого собі, це дуже багато коду. Приємна робота та спасибі за спільний доступ. Я думаю, що мені потрібно щось простіше - SSH - це досить основний інструмент для мене.
artfulrobot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.