Підвищення безпеки та захисту сервера Linux / CentOS в Інтернеті

У цій статті ми розглянемо основні концепції та конкретні настройки, які допоможуть підвищити захищеність вашого CentOS сервера в Інтернеті. Використання даних підходів дозволить підвищити захист сервера від злому і зараження. Інструкція в більшій частині універсальна і основні моменти підійдуть для підвищення безпеки будь-якого Linux сервера.

зміст:

  • Розбивка і опції монтування дисків для ізоляції
  • Установка і оновлення програмного забезпечення в Linux (CentOS)
  • Захист SSH, авторизація по ключам
  • Регулярна зміна паролів в Linux
  • Підвищення захисту сервера за допомогою SELinux
  • Налаштування брандмауера Firewalld
  • Видалення X Windows
  • Захист ядра Linux
  • Права на файли в Linux
  • Захист Web-сервера
  • Захист фізичного сервера
  • Створення резервних копій сервера Linux

Розбивка і опції монтування дисків для ізоляції

При установці CentOS (і будь-якого дистрибутива Linux) на етапі розбивки диска, не створюйте один розділ, а відокремте web-простір від основного розділу, також створіть системні розділи:

  • / root
  • / boot
  • / var
  • / tmp
  • /

При ізоляції розділів зловмисники не зможуть піднятися вище директорії web при зломі сайту і впровадження в нього шкідливих скриптів.

Використовуйте спеціальні опції для безпечного монтування деяких розділів диска:

  • noexec - не дозволяє запускати бінарні файли (не можна використовувати на кореневій директорії, так як це призведе до непрацездатності системи);
  • nodev - передбачає, що на монтируемой файлової системи не будуть створені файли пристроїв / dev. Так само не може бути застосовано до кореневого каталогу;
  • nosuid - забороняє операції з suid і sgid битами.

Дані параметри можуть бути встановлені на директорію, тільки якщо вона існує як окремий розділ. Ви можете налаштувати / Etc / fstab відповідно до наступних рекомендацій, якщо такі розділи на диску у вас існують:

  • / home - змонтувати з опціями nodev, nosuid, usrquota (Включення квоти);
  • / boot - змонтувати з опціями nodev, nosuid, noexeс - даний розділ потрібно для завантаження системи, заборонимо що-небудь міняти в ньому;
  • / var - nosuid - під root користувачем виконання процесів не заборонено;
  • / Var / log - змонтувати з опціями nodev, nosuid, noexeс;
  • / Var / www - змонтувати з опціями nodev, nosuid;
  • / tmp - змонтувати з опціями nodev, nosuid, noexeс - даний розділ потрібен лише для зберігання і запису тимчасових файлів.
Всі перераховані вище розділи монтуються з опцією rw (Можливість запису).

Установка і оновлення програмного забезпечення в Linux (CentOS)

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

Встановлюйте лише мінімально необхідне програмне забезпечення. Установка і настройка тільки по справі і за допомогою установника yum і dnf. Перевірте все встановлене ПЗ і видаліть непотрібні пакети:

yum list installed
yum list packageName
yum remove packageName

Використовуйте тільки офіційні та довірені репозиторії пакетів.

Не використовуйте нешифровані протоколи FTP, Telnet, Rlogin, Rsh.

Вимикатимете сервіси на своєму сервері, якщо в даний момент видалення сервісу вам не підходить.

Щоб перевірити список всіх сервісів, використовуйте команду:

systemctl list-unit-files --type = service

Щоб відключити і прибрати службу з автозавантаження в CentOS використовується systemctl:

systemctl stop service
systemctl disable service

Наприклад, для відключення сервісу httpd використовується така команда:

systemctl stop httpd.service
systemctl disable httpd.service

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

yum update - оновлення системи

Захист SSH, авторизація по ключам

Для безпечної авторизації на сервері, використовуйте приватний ключ. Згенеруйте ключ за допомогою утиліти ssh-keygen:

# Ssh-keygen

Generating public / private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256: ffIDjWIfOgMZmOVbQmDWaOCADK4G3cYYy0dTIjqLkD8 [email protected] The key's randomart image is: + --- [RSA 2048] ---- + | * + .B = + | | OO @oO. | | *. *. B +. | | = + O *. o | | + .E + S * o | | ... o + * | | +. o | | o. | | | + ---- [SHA256]-----+ 

Після генерації, ви можете підключитися за допомогою даного ключа до сервера, через ssh-клієнт.

Створіть додаткового користувача і виконуйте команди через sudo.

sudo groupadd sudo - Створити групу sudo

adduser webmaster - створити користувача

passwd webmaster - поміняти пароль

usermod -aG sudo webmaster - додати користувача до групи sudo

У файлі / Etc / sudoers додайте рядок:

% Sudo ALL = (ALL: ALL) ALL

Вимкніть в налаштування ssh-сервера, авторизацію через root і за логіном / паролем:

nano / etc / ssh / sshd_config

І змінюємо значення зазначених нижче рядків на:

PermitRootLogin no PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no AuthenticationMethods publickey PubkeyAuthentication yes 

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

Щоб поміняти стандартний порт на ssh, в конфігураційному файлі / Etc / ssh / sshd_config замініть значення в рядку:

Port 22

Регулярна зміна паролів в Linux

Якщо ви все ж використовуєте паролі для авторизації в Linux, то налаштуйте термін дії пароля через утиліту chage.

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

chage -l root

За замовчуванням для root у мене було встановлено 99999 днів:

# Chage -l root

Last password change: never Password expires: never Password inactive: never Account expires: never Minimum number of days between password change: 0 Maximum number of days between password change: 99999 Number of days of warning before password expires: 7 

Щоб змінити термін дії пароля (наприклад 9 днів), скористайтеся командою:

chage -M 9 root

Тепер при перевірці інформації про термін пароля для користувача root, інформація змінилася:

# Chage -l root

Last password change: never Password expires: never Password inactive: never Account expires: never Minimum number of days between password change: 0 Maximum number of days between password change: 9 Number of days of warning before password expires: 7 

Більше опцій по утиліті chage ви можете отримати з довідки:

man chage

Для блокування користувачів при введенні неправильного пароля, скористайтеся утилітою fail2ban (Вона дозволяє реалізувати аналог групових політик блокування облікових записів в Windows). Fail2ban дозволяє захистити сервер Linux і служби від підбору паролів.

Для установки fail2ban виконайте:

yum install epel-release fail2ban -y

Конфігураційний файл fail2ban розташований в /etc/fail2ban/jail.conf. Налаштування, які ми торкнемося:

  • bantime = 600 - час бана при блокуванні
  • maxretry = 3 - кількість спроб неправильного введення пароля, після яких користувач буде заблокований
  • findtime = 600 - часовий відрізок, в якій потрібно авторизуватися користувачеві

Інші налаштування використовуються за бажанням. Додатково ви можете налаштувати відправку звітів до себе на пошту.

створіть файл /etc/fail2ban/jail.local і додайте туди наступні рядки:

Після зміни конфігураційного файлу, запустіть сервіс.

[DEFAULT] ignoreip = 127.0.0.1/24 [ssh-iptables] enabled = true port = ssh filter = sshd action = iptables [name = sshd, port = ssh, protocol = tcp] logpath = / var / log / secure 

Після чого збережіть файл і перезапустіть сервіс fail2ban:

systemctl restart fail2ban

Таким чином, ми налаштували блокування користувачів для ssh:

При неправильному введенні пароля, мене заблокувало на 10 хвилин. Ви можете налаштувати fail2ban для роботи з будь-яким сервісом, який працює з користувачами, наприклад:

  • proftpd
  • exim
  • postfix

Підвищення захисту сервера за допомогою SELinux

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

SELinux має 3 режими роботи:

  • Enforcing
  • Permissive
  • Disabled

В режимі enforsing SELinux застосовує свою політику в системі і стежить за несанкціонованим доступом з боку користувачів. Всі спроби реєструються в логах.

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

І disabled відповідно взагалі відключає SELinux і її політика не застосовується взагалі.

конфігураційний файл SELinux - / Etc / selinux / config

ретельну настройку SELinux можна розписати на декілька статей, якщо вам потрібна детальна інформація, можна скористатися офіційною документацією RedHat. Зазвичай при налаштуванні сервера, все працює повноцінно, я з включеним SELinux помічав, що виникають проблеми з ftp-сервером, а також з деякими платним ПО.

Перевірка статусу:
# sestatus

SELinux status: disabled

Для більш зручного вивчення логів SELinux рекомендую використовувати утиліти aureport і sealer.

Налаштування брандмауера Firewalld

Відкрийте тільки мінімально необхідний набір портів на сервері, які дійсно потрібні для роботи. Наприклад, для роботи web-серверів досить відкрити 80 і 443. Якщо ви використовуєте mysql /mariadb, відключіть можливість підключення з віддалених серверів на порт 3306 (якщо ваша БД використовується тільки локально, не включена в кластер Galera і не наспіл в сценаріях реплікації).

Якщо у вас на комп'ютері / шлюзі доступу заданий статичний IP адреса, додайте в винятку брандмауера ваш довірений адресу і підключайтеся до сервера з нього. Детальніше про налаштування firewalld в CentOS (якщо ви прівиккі до iptables дивіться статтю Налаштування Linux-файрволу за допомогою iptables).

Щоб перевірити відкриті порти на сервері, використовуйте утиліту netstat:

netstat -tulpn

Видалення X Windows

Не використовуйте на своєму сервері систему X Windows. Видаліть всі ПО, яке пов'язане з цією системою, немає необхідності використовувати це на Linux сервері:

yum group remove "GNOME Desktop"
yum group remove "KDE Plasma Workspaces"
yum group remove "Server with GUI"
yum group remove "MATE Desktop"

Захист ядра Linux

Використовуйте налаштування у файлі /etc/sysctl.conf для забезпечення додаткової безпеки під час завантаження ядра Linux.

Увімкніть execshield:

kernel.exec-shield = 1

Вимкніть IP-маршрутизацію (якщо ваш сервер не використовується як шлюз доступу в Інтернет з LAN):

net.ipv4.conf.all.accept_source_route = 0

Увімкніть захист від спуфинга

net.ipv4.conf.all.rp_filter = 1

Увімкніть ігнорування широкомовних запитів

net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_messages = 1

Увімкніть реєстрацію підозрілих пакетів

net.ipv4.conf.all.log_martians = 1

Права на файли в Linux

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

find / директорія -xdev \ (-nouser -o -nogroup \) -print

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

встановіть прапорець chattr на потрібні файли, щоб захистити їх від модифікації. Жоден користувач, не зможе змінити файл, поки даний прапорець встановлений. наприклад:

chattr + i /etc/mysript.sh

Не встановлюйте занадто високі права на директорії і файли, наприклад, стандартні права для web:

  • 755 для директорій
  • 644 для файлів

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

find / home -type f -perm 777

Захист Web-сервера

Якщо ви використовуєте сервер під web, подбайте про налаштування web-сервісів. Закрийте перегляд вмісту директорій через Options -Indexes, а також додайте X-frame.

Header always append X-Frame-Options SAMEORIGIN

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

Вимкніть показ версії вашого web-сервера. для apache в файлі конфігурації пропишіть:

serverSignature Off

для nginx в файлі конфігурації в секцію http пропишіть:

server_tokens off;

Якщо ви використовуєте php, забороніть небезпечні функції через php.ini:

expose_php = Off

- заборонить показ версії php

disable_functions = exec, passthru, shell_exec, system, proc_open, popen

- заборонить використання даних функцій

Так само налаштуйте ліміти по виконанню скриптів і їх розмір, це убезпечить вас від дрібних атак.

Встановіть на свій сайт і пошту SSL сертифікат, щоб з'єднання в браузері і при відправці пошти, шифрувати. Можна скористатися безкоштовним сертифікатом від Let's Encrypt, або придбати недорогий платний сертифікат.

Захист фізичного сервера

Якщо на вашому сервері є консоль для віддаленого доступу ILO/IPMI/ BMC, закрийте доступ до неї із зовні, залиште тільки ваш довірений IP, це дозволить обмежити себе від зайвих проблем.

Якщо ваш фізичний сервер розміщується поза офісом / будинку, закрийте BIOS / UEFI паролем.

І головний момент, розміщуйте свої сервера у перевірених провайдерів.

Створення резервних копій сервера Linux

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