Повышение безопасности и защиты сервера Linux/CentOS в Интернете

Повышение безопасности и защиты сервера Linux/CentOS в Интернете

В этой статье мы рассмотрим основные концепции и конкретные настройки, которые помогут повысить защищенность вашего CentOS сервера в Интернете. Использование данных подходов позволит повысить защиту сервера от взлома и заражения. Инструкция в большей части универсальна и основные моменты подойдут для повышения безопасности любого Linux сервера.

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

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

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

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

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

Данные параметры могут быть установлены на директорию, только если она существует как отдельный раздел. Вы можете настроить /etc/fstab согласно следующим рекомендациям, если таковые разделы на диске у вас существуют:

  • /home — смонтировать с опциями nodev, nosuid, usrquota (включение квоты);
  • /boot – смонтировать с опциями nodev, nosuid, noexeс — данный раздел требуется для загрузки системы, запретим что-либо менять в нем;
  • /varnosuid — под 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

linux centos отключение неиспользуемых сервисов

Чтобы отключить и убрать службу из автозагрузки в 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 авторизации

После генерации, вы можете подключиться с помощью данного ключа к серверу, через 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

смена порта ssh в sshd_config

Регулярная смена паролей в 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:

fail2ban блокировка ssh при неправильном пароле

При неправильном вводе пароля, меня заблокировало на 10 минут. Вы можете настроить fail2ban для работы с любым сервисом, который работает с пользователями, например:

Повышение защиты сервера с помощью 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

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

Конечно не стоит забывать о резервном копировании сервера. Вы можете выполнять резервные копии как всего сервера, так и отдельно взятые файлы или директории (можно настроить бэкап в бесплатные облачные хранилища скриптами). В случае какого-либо инцидента, у вас всегда под рукой будет актуальная резервная копия, из которой можно развернуть сервер или заменить конфигурационный файлы.

Linux
Повышение безопасности и защиты сервера Linux/CentOS в Интернете