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