Главная >> Безопасность >> Безопасность сервера Linux

Безопасность сервера Linux

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

Если это домашний компьютер, то про безопасность, возможно, и нет смысла беспокоиться настолько сильно, достаточно будет надежных паролей и закрытия доступа к портам из сети интернет. Но в случае публичного сервера стоит обратить внимание на обеспечение его защиты. Эта инструкция подойдет для любого дистрибутива, неважно, что вы используете CentOS, Fedora, Red Hat Enterprise Linux или Ubuntu и Debian.


Содержание статьи

Настройка безопасности сервера Linux

1. Обновления системы

Несмотря на простоту этого пункта, он один из самых важных. В программном обеспечении постоянно находят и исправляют различные уязвимости. Если вы хотите чтобы ваш сервер был в безопасности, держите всё программное обеспечение в актуальном состоянии. Возьмите за правило время от времени проводить обновление системы. В Ubuntu или Debian для обновления надо выполнить:

sudo apt update

sudo apt full-update

В Fedora или CentOS надо использовать пакетный менеджер dnf:

sudo dnf update

2. Не используйте незащищённые сервисы

В большинстве сетей имена пользователей, пароли от FTP, Telnet, RSH команд могут быть перехвачены кем-либо из той же самой сети с помощью анализатора пакетов. Общее решение этой проблемы заключается в использовании OpenSSH или SFTP, который добавляет SSL или TLS к обычному FTP. Для подключения к серверу удалённо можно использовать ssh, а для передачи файлов либо SSH либо SFTP.

3. Минимум программ и открытых портов

Чем меньше портов на вашем сервере доступно из сети, тем безопаснее и тем меньше вероятность, что в какой-нибудь программе обнаружится уязвимость и вас взломают. Вы можете проверить какие сейчас порты открыты на вашем сервере:

sudo nmap -sT адрес_сервера

Например, для losst.pro:

Вы можете узнать PID процесса, который использует порт с помощью команды ss:

sudo ss -lptn 'sport = :53'

Информацию о процессе по его PID вы можете узнать с помощью команды ps. Например:

ps -p 2756

Используйте свой пакетный менеджер чтобы посмотреть установленные программы и удалить все ненужные. Например, для Debian:

yum list installed
yum list пакет
yum remove пакет

Или для Ubuntu:

dpkg --list
dpkg --info пакет
apt remove пакет

4. SELinux или Apparmor

Операционная система Linux поставляется с различными патчами безопасности, которые могут быть использованы для защиты от неправильной конфигурации или вредоносных программ. Вы можете использовать также такие дополнительные системы контроля доступа для приложений как SELinux или AppArrmor.

SELinux предоставляет различные политики безопасности для ядра Linux. Эта надстройка позволяет контролировать доступ процессов к файлам в файловой системе. К тому или иному ресурсу может получить доступ только программа, роль которой позволяет это делать и даже права суперпользователя не имеют значения. SELinux намного увеличивает безопасность системы Linux, поскольку даже root здесь считается обычным пользователем. Подробнее о настройке SELinux описано в отдельной статье.

Система AppArmor используется в Ubuntu, она работает похожим образом на SELinux. Здесь для каждого приложения создаются профили, в которых описано к каким файлам приложение может получить доступ, а ко всему остальному у него доступа не будет. Подробнее про AppArrmor читайте здесь.

5. Учетные записи пользователей

Не используйте пользователя root для администрирования сервера. Создайте для этого не привилегированного пользователя с помощью команд useradd и usermod/ Убедитесь, что у вас хороший и сильный пароль, он должен содержать, по крайней мере, восемь символов, желательно в разном регистре, среди которых должны встречаться специальные символы или цифры. Например, 8 символов, из которых семь буквы и один символ или цифра. Для генерации паролей можно воспользоваться утилитой pwgen или любой другой утилитой из этой статьи.

6. Регулярная смена пароля

Команда change позволяет указать количество дней до даты принудительной смены пароля. Эта информация используется системой для определения момента, когда пользователь должен его изменить. Эти настройки находятся в /etc/login.defs. Чтобы отключить старение пароля введите следующую команду:

change -l имя_пользователя

Чтобы получить информацию о строке годности пароля введите команду:

Также вы можете все настроить вручную, в файле /etc/shadow:

{пользователь}:{пароль}:{последнее_изменение}:{максимум_дней}:{минимум_дней}:{Предупреждение}:{деактивировать}:{строк_годности}:

  • Минимум дней - минимальный интервал между сменами паролей, то есть насколько часто пользователь может менять пароль.
  • Максимум дней - сколько дней будет годен пароль, по истечении этого срока пользователь будет вынужден поменять пароль.
  • Предупреждение - количество дней после которых пользователь будет предупрежден, что ему нужно сменить пароль.
  • Строк_годности - количество дней с первого января 1970 когда аккаунт будет полностью отключен.

Рекомендуется использовать такую команду, вместо редактирования файла /etc/shadow вручную:

chage -M 60 -m 7 -W 7 имя_пользователя

Также желательно запретить пользователям использовать старые пароли, иначе все старания с попытками заставить их принудительно менять пароли будут сведены к нулю.

7. Использование fail2ban

В операционной системе Linux вы можете использовать команду faillog, чтобы посмотреть неудачные попытки входа пользователей. Также с помощью нее вы можете установить лимит неудачных попыток входа. Вся информация о неудачных попытках входа хранится в файле /var/log/faillog или /var/log/secure. Чтобы ее посмотреть наберите:

faillog

Или:

cat /var/log/secure

Сервис fail2ban позволяет блокировать IP адреса после нескольких неудачных попыток авторизации по SSH, FTP, HTTP или в других сервисах Linux. Можно даже настроить блокировку для неудачных попыток входа в WordPress. Это может обезопасить вашу систему от попыток перебора пароля. Подробнее про fail2ban читайте тут.

8. Отключение входа для суперпользователя

На одном из предыдущих шагов вы создали непривилегированного пользователя, его и следует использовать для авторизации на сервере по SSH, а вход от имени Root пользователя следует отключить. Для этого в конфигурационном файле /etc/sshd_config надо изменить значение строчки PermitRootLogin с Yes на No:

sudo vi /etc/sshd_config

9. Настройка брандмауэра

Используйте брандмауэр. Он позволяет закрыть доступ к портам, которые не должны быть видны из сети, а также отфильтровать нежелательный трафик. Разрешите в брандмауэре только нужные порты, а остальные пусть будут закрытыми. Про настройку iptables можно почитать в статье iptables для чайников. А ещё есть ufw и firewalld.

10. Настройка ядра

В файле /etc/sysctl.conf хранятся настройки ядра, которые загружаются и применяются во время запуска системы. Чтобы включить защиту от переполнения буфера execshield, добавьте:

kernel.exec-shield=1
kernel.randomize_va_space=1

Включить защиту от подделывания IP:

net.ipv4.conf.all.rp_filter=1

Отключить перенаправление IP адресов:

net.ipv4.conf.all.accept_source_route=0

Игнорировать широковещательные запросы:

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

Логгировать все подделанные пакеты:

net.ipv4.conf.all.log_martians = 1

11. Разбивка диска на разделы

Разделение жесткого диска на разделы в зависимости от назначения файлов улучшает безопасность ОС Linux. Рекомендуется делать отдельные разделы для таких директорий:

  • /usr
  • /home
  • /var и /var/tmp
  • /tmp

Сделайте отдельные разделы для корневых директорий Apache и FTP серверов. Откройте файл /etc/fstab и выставьте специальные опции для нужных разделов:

  • noexec - не выполнять любые программы или исполняемые файлы на этом разделе, разрешены только скрипты
  • nodev - не разрешать символические или специальные устройства на этом разделе.
  • nosuid - не разрешать SUID / SGID доступ для программ из этого раздела.

12. Отключение IPv6

Протокол интернета нового поколения IPv6 в будущем заменит уже используемый IPv4. Но на данный момент нет инструментов, позволяющих проверить безопасность сети на основе IPv6. Многие дистрибутивы Linux разрешают использование протокола IPv6 по умолчанию. Хакеры могут отправлять нежелательный трафик и администраторы не смогут его отследить. Так что если эта служба вам не нужна отключите её. Про отключение IPv6 в Ubuntu написано здесь.

13. Программы с SUID и SGID битами

Все исполняемые файлы, для которых включен флаг SUID или SGID потенциально опасны. Этот флаг означает, что программа будет выполняться с правами суперпользователя. А это значит, что если в программе есть какая-нибудь уязвимость или баг, то локальный или удаленный пользователь сможет использовать этот файл для атаки на систему. Найдите все файлы с SUID битом с помощью следующей команды:

find / -perm +4000

Затем файлы с установленным SGID битом:

find / -perm +2000

Или можно скомбинировать всё это в одной команде:

find / \( -perm -4000 -o -perm -2000 \) -print

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

14. Общедоступные файлы

Также желательно найти файлы, которые могут изменять все пользователи в системе. Для этого используйте такую команду:

find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print

Теперь вам нужно проверить правильно ли выставлены права для группы и владельца этого каждого файла и не несет ли это угрозы безопасности.

Также желательно найти все файлы не принадлежащие никому:

find / -xdev \( -nouser -o -nogroup \) -print

15. Логирование и аудит

Настройте логгирование и аудит для сбора и сохранения всех неудачных попыток входа и попыток взлома. По умолчанию все логи или, по крайней мере, большинство из них находятся в папке /var/log/. Подробнее, о том, за что отвечают определенные лог файлы мы говорили в отдельной статье.

Вы можете смотреть логи с помощью таких утилит, как logwatch или logcheck. Они очень сильно упрощают чтение логов. Вы можете просматривать не весь файл, а только интересующие вас события, а также отправлять себе уведомление на электронный адрес.

Наблюдайте за системой с помощью службы auditd. Программа записывает на диск все события аудита которые вас интересуют. Все настройки аудита хранятся в файле /etc/audit.rules при запуске системы сервис прочитывает все правила из этого файла. Вы можете его открыть и настроить все как нужно или же воспользоваться отдельной утилитой - auditctl. Можно настроить такие моменты:

  • События запуска и выключения системы
  • Дата и время события
  • Пользовательские события (например доступ к определенному файлу)
  • Тип события (редактирование, доступ, удаление, запись, обновление и т д)
  • Удачность или сбой при выполнении события
  • Запись событий изменения настроек сети
  • Запись изменения пользователей и групп
  • Мониторинг изменений файлов

16. Настройка SSH сервера

OpenSSH рекомендуется использовать для удаленного доступа к компьютеру и защищенной передачи данных. Но в то же время сервер подвержен многим атакам. Например, даже перебор пароля.

Поэтому рекомендуется отключить использование протокола SSH1, в пользу более защищенного SSH2. Все настройки сервера ssh находятся в файле /etc/ssh/sshd_config. Разрешите только использование протокола 2:

Protocol 2

Выше я предлагал запретить вход от имени суперпользователя и использовать для администрирование сервера пользователя с обычными привилегиями и утилиту sudo. Но ещё лучше будет, если вы настроите авторизацию по ключу и отключите полностью авторизацию по паролю. Для этого после настройки авторизации по ключу найдите в /etc/ssh/sshd_config такие строки и приведите их к такому виду:

PasswordAuthentication no
UsePAM no
ChallengeResponseAuthentication no

Также рекомендуется сменить порт ssh на случайный чтобы боты, которые автоматически пытаются перебрать пароль не могли этого сделать.

17. Установка IDS

IDS или система обнаружения вторжений пытается обнаружить подозрительную, вредоносную активность, такую как атака DOS,  сканирование портов или даже попытки взломать компьютер путем мониторинга сетевого трафика.

Хорошая практика - развернуть подобное программное обеспечение, перед тем как система станет доступной из интернета. Вы можете установить AIDE, это HIDS (Host based IDS) которая может контролировать все аспекты внутреннего устройства вашей системы.

Snort - это программное обеспечение для обнаружения попыток вторжения из сети. Она способна выполнять анализ и журналирование пакетов и анализировать сетевой трафик в реальном времени.

Выводы

Теперь безопасность ос linux на вашем компьютере будет намного увеличена. Не забывайте ставить сложные пароли и время от времени проверять систему на руткиты. Напишите в комментариях свой любимый инструмент для обеспечения безопасности системы.

9 комментариев к “Безопасность сервера Linux”

  1. Хорошая статья. Напишите пожалуйста статью про безопасность Linux на домашнем ПК. Я часто пользуюсь торрент трекерами, в основном для скачивания фильмов и сериалов. Качаю со строго определенных трекеров, проверенных годами сидения под виндой, в общем пара тройка трекеров которым я доверяю хотелось бы сохранить эту возможность=)

    Ответить
  2. Ой холиварная статья то! :))

    1. Обновления системы: spacewalk в руки, удобное дело. Накатывать вручную печально, ставить на автообновление - есть шанс проснуться от матюгов мониторинга, так как какой-то сервис может потребовать дополнительных настроек и просто не запустится.
    2. Открытые порты lsof -Pni | grep LISTEN и это уже немало покажет.Смысла нет самого себя сканировать.
    3. Регулярная смена пароля: даже майки от этого отказались. Если нормальный пасс - он будет жить долго и счастливо. Если ломанут - сервис будут использовать сразу и никто не станет ждать ..дцать дней чтобы снова зайти.
    4. fail2ban - шикарен на серверах, наличие которого не сильно важно самому владельцу. Он или будет работать совсем слабо или будет слишком активен и, в итоге, будет больше мешать, чем спасать. Про переполнение буфера в iptables молчу, на эти грабли и крупный игрок IT сферы уже натыкался при мне дважды.
    5. Отключение входа root - зачем? Чтобы потом заходить пользователем и сразу sudo su - ? Ограничить ключами и только с нужных хостов/сетей (hosts.allow и hosts.deny прекрасно работают в этом плане)
    6. Про настройки ядра - тут надо смотреть на роли серверов.
    7. Отключение ipv6 - вот это вообще странно. Доля трафика на 6 версии растёт и на своих машинках давно уже вижу что за 20-30 процентов заваливает. А если где-то используются пиринговый технологии, то там и вообще под 80. Лучше научится пользоваться, чем бездумно отключать.

    По хорошему, лучше каждый пункт разобрать и решить, где использовать, где нет, а где сделать с точностью до наоборот. 🙂 И немаловажно: научится использовать хотя бы Ansible+Git. Если на прод-машинки человек заходит по SSH, значит он уже как убегающий шпион - уже проиграл.

    Ответить
    • Добрый день. Поясните эту фразу:
      "Если на прод-машинки человек заходит по SSH, значит он уже как убегающий шпион - уже проиграл."
      Как более безопасно или кошерно заходить на сервер?
      Ведь энсимбл не для входа используется а для автоматизации разворота сервера

      Ответить
  3. Строк_годности ==> Срок_годности

    Минимум дней - минимальный интервал между сменами паролей, то есть насколько часто пользователь может менять пароль.
    Максимум дней - сколько дней будет годен пароль, по истечении этого срока пользователь будет вынужден поменять пароль.
    Предупреждение - количество дней после которых пользователь будет предупрежден, что ему нужно сменить пароль.
    Строк_годности - количество дней с первого января 1970 когда аккаунт будет полностью отключен.

    Ответить

Оставьте комментарий