Мы — долго запрягаем, быстро ездим, и сильно тормозим.
|
||||||||||||||||||||||||||||||||||||||||||||||||
www.lissyara.su
—> статьи
—> FreeBSD
|
|
Далее необходимо загрузить сам модуль политики. Добавляем в /boot/loader.conf
|
Что б не случилось курьезов, root`а переводим сразу на уровень допуска high, с возможностью изменения в пределах low-high. Правим класс default в /etc/login.conf
|
И обновляем bd
|
Далее проверяем, что root в классе default или классе, его включающем (напр. russian)
|
Если нет, включаем его туда или правим класс. Сейчас проще включить
|
Перезагружаемся и логинимся под root`ом.
Еще немного теории
[man]getpmac [-p pid] - посмотреть уровень допуска процесса
setpmac label command - запустить коммандуcommand с уровнем допуска label
getfmac [-h] [-l lol] [file]- посмотреть уровень доступа файла
setfmac [-h] [-l lol] [file]- установить уровень доступа файла[/man]
Проверяем.
Теперь всем процессам присвоена метка high
|
Процесс init использует политику biba, работает с приоритетом high, с возможностью менять приоритет в пределах диапазона low-high
|
У нас приоритет high.
|
Все процессы и файлы имеют приоритет high.
Попробуем запустить csh с приоритетом low
|
При этом можно убедиться, что мы можем читать все файлы, права на чтение которых имеет root, а вот записать не можем ни один, несмотря на то, что права на запись так же имеются. Выходим из шела набрав exit.
Пробуем установить метку.
|
Метки не поддерживаются. Включаем их на отмонтированном слайсе. Но в доках про это не слова. Есть только про ошибки /.
|
Пробуем заново
|
Далее запускаем csh с приоритетом low и пробуем писать и читать файл test
|
Удалить его не получится, т.к. для удаления нужны привелегии на каталог выше. Поэтому, работая под low, повышаем уровень доступа test до high, выходим, и удаляем его.
|
Особый интерес представляет политика lomac. В целом, она схожа с biba, но дает одно преимущество - использование плавающих меток для поддержки понижения метки субъекта через вспомогательный отдел градации. Этот вспомогательный отдел принимает вид [auxgrade]. Это что-то вроде наследования привелегий.
Правим /boot/loader.conf
|
И в /etc/login.conf меняем
|
на
|
И обновляем bd
|
Для вступления изменений в силу необходимо перезагрузиться.
Принцип работы объясню на примере.
|
Как видим из примера, независимо от уровня доступа родительского каталога dir, все файлы в нем создаются с уровнем доступа пользователя, который их создает, если он имеет на это право. В нашем случае я работаю под lomac/high. Но это не всегда удобно. Например, есть защищенный каталог, а в нем лежат незащищенный данные. Например, root хочет работать с какими-либо временнымти файлами web-сервера. Т.к. в моем случае httpd работает с привелегиями low, то данные, которые он может изменять, должны иметь уровень доступа тоже low. Если какие-либо файлы в этой директории будут созданы root`ом, они будут иметь уровень доступа high, как и
root, и httpd после этого не сможет их изменять. В этом случае как раз и пригодится эта особенность lomac.
|
Т.е. уровень доступа файлов, созданных в каталоге, будет понижен до уровня доступа вспомогательной градации(`[]`), указанного в уровне доступа родительского каталога.
Так же до этого уровня понижаются привелегии субъекта, порожденного этим объектом, если он является исполняемым.
|
Некой особенностью тут является то, что работая с уровнем допуска high, мы не видим процессы, работающие под low.
Метка вида ``lomac/equal(equal-equal)'' может быть установлена на субъекты, которые используются для административного изменения меток в системе.
Сетевые интерфейсы
Интересные возможности дает установка меток на сетевые интерфейсы. По умолчанию при загрузке модуля они ставятся в
|
И сетевые пакеты перестают бегать. Это дает достаточно широкое поле для экспериментов, но практического применения этой особенности я не придумал. НУ, можно разрешить каким-либо пользователям работать с сетью, а каким-то запретить. В нашем примере это не используется, поэтому выключаем сетевые интерфейсы из политики. Сделать это можно двумя способами:
|
Или
|
Лично пробовал первый.
Как это применительно к apache? Да очень просто. По минимуму, вся система у нас работает в high, процесс httpd и каталоги, куда он пишет (логи и сессии, например) в low. В случае взлома апача злоумышленник может изменять только файлы логов и того, что разрешено изменять апачу. Скажу сразу, если у вас крутится phpmyadmin и roundcube для локальных пользователей, то оно того, я думаю, не стоит.
И так, приступим.
Для начала необходимо загрузить сам модуль.
|
Так же необходимо исключить сетевые интерфейсы из политики. Пусть трафик на них будет бегать независимо от привелегий.
|
Можно перезагрузиться и проверить, что все работает.
Далее готовим apache. Не забывая его перед этим остановить.
Apache, работая под low, не сможет полноценно работать с директориями и файлами, имеющими уровень доступа high. Что бы не менять уровень доступа системных папок, создаем апачу свои папки.
В конфиге меняем путь к pid-файлу.
|
Что бы rc.d скрипт видел новый pid в rc.conf дописываем
|
И в /usr/local/etc/rc.d/apache22 после
|
Добавляем
|
Далее создаем папку для pid-файла.
|
Так же необходимо переместить лог-файлы. В httpd.conf меняем пути к лог-файлам
|
И создаем под них директорию.
|
ПОсле этого пробуем запустить-остановить апач с новым pid-файлом и путями к логам. Убеждаемся, что все нормально работает.
|
Далее работаем над запуском apache с уровнем допуска low.
Все директории, куда пишет apache, должны иметь уровень доступа lomac/low[low]
|
Дальше несколько полезностей.
Что б без проблем работать с /tmp
|
В /var/tmp/ apache пишет сессии. Переназначить этот путь можно через php_admin_value session.save_path, что я и сделал. Для каждого виртуалхоста. В секциии виртуалхоста дописываем
|
В этут папку должен иметь права на запись пользователь, от контого работает виртуалхост. Так же устанавливаем уровень доступа
|
Для загрузки файлов на ресурс иногда надо установить php_admin_value upload_tmp_dir подобно примеру выше.
Для отправки почты с сайтов разрешаем всем работать со спулом
|
Меняем auxgrade на low для httpd, что бы все порождаемые им процессы имели уровень допуска low. На всякий случай.
|
Похоже, все. Пробуем запустить. Запуск должен производиться с допуском low-low. Для этого запускаем shell с не обходимым допуском. Далее все операции с apache будут производиться через него. Скаже больше, процессы httpd даже не будут видны из шела с уровнем допуска high. Что и продемонстрируем.
|
Ну вот,впринципе, и все. Небольшой стартовый скрипт для запуска-остановки. Правим rc.conf
|
Ну, и сам скрипт
|
Обратите внимание, что здесь есть переносы строки, в реально скрипте которых быть не должно. Это связано с ограничением длины строки кода на данном ресурсе.
Некоторые спросят - почему не стал использовать /etc/rc.subr. Отвечу - при использовании данных фунцкий с setpmac у меня были ошибки.
Пример с реализацией писался уже после внедрения, так что могут быть неточности.
С удовольствием выслушаю конструктивную критику и предложения по дополнению статьи.
Небольшое дополнение. Например, при ротации логов апача newsyslog`ом, сервер не принимает сигнал на перечитывание конфигов и логи пишутся в старый. Или при использовании tail и grep одновременно для обработки логов возникает ошибка
#tail -f /var/log/httpd/httpd-access.log.0 | grep 1 tail: stdout: Permission denied # |
Лечится просто:
|
Источники:
http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/mac.html
man 4 mac
man 4 mac_mls
man 4 mac_biba
man 4 mac_lomac
размещено: 2011-11-08,
последнее обновление: 2012-05-16,
автор: Al
Этот информационный блок появился по той простой причине,
что многие считают нормальным, брать чужую информацию не уведомляя автора
(что не так страшно), и не оставляя линк на оригинал и автора — что более существенно.
Я не против распространения информации — только за. Только условие простое — извольте
подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой,
незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
Если соизволите поставить автора в известность — то вообще почёт вам и уважение.
© lissyara 2006-10-24 08:47 MSK
Комментарии пользователей [0 шт.]