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

В этой статье мы рассмотрим основные концепции и конкретные настройки, которые помогут повысить защищенность вашего CentOS сервера в Интернете. Использование данных подходов позволит повысить защиту сервера от взлома и заражения. Инструкция в большей части универсальна и основные моменты подойдут для повышения безопасности любого 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

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._x000D_Enter file in which to save the key (/root/.ssh/id_rsa):_x000D_Enter passphrase (empty for no passphrase):_x000D_Enter same passphrase again:_x000D_Your identification has been saved in /root/.ssh/id_rsa._x000D_ Your public key has been saved in /root/.ssh/id_rsa.pub._x000D_The key fingerprint is:_x000D_SHA256:ffIDjWIfOgMZmOVbQmDWaOCADK4G3cYYy0dTIjqLkD8 [email protected]_x000D_The key's randomart image is:_x000D_+---[RSA 2048]----+_x000D_|* +.B=+ |_x000D_|oO @oO. |_x000D_|*.*.B + . |_x000D_|=+ o * . o |_x000D_|+.E + S * o |_x000D_|. . o + * |_x000D_| + . o |_x000D_| o . |_x000D_| |_x000D_+----[SHA256]-----+_x000D_

генерация ключей для 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_x000D_PasswordAuthentication no_x000D_ChallengeResponseAuthentication no_x000D_UsePAM no_x000D_AuthenticationMethods publickey_x000D_PubkeyAuthentication yes_x000D_

Смените стандартный порт для 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_x000D_Password expires : never_x000D_Password inactive : never_x000D_Account expires : never_x000D_Minimum number of days between password change : 0_x000D_Maximum number of days between password change : 99999_x000D_Number of days of warning before password expires : 7_x000D_

Чтобы изменить срок действия пароля (например 9 дней), воспользуйтесь командой:

chage -M 9 root

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

# chage -l root

Last password change : never_x000D_Password expires : never_x000D_Password inactive : never_x000D_Account expires : never_x000D_Minimum number of days between password change : 0_x000D_Maximum number of days between password change : 9_x000D_Number of days of warning before password expires : 7_x000D_

Больше опций по утилите 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]_x000D_ignoreip = 127.0.0.1/24_x000D_[ssh-iptables]_x000D_enabled = true_x000D_port = ssh_x000D_filter = sshd_x000D_action = iptables[name=sshd, port=ssh, protocol=tcp]_x000D_logpath = /var/log/secure_x000D_

После чего сохраните файл и перезапустите сервис fail2ban :

systemctl restart fail2ban

Таким образом, мы настроили блокировку пользователей для ssh:

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

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_x000D_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

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

EnglishRussianUkrainian