
, CC BY-SA
У наш час підняти сервер на хостингу - справа кількох хвилин і кількох клацань миші. Але одразу після запуску він потрапляє у вороже середовище, бо відкритий для всього інтернету як безневинна дівчина на дискеті рокерської. Його швидко намацають сканери та виявлять тисячі автоматично скриптових ботів, які нишпорять по мережі в пошуках уразливостей та неправильних конфігурацій. Є кілька речей, які слід зробити одразу після запуску, щоб забезпечити базовий захист.
Зміст
Нерутовий користувач
Насамперед необхідно завести собі нерутового користувача. Справа в тому, що у користувача root абсолютні привілеї в системі, а якщо дозволити йому віддалене адміністрування, то ви зробите половину роботи для хакера, залишивши для нього валідний username.
Тому необхідно завести іншого користувача, а для рута відключити віддалене адміністрування по SSH.
Новий користувач заводиться командою useradd:
useradd [options] <username> Потім до нього додається пароль командою passwd:
passwd <username> Зрештою, цього користувача потрібно додати до групи, яка має право виконувати команди з підвищенням привілеїв. sudo. Залежно від дитрибутива Linux це можуть бути різні групи. Наприклад, в CentOS і Red Hat користувача додають до групи wheel:
usermod -aG wheel <username> У Ubuntu він додається до групи sudo:
usermod -aG sudo <username>
Ключі замість паролів SSH
Брутфорс або витік паролів — стандартний вектор атаки, так що аутентифікацію за паролями в SSH (Secure Shell) краще відключити, а замість неї використовувати аутентифікацію за ключами.
Існують різні програми для реалізації протоколу SSH, такі як и Але найпопулярнішою є OpenSSH. Встановлення клієнта OpenSSH на Ubuntu:
sudo apt install openssh-clientВстановлення на сервері:
sudo apt install openssh-serverЗапуск демона SSH (sshd) на сервері під Ubuntu:
sudo systemctl start sshdАвтоматичний запуск демона при кожному завантаженні:
sudo systemctl enable sshd Слід зазначити, що серверна частина OpenSSH включає клієнтську. Тобто через openssh-server можна підключатися до інших серверів. Більше того, зі своєї клієнтської машини ви можете запустити SSH-тунель з віддаленого сервера на сторонній хост, і тоді сторонній хост вважатиме віддалений сервер джерелом запитів. Дуже зручна функція для маскування власної системи. Детальніше див. .
На клієнтській машині зазвичай немає сенсу ставити повноцінний сервер, щоб не допускати можливість віддаленого підключення до комп'ютера (з метою безпеки).
Отже, для свого нового користувача спочатку необхідно згенерувати ключі SSH на комп'ютері, з якого ви заходитимете на сервер:
ssh-keygen -t rsa Публічний ключ зберігається у файлі .pub і виглядає як рядок випадкових символів, які починаються з ssh-rsa.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname
Потім з-під рута створити на сервері директорію SSH у домашньому каталозі користувача та додати публічний ключ SSH у файл authorized_keys, використовуючи текстовий редактор на кшталт Vim:
mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keysvim /home/user_name/.ssh/authorized_keysНарешті встановити коректні дозволи для файлу:
chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keysі змінити володіння цього користувача:
chown -R username:username /home/username/.sshНа стороні клієнта потрібно вказати розташування секретного ключа для аутентифікації:
ssh-add DIR_PATH/keylocationТепер можна залогінитися на сервер під ім'ям користувача за цим ключем:
ssh [username]@hostnameПісля авторизації можна використовувати команду scp для копіювання файлів, утиліту для віддаленого встановлення файлової системи або директорій.
Бажано зробити кілька резервних копій приватного ключа, тому що якщо відключити аутентифікацію за паролем і втратити його, то у вас взагалі не залишиться ніякої можливості зайти на власний сервер.
Як згадувалося вище, в SSH необхідно відключити автентифікацію для рута (тому ми і заводили нового користувача).
На CentOS/Red Hat знаходимо рядок PermitRootLogin yes у конфігураційному файлі /etc/ssh/sshd_config і змінюємо її:
PermitRootLogin no На Ubuntu додаємо рядок PermitRootLogin no у конфігураційний файл 10-my-sshd-settings.conf:
sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.confПісля перевірки, що новий користувач проходить автентифікацію за своїм ключем, можна відключити автентифікацію по паролю, щоб унеможливити ризик його витоку чи брутфорсу. Тепер для доступу на сервер зловмиснику необхідно дістати приватний ключ.
На CentOS/Red Hat знаходимо рядок PasswordAuthentication yes у конфігураційному файлі /etc/ssh/sshd_config і змінюємо її так:
PasswordAuthentication no На Ubuntu додаємо рядок PasswordAuthentication no у файл 10-my-sshd-settings.conf:
sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.confІнструкцію з підключення двофакторної аутентифікації SSH див. .
Файрвол
Файрвол гарантує, що на сервер піде лише той трафік по тих портах, які ви дозволили. Це захищає від експлуатації портів, які випадково увімкнулися з іншими сервісами, тобто сильно зменшує поверхню атаки.
Перед встановленням файрвола потрібно переконатися, що SSH внесений до списку винятків і блокуватиметься. Інакше після запуску файрвола ми зможемо підключитися до серверу.
З дистрибутивом Ubuntu йде Uncomplicated Firewall (), а з CentOS/Red Hat - .
Дозвіл SSH у файрволі на Ubuntu:
sudo ufw allow ssh На CentOS/Red Hat використовуємо команду firewall-cmd:
sudo firewall-cmd --zone=public --add-service=ssh --permanentПісля цієї процедури можна запустити файрвол.
На CentOS/Red Hat запускаємо сервіс systemd для firewalld:
sudo systemctl start firewalld
sudo systemctl enable firewalldНа Ubuntu використовуємо таку команду:
sudo ufw enable
Fail2Ban
Сервіс аналізує логи на сервері та підраховує кількість спроб доступу з кожної IP-адреси. У налаштуваннях вказано правила, скільки спроб доступу дозволено за певний інтервал - після чого ця IP-адреса блокується на заданий відрізок часу. Наприклад, дозволяємо 5 невдалих спроб аутентифікації SSH в проміжок 2 години, після чого блокуємо дану IP-адресу на 12 годин.
Установка Fail2Ban на CentOS та Red Hat:
sudo yum install fail2banУстановка на Ubuntu та Debian:
sudo apt install fail2banзапуск:
systemctl start fail2ban
systemctl enable fail2ban У програмі два конфігураційних файли: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf. Обмеження для бана вказуються у другому файлі.
Джейл SSH включений за замовчуванням з дефолтними налаштуваннями (5 спроб, інтервал 10 хвилин, бан на 10 хвилин).
[DEFAULT] ignorecommand = bantime = 10m findtime = 10m maxretry = 5
Крім SSH, Fail2Ban може захищати інші сервіси на веб-сервері nginx або Apache.
Автоматичні оновлення безпеки
Як відомо, у всіх програмах постійно знаходять нові вразливості. Після публікації інформації експлоїти додаються до популярних експлоїт-паків, які масово використовуються хакерами та підлітками при скануванні всіх серверів поспіль. Тому дуже важливо встановлювати оновлення безпеки, як тільки вони з'являються.
На сервері Ubuntu у конфігурації за замовчуванням включені автоматичні оновлення безпеки, тому додаткових дій не потрібно.
На CentOS/Red Hat потрібно встановити програму та включити таймер:
sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timerПеревірка таймера:
sudo systemctl status dnf-automatic.timer
Зміна портів за замовчуванням
SSH був розроблений у 1995 році для заміни telnet (порт 23) та ftp (порт 21), тому автор програми Тату Ілтонен , та його затвердили в IANA.
Звичайно, всі зловмисники знають, на якому порту працює SSH — і сканують його разом з іншими стандартними портами, щоб дізнатися версію програмного забезпечення, для перевірки стандартних паролів рута і так далі.
Зміна стандартних портів – обфускація – у кілька разів скорочує обсяг сміттєвого трафіку, розмір логів та навантаження на сервер, а також скорочує поверхню атаки. Хоча деякі (Security through obscurity). Причина в тому, що ця техніка протиставляється фундаментальною. . Тому, наприклад, Національний інститут стандартів та технологій США в вказує необхідність відкритої серверної архітектури: «Безпека системи має покладатися на скритність реалізації її компонентів», — сказано у документі.
Теоретично зміна портів за умовчанням суперечить практиці відкритої архітектури. Але на практиці обсяг шкідливого трафіку дійсно скорочується, так що це простий та ефективний захід.
Номер порту можна настроїти, змінивши директиву Port 22 у файлі конфігурації . Він також вказується параметром -p <port> в . Клієнт SSH та програми теж підтримують параметр -p <port>.
Параметр -p <port> можна використовувати для вказівки номера порту при підключенні за допомогою команди ssh у Linux. У и scp використовується параметр -P <port> (Заголовна P). Вказівка командного рядка перевизначає будь-яке значення у файлах конфігурації.
Якщо серверів багато, майже всі ці дії захисту Linux-сервера можна автоматизувати в скрипті. Але якщо сервер лише один, то краще вручну контролювати процес.
На правах реклами
Замов і одразу працюй! будь-якої конфігурації та з будь-якою операційною системою протягом хвилини. Максимальна конфігурація дозволить відірватися на повну – 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Епічненько 🙂
Джерело: habr.com
