На ежегодной конференции LinuxCon в 2015 году создатель ядра GNU/Linux Линус Торвальдс поделился своим мнением по поводу безопасности системы. Он подчеркнул необходимость смягчения эффекта от наличия тех или иных багов грамотной защитой, чтобы при нарушении работы одного компонента следующий слой перекрывал проблему.

В этом материале мы постараемся раскрыть эту тему с практической точки зрения:



/ фото Dave Allen CC

  • начнём с предварительной настройки и рекомендаций по выбору и установке дистрибутивов Linux;
  • затем расскажем о простом и действенном пункте защиты — обновлении системы безопасности;
  • далее рассмотрим, как настроить ограничения для программ и пользователей;
  • как обезопасить соединение с сервером через SSH;
  • приведём примеры настройки firewall и ограничения нежелательного трафика;
  • в заключительной части объясним, как отключить ненужные программы и сервисы, как дополнительно оградить серверы от злоумышленников.

1. Настроить среду предзагрузки до установки Linux


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

  • Загрузка в режиме UEFI (не legacy BIOS – о нем подраздел ниже)
  • Установить пароль на настройку UEFI
  • Активировать режим SecureBoot
  • Установить пароль на уровне UEFI для загрузки системы

2. Выбрать подходящий дистрибутив Linux


Скорее всего, вы выберете популярные дистрибутивы — Fedora, Ubuntu, Arch, Debian, или другие близкие ответвления. В любом случае, вам нужно учитывать обязательное наличие этих функций:

  • Поддержка принудительного (MAC) и ролевого контроля доступа (RBAC): SELinux/AppArmor/GrSecurity
  • Публикация бюллетеней безопасности
  • Регулярный выпуск обновлений безопасности
  • Криптографическая верификация пакетов
  • Поддержка UEFI и SecureBoot
  • Поддержка полного нативного шифрования диска

Рекомендации по установке дистрибутивов

Все дистрибутивы отличаются, но существуют моменты, на которые обязательно стоит обратить внимание и выполнить:

  • Использовать полное шифрование диска (LUKS) с надёжной ключевой фразой
  • Процесс подкачки страниц должен быть зашифрован
  • Установить пароль для редактирования boot-загрузчика
  • Надёжный пароль на root-доступ
  • Использовать аккаунт без привилегий, относящийся к группе администраторов
  • Установить для пользователя надёжный пароль, отличный от пароля на root

3. Настроить автоматические обновления безопасности


Один из основных способов обеспечить безопасность операционной системы — обновлять программное обеспечение. Обновления часто исправляют найденные баги и критические уязвимости.

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

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

  • В Debian/Ubuntu для обновлений используется пакет unattended upgrades
  • В CentOS для автообновления используется yum-cron
  • В Fedora для этих целей есть dnf-automatic

Для обновления используйте любой из доступных RPM-менеджеров пакетов командами:

yum update

или

apt-get update && apt-get upgrade

Linux можно настроить на отправку оповещений о новых обновлениях по электронной почте.

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

SELinux — это гибкая система принудительного контроля доступа, которая может работать одновременно с избирательной системой контроля доступа. Запущенные программы получают права на доступ к файлам, сокетам и прочим процессам, и SELinux устанавливает ограничения так, чтобы вредные приложения не смогли сломать систему.

4. Ограничить доступ к внешним системам


Следующий после обновления способ защиты — ограничить доступ к внешним сервисам. Для этого нужно отредактировать файлы /etc/hosts.allow и /etc/hosts.deny.

Вот пример того, как ограничить доступ к telnet и ftp:

В файле /etc/hosts.allow:

hosts.allow

in.telnetd: 123.12.41., 126.27.18., .mydomain.name, .another.name
in.ftpd: 123.12.41., 126.27.18., .mydomain.name, .another.name

Пример сверху позволит выполнять telnet и ftp соединения любому хосту в IP-классах 123.12.41.* и 126.27.18.*, а также хосту с доменами mydomain.name и another.name.

Далее в файле /etc/hosts.deny':

hosts.deny
in.telnetd: ALL
in.ftpd: ALL

Добавление пользователя с ограниченными правами

Мы не рекомендуем подключаться к серверу от имени пользователя root — он имеет права на выполнение любых команд, даже критических для системы. Поэтому лучше создать пользователя с ограниченными правами и работать через него. Администрирование можно выполнять через sudo (substitute user and do) — это временное повышение прав до уровня администратора.

Как создать нового пользователя:

В Debian и Ubuntu:

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

adduser administrator

Добавьте пользователя в группу sudo:

adduser administrator sudo

Теперь вы можете использовать префикс sudo при выполнении команд, требующих прав администратора, например:

sudo apt-get install htop

В CentOS и Fedora:

Создайте пользователя, заменив administrator на желаемое имя, и создайте пароль для его аккаунта:

useradd adminstrator && passwd administrator

Добавьте пользователя в группу wheel для передачи ему прав sudo:

usermod –aG wheel administrator

Используйте только сильные пароли — минимум из 8 букв разного регистра, цифр и других специальных знаков. Для поиска слабых паролей среди пользователей вашего сервера используйте утилиты как «John the ripper», измените настройки в файле pam_cracklib.so, чтобы пароли устанавливались принудительно.

Установите период устаревания паролей командой chage:

chage -M 60 -m 7 -W 7 ИмяПользователя

Отключить устаревание паролей можно командой:

chage -M 99999 ИмяПользователя

Узнать, когда пароль пользователя устареет:

chage -l ИмяПользователя

Также вы можете отредактировать поля в файле /etc/shadow:

{ИмяПользователя}:{password}:{lastpasswdchanged}:{Minimum_days}:{Maximum_days}:{Warn}:{Inactive}:{Expire}:

где,

  • Minimum_days: Минимальное количество дней до истечения действия пароля.
  • Maximum_days: Максимальное количество дней до истечения пароля.
  • Warn: Количество дней перед истечением, когда пользователь будет предупреждён о приближающемся дне смены.
  • Expire: Точная дата истечения действия логина.

Также стоит ограничить переиспользование старых паролей в модуле pam_unix.so и установить предельное количество неудачных попыток входа пользователя.

Чтобы узнать количество неудачных попыток входа:

faillog

Разблокировать аккаунт после неудачного входа:

faillog -r -u ИмяПользователя

Для блокирования и разблокирования аккаунтов можно использовать команду passwd:

lock account
passwd -l ИмяПользователя

unlocak account
passwd -u ИмяПользователя

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

awk -F: '($2 == "") {print}' /etc/shadow

Заблокировать пользователей без паролей:

passwd -l ИмяПользователя

Проследите, чтобы параметр UID был установлен на 0 только для root-аккаунта. Введите эту команду, чтобы посмотреть всех пользователей с равному 0 UID.

awk -F: '($3 == "0") {print}' /etc/passwd

Вы должны увидеть только:

root:x:0:0:root:/root:/bin/bash

Если появятся и другие строки, то проверьте, устанавливали ли вы для них UID на 0, ненужные строки удалите.

5. Настроить права доступа для пользователей


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

Категории доступа

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

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

cat /etc/passwd

Файл /etc/passwd содержит строку для каждого пользователя операционной системы. Под сервисы и приложения могут создаваться отдельные пользователи, которые также будут присутствовать в этом файле.

Помимо отдельных аккаунтов существует категория доступа для групп. Каждый файл принадлежит одной группе. Один пользователь может принадлежать к нескольким группам.

Посмотреть группы, к которым принадлежит ваш аккаунт, можно командой:

groups

Вывести список всех групп в системе, где первое поле означает название группы:

cat /etc/group

Существует категория доступа «прочие», если пользователь не имеет доступа к файлу и не принадлежит к группа.

Типы доступа

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

В алфавитной нотации разрешения отмечены буквами:

r = чтение
w = изменение
x = запуск

В восьмеричной нотации уровень доступа к файлам определяется числами от 0 до 7, где 0 означает отсутствие доступа, а 7 означает полный доступ на изменение, чтение и выполнение:

4 = чтение
2 = изменение
1 = запуск

6. Использовать ключи для соединения по SSH


Для подключения к хосту по SSH обычно используется аутентификация по паролю. Мы рекомендуем более безопасный способ —  вход по паре криптографических ключей. В таком случае закрытый ключ используется вместо пароля, что серьёзно усложнит подбор грубой силой (brute-force).

Для примера создадим пару ключей. Действия нужно выполнять на локальном компьютере, а не на удалённом сервере. В процессе создания ключей вы можете указать пароль для доступа к ним. Если оставите это поле пустым, то не сможете использовать созданные ключи до сохранения их в keychain-менеджер компьютера.

Если вы уже создавали RSA ключи ранее, то пропустите команду генерации. Для проверки cуществующих ключей запустите:

ls ~/.ssh/id_rsa*

Для генерации новых ключей:

ssh-keygen –b 4096

Загрузка публичного ключа на сервер

Замените administrator на имя владельца ключа, а 1.1.1.1 на ip-адрес вашего сервера. С локального компьютера введите:

ssh-copy-id administrator@1.1.1.1

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

Настройка SSH

Вы можете запретить подключаться через SSH от имени root-пользователя, а для получения прав администратора использовать sudo в начале команды. На сервере в файле /etc/ssh/sshd_config нужно найти параметр PermitRootLogin и установить его значение на no.

Вы также можете запретить SSH-подключение по вводу пароля, чтобы все пользователи использовали ключи. В файле /etc/ssh/sshd_config укажите для параметра PasswordAuthentification значение no. Если этой строки нет или она закомментирована, то соответственно добавьте или разкомментируйте её.

В Debian или Ubuntu можно ввести:

nano /etc/ssh/sshd_config

...
PasswordAuthentication no

Подключение можно также дополнительно обезопасить с помощью двухфакторной аутентификации.

7. Установить сетевые экраны


Недавно была обнаружена новая уязвимость, позволяющая проводить DDoS-атаки на сервера под управлением Linux. Баг в ядре системы появился с версии 3.6 в конце 2012 года. Уязвимость даёт возможность хакерам внедрять вирусы в файлы загрузки, веб-страницы и раскрывать Tor-соединения, причём для взлома не нужно прилагать много усилий — сработает метод IP-спуфинга.

Максимум вреда для зашифрованных соединений HTTPS или SSH — прерывание соединения, а вот в незащищённый трафик злоумышленник может поместить новое содержимое, в том числе вредоносные программы. Для защиты от подобных атак подойдёт firewall.

Блокировать доступ с помощью Firewall

Firewall — это один из самых важных инструментов блокирования нежелательного входящего трафика. Мы рекомендуем пропускать только действительно нужный трафик и полностью запретить весь остальной.

Для фильтрации пакетов в большинстве дистрибутивов Linux есть контроллер iptables. Обычно им пользуются опытные пользователи, а для упрощённой настройки можно использовать утилиты UFW в Debian/Ubuntu или FirewallD в Fedora.

8. Отключить ненужные сервисы


Специалисты из Университета Виргинии рекомендуют отключить все сервисы, которые вы не используете. Некоторые фоновые процессы установлены на автозагрузку и работают до отключения системы. Для настройки этих программ нужно проверить скрипты инициализации. Запуск сервисов может осуществляться через inetd или xinetd.

Если ваша система настроена через inetd, то в файле /etc/inetd.conf вы сможете отредактировать список фоновых программ «демонов», для отключения загрузки сервиса достаточно поставить в начале строки знак «#», превратив её из исполняемой в комментарий.

Если система использует xinetd, то её конфигурация будет в директории /etc/xinetd.d. Каждый файл директории определяет сервис, который можно отключить, указав пункт disable = yes, как в этом примере:

service finger
{
  socket_type     = stream
  wait            = no
  user            = nobody
  server          = /usr/sbin/in.fingerd
  disable         = yes
}

Также стоит проверить постоянные процессы, которые не управляются inetd или xinetd. Настроить скрипты запуска можно в директориях /etc/init.d или /etc/inittab. После проделанных изменений запустите команду под root-аккаунтом.

/etc/rc.d/init.d/inet restart

9. Защитить сервер физически


Невозможно полностью защититься от атак злоумышленника с физическим доступом к серверу. Поэтому необходимо обезопасить помещение, где расположена ваша система. Дата-центры серьёзно следят за безопасностью, ограничивают доступ к серверам, устанавливают камеры слежения и назначают постоянную охрану.

Для входа в дата-центр все посетители должны проходить определенные этапы аутентификации. Также настоятельно рекомендуется использовать датчики движения во всех помещениях центра.

10. Защитить сервер от неавторизованного доступа


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

Например, инструменты Tripwire и Aide собирают базу данных о системных файлах и защищают их с помощью набора ключей. Psad используется для отслеживания подозрительной активности с помощью отчётов firewall.

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

Заключение


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

О чем еще мы пишем:

Поделиться с друзьями
-->

Комментарии (16)


  1. samsivan
    12.09.2016 10:40

    Спасибо за пост. Как новичку в Линуксе мне советы довольно актуальны — хотя наверное более продвинутые пользователи все это и так знают.


    1. facha
      12.09.2016 15:38

      Некоторые моменты очень устарели. В наши дни мало кому доводится порулить машиной с inetd, telnetd или fingerd.


  1. 3om6ak
    12.09.2016 12:07

    Если вводить 100500 паролей при загрузках/расшифровках — пользоваться такой системой будет малоприятно…


  1. andvgal
    12.09.2016 13:18
    +4

    hosts.allow
    in.telnetd: 123.12.41., 126.27.18., .mydomain.name, .another.name
    in.ftpd: 123.12.41., 126.27.18., .mydomain.name, .another.name

    2016 года, это уже за гранью добра и зла… Вы ссылаетесь на документ, который ещё был написан на SGML. SGML, Карл!


  1. CrzyDocTI
    12.09.2016 14:27

    «малоприятно» — не то слово, захотел к примеру поставить MQ manager, а он на каждое сообщение шифрует/дешифрует диск. Сообщений допустим по 30к/мин — это уже невозможно. Единственно действующую защиту на практике — видел только контроль доступа.


  1. white_wyrm
    13.09.2016 12:54

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

    Кстати, желающие дальнейшего повышения градуса паранойи могут почитать про Cold Boot Attack и подумать, как мы можем защитить от нее наш бедный Линукс-сервер с hosts.allow. Поскольку биос закрыт паролем, атака будет осуществляться вскрытием корпуса, охлаждением памяти и втыканием ее в устройство злоумышленника.


    1. marlikalmighty
      14.09.2016 11:51

      И что вам это даст, если диск пошифрован?


      1. white_wyrm
        14.09.2016 13:05

        Ключ для подмонтированного шифрованного диска находится в памяти. Я не буду утверждать, что получение его абсолютно элементарно, но при внезапном отключении питания (без размонтирования дисков и очистки памяти) вполне технически выполнимо.


        1. pwrlnd
          16.09.2016 06:32

          А если сервер виртуальный, то дамп памяти снять — дело пары команд. Если нужно иметь контроль над данными, то физический контроль над сервером обязателен.


    1. amagic
      16.09.2016 10:10

      Несколько вопросов, если позволите:
      «Поскольку биос закрыт паролем...» неужели в сфере линукс были существенные проблемы с дырявостью BIOS?? Если да, то почему древнюю технологию UEFI внедрили только 10-15 лет спустя с момента ее изобретения??? И как много было прецедентов взлома систем?? Неужели падучая файловая система FAT32 добавляет безопасности серьезным серверным решениям?


  1. mikkisse
    14.09.2016 06:45

    Еще я бы настоятельно советовал:
    1. Устанавливать сервер в минимальной конфигурации и уже потом доставлять только то, что необходимо;
    2. Изменять порт SSH;
    3. Использовать только официальные репозитории с подписанными пакетами;
    4. Никогда (НИКОГДА) не отключать SElinux, а научиться с ним дружить;
    5. Читать системные логи и логи безопасности, настроить уведомления по определенным событиям.


  1. romeo_82
    14.09.2016 11:55

    Подскажите, а как настроить автообновления только безопасности?


    1. TrogWarZ
      16.09.2016 10:11

      В случае с ubuntu –> crontab + unattended-packages (подробнее: https://help.ubuntu.com/community/AutomaticSecurityUpdates )


  1. GhOsT_MZ
    14.09.2016 11:55
    +1

    А в чем смысл статьи? Упомянули простейшие способы «защиты», более того, среди упомянутого — мамонты в виде inetd. Да, вспомнили вскользь о SELinux, не сказав ни слова о том, как им пользоваться.


    1. AlexandrRS
      14.09.2016 12:44

      Интересно, что практический к каждой статье есть такой комментарий с некоторыми вариациями и очень редко с конструктивными предложениями. Это я к тому: посоветуйте автору что следует выкинуть, а что добавить. Статья станет лучше.


      1. GhOsT_MZ
        15.09.2016 20:47

        Хм, согласен, разумно.
        На мой взгляд стоило бы убрать упоминание о софте, который уже практически не используется. А вот добавить бы стоило много чего.
        Раз уж заговорили о фаерволе, то стоило дать рекомендации по его настройкам, как минимум поверхностные, например, предложить несколько схем его настройки («разрешить все кроме» и «запретить все кроме»), рассказать о разнице между ними и привести примеры настройки фаервола хотя бы для одного из популярных дистрибутивов. Вот такая информация могла бы помочь начинающим администраторам, и могла бы быть отправной точкой в настройке.
        Далее, был упомянут SELinux, по нему тоже стоило более расширенно написать, начать банально с того, как его включить/выключить, заканчивая тем, как им пользоваться. Понятное дело, SELinux — тема не на одну статью, но можно было бы дать базовую информацию по этому ПО.

        А вообще, статья больше похожа на заметку из серии «надо не забыть при настройке очередного сервера». В идеале сделать бы из нее некий каталог ссылок на статьи, которые более глубоко описывают каждый раздел. ИМХО, в таком варианте она имела бы большую ценность.