Ключі SSH: створити, встановити на сервер і вимкнути вхід за паролем
Зміст статті
Для адміністратора, який поки що входить на Linux-сервер за паролем. У підсумку ви входитимете за ключем ed25519, а вхід за паролем по SSH буде вимкнено.
Що знадобиться#
- Адреса сервера, ім’я користувача і пароль — ці доступи надсилає підтримка. У прикладах використано навчальні значення
203.0.113.10іadmin. - Клієнт OpenSSH на вашому комп’ютері. У macOS і Linux він уже є, у Windows 10 (з версії 1809) і Windows 11 — вбудований. Щоб перевірити, відкрийте PowerShell і виконайте
ssh -V. Якщо такої команди немає, знайдіть у меню «Пуск» «Додаткові компоненти» (Optional features) і додайте «Клієнт OpenSSH» (OpenSSH Client). - Сервер із Debian або Ubuntu. В інших дистрибутивах кроки ті самі, але служба може називатися
sshd. Якщо ви працюєте якroot, команди можна виконувати безsudo. - Відкрита SSH-сесія на сервері, яку ви не закриватимете до останньої перевірки.
Ключ — це пара файлів. Закритий ключ лишається на вашому комп’ютері, його нікому не передають. Відкритий (.pub) можна вільно копіювати: його записують на сервері у файл ~/.ssh/authorized_keys.
Крок 1 Створіть ключ ed25519#
Команда однакова в PowerShell у Windows і в терміналі macOS та Linux. Виконуйте її на своєму комп’ютері, а не на сервері:
ssh-keygen -t ed25519 -C "admin@example.com"Параметр -C задає коментар, за яким ви впізнаєте ключ на сервері: вкажіть, чий він. Тип ключа вказуйте явно: OpenSSH до версії 9.5, який ще трапляється у Windows 10 і старіших випусках Linux, типово створює ключ RSA.
На запитання про файл натисніть Enter: ключ збережеться в ~/.ssh/id_ed25519 (у Windows — %USERPROFILE%\.ssh\id_ed25519). Якщо такий файл уже є, не перезаписуйте його — задайте інше ім’я параметром -f. Поруч з’явиться id_ed25519.pub — відкритий ключ: один рядок, що починається з ssh-ed25519.
Windows PowerShell може не розгорнути символ ~ у параметрах команд: якщо файл не знайдено, пишіть $env:USERPROFILE\.ssh\ замість ~/.ssh/.
Крок 2 Парольна фраза і ssh-agent#
На запит Enter passphrase введіть парольну фразу, не лишайте її порожньою. Вона шифрує закритий ключ на диску: якщо ноутбук вкрадуть або файл скопіюють, без фрази ключем не скористаються. Змінити фразу можна командою ssh-keygen -p -f ~/.ssh/id_ed25519.
Щоб не вводити фразу під час кожного підключення, додайте ключ до ssh-agent: він тримає розшифрований ключ у пам’яті.
Linux#
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519macOS#
ssh-add --apple-use-keychain ~/.ssh/id_ed25519Фраза збережеться у В’язці (Keychain) macOS.
Windows#
Службу ssh-agent у Windows типово вимкнено. Один раз увімкніть її в PowerShell, запущеному від імені адміністратора:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agentПотім у звичайному вікні PowerShell:
ssh-add $env:USERPROFILE\.ssh\id_ed25519Які ключі є в агенті, показує ssh-add -l.
Крок 3 Перенесіть відкритий ключ на сервер#
У macOS і Linux це робить ssh-copy-id: створює на сервері каталог ~/.ssh і файл authorized_keys, якщо їх ще немає, і дописує туди ключ.
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@203.0.113.10У Windows цієї утиліти немає, тому зробіть те саме вручну з PowerShell:
$key = Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"
ssh admin@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && echo '$key' >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"В обох випадках сервер востаннє запитає пароль.
Права на каталог і файл#
Сервер ігнорує authorized_keys, якщо цей файл, каталог ~/.ssh або домашній каталог доступні для запису іншим користувачам чи належать не вам (параметр StrictModes, типово ввімкнений). Виправте й перевірте права на сервері:
chmod go-w ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
ls -ld ~ ~/.ssh ~/.ssh/authorized_keysВ усіх трьох рядках власником має бути ваш користувач. Якщо каталог створено через sudo і він належить root, виправте: sudo chown -R admin:admin /home/admin/.ssh.
Крок 4 Опишіть сервер у ~/.ssh/config#
Щоб не запам’ятовувати адреси й імена, створіть на своєму комп’ютері файл ~/.ssh/config (у Windows — %USERPROFILE%\.ssh\config, без розширення .txt):
Host srv-pl
HostName 203.0.113.10
User admin
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesТепер досить набрати ssh srv-pl. Рядок IdentitiesOnly yes змушує клієнт пропонувати серверу лише вказаний ключ — це важливо, коли ключів кілька. У macOS додайте в кінець файлу блок Host * з рядками AddKeysToAgent yes і UseKeychain yes, щоб фраза бралася з В’язки. У Linux і Windows параметра UseKeychain немає — там цей рядок не додавайте.
Крок 5 Перевірте вхід за ключем у новій сесії#
Не закривайте поточну сесію. Відкрийте нове вікно термінала й підключіться так, щоб клієнт не міг перейти на пароль:
ssh -o PreferredAuthentications=publickey srv-plЯкщо ви опинилися на сервері, ключ працює. Запит Enter passphrase for key стосується парольної фрази ключа — так і має бути. А запит admin@203.0.113.10's password: з цим параметром з’явитися не повинен. Відповідь Permission denied означає, що сервер не прийняв ключ: знайдіть причину (розділ «Типові помилки») і не переходьте до наступного кроку.
Крок 6 Вимкніть вхід за паролем#
Увага. Помилка на цьому кроці може залишити вас без доступу до сервера. Спершу переконайтеся, що вхід за ключем на кроці 5 спрацював, і прочитайте порядок відкату наприкінці цього кроку. Не закривайте поточну сесію, доки не пройдете розділ «Як перевірити результат».
Подивіться, де ці параметри вже задано:
grep -n '^Include' /etc/ssh/sshd_config sudo grep -rniE 'passwordauthentication|kbdinteractiveauthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/Перша команда має показати рядок
Include /etc/ssh/sshd_config.d/*.confна початку файлу. Якщо його немає, sshd не читає каталогsshd_config.d: тоді впишіть обидва рядки з пункту 2 на самий початокsshd_config, а для відкату видаліть їх звідти. Друга команда в Ubuntu часто знаходить файл50-cloud-init.confз рядкомPasswordAuthentication yes: його створює cloud-init під час першого запуску системи. Рядки, що починаються з#, — коментарі.Створіть власний файл із номером, меншим за 50:
sudo tee /etc/ssh/sshd_config.d/10-password-off.conf > /dev/null <<'EOF' PasswordAuthentication no KbdInteractiveAuthentication no EOFНомер важливий. Для кожного параметра sshd бере перше знайдене значення, а файли з
sshd_config.dчитає за алфавітом і раніше, ніж решту основного файлу. Тому10-password-off.confпереважить50-cloud-init.conf, а файл99-…чи рядок нижче в самомуsshd_config— ні. Файл cloud-init не редагуйте: cloud-init може перезаписати його під час повторної ініціалізації системи.Перевірте синтаксис і підсумкові значення:
sudo sshd -t sudo sshd -T | grep -Ei '^(pubkey|password|kbdinteractive)authentication'Перша команда в разі успіху нічого не виводить. Друга має показати
pubkeyauthentication yes,passwordauthentication noіkbdinteractiveauthentication no. Якщо для пароля досіyes, якийсь файл стоїть за алфавітом раніше за ваш — знайдіть його другою командою з пункту 1.Перезапустіть службу. У Debian і Ubuntu вона називається
ssh:sudo systemctl restart sshВідкритих сесій перезапуск не розриває. В Ubuntu, починаючи з 22.10 (тобто і в 24.04 LTS, і в 26.04 LTS), порт слухає systemd через
ssh.socket, а sshd запускається з першим підключенням. Для параметрів автентифікації доситьrestart ssh;ssh.socketперезапускають (післяsystemctl daemon-reload) лише тоді, коли змінюють порт чи адресу.
Відкат. Якщо нова сесія не відкривається, у старій виконайте:
sudo rm /etc/ssh/sshd_config.d/10-password-off.conf
sudo sshd -t && sudo systemctl restart sshЯк перевірити результат#
У новому вікні термінала на своєму комп’ютері виконайте по черзі дві команди:
ssh srv-pl
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password,keyboard-interactive admin@203.0.113.10Перша має впустити вас за ключем; вийдіть командою exit і виконайте другу. Вона має завершитися повідомленням Permission denied (publickey) без запиту пароля. Лише після цього закривайте стару сесію. Пароль облікового запису збережіть: він і далі потрібен для sudo та входу через консоль.
Окремий ключ кожному адміністратору#
- Кожен адміністратор створює пару на своєму комп’ютері й передає лише файл
.pub. Один закритий ключ на всіх — це спільний пароль, який не можна відкликати в однієї людини. - Найкраще дати кожному окремий обліковий запис. Якщо запис спільний, кожен ключ — окремий рядок у файлі
authorized_keysзі зрозумілим коментарем. - Список ключів із відбитками й коментарями показує
ssh-keygen -lf ~/.ssh/authorized_keys. Де на сервері є ключі:sudo sh -c 'ls -l /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys'. - Щоб відкликати ключ, видаліть його рядок з
authorized_keysна кожному сервері й у кожному обліковому записі, де він був. Нові підключення з цим ключем сервер відхиляє одразу, перезапуск не потрібен. Уже відкриті сесії не розриваються — перевірте їх командоюwho.
Якщо ключ втрачено#
Тримайте на сервері щонайменше два ключі: другого адміністратора або резервний, який зберігається окремо від робочого комп’ютера. Тоді після втрати ноутбука досить увійти з іншим ключем, видалити рядок втраченого й додати новий. Парольна фраза на втраченому ключі дає на це час.
Якщо робочих ключів не лишилося, увійти по SSH не вдасться: вхід за паролем вимкнено. Зверніться до технічної підтримки, вона працює цілодобово: телефон +38 044 206 08 08, пошта info@united.net.ua. Віддалена консоль доступна за запитом через підтримку: у ній ви входите з паролем облікового запису (налаштування sshd на консоль не впливають) і додаєте новий ключ. На серверах лінійки Лайт віддаленої консолі немає: тоді підтримка за запитом перезавантажує сервер у режим відновлення — тимчасову систему з доступом по SSH, у якій ви монтуєте диск і додаєте ключ.
Типові помилки#
- Неправильні права або власник
- Ключ скопійовано, але сервер усе одно просить пароль або відповідає
Permission denied. Командаsudo journalctl -u ssh -n 20на сервері покажеAuthentication refused: bad ownership or modes. Повторіть команди з розділу «Права на каталог і файл». - Ключ не той
- Клієнт пропонує інший ключ, або відкритий ключ додано не тому користувачеві (наприклад,
rootзамістьadmin). Командаssh -v srv-plпоказує, які ключі пропонує клієнт. Порівняйте відбитокssh-keygen -lf ~/.ssh/id_ed25519.pubна комп’ютері з виводомssh-keygen -lf ~/.ssh/authorized_keysна сервері. Від повідомленняToo many authentication failuresрятуєIdentitiesOnly yes. - Сесію закрили до перевірки
- Найдорожча помилка: виправити конфігурацію вже немає звідки. Лишається консоль за запитом через підтримку.
- Ubuntu досі приймає паролі
- Параметр вписано в основний
sshd_configабо у файл99-…, і50-cloud-init.confспрацьовує раніше. Перевірте вивідsudo sshd -T.
Що далі#
- Базовий захист Linux-сервера: SSH, мережевий екран, оновлення.
- Перший вхід на Linux-сервер по SSH: що зробити в першу годину.
- Довідка OpenSSH: ssh-keygen, sshd_config, ssh_config.
- Сервери з наявності — в каталозі, порівняння країн — на сторінці локацій.