Налаштування аутентифікації на базі ключів SSH на сервері Linux

Вступ

SSH (Secure Shell) – це шифрований протокол, який використовується для адміністрування та зв’язку з серверами. При роботі з сервером Linux ви, найімовірніше, проведете найбільше годин у сеансах терміналу із підключенням до сервера через SSH.

Хоча існує кілька різних способів входу на сервер SSH, у цьому навчальному модулі ми надамо основну увагу налаштування ключів SSH. Ключі SSH забезпечують простий, але дуже безпечний спосіб входу на сервер. Тому рекомендуємо цей метод усім користувачам.

Як працюють ключі SSH?

Сервер SSH може використовувати багато різних методів автентифікації клієнтів. Найпростіший метод – автентифікація за допомогою пароля. Цей метод просто використовувати, але він не є найбезпечнішим.

Хоча паролі відправляються на сервер у безпечному режимі, зазвичай вони недостатньо складні та довгі, щоб забезпечити надійну захист проти завзятих зловмисників, які здійснюють багаторазові атаки. Обчислювальна потужність сучасних систем та автоматизовані скрипти дозволяють легко зламати обліковий запис методом прямого підбору пароля. Хоча існують інші методи посилення заходів безпеки ( fail2ban і т. д.), ключі SSH показали собі надійною та безпечною альтернативою.

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

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

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

Відкритий ключ вивантажується на віддалений сервер, на який ви хочете заходити за допомогою SSH. Цей ключ додається до спеціального файлу  ~/.ssh/authorized_keys в акаунті користувача, який Ви використовуєте для входу.

Коли клієнт намагається пройти автентифікацію за допомогою ключів SSH, сервер може протестувати клієнт на наявність у нього закритого ключа. Якщо клієнт може довести, що він має закритий ключ, сервер виконує запитану команду або відкриває сеанс з’єднання.

Створення ключів SSH

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

Для цього ми можемо використовувати спеціальну утиліту  ssh-keygen, яка входить до стандартного набору інструментів OpenSSH. За замовчуванням вона створює пару 2048-бітних ключів RSA, що підходить для більшості сценаріїв використання.

Згенеруйте на локальному комп’ютері пару ключів SSH, ввівши таку команду:

$ ssh-keygen

Утиліта запропонує вам вибрати місце розміщення ключів, що генеруються. За промовчанням ключі зберігаються в каталозі  ~/.ssh всередині домашнього каталогу користувача. Закритий ключ матиме ім’я  id_rsa, а відповідний відкритий ключ матиме ім’я  id_rsa.pub.

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

Якщо раніше ви згенерували пару ключів SSH, можна побачити наступний діалог:

/home/username/.ssh/id_rsa already exists.

Якщо ви вирішите перезаписати ключ на диску, ви не зможете виконувати аутентифікацію за допомогою попереднього ключа. Будьте обережні при виборі варіанта yes, оскільки цей процес знищує ключі, і його не можна скасувати.

Created directory '/home/username/.ssh'.

Далі вам буде запропоновано ввести парольну фразу ключа. Це опціональна парольна фраза, яку можна використовувати для шифрування файлу закритого ключа на диску.

Можливо вам буде цікаво, в чому полягають переваги ключа SSH, якщо вам потрібна парольна фраза. Ось деякі його переваги:

  • Закритий ключ SSH (захищена паролем частина) ніколи не доступний через мережу. Парольна фраза використовується лише для розшифрування ключа на локальному комп’ютері. Це означає, що парольну фразу не можна зламати через мережу шляхом прямого підбору.
  • Закритий ключ зберігається у каталозі з обмеженим доступом. Клієнт SSH не приймає закритих ключів, які зберігаються у каталогах, доступ до яких не обмежений. У самого ключа можуть бути обмежені дозволи (читання та запис доступні лише власнику). Це означає, що інші користувачі системи не зможуть створити вразливість.
  • Для спроби злому захищеного парольною фразою закритого ключа SSH зловмиснику вже потрібен доступ до системи. Це означає, що він повинен мати доступ до аккаунта користувача або аккаунта root. Якщо ви опинитеся в такій ситуації, парольна фраза може перешкодити зловмисникові відразу потрапити на інші сервери. Це може дати вам достатньо часу, щоб створити та впровадити нову пару ключів SSH та заборонити доступ зі зламаним ключем.

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

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

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host
The key's randomart image is:
+--[ RSA 2048]----+
|     ..o         |
|   E o= .        |
|    o. o         |
|        ..       |
|      ..S        |
|     o o.        |
|   =o.+.         |
|. =++..          |
|o=++.            |
+-----------------+

Тепер у вас є відкриті та закриті ключі, які можна використовувати для аутентифікації. Наступним кроком буде розміщення відкритого ключа на сервері, що дозволить використовувати автентифікацію SSH для входу до системи.

Копіювання відкритого ключа за допомогою SSH-Copy-ID

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

Інструмент  ssh-copy-id входить до пакетів OpenSSH у багатьох дистрибутивах, тому, можливо, він вже встановлений на вашій локальній системі. Щоб цей метод спрацював, потрібно вже настроїти захищений паролем доступ до сервера через SSH.

Для використання цієї утиліти вам потрібно лише вказати віддалений хост, до якого ви хочете підключитися, та обліковий запис користувача, до якого ви маєте доступ через SSH за допомогою пароля. Це аккаунт, куди буде скопійовано ваш відкритий ключ SSH.

Синтаксис виглядає так:

$ ssh-copy-id username@remote_host

Ви можете побачити таке повідомлення:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Це означає, що ваш локальний комп’ютер не розпізнає віддалений хост. Це станеться під час першого підключення до нового хоста. Введіть “yes” і натисніть ENTER, щоб продовжити.

Потім утиліта проведе сканування локального облікового запису для пошуку раніше створеного ключа  id_rsa.pub. Коли ключ буде знайдено, вам буде запропоновано ввести пароль акаунту віддаленого користувача:

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

Введіть пароль (для безпеки текст, що вводиться, не відображатиметься) і натисніть ENTER. Утиліта підключиться до аккаунту на віддаленому хості, використовуючи вказаний пароль. Потім вміст ключа  ~/.ssh/id_rsa.pub буде скопійовано до основного каталогу  ~/.ssh віддаленого аккаунту у файл з ім’ям  authorized_keys.

Ви отримаєте наступний результат:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

Тепер ваш ключ  id_rsa.pub вивантажено у віддалений обліковий запис. Тепер можна перейти до наступного розділу.

Копіювання відкритого ключа за допомогою SSH

Якщо у вас немає  ssh-copy-id, але ви активували захищений паролем доступ до аккаунту на сервері через SSH, ви можете вивантажити ключі за допомогою стандартного методу SSH.

Для цього ми можемо вивести вміст нашого відкритого ключа SSH на локальний комп’ютер і передати його через з’єднання SSH на віддалений сервер. З іншого боку, ми можемо підтвердити існування каталогу  ~/.ssh в обліковому записі, що використовується, і вивести передані дані до файлу  authorized_keys в цьому каталозі.

Ми використовуємо символ перенаправлення  >>, щоб доповнювати вміст, а не замінювати його. Це дозволяє додавати ключі без знищення раніше доданих ключів.

Повна команда виглядає так:

$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Ви можете побачити таке повідомлення:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Це означає, що ваш локальний комп’ютер не розпізнає віддалений хост. Це станеться під час першого підключення до нового хоста. Введіть “yes” і натисніть ENTER, щоб продовжити.

Після цього ви побачите діалог, де потрібно буде ввести пароль для аккаунта, до якого ви намагаєтеся підключитися:

[email protected]'s password:

Після введення пароля вміст ключа  id_rsa.pub буде скопійовано до кінця файлу  authorized_keys акаунта віддаленого користувача. Якщо процедуру буде успішно виконано, перейдіть до наступного розділу.

Копіювання відкритого ключа вручну

Якщо у вас немає захищеного паролем доступу до сервера SSH, вам потрібно буде виконати вказану вище процедуру вручну.

Вміст файлу  id_rsa.pub потрібно буде додати до файлу  ~/.ssh/authorized_keys на віддаленому комп’ютері.

Щоб вивести вміст ключа  id_rsa.pub, введіть на локальному комп’ютері таку команду:

$ cat ~/.ssh/id_rsa.pub

Ви побачите вміст ключа, який може виглядати приблизно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@ test

Відкрийте віддалений хост за допомогою будь-якого доступного методу. Коли ви отримаєте доступ до облікового запису на віддаленому сервері, вам потрібно буде переконатися, що каталог  ~/.ssh створено. За необхідності ця команда створить каталог, а якщо каталог вже існує, команда нічого не зробить:

$ mkdir -p ~/.ssh

Тепер ви можете створити або змінити файл  authorized_keys у цьому каталозі. Ви можете додати вміст файлу  id_rsa.pub до кінця файлу  authorized_keys і, при необхідності, створити цей файл, використовуючи таку команду:

$ echo public_key_string >> ~/.ssh/authorized_keys

У вищезазначеній команді замініть  public_key_string результати команди  cat ~/.ssh/id_rsa.pub, виконаної на локальному комп’ютері. Вона має починатися з  ssh-rsa AAAA....

Якщо це спрацює, можна спробувати встановити аутентифікацію без пароля.

Аутентифікація на сервері за допомогою ключів SSH

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

Базовий процес виглядає аналогічно:

$ ssh username@remote_host

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

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

Це означає, що ваш локальний комп’ютер не розпізнає віддалений хост. Введіть “yes” і натисніть ENTER, щоб продовжити.

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

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

Вимкнення аутентифікації за допомогою пароля на сервері

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

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

Коли ви виконаєте вищезазначені умови, увійдіть на віддалений сервер за допомогою ключів SSH з обліковим записом root або з обліковим записом з привілеями  sudo. Відкрийте файл конфігурації демона SSH:

$ sudo nano /etc/ssh/sshd_config

Знайдіть у файлі директиву  PasswordAuthentication. Вона може бути позначена як коментар. Видаліть символ коментаря на початку рядка та встановіть значення “no”. Після цього ви втратите можливість входу в систему через SSH за допомогою паролів облікового запису:

PasswordAuthentication no

Збережіть файл та закрийте його після завершення. Щоб фактично активувати внесені зміни, необхідно перезапустити службу.

На комп’ютерах під керуванням Ubuntu або Debian можна використовувати наступну команду:

$ sudo service ssh restart

На комп’ютерах під керуванням CentOS/Fedora цей демон носитиме ім’я  sshd:

$ sudo service sshd restart

Виконавши цей крок, ви успішно перенастроювали демон SSH так, щоб він реагував лише на ключі SSH.

Висновок

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

Якщо помітили помилки чи неточності, будь ласка, залишіть коментар чи напишіть листа на поштову адресу [email protected]

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *