П'ять простих кроків для захисту ssh в ubuntu

Одна з найбільш важливих речей, які потрібно зробити відразу ж після підключення сервера з Ubuntu до мережі інтернет - це, звичайно ж, захист від несанкціонованого доступу до управління сервером через ssh. Якщо цього не зробити, то дуже швидко спеціально написані програми, скануючі глобальну мережу, виявлять, що на вашому сервері відкритий порт 22 і що для повного контролю над системою досить тільки підібрати пароль для користувача root. Звичайно, абсолютного захисту не існує, але максимально ускладнити завдання зловмисникові нам цілком під силу. Розповідь про методи захисту ssh я буду вести, враховуючи можливі особливості як для повноцінних виділених серверів з Ubuntu, так і для VPS / VDS серверів.
Захищати доступ по ssh безумовно потрібно. Якщо ви цього ще не робили, то просто загляньте в файл /var/log/auth.log. Напевно там є записи про спроби несанкціонованого доступу до системи.

sudo nano / etc / ssh / sshd_config


В одній з його перших рядків знаходимо директиву Port. Замінюємо номер порту 22 на один з нестандартних портів, наприклад, на 4117.

# What ports, IPs and protocols we listen for
Port 4117


Після цього перезапускаємо ssh-сервер:

sudo service ssh restart


... і цілком передбачувано втрачаємо зв'язок з сервером. Тому заново підключаємося по ssh, але тепер вказуємо в параметрах підключення новий порт, наприклад, так:

ssh -p 4117 [email protected]


Зміна номера порту ssh дозволяє позбутися від більшості спроб перебору паролів автоматичними програмами. Однак від більш професійних спроб несанкціонованого доступу до всієї системи цей крок не врятує. Разом з ним слід застосовувати й інші методи захисту.

sudo passwd -l root


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


У цьому файлі ви можете побачити такі рядки:


Рядки, наведені вище означають, що виконувати команди від імені суперадміністратора може користувач root, а також користувачі, що входять до групи sudo і admin. Тому досить помістити нового користувача в одну з цих груп. Файл visudo, тим часом, слід закрити, не вносячи в нього змін. Після цього додамо користувача test в групу sudo:

usermod -a -G sudo test


Щоб переконатися, що користувач test був доданий до групи sudo, можна виконати наступну команду:


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

logout
ssh -p 4117 [email protected]
sudo passwd -l root


Ключі за замовчуванням зберігаються в домашній каталог користувача, в файли

/.ssh/id_rsa (закритий ключ) і

scp -P 4117 [email protected]:


Це командою ми завантажимо файл id_rsa.pub на сервер example.org в домашній каталог користувача test. Також в цій команді вказано нестандартний номер порту ssh: 4117. Потім вже на віддаленому сервері потрібно додати вміст файлу id_rsa.pub в файл

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

ssh -p 4117 -v [email protected]

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no


Після цього залишається тільки перезапустити ssh:

sudo service ssh restart

sudo aptitude install denyhosts


Для того щоб нові налаштування вступили в силу, потрібно перезапустити службу denyhosts:

sudo service denyhosts restart

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

Її суть полягає в тому, що на сервері запускається спеціальна служба knockd, яка «слухає» підключення по всіх портах, і при отриманні якоїсь очікуваної послідовності підключень виконує заздалегідь задану адміністратором команду. Така технологія дає додаткову можливість з віддаленого управління сервером. Залишається тільки закрити порт ssh і задати службі knockd таку команду, яка змусить фаєрвол відкрити порт ssh при отриманні певної послідовності підключення до портів сервера. Далі я опишу як максимально просто і швидко зробити це в Ubuntu.

крок п'ятий
На віддаленому сервері все нижче перераховані дії слід проводити з особливою обережністю, так як є ризик втратити зв'язок з сервером в разі помилки.
Спочатку потрібно встановити пакет knockd. Разом з ним також встановиться утиліта knock, за допомогою якої можна буде «простукувати» порти на віддаленому сервері.

sudo aptitude install knockd


У складі Ubuntu є спрощений фаєрвол ufw, який значно легше в розумінні, ніж iptables. Тому для відкриття порту ssh службою knockd ми будемо використовувати саме ufw, який за своєю суттю є надбудовою для iptables. Пакет ufw встановлений в Ubuntu за замовчуванням. Якщо пакета ufw немає, то його можна встановити. Однак мушу попередити, що якщо пакета ufw немає на віртуальному виділеному сервері (VPS / VDS), то його краще не встановлювати. На таких серверах зазвичай використовуються спеціальні ядра linux, деякі з яких несумісні з Фаєрвол ufw.
І так, при включенні Фаєрвол ufw всі порти закриються. Тому перед стартом ufw слід відкрити порт, на якому у нас знаходиться ssh. У більшості випадків це порт 22, але в попередній статті ми використовували порт 4117 для цих цілей.

sudo ufw allow 22
sudo ufw enable


Потім потрібно налаштувати конфігураційні файли служби knockd. Нижче я привожу приклад конфігураційного файлу для відкриття порту 22 на віддаленому сервері.

[Options]
logfile = /var/log/knockd.log

[OpenSSH]
sequence = 4561: tcp, 7127: udp, 5934: tcp, 3901: udp
seq_timeout = 30
tcpflags = syn
start_command = ufw allow from% IP% to any port 22
cmd_timeout = 30
stop_command = ufw delete allow from% IP% to any port 22

# Control if we start knockd at init or not
# 1 = start
# Anything else = do not start
#
# PLEASE EDIT /etc/knockd.conf BEFORE ENABLING
START_KNOCKD = 1


Потім перезапустити саму службу:

sudo service knockd restart


На комп'ютері, з якого ми будемо підключатися до віддаленого сервера, також встановимо службу knockd і виконаємо команду, яка додасть в фаєрвол нове правило:

sudo aptitude install knockd
knock 4561: tcp 7127: udp 5934: tcp 3901: udp


Щоб перевірити, додалося нове правило, потрібно протягом 30 секунд виконати на віддаленому сервері команду:

sudo ufw status

sudo ufw delete allow 22


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

Схожі статті