Операционная система Unix с самого начала задумывалась простой по устройству
и безопасной по содержанию. Простота системы заключается в том, что все что не видит глаз является файлами, правда разными внутри, но пользователь не видит абсолютно никакой разницы между обычным текстовым файлом или файлом представляющим собой жесткий диск. Жизнь в систему вдыхают процессы. И те и другие имеют определенные права доступа на основании которых решается вопрос о том, может ли процесс имеющий определенные атрибуты (владелец, группа) открыть файл для работы с ним. Но такое упрощение имеет и свои видимые недостатки. Так например важные системные файлы получаются фактически не защищенны. Почему? Как правило в правильно настроенной системе такие файлы может изменять и в том числе удалять только суперпользователь. Но хорошо когда это именно наш системный администратор, а если нет. Нет, я считаю, что взломать аккаунт root’a в принципе возможно, но есть гораздо более эффективный и быстрый способ. Так извесно, что большинство демонов (программ выполняющих запросы пользователей) имеют установленный SUID/SGID-бит. Сущность его заключается в том чтобы придать процессу запущенному от имени обычного пользователя несколько большие права в системе. В качестве примера где может применяться это свойство рассмотрим утилиту
passwd, которая позволяет изменить пользователю свой пароль. Все учетные записи и
пароли (в зашифрованном виде) хранятся в файлах /etc/passwd и /etc/shadow, если
предоставить право каждому пользователю на самолично вносить изменения в эти файлы
напрямую, то можете представить, что это будет. И естественно вам и не кто и не даст
такое право.
[sergej@grinder sergej]$ ls -l /etc/passwd /etc/shadow
-rw-r--r-- 1 root root 1628 Авг 13 18:31 /etc/passwd
-r-------- 1 root root 1081 Авг 13 18:31 /etc/shadow
Как видите все пользователи имеют право только на чтение файла /etc/passwd, а
записывать информацию может только root (а /etc/shadow как вы видите закрыли от всех,
чтобы пароли не могли подобрать). Теперь смотрим на утилиту passwd:
[sergej@grinder sergej]$ ls -l /usr/bin/passwd
-r-s--x--x 1 root root 15104 Мар 14 03:44 /usr/bin/passwd
Буква ‘s’ означает, что установлен флаг SUID, а владельцем файла является его
величество root и теперь кто бы ни запустил утилиту на выполнение, на время работы
программы он временно получает права суперпользователя, т.е. произвести запись в
защищенный системный файл. Естественно утилита должна (и делает это) производить
изменение учетной записи только запустившего ее пользователя. Как вы понимаете
требования по безопасности к программам использующим данный метод должны быть
повышены. Это наверное самая большая дыра во всех Unix, потому что найдя ошибку в
одной из программ использующих биты SUID/SGID можно производить любые действия
не обладая при этом правами суперпользователя. Это свойство использовал нашумевший
в 1988 вирус Морриса использовавший в том числе и ошибки в SUID/SGID для
достижения своих целей. Теперь получив доступ к такой программе ничего не мешает
переслать файл /etc/passwd себе по электронной почте или убить init тем самым остановив работу сервера. Но с другой строны к тому же файлу /etc/passwd при нормальной роботе должны обращаться всего ДВЕ программы: login — при входе пользователя в систему и уже упоминаемая passwd при смене пароля. Но уж никак не Sendmail. Отсюда получаем что процессы запущенные от имени суперпользователя имеют гораздо больше лишних прав чем им положено. С одной стороны количество SUID/SGID неуклонно уменьшается, но до нуля их количество врядли дойдет. Поэтому необходимо иметь способ вручную отрегулировать доступ к некоторым важным системным файлам и каталогам. Еще было бы совсем не плохо расширить имеющуюся модель доступа к файлам — владелец, группа-владелец, остальные и права для каждого чтение, запись, выполнение. Такая модель хотя и обладает определенной простотой в реализации, но иногда не обеспечивает гибкости при организации прав доступа в тех случаях, когда есть необходимость задать их персонально для каждого (что отлично реализовано в Windows NT).
Итак проблемы намечены, теперь хотелось бы иметь инструмент для их
решения. Такое средство есть и называется LIDS ( Linux Intrusion Detection System).
Представляет из себя патч к ядру для осуществления принудительного контроля доступа в ядре, а также инструмент администрирования (lidsadm). Кроме того LIDS встраивает в ядро механизм предупреждений о каких-либо опасных действиях, а также такую довольно полезную штуку как детектор сканера портов, дающий сисадмину время на подготовку к отражению атаки. Ведь в большинстве случаев перед проникновением идет «разведка боем».
Для установки LIDS необходимо скачать с сайта проекта (http://www.lids.org/install.html) или с одного из его ftp-зеркал утилиту администрирования
и патч к ядру. Все это находится в пакете lids-х.х.х-y.y.y.tar.gz, где х.х.х — номер версии утилиты lids, а y.y.y — номер версии ядра для которого предназначен патч. Причем поддерживаются и так любимые системными администраторами ядра серии 2.2.х и современные 2.4.х, а также developer ядра серии 2.5.х. Я использовал lids-1.1.2rc4-2.4.19.tar.gz, поэтому с ftp://ftp.kernel.org было взято ядро linux-2.4.19.tar.bz2. Теперь распаковываем два скачанных файла.
# bzip2 -cd linux-2.4.19.tar.bz2 | tar -xvf -
# tar -zxvf lids-1.1.2rc4-2.4.19.tar.gz
Следующим шагом переходим в распакованный каталог с ядром и
устанавливаем патч.
# cd linux_install_path/linux
# patch -p1 < /lids_install_path/lids-1.1.2rc4-2.4.19.patch
В случае если патч установился без проблем теперь обязательно нужно, создать
символическую ссылку /usr/src/linux на новый каталог с исходниками ядра.
# rm -rf /usr/src/linux
# ln -s linux_install_patch/linux /usr/src/linux
Теперь переходим в каталог с исходными текстами конфигурируем и
компилируем ядро.
# cd /usr/src/linux
# make xconfig (или make menuconfig)
В процессе конфигурирования необходимо обязательно установить следующие
пункты.
В "Code maturity level options"
[*] Prompt for development and/or incomplete code/drivers
В "General setup"
[*] Sysctl support
И зайдя в новый пункт "Linux Intrusion Detection System"
[*] Linux Intrusion Detection System support (EXPERIMENTAL)
После конфигурирования записываем внессенные изменения и выходим из
программы конфигурации. После этого идет обычный процесс компиляции и установки
нового ядра.
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
Копируем получившееся новое ядро в каталог /boot
# cp arch/i386/boot/bzImage /boot/lids-kernel
И в параметрах загрузчика (Grub или LILO) прописываем необходимые строки
для запуска системы с новым ядром. Но перегружаться еще рано, теперь необходимо
установить и первоначально установить и сконфигурировать утилиту lidsadm. Если этого
не сделать то система попросту не загрузится. Не удаляйте также старое ядро хотя бы по той причине, что в случае неудачи будет возможность загрузится без LIDS для
продолжения работы и выяснения причин. Итак, переходим в каталог с распакованной
LIDS и даем стандартную команду для конфигурирования и установки.
# ./configure && make && make install
После установки можно обнаружить каталог /etc/lids/ в котором хранятся
установки и настройки программы. Внутри находятся четыре файла:
- lids.conf — в данном файле содержится информация о правах доступа (ACL —
Access Control Lists) к различным файлам и каталогам. - lids.cap — в этом файле прописанны возможности по конфигурированию,
чтобы включить необходимое свойство необходимо поставить «+» перед ним,
отключить — «-» - lids.net — в этом файле устанавливаются необходимые значения для посылки
предупреждающих сообщений с помошью e-mail (IP-адрес, порт, SMTP-
сервер, заголовок). Для включения данной возможности необходимо собрать
ядро с параметром
[*] Send security alerts through network - lids.pw — в этом файле сохраняется пароль предназначенный для изменения
параметров lids
Теперь самое время познакомится с самой утилитой администрирования lidsadm.
Первое чувство которое возникает когда знакомишься с используемыми опциями и
правилами, что это уже где-то видел. И в принципе будете правы на все сто. Все опции и действия которые можно задать с помощью них напоминают используемые в программе конфигурирования FIREWALL — ipchains. Даже принцип действия у них в чем то совпадает, только ipchains работает с пакетами пришедшими по сети, а LIDS с процессами запущенными от имени какого то пользователя. Для начала необходимо определится с некоторыми терминами. Субъектом действия утилиты может быть любая программа или файл, объектом может быть файл каталог или специальное устройство. Перво наперво устанавливаем пароль для защиты утилиты, пока работаем с обычным ядром пароля у нас спрашивать не будут, но как только перегрузимся все действия по конфигурированию будут предваряться запросом пароля (хотя есть возможность и отключить защиту). Итак вводим
# lidsadm -P
теперь у нас запросят пароль дважды и после окончания работы утилиты в зашифрованном виде его можно пронаблюдать в файле lids.pw. Для получения
краткой справки по используемым командам и устанавливаемым флагам введите #
lidsadm -h. Теперь чтобы добавить новое правило воспользуемся опцией -A (append).
Общий синтаксис команды такой:
lidsadm -A [-s subject] -o object [-d] -j
Поле ACTION указывает на действие которое будет выполняться при запросе отмеченного ресурса. Оно может принимать несколько значений, но самыми употребляемыми будут четыре:
- READ (объект помечен только для чтения)
- APPEND (возможно только добавление информации),
- WRITE (возможна запись, в том числе и удаление)
- GRANT (предоставляет возможность субъекту отклонять общие правила)
Теперь введя команду
# /sbin/lidsadm -A -o /etc/shadow -j DENY
мы запретим всем пользователям доступ к данному файлу. Теперь после перезагрузки с lids-ядром просмотрев с помощью команды # ls /etc/shadow в ответ получим ls: /etc/shadow : No such file or directory. Чтобы пользователь мог зарегистрироваться в системе откроем доступ только для чтения единственной
программе, которая законно должна работать с данным файлом.
# /sbin/lidsadm -A -s /bin/login -o /etc/shadow -j READ
Теперь пользователи получают возможность входить в систему (с помощью
/bin/login) т.е. здесь достаточно прав только для чтения, а другим программа доступ будет заблокирован. Аналогичным образом можно установить требуемые действия сразу на весь каталог.
# /sbin/lidsadm -A -o /sbin/ -j READ
Для различных файлов журналов достаточно установить возможность только
дозаписи информации в них, в таком случае злоумышленнику будет довольно трудно
скрыть свое пребывание редактированием соответствующих логов. Например:
# /sbin/lidsadm -A -o /var/log/samba/ -j APPEND
# /sbin/lidsadm -A -o /var/log/secure -j APPEND
Просмотреть теперь все установленные правила можно воспользовавшись
опцией -L (list): lidsadm -L. Статус системы можно просмотреть опцией # /sbin/lidsadm -V. После того как все необходимые правила будут занесены необходимо обновить dev/inode лист с помощью команды /sbin/lidsadm -U. Естественно кроме добавления информации о защищаемых файлах есть возможность удалить файл из списка. Это можно проделать
либо воспользовавшись опцией -D (delete) с указанием конкретного файла
# /sbin/lidsadm -D /etc/httpd/
или с помощью команды lidsadm -Z очистить сразу весь список.И напоследок
после всех установок необходимо «запечатать» ядро («seal the kernel») с помощью
команды /sbin/lidsadm -I или лучшим решением будет занести в файл /etc/rc.local
соответсвующую строку, чтобы не вводить ее при каждом перезапуске системы. После
этого ваша система будет защищена с помощью lids. А что теперь делать, если появилась необходимость убрать временно защиту, неужели опять перезагружаться со старым ядром? Совсем нет. Необходимо переключиться в режим LIDS free session (LFS). Для его поддержки при конфигурирования ядра необходимо установить параметр
[*] Allow switching LIDS protections
Теперь чтобы открыть сеанс LFS в текущем терминале (и только в нем)
необходимо ввести # /sbin/lidsadm -S — -LIDS и ввести пароль по запросу. Чтобы отказаться от режима LFS вводим # /sbin/lidsadm -S — +LIDS. И дополнительно желательно заставить перечитать lids конфигурационные файлы
# /sbin/lidsadm -S -- +RELOAD_CONF
Если появилась необходимость отключения от защищенного режима
глобально для всей системы, то достаточно для этого ввести
# /sbin/lidsadm -S -- -LIDS_GLOBAL
и теперь это будет обычная система.
Как говорилось lids может защищать процессы от посягательств из вне.
Установив в файле /etc/lids/lids.cap опцию -29:CAP_INIT_KILL можно защитить все
процессы чьим родительским является процесс номер 1 в системе — init. А вот так можно убрать (спрятать) из списков процессов выдаваемых с помощью команды ps сервер Apache.
# /sbin/lidsadm -A -s /usr/sbin/httpd -t -o CAP_HIDDEN -j INHERIT
В случае если lids прижился на компьютере и старое ядро за ненадобностью было
удалено, есть возможность при загрузке lids-ядра установить режим загрузки без защиты.
Для этого надо при выборе ядра в LILO или GRUB указать дополнительно параметр
security=0: grub>lids-kernel security=0. После этого система будет загружена в обычном
незащищенном режиме.
При компиляции ядра с опцией [*] Port Scanner Detector in kernel появится
возможность дополнительно отслеживать работу сканеров портов и в случае
обнаружения такого сканирования системный администратор будет оповещен, а в лог-
файле появится информация которая может помочь (а может и не помочь, скрыть IP-
адрес труда особого не представляется, но это тема отдельного разговора) в поиске
злоумышленика так, что такой возможностью пренебрегать не стоит.
Вот такой он lids. Единственная сложность в конфигурировании это
определиться с каталогами которые нужно будет защищать и выбрать режим работы для них. Здесь универсальный совет дать трудно все зависит от назначения компьютера и запущенных сервисов. Но не обязательно стараться закрыть все файлы, достаточно поначалу обойтись только наиболее важными, а затем постепенно наращивать защиту. В документации поставляемой с пакетом lids приведенны примеры для некотрых наиболее часто используемых сервисов, так что по аналогии можно будет разобраться потихоньку. Но одно ясно используя LIDS можно существенно поднять уровень защиты компьютера под управлением Linux и значительно усложнить жизнь тем кто хочет покопаться в чужом компьютере.