Вступ
В попередній статті Заказ VPS-сервера на MVPS.net ми орендували собі віртуальний приватний сервер, та встановили на нього операційну систему Ubuntu 22.04 Server. Після створення нового сервера, нам слід подбати про його безпеку. В першу чергу потрібно виконати деякі важливі початкові налаштування, які підвищать безпеку нашого сервера та зручність користування ним.
Створення нового користувача
По замовчуванню система встановлюється тільки з користувачем root. Користувач root – це користувач-адміністратор у середовищі Linux із максимальними правами. Через максимальні права облікового запису, користувач root може внести дуже серйозні руйнівні зміни, навіть випадково, після чого система може працювати неправильно або непрацювати взагалі. Тому, використовувати регулярно користувача root не рекомендується.
Також, через максимальні права облікового запису, користувач root буде найбільшою мішенню для зловмисників. Ми повністю відключимо вхід в систему root-користувача (нижче в статті буде описано).
Заходимо на сервер по SSH. Якщо ви працюєте на операційній системі Windows, можна скористатися безкоштовною програмою PuTTY. Якщо будемо заходити на сервер з Linux-систем, то для входу на сервер потрібно в терміналі ввести наступну команду
ssh root@your_server_ip
your_server_ip – це IP-адреса нашого віддаленого сервера, до якого ми намагаєтеся підключитися.
Під час першого входу на сервер, система попередить нас про додавання цифрового підпису для нашого підключення. Просто погоджуємося з цим написавши з клавіатури “yes” та натискаємо enter. Далі водимо наш пароль для root-користувача і натискаємо enter. Якщо все введено вірно, ми увійдемо в систему і зможемо з нею далі працювати.
Першим ділом перевіряємо систему на наявність оновлень та встановлюємо самі свіжі оновлення
apt update
apt upgrade
Після завершення процесу оновлення, деяким службам та/або компонентам операційної системи необхідна буде перезапуск. Для перезапуску системи вводимо команду
reboot
Далі створюємо нового користувача. Замість username вводимо назву нашого нового юзера
adduser username
Потрібно буде задати пароль для нового користувача та підтвердити цей пароль. Далі система запропонує заповнити поля Full Name, Room Number, Work Phone, Home Phone та Other. Дані поля не є обов’язковими і можуть заповнюватися за бажанням. На запит Is the information correct? [Y/n] відповідаємо “y”.
Ми створили нового користувача. Тепер цього новоствореного користувача необхідно добавити в групу sudo
usermod -aG sudo username
Тепер ми можемо вводити sudo перед командами, щоб запускати їх з root-правами.
Настройка брандмауера
Сервери Ubuntu 22.04 можуть використовувати брандмауер UFW (Uncomplicated Firewall або “простий брандмауер”). Різні програми можуть реєструвати свої профілі в UFW після встановлення. Ці профілі дозволяють UFW керувати цими програмами по імені.
Для перегляду списку встановлених профілів вводимо
ufw app list
отримаємо:
Available applications:
OpenSSH
OpenSSH – служба, яка дозволяє нам підключатися до нашого сервера, має зареєстрований профіль в UFW.
Нам потрібно впевнитися що брандмауер дозволяє SSH-підключення. В противному випадку ми не зможемо зайти на сервер після ввімкнення брандмауера. Щоб дозволити ці підключення вводимо
ufw allow OpenSSH
Тепер вмикаємо брандмауер
ufw enable
Натискаємо “y” та enter для підтвердження. Для перегляду статусу брандмауера вводимо
ufw status
отримаємо:
Status: active
To Action From
– ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Ми можемо бачити, що на даний момент брандмауер блокує всі підключення крім OpenSSH.
В майбутньому, коли ми будемо встановлювати і налаштовувати інші служби, нам буде потрібно по мірі необхідності налаштовувати параметри брандмауера, щоб дозволити новий трафік на наш сервер від цих служб.
Зовнішній доступ для звичайного користувача
Тепер, коли в нас є новостворений користувач, нам потрібно впевнитися що ми зможемо напряму підключитися до нього по SSH.
Поки ми не впевнимося що зможемо увійти в систему і використовувати команди sudo з новим користувачем, рекомендується залишатися в системі як root-користувач. Якщо у вас виникнуть проблеми з підключенням, ви зможете ліквідувати неполадки і внести необхідні зміни як root.
Відкриваємо новий сеанс терміналу, використовуючи SSH з нашим новим іменем:
ssh username@your_server_ip
де username – ім’я нашого новоствореного користувача, your_server_ip – це IP-адреса нашого віддаленого сервера, до якого ми намагаєтеся підключитися. Після введення пароля нашого користувача ми повинні увійти в систему.
Налаштування доступу до сервера по SSH-ключу
Служба SSH дозволяє декілька різних методів аутентифікації клієнтів. Найбільш-простий метод – аутентифікація за допомогою паролю. Даний метод простий у користуванні, але він не є безпечним.
Всі паролі, які ми вводимо для підключення, відправляються на сервер у безпечному вигляді. Але зазвичай паролі бувають недостатньо складними та довгими щоб забезпечити надійний захист проти зловмисників, які здійснюють багаторазові атаки. Обчислювальна потужність сучасних систем і автоматизовані скрипти дозволяють достатньо легко зламати обліковий запис методом прямого перебору пароля. Хоча існують і інші методи посилення безпеки, ключі SSH показали себе надійною і безпечною альтернативою.
Першим кроком буде створення пари ключів на клієнтській машині (зазвичай це ваш комп’ютер)
ssh-keygen
Після цієї команди ми повинні побачити вивід:
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/your_user/.ssh/id_rsa):
Натискаємо enter, щоб зберегти пару ключів в .ssh/ підкаталог або можна вказати альтернативний шлях за потребою.
Якщо раніше вже створювалась пара SSH-ключів, то ми побачимо наступний вивід:
/your_home/your_user/.ssh/id_rsa already exists.
Overwrite (y/n)?
Якщо переписати ключ на диску, ми більше не зможемо аутентифікуватися з використанням попереднього ключа. Потрібно бути дуже обережним, вибираючи “Y”
Далі ми повинні побачити наступний вивід:
Enter passphrase (empty for no passphrase):
Тут при бажанні можна ввести безпечну фразу-пароль для ключа. Її потрібно буде вводити постійно при підключенні до сервера. Парольна фраза додає додатковий рівень безпеки для запобігання входу неавторизованих користувачів. Цю фразу можна залишити пустою.
Далі ми повинні побачити вивід подібний до наступного:
Your identification has been saved in /your_home/your_user/.ssh/id_rsa
Your public key has been saved in /your_home/your_user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/hk7MJ5n5aiqdfTVUZr+2Qt+qCiS7BIm5Iv0dxrc3ks user@host
The key's randomart image is:
+---[RSA 3072]----+
| .|
| + |
| + |
| . o . |
|o S . o |
| + o. .oo. .. .o|
|o = oooooEo+ ...o|
|.. o *o+=.*+o… .|
| =+=ooB=o.... |
+----[SHA256]-----+
Тепер в нас є відкритий і закритий ключі, які ми можемо використовувати для входу
Копіювання відкритого ключа на наш сервер Ubuntu з допомогою ssh-copy-id
Самий простий та швидкий спосіб скопіювати відкритий ключ на хост Ubuntu – скористатися утилітою ssh-copy-id. За своєї простоти рекомендується використовувати цей метод, якщо він доступний. Якщо у вас немає ssh-copy-id доступу до вашого клієнтського комп’ютера, ви можете скопіювати ключ вручну (буде описано далі).
Щоб скористатися утилітою, ми вказуємо віддалений хост до якого хочемо підключитися і обліковий запис користувача, до якого в нас є доступ по SSH на основі пароля. Це обліковий запис, в який буде скопійований наш відкритий SSH-ключ.
Вводимо:
ssh-copy-id username@remote_host
Ми повинні побачити щось схоже на наступне повідомлення:
The authenticity of host '203.0.113.1 (203.0.113.1)' 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” і натискаємо 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
username@203.0.113.1's password:
Вводимо пароль і натискаємо enter. Ми повинні побачити щось схоже на наступне повідомлення:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'username@203.0.113.1'"
and check to make sure that only the key(s) you wanted were added.
На даний момент наш id_rsa.pub ключ загружений у віддалений обліковий запис
Копіювання відкритого ключа на наш сервер Ubuntu вручну
Якщо у нас немає ssh-copy-id доступу, ми можемо вручну добавити вміст нашого id_rsa.pub файлу у ~/.ssh/authorized_keys файл на нашому віддаленому сервері.
Щоб відобразити вміст нашого id_rsa.pub ключа, на локальному комп’ютері вводимо:
cat ~/.ssh/id_rsa.pub
Ми побачимо вміст ключа, який повинен виглядати приблизно так:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3
pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCE
AjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385
gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2
wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNz
SgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikryg
TKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiF
xgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/
zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6Z
lN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ
068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q
8/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 ми заміняємо на вміст файлу id_rsa.pub (той, що був виведений на локальній машині командою cat ~/.ssh/id_rsa.pub)
Наостанок, ми для каталогу ~/.ssh і файлу authorized_keys встановимо відповідні права:
chmod -R go= ~/.ssh
Це рекурсивно видалить всі “групові” та “інші” права для каталогу ~/.ssh/
Якщо ми використовуємо обліковий запис root для настройки ключів облікового запису користувача, важливо щоб каталог ~/.ssh належав користувачу а не root:
chown -R user:user ~/.ssh
Ім’я user потрібно замінити на ім’я свого облікового запису. Якщо все виконано успішно і правильно, ми повинні увійти на сервер не вводячи пароль облікового запису.
Якщо ми не вказували парольну фразу для свого закритого ключа, ми зразу увійдемо в систему. Якщо ми вказали парольну фразу при створені ключа, ми повинні будемо її ввести.
Відключення аутентифікації по паролю на нашому сервері
Якщо ми змогли ввійти у свій обліковий запис використовуючи SSH без пароля, ми успішно налаштували аутентификацію на основі SSH-ключа для свого облікового запису. Однак наш механізм аутентифікації на основі пароля надалі активний. Це означає, що наш сервер надалі піддається атакам.
Після того, як ми переконаємося що наш віддалений обліковий запис має адміністраторські права – входимо на віддалений сервер з ключами SSH або як root, або з обліковим записом з sudo правами.
Далі відкриваємо файл конфігурації демона SSH
sudo nano /etc/ssh/sshd_config
Шукаємо розкоментовану директиву PasswordAuthentication yes і встановлюємо її no.
Ця стрічка може бути закоментована за допомогою символу #. Розкоментовуємо стрічку і встановлюємо потрібне значення no. Це вимкне можливість входу по SSH з використанням паролів облікових записів.
Також ми повністю відключаємо вхід в систему root-користувача. Для цього шукаємо розкоментовану директиву PermitRootLogin yes і встановлюємо її no. Якщо директива закоментована за допомогою символу # то розкоментовуємо її.
Зберігаємо і закриваємо файл.
Щоби зміни вступили в дію, перезавантажуємо службу sshd:
sudo systemctl restart ssh
Встановлення додаткових служб і утиліт
vnstat – утиліта, яка фіксує використаний трафік
sudo apt install vnstat
ifconfig – утиліта для відображення параметрів мережевих інтерфейсів
sudo apt install net-tools