Настройки ядра linux безопасность

Обновлено: 02.07.2024

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

№ 1. Избегайте использования FTP, Telnet и Rlogin/Rsh

В большинстве вариантов конфигурации сетей можно в той же самой сети с помощью сниффера пакетов ( packet sniffer ) перехватывать имена пользователей, пароли, команды FTP/Telnet/RSH и пересылаемые файлы. Общим решением проблемы является использование OpenSSH, SFTP или FTPS (FTP поверх SSL), которые добавляют к FTP либо SSL, либо шифрование TLS. Для того, чтобы удалить NIS, rsh и другие устаревшие сервисы, наберите следующую команду:

№ 2. Минимизируйте количество установленных приложений для минимизации числа уязвимостей

Вам действительно нужны все виды установленных веб-сервисов? Избегайте устанавливать ненужные приложения с тем, чтобы избежать уязвимостей, имеющихся в этих приложениях. Воспользуйтесь менеджером пакетов RPM, таким как as yum, либо apt-get and/or dpkg to review для просмотра всего набора установленных в системе программ. Удалите все ненужные пакеты.

№ 3. Один сетевой сервис на каждую систему или экземпляр виртуальной машины

Запускайте различные сетевые сервисы на отдельных серверах или отдельных экземплярах виртуальной машины. Это снизит количество сервисов, которые могут подвергнуться опасности. Например, если атакующий успешно попадает внутрь сервиса Apache , он также сможет получить доступ ко всему серверу, в том числе и к другим сервисам, таким как MySQL, почтовый сервер и т. п.

№ 4. Поддерживайте ядро Linux и программы в обновлённом состоянии

Применение всех патчей безопасности является важной частью работы по поддержанию сервера Linux. В Linux есть все необходимые средства для поддержания вашей системы всегда в обновлённом состоянии и для легкого перехода к следующим версиям. Все обновления, касающиеся безопасности, должны изучаться и устанавливаться сразу, как для этого появится возможность. Для того, чтобы установить все обновления, касающиеся безопасности, опять воспользуйтесь менеджером пакетов RPM, таким как yum или apt-get и/или dpkg:

Вы можете сконфигурировать Red hat/CentOS/Fedora Linux так, что yum будет посылать вам по e-mail напоминание о том, что есть обновление. Другая возможность – выполнять все обновления, относящиеся к безопасности, как задания для cron. Под Debian/Ubuntu Linux вы можете использовать apticron для отсылки напоминаний, касающихся безопасности.

№ 5: Используйте расширения Linux, повышающие безопасность

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

№ 6. Политика пользовательских паролей и сильные пароли

Используйте команды useradd/usermod для того, чтобы создавать и работать с регистрационными записями пользователей. Удостоверьтесь в том, что вы используете политику применения хороших и сильных паролей. Например, длина хорошего пароля должна быть не менее 8 символов и в нём должны присутствовать прописные и строчные буквы, цифры, специальные символы и т. п. Самое главное – подобрать пароль, который вы можете запомнить. Используйте такие инструментальные средства, как John the ripper для поиска на вашем сервере слабых пользовательских паролей. Используйте pam_cracklib.so для того, чтобы проверять устойчивость пароля против его подбора по словарю.

№ 7. Запретите прямой доступ в систему с правами root

Никогда не входите в систему как пользователь root. Для выполнения команд уровня root, если это потребуется, вам следует пользоваться командой sudo . Команда sudo существенно повышает безопасность системы и не требует раздавать пароль root другим пользователям и администраторам. Команда sudo также предоставляет простые средства для аудита и отслеживания событий.

№ 8. Защитите сервер от физического доступа к нему

Вы должны защитить консоли Linux-серверов от физического доступа к системе. Сконфигурируйте BIOS и запретите загружаться с таких внешних устройств, как DVDs/CDs/USB. Установите пароль BIOS и пароль загрузки grub с тем, чтобы защитить эти настройки. Все системные блоки должны быть сосредоточены в специально отведённом для этого помещении и персонал, прежде чем получить доступ к вашему серверу, должен пройти в службе безопасности определенную проверку.

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

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

Предыстория Linux Security Modules и SELinux

Security Enhanced Linux представляет собой набор правил и механизмов доступа, основанный на моделях мандатного и ролевого доступа, для защиты систем Linux от потенциальных угроз и исправления недостатков Discretionary Access Control (DAC) — традиционной системы безопасности Unix. Проект зародился в недрах Агентства Национальной Безопасности США, непосредственно разработкой занимались, в основном, подрядчики Secure Computing Corporation и MITRE, а также ряд исследовательских лабораторий.


Linux Security Modules

Линус Торвальдс внес ряд замечаний о новых разработках АНБ, с тем, чтобы их можно было включить в основную ветку ядра Linux. Он описал общую среду, с набором перехватчиков для управления операциями с объектами и набором неких защитных полей в структурах данных ядра для хранения соответствующих атрибутов. Затем эта среда может использоваться загружаемыми модулями ядра для реализации любой желаемой модели безопасности. LSM полноценно вошел в ядро Linux v2.6 в 2003 году.

Фреймворк LSM включает защитные поля в структурах данных и вызовы функций перехвата в критических точках кода ядра для управления ими и выполнения контроля доступа. Он также добавляет функции для регистрации модулей безопасности. Интерфейс /sys/kernel/security/lsm содержит список активных модулей в системе. Хуки LSM хранятся в списках, которые вызываются в порядке, указанном в CONFIG_LSM. Подробная документация по хукам включена в заголовочный файл include/linux/lsm_hooks.h.

Подсистема LSM позволила завершить полноценную интеграцию SELinux той же версии стабильного ядра Linux v2.6. Буквально сразу же SELinux стал стандартом де-факто защищенной среды Linux и вошел в состав наиболее популярных дистрибутивов: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Глоссарий SELinux

  • Идентичность — Пользователь SELinux не то же самое, что и привычный Unix/Linux user id, они могут сосуществовать на одной и той же системе, но совершенно различны по сути. Каждая стандартная учетная запись Linux может соответствовать одному или нескольким в SELinux. Идентичность SELinux является составной частью общего контекста безопасности, который определяет в какие домены можно входить, а в какие — нельзя.
  • Домены — В SELinux домен является контекстом выполнения субъекта, т. е. процесса. Домен напрямую определяет доступ, который имеет процесс. Домен — это в основном список того, что могут делать процессы или какие действия процесс может выполнять с разными типами. Некоторые примеры доменов: sysadm_t для системного администрирования, и user_t, который является обычным непривилегированным доменом пользователя. Система инициализации init запускается в домене init_t, а процесс named запускается в домене named_t.
  • Роли — То, что служит посредником между доменами и пользователями SELinux. Роли определяют, в каких доменах может состоять пользователь и к каким типам объектов он сможет получить доступ. Подобный механизм разграничения доступов предотвращает угрозу осуществить атаку повышения привилегий. Роли вписаны в модель безопасности Role Based Access Control (RBAC), используемой в SELinux.
  • Типы — Атрибут списка Type Enforcement, который назначается объекту и определяет, кто получит к нему доступ. Похоже на определение домена, за исключением того, что домен применяется к процессу, а тип применяется к таким объектам, как каталоги, файлы, сокеты и т. д.
  • Субъекты и объекты — Процессы являются субъектами и запускаются в определенном контексте, или домене безопасности. Ресурсы операционной системы: файлы, директории, сокеты и пр., являются объектами, которым ставится в соответствие определенный тип, иначе говоря — уровень секретности.
  • Политики SELinux — Для защиты системы SELinux использует разнообразные политики. Политика SELinux определяет доступ пользователей к ролям, ролей — к доменам и доменов — к типам. В начале пользователь авторизуется для получения роли, далее роль авторизуется для доступа к доменам. Наконец домен может иметь доступ лишь к некоторым типам объектов.

LSM и архитектура SELinux

Несмотря на название LSM в общем-то не являются загружаемыми модулями Linux. Однако также, как и SELinux, он непосредственно интегрирован в ядро. Любое изменение исходного кода LSM требует новой компиляции ядра. Соответствующая опция должна быть включена в настройках ядра, иначе код LSM не будет активирован после загрузки. Но даже в этом случае его можно включить опцией загрузчика ОС.


Стек проверок LSM

LSM оснащен хуками в основных функций ядра, которые могут быть релевантными для проверок. Одна из основных особенностей LSM состоит в том, что они устроены по принципу стека. Таким образом, стандартные проверки по-прежнему выполняются, и каждый слой LSM лишь добавляет дополнительные элементы управления и контроля. Это означает, что запрет невозможно откатить назад. Это показано на рисунке, если результатом рутинных DAC проверок станет отказ, то дело даже не дойдет до хуков LSM.

SELinux перенял архитектуру безопасности Flask исследовательской операционной системы Fluke, в частности принцип наименьших привилегий. Суть этой концепции, как следует из их названия, в предоставлении пользователю или процессу лишь тех прав, которые необходимы для осуществления предполагаемых действий. Данный принцип реализован с помощью принудительной типизации доступа, таким образом контроль допусков в SELinux базируется на модели домен => тип.

Благодаря принудительной типизации доступа SELinux имеет гораздо более значительные возможности по разграничению доступа, нежели традиционная модель DAC, используемая в ОС Unix/Linux. К примеру, можно ограничить номер сетевого порта, который будет случать ftp сервер, разрешить запись и изменения файлов в определенной папке, но не их удаление.

Основные компоненты SELinux таковы:

  • Policy Enforcement Server — Основной механизм организации контроля доступа.
  • БД политик безопасности системы.
  • Взаимодействие с перехватчиком событий LSM.
  • Selinuxfs — Псевдо-ФС, такая же, как /proc и примонтированная в /sys/fs/selinux. Динамически заполняется ядром Linux во время выполнения и содержит файлы, содержащие сведения о статусе SELinux.
  • Access Vector Cache — Вспомогательный механизм повышения производительности.

Все это работает следующим образом.

  1. Некий субъект, в терминах SELinux, выполняет над объектом разрешенное действие после DAC проверки, как показано не верхней картинке. Этот запрос на выполнение операции попадает к перехватчику событий LSM.
  2. Оттуда запрос вместе с контекстом безопасности субъекта и объекта передается на модуль SELinux Abstraction and Hook Logic, ответственный за взаимодействие с LSM.
  3. Инстанцией принятия решения о доступе субъекта к объекту является Policy Enforcement Server и к нему поступают данные от SELinux AnHL.
  4. Для принятия решения о доступе, или запрете Policy Enforcement Server обращается к подсистеме кэширования наиболее используемых правил Access Vector Cache (AVC).
  5. Если решение для соответствующего правила не найден в кэше, то запрос передается дальше в БД политик безопасности.
  6. Результат поиска из БД и AVC возвращается в Policy Enforcement Server.
  7. Если найденная политика согласуется с запрашиваемым действием, то операция разрешается. В противном случае операция запрещается.

Управление настройками SELinux

SELinux работает в одном из трех режимов:

  • Enforcing — Строгое соблюдение политик безопасности.
  • Permissive — Допускается нарушение ограничений, в журнале делается соответствующая пометка.
  • Disabled — Политики безопасности не действуют.


Изменение режима до перезагрузки, например выставить на enforcing, или 1. Параметру permissive соответствует числовой код 0.


Также изменить режим можно правкой файла:

Разница с setenfoce в том, что при загрузке операционный системы режим SELinux будет выставлен в соответствии со значением параметра SELINUX конфигурационного файла. Помимо того, изменения enforcing <=> disabled вступают в силу только через правку файла /etc/selinux/config и после перезагрузки.

Просмотреть краткий статусный отчет:


SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
Для просмотра атрибутов SELinux некоторые штатные утилиты используют параметр -Z.


По сравнению с обычным выводом ls -l тут есть несколько дополнительных полей следующего формата:

Последнее поле обозначает нечто вроде грифа секретности и состоит из комбинации двух элементов:

  • s0 — значимость, также записывают интервалом lowlevel-highlevel
  • c0, c1… c1023 — категория.

Изменение конфигурации доступов

Используйте semodule, чтобы загружать модули SELinux, добавлять и удалять их.


Первая команда semanage login связывает пользователя SELinux с пользователем операционной системы, вторая выводит список. Наконец последняя команда с ключом -r удаляет связку отображение пользователей SELinux на учетные записи ОС. Объяснение синтаксиса значений MLS/MCS Range находится в предыдущем разделе.


Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server

]$ semanage login -d karol

Команда semanage user используется для управления отображений между пользователями и ролями SELinux.

  • -a добавить пользовательскую запись соответствия ролей;
  • -l список соответствия пользователей и ролей;
  • -d удалить пользовательскую запись соответствия ролей;
  • -R список ролей, прикрепленных к пользователю;

Файлы, порты и булевы значения


Первая команда регистрирует новые правила маркировки, а вторая сбрасывает, вернее выставляет, типы файлов в соответствии с текущими правилами.

Аналогично, TCP/UDP порты отмечены таким образом, что лишь соответствующие сервисы могут их прослушивать. Например, для того, чтобы веб-сервер мог прослушивать порт 8080, нужно выполнить команду.


Значительное число модулей SELinux имеют параметры, которые могут принимать булевы значения. Весь список таких параметров можно увидеть с помощью getsebool -a. Изменять булевы значения можно с помощью setsebool.

Практикум, получить доступ к интерфейсу Pgadmin-web

Рассмотрим пример из практики, мы установили на RHEL 7.6 pgadmin4-web для администрирования БД PostgreSQL. Мы прошли небольшой квест с настройкой pg_hba.conf, postgresql.conf и config_local.py, выставили права на папки, установили из pip недостающие модули Python. Все готово, запускаем и получаем 500 Internal Server error.


На этом месте у большинства администраторов Linux возникнет стойкое искушение запустить setenforce 0, да и дело с концом. Признаться, в первый раз я так и сделал. Это конечно тоже выход, но далеко не самый лучший.

Несмотря на громоздкость конструкций SELinux может быть дружественным к пользователю. Достаточно установить пакет setroubleshoot и просмотреть системный журнал.

]$ yum install setroubleshoot
[admin@server

]$ journalctl -b -0
[admin@server

]$ service restart auditd

Обратите внимание на то, что сервис auditd необходимо перезапускать именно так, а не с помощью systemctl, несмотря на наличие systemd в ОС. В системном журнале будет указан не только факт блокировки, но также причина и способ преодоления запрета.

Ядро Linux - очень гибкая вещь, позволяющая настроить очень много параметров. Такие параметры, как поддерживаемые устройства и функции настраиваются при сборке ядра. Но сегодня не будет рассматриваться компиляция ядра Linux. Мы поговорим о более тонкой настройке параметров ядра на лету, прямо во время его работы.

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

Как выполняется настройка?

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

echo "1" > /proc/sys/net/ipv4/ip_forward

Значение 1 будет записано в файл ipv4_forward. Но измененные таким способом параметры не сохраняются после перезагрузки. Перед тем как рассматривать как сохранить параметры ядра linux из proc рассмотрим еще один способ их модификации.

Для работы с параметрами ядра есть утилита sysctl. Она представляет все параметры в виде переменных. Имена этих переменных соответствуют адресу файла в папке /proc/sys только слеш заменен точкой. Например:

Вы можете установить значение параметра такой командой:

Но это изменение тоже не сохранится, чтобы сохранить настройку после перезагрузки нужно добавить опцию -w:

sysctl -w net.ipv4.ip_forward=1

Вы можете также сразу посмотреть все доступные переменные с помощью опции -a:

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

  • /run/sysctl.d/*.conf
  • /etc/sysctl.d/*.conf
  • /usr/local/lib/sysctl.d/*.conf
  • /usr/lib/sysctl.d/*.conf
  • /lib/sysctl.d/*.conf
  • /etc/sysctl.conf

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

* Applying /boot/sysctl.conf-4.1.21-14-default .
kernel.hung_task_timeout_secs = 0
kernel.msgmax = 65536
kernel.msgmnb = 65536
kernel.shmmax = 0xffffffffffffffff
kernel.shmall = 0x0fffffffffffff00
vm.dirty_ratio = 20

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

Настройка ядра Linux

abi.vsyscall32

Если установлено 1, разрешает выполнение 32 битных программ в 64 битной системе. По умолчанию включено, можете отключить, а затем попробовать запустить, например, skype.

debug.exception-trace

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

dev.cdrom.autoclose

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

dev.cdrom.autoeject

CDROM будет открыт после размонтирования содержащегося там диска с помощью команды umount.

dev.hpet.max-user-freq

Максимальная частота генерации прерываний от системного таймера High Precision Event Timer (HPET), который пришел на замену таймеру реального времени RTC. По умолчанию 64.

fs.aio-nr

Количество асинхронных операций ввода и вывода в вашей файловой системе.

fs.file-max

fs.inotify.max_queued_events

Подсистема ядра inotify позволяет следить за изменениями в файловой системе. Этот параметр устанавливает максимальное количество событий, которые могут находиться в очереди, перед тем как их обработает программа.

fs.inotify.max_user_instances

Максимальное количество объектов inotify, которые может создать один пользователь.

fs.inotify.max_user_watches

Максимальное количество файлов и директорий, за которыми может наблюдать один объект inotify.

cad_pid

PID процесса, который получит сигнал, если будет нажато сочетание клавиш Ctrl+Alt+Del

kernel.ctrl-alt-del

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

kernel.domainname

Позволяет установить доменное имя NIS (Network Internet Services) и YP (Yellow Pages). Но не путайте это доменное имя с DNS, это совсем разные вещи.

kernel.hostname

Имя вашего компьютера. Это самый простой способ изменить имя компьютера прямо сейчас, без перезагрузки.

kernel.modules_disabled

Позволяет отключить загрузку модулей ядра.

kernel.panic

Указывает количество секунд после ошибки в ядре (kernel panic) до перезагрузки.

kernel.pid_max

Максимальное значение PID процесса. Когда PID достигает этого значения, ядро переходит опять к минимальному. Значения больше этого не выделяются.

kernel.random.boot_id

Этот файл доступен только для чтения и содержит уникальный, случайный идентификатор загрузки. Генерируется для каждой загрузки.

kernel.random.uuid

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

kernel.randomize_va_space

Рандомизация адресного пространства это функция увеличивающая безопасность вашей системы. Она защищает от атак на переполнение буфера. По умолчанию включена.

kernel.sysrq

Позволяет включить или отключить управление ядром с помощью SysRQ. Доступны такие параметры:

kernel.threads-max

Максимальное количество запущенных потоков для процессов.

net.ipv4.icmp_echo_ignore_all

Если включено, ядро будет игнорировать все icmp запросы. Рекомендуется для защиты от DDOS атак.

net.ipv4.icmp_echo_ignore_broadcasts

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

net.ipv4.ip_default_ttl

Максимальное количество узлов, через которые может пройти отправленный пакет перед тем, как достигнет цели.

net.ipv4.ip_forward

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

net.ipv4.ip_local_port_range

Диапазон локальных портов, которые могут быть использованы вашими программами.

net.ipv4.tcp_rfc1337

Установите 1 чтобы защитить компьютер от атаки TCP TimeWait.

net.ipv4.tcp_fin_timeout

Таймаут ожидания завершения соединения после отправки пакета FIN. Рекомендовано 15.

net.ipv4.tcp_keepalive_time

Поддерживать соединение активным определенное время, например, 300 секунд. По истечении этого времени TCP соединение будет разорвано.

net.core.rmem_default

Указывает размер по умолчанию буфера для сокета получения данных по сети.

net.core.rmem_max

Максимальный размер буфера сокета для получения данных по сети.

net.core.wmem_default

Размер сокета по умолчанию для отправки данных по сети.

net.core.wmem_max

Максимальный размер буфера сокета для отправки данных по сети.

net.ipv4.tcp_rmem

Количество памяти, доступной для работы TCP.

vm.dirty_background_ratio

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

vm.dirty_ratio

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

vm.laptop_mode

Функция laptop mode позволяет не сразу записывать данные на жесткий диск после запроса, а хранить их указанное время в оперативной памяти. Может быть полезно если вы экономите заряд батареи и не хотите, чтобы жесткий диск всегда вращался.

vm.swappiness

Устанавливает процент свободной памяти, по достижении которого данные начинают переноситься на swap раздел, для систем с большим количеством памяти рекомендовано значение 10.

Выводы

Мы рассмотрели далеко не все параметры ядра linux, здесь описаны лишь самые интересные из них. Более подробную информацию и еще больше переменных вы можете найти в официальной документации по ядру Linux. И будьте осторожны, конфигурация ядра Linux - дело серьезное. Если я упустил какой-то важный параметр, напишите в комментариях!


Что­бы выпол­нить все задуман­ное, нам понадо­бят­ся сле­дующие ути­литы:

  • GCC — ком­пилятор C, что­бы ком­пилиро­вать ядро;
  • GDB — отладчик, который нам при­годит­ся, что­бы отла­живать ядро;
  • BC — будет нужен для сбор­ки ядра;
  • Make — обра­бот­чик рецеп­тов сбор­ки ядра;
  • Python — интер­пре­татор язы­ка Python, он будет исполь­зовать­ся модуля­ми GDB;
  • pacstrap или debootstrap — скрип­ты для раз­вер­тки сис­темы. Будут нуж­ны, что­бы соб­рать rootfs;
  • лю­бой тек­сто­вый редак­тор (подой­дет Vim или nano), что­бы написать модуль и рецепт к нему;
  • qemu-system-x86_64 — вир­туаль­ная машина, с помощью которой мы будем запус­кать ядро.

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

В целях экспе­римен­та нам понадо­бит­ся ядро Linux, которое при­дет­ся самос­тоятель­но соб­рать.

Конфигурация

Мы не будем делать уни­вер­саль­ное ядро, которое может под­нимать любое железо. Все, что нам нуж­но, — это что­бы оно запус­калось в QEMU, а изна­чаль­ная кон­фигура­ция, пред­ложен­ная раз­работ­чиками, для этих целей под­ходит. Одна­ко все‑таки необ­ходимо удос­товерить­ся, что у нас будут сим­волы для отладки пос­ле ком­пиляции и что у нас нет сте­ковой канарей­ки (об этой пти­це мы погово­рим поз­же).

Су­щес­тву­ет нес­коль­ко спо­собов задать пра­виль­ную кон­фигура­цию, но мы выберем menuconfig . Он удо­бен и нет­ребова­телен к GUI. Выпол­няем коман­ду make menuconfig и наб­люда­ем сле­дующую кар­тину.

Главное меню menuconfig

Глав­ное меню menuconfig

Для того что­бы у нас появи­лись отла­доч­ные сим­волы, идем в сек­цию Kernel hacking → Compile-time checks and compiler options. Тут надо будет выб­рать Compile the kernel with debug info и Provide GDB scripts for kernel debugging. Кро­ме отла­доч­ных сим­волов, мы получим очень полез­ный скрипт vmlinux-gdb. py . Это модуль для GDB, который поможет нам в опре­деле­нии таких вещей, как базовый адрес модуля в памяти ядра.

Включение символов отладки и vmlinux-gdb.py

Вклю­чение сим­волов отладки и vmlinux-gdb.py

Те­перь надо убрать про­тек­тор сте­ка, что­бы наш модуль был экс­плу­ати­руем. Для это­го воз­вра­щаем­ся на глав­ный экран кон­фигура­ции, заходим в раз­дел General architecture-dependent options и отклю­чаем фун­кцию Stack Protector buffer overflow detection.

Отключение стековой канарейки

От­клю­чение сте­ковой канарей­ки

Мож­но нажать на кноп­ку Save и выходить из окна нас­трой­ки. Что дела­ет эта нас­трой­ка, мы уви­дим далее.

Сборка ядра

Тут сов­сем ничего слож­ного. Выпол­няем коман­ду make -j< threads> , где threads — это количес­тво потоков, которые мы хотим исполь­зовать для сбор­ки ядра, и нас­лажда­емся про­цес­сом ком­пиляции.

Компиляция ядра

Ком­пиляция ядра

Ско­рость сбор­ки зависит от про­цес­сора: око­ло пяти минут она зай­мет на мощ­ном компь­юте­ре и нам­ного доль­ше — на сла­бом. Можешь не ждать окон­чания ком­пиляции и про­дол­жать читать статью.

Модуль ядра

В ядре Linux есть такое понятие, как character device. По‑прос­тому, это некото­рое устрой­ство, с которым мож­но делать такие эле­мен­тарные опе­рации, как чте­ние из него и запись. Но иног­да, как ни парадок­саль­но, это­го устрой­ства в нашем компь­юте­ре нет. Нап­ример, сущес­тву­ет некий девайс, име­ющий путь / dev/ zero , и, если мы будем читать из это­го устрой­ства, мы получим нули (нуль‑бай­ты или \ x00 , если записы­вать в нотации C). Такие устрой­ства называ­ются вир­туаль­ными, и в ядре есть спе­циаль­ные обра­бот­чики на чте­ние и запись для них. Мы же напишем модуль ядра, который будет пре­дос­тавлять нам запись в устрой­ство. Назовем его / dev/ vuln , а фун­кция записи в это устрой­ство, которая вызыва­ется при сис­темном вызове write , будет содер­жать уяз­вимость перепол­нения буфера.

Код модуля и пояснения

Соз­дадим в пап­ке с исходным кодом ядра вло­жен­ную пап­ку с име­нем vuln , где будет находить­ся модуль, и помес­тим там файл vuln. c вот с таким кон­тентом:


Операционные системы семейства Linux всегда славились своей защищённостью и надёжностью. Но по мере развития этой системы, не сидят на месте и хакеры, которые постоянно ищут дыры в ПО и пытаются обойти системы защиты. Если в Windows вы не можете даже положиться на дорогой антивирус, или даже комплекс защитных программ, то с Linux всё куда проще.

Linux, как и прочие UNIX-подобные системы, изначально спроектирован так, чтобы обеспечить достаточный уровень безопасности из коробки. По умолчанию у пользователя отсутствуют привелегии суперпользователя (root, или административные права), и обязательно устанавливается пароль (сразу вспоминается Windows, которая по умолчанию не только предоставляет учётную запись администратора, но и позволяет обойтись без пароля). Это лишь одна из многих мер защиты, которые присутствуют сразу. Вы наверняка слышали, что на Linux нет вирусов. Это не совсем так. Тут важно понимать что есть вирус. Конечно, того, что творится в Windows, вы здесь не увидите. Множество различных конфигураций, версий системного и прикладного ПО, ядра, а также различные варианты его сборки, сводят на нет попытки написать хороший, работоспособный вирус под Linux. К тому же, программы как правило устанавливаются из репозиториев, которые подписаны цифровыми ключами, и вы без труда сможете выяснить владельца репозитория.

Разумеется, если вы любитель ставить левый софт из не менее левых репозиториев - то вы вполне можете что-нибудь подхватить. Какой-нибудь весьма шаловливый, и на первый взгляд, неочевидный скрипт. Другое дело, так называемые руткиты. Сами по себе эти зловреды не наносят вредя системе. Их задача - получить права root (отсюда и название), и предоставить другим зловредам полный доступ к системе. При это руткит очень тщательно себя маскирует, и порой его очень непросто найти. Обычно, мишенью злоумышленников, становятся крупные сервера, а также рабочие станции, представляющие ценный интерес (давно прошли те времена, когда вирусы писались ради удовольствия. Теперь это очень серьёзный, прибыльный и крайне незаконный бизнес). Но и ваш домашний компьютер вполне может стать случайной жертвой, если вы используете уязвимое ПО, ставите софт из левых репозиториев и так далее.

Опять же, стоит провести параллель с Windows. Данная, с позволения сказать, операционная система, из коробки представляет из себя ведро с проржавевшим дном. По умолчанию доступен вшитый в систему фаерволл (справделивости ради сказать, не такой уж ужасный в последних виндах), защита системных файлов от удаления и. всё. Действительно, система сразу после установки дала нам учётную запись адмнистратора, а вы наверняка не указали для неё пароля. Впрочем, Майкрософт можно сказать, предусмотрела это, и ввела такую штуку, как Контроль Учётных записей пользователя (User Account Control, UAC). То самое окно, появляющиеся после запуска какой-нибудь административной утилиты или запуска любой программы от имени администратора. К сожалению, человеческая лень и порой неграмотность, неискоренимы. Многие люди просто напросто вырубают UAC. И всё, что находится в системе, получает к ней полный доступ (а также порнобаннеры, трояны, руткиты и тд). Немногие люди включают его на максимум, ставят и правильно настраивают антивирусы и фаерволл, устанавливают обновления системы. Ещё более немногие, знают какие уязвимые службы нужно отключить. Но как бы вы не старались, какие бы вы не принимали защитные меры - Windows была, есть и будет самой уязвимой и слабозащищённой операционной системой.

Вернёмся к Линуксу. Как я уже сказал, по умолчанию пользователю закрыт root доступ. Для запуска административных программ, используется sudo - утилита, предоставляющая временные права администратора на конкретную команду. Все каталоги в системе имеют своих владельцев и соответствующие права на чтение/запись. В самом ядре системы, включены многие защитные механизмы. Да и большинство популярных дистрибутивов Linux, собираются на совесть, разработчики задействуют дополнительные меры защиты. И всё это - из коробки. Никаких антивирусов, никакой боязни баннеров и троянов. Поставил, настроил, пользуйся. Но тема данной статьи, говорит о том, что это не предел защиты, которую можно обеспечить. Поэтому предлагаю вашему вниманию ряд дополнительных мер, которые помогут превратить вашу систему в непоколебимую крепость. Конечно, обсудить в подробности всё, не получится. Это тема для нескольких десятков статей (к тому же эти статьи уже существуют). Я лишь опишу то, что пригодится простому домашнему пользователю, которому не плевать на защищённость своей системы.

Пароль.

Пароль - это первая и основная линия обороны. Пароль должен, нет, обязан быть достаточно длинным и сложным, но при этом таким, чтобы вы могли его запомнить. Рекомендуется пароль длиной от 8 до 12 знаков (можно больше), состоящий из цифр, букв разного регистра и различных символов. Придумать подобный пароль иногда бывает сложно, поэтому можно его сгенерировать самому, при помощи OpenSSL. OpenSSL есть в любом дистрибутиве Linux, для генерации пароля наберите:

openssl rand -base64 6

Разумеется, такой пароль будет непросто запомнить. А если паролей много? Эту проблему решает менеджер паролей, такой как KeePassX - кроссплатформенный менеджер паролей, доступный в большинстве дистрибутивов Linux.

Если вы пользуетесь SSH, обязательно запретите в его настройках вход для root, безпарольную аутентификацию и используйте для входа шифрованный ключ. Кстати о шифровании.

Шифрование.

Шифрование - самый верный и надёжный способ защитить свои конфиденциальные данные. Способо шифрования в Linux много, все они доступны штатно. Можно зашифровать весь диск, раздел или отдельные каталоги. Шифрование поддерживают все популярные файловые системы в Linux. Шифровать диск целиком - задача долгая, и по большей части бесполезная. К примеру шифровать корневой раздел, смысла нет никакого. Там нет ничего конфиденциального. А вот домашний каталог, а также раздел подкачки (swap), уже другое дело.

Для шифрования каталогов, установим утилиты ecryptfs (на примере Debian/Ubuntu):

sudo apt-get install ecryptfs-utils

sudo ecryptfs-setup-swap
ecryptfs-setup-private

/Private, в которых будут храниться зашифрованные и расшифрованные файлы соответственно. При входе в систему будет срабатывать PAM-модуль pam_ecryptfs.so, который смонтирует первый каталог на второй с прозрачным шифрованием данных. После размонтирования

/Private окажется пуст, а

/.Private будет содержать все файлы в зашифрованном виде.

Для шифрования домашнего каталога:

sudo ecryptfs-migrate-home -u имяпользователя

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

mount | grep Private

Если всё нормально - можете удалить незашифрованный домашний каталог:

sudo rm -r /home/имяпользователя.*

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

Всегда устанавливайте обновления безопасности в системе. Разработчики очень оперативно выпускают патчи для закрытия уязвимостей в ПО, исправления багов и так далее. В большинстве популярных дистрибутивов, есть графический менеджер обновлений, который периодически проверяет их наличие. Но вы также можете проверить их наличие и установить из терминала. Для Debian/Ubuntu:

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

Фаерволл.

Фаерволл (он же брандмауэр) - это программа, которая позволяет гибко настраивать доступ различных приложений к сети. В ядре Linux, есть мощный и гибкий фаерволл, под названием netfilter. Интерфейсом к нему служит консольная утилита iptables. Настройка производится посредством написания правил обработки сетевых пакетов, проходящих через определённые соединения. Для домашнего компьютера, составлять километровые списки правил не требуется. Более того, если ваше интернет соединение проходит через маршрутизатор (роутер), то настраивать лучше его (даже самые дешёвые роутеры имеют в себе фаерволл). Но если его нет, то настроим всё средствами iptables.

Существуют различные фронтенды (надстройки) над iptables, упрощающие конфигурирование фаерволла. Один из таких - UFW. Он есть в каждом дистрибутиве Linux, имеется графическая оболочка (gufw) для его настройки. Установить можно так:

sudo apt-get install ufw gufw


Интерфейс предельно простой. По умолчанию, фаерволл выключен. Правила добавляются несколькими кликами. Более детальная настройка UFW описана здесь (обязательно прочитайте).

sudo apt-get install ipkungfu

Открываем конфиг:

sudo nano /etc/ipkungfu/ipkungfu.conf

Осталось сделать внести несколько дополнительных настроек для ядра. Открываем /etc/sysctl.conf и прописываем:

Активируем изменения:

sudo sysctl -p

Теперь вы можете не бояться большинства сетевых атак.

Каталог /tmp

Это каталог для временных файлов. Но он также потенциально опасен, поскольку оттуда могут запускаться различные зловреды. Чтобы это не произошло, лучше вынести его на отдельный раздел (2-5 гигабайт), и установить параметры монтирования nodev, noexec, nosuid. Первый запретит монтирование устройств на этот каталог, второй запретит выполнение программ, а третий - запретит устанавливать на каталог бит SUID, который позволяет запускать файлы с правами root от обычного пользователя. К слову, на серверах, вынесение каталога /tmp на отдельный раздел, является обязательным.

Браузер

Как бы не была защищена система, остаётся уязвимым то, через что вы сёрфите по интернету. Это браузер. Опишу настройку стандартного для большинства дистрибутивов, браузера Mozilla Firefox (в дистрибутиве Debian он зовётся Iceweasel):

  • Установите расширение uBlock (или AdBlock, если вы привыкли к нему). Это отсеет множество рекламных баннеров, которые очень часто бывают вредоносными. В настройках расширения включите подписки RuList+EasyList, а также фильтры вредоносных программ (Malware).
  • Установите расширение NoScript, которое будет отключать расширения JavaScript, которые являются самыми опасными в плане уязвимостей. Это может нарушить функционал сайта, поэтому вы можете включить только нужные JavaScript'ы, для работы сайта.
  • В адресной строке, наберите about:config. Откроется редактор расширенных настроек браузера. Наверху будет поисковая строка. Делаем так:

FlashPlayer. Самое уязвимое и опасное, что может находиться в вашем браузере. Если вы используете его только для просмотра видео на YouTube, то он вам не нужен. Можно переключиться на HTML 5 проигрыватель (который, правда, пока не позвоялет смотреть в Firefox видео в 1080p). Для этого в about:config

Если флеш всё-таки нужен, то делаем так:

Руткиты

Если какому-то особо изощрённому хакеру удалось взломать вашу систему, и/или у вас есть подозрение на наличие руткита, воспользуйтесь утилитой rkhunter:

sudo apt-get install rkhunter
sudo rkhunter -c --sk

Утилита проверит систему на наличие руткитов, и если найдёт - укажет где он сидит, и его можно будет удалить. Подробный лог проверки находится в /var/log/rkhunter.log. Утилиту нужно периодически обновлять. Можно создать задание для cron, котрое будет ежедневно выполнять обновление утилиты и сканирование на руткиты:

sudo nano /etc/cron.daily/rkhunter.sh

sudo chmod +x /etc/cron.daily/rkhunter.sh

После проверки, результат сканирования отправится на адрес электронной почты, который вы указали.

Выводы.

Выполнив рекомендации из данной статьи, вы получите суперзащищённый десктоп, имунный к большинству сетевых атак и различной сетевой заразы. Однако стоит соблюдать и элементарные меры защиты:

Читайте также: