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