Повышение безопасности с помощью многоэкземплярности директорий

Использование подключаемых модулей аутентификации для защиты конфиденциальных данных

Если вы заинтересованы в защите от несанкционированного доступа к совместно используемым директориям (например, /tmp или /var/tmp), которые доступны на запись "всему миру", вам могут помочь подключаемые модули аутентификации Linux® (PAM). При входе пользователей в систему модуль pam_namespace создаёт отдельное пространство имён. Это разделение выполняется на уровне операционной системы Linux, в результате пользователи оказываются защищены от нескольких типов атак. Эта статья предназначена для системных администраторов Linux. В ней показано, как с помощью PAM подключить механизм пространств имён.

Роб Романс, инженер-программист, IBM

Роб Романс редактор в группе User Technologies корпорации IBM. Он работает с Linux, архитектурой Cell Broadband Engine и программным обеспечением с открытым исходным кодом. До того как Роб перешёл в группу Information Development, он работал в качестве разработчика в таких областях как безопасность Linux, Linux для встраиваемых систем.



14.05.2008

Для повышения безопасности разумно использовать несколько способов защиты ("defense in depth" - глубоко эшелонированная защита). Таким образом, если один из способов защиты взломан, другой останется в рабочем состоянии и предотвратит дальнейшее вторжение. В этой статье описан способ, который позволит вам добавить ещё один уровень в вашу стратегию безопасности: использование PAM для включения механизма многоэкземплярности (polyinstantiation) совместно используемых директорий, доступных на запись "всему миру". Это означает, что для каждого пользователя создаётся новый экземпляр директории (например, /tmp).

В статье Рассела Кокера (Russell Coker) "Polyinstantiation of directories in an SELinux system" (см. раздел Ресурсы) описаны следующие типы атак, выполнению которых препятствует многоэкземплярность:

  • Атаки, использующие состояние гонки (race-condition) и символические ссылки
  • Раскрытие имени файла, который содержит секретную информацию или может быть использован атакующим
  • Атаки одного пользователя на другого пользователя
  • Атаки пользователя на демона
  • Атаки демона без привилегий root на пользователя

В то же время многоэкземплярность НЕ препятствует выполнению следующих типов атак:

  • Атаки демона с привилегиями root на пользователя
  • Атаки root (учётная запись или повышенные привилегии) на любого пользователя

Как работают PAM и многоэкземплярность

Во время входа в систему PAM создаёт (в пределах системного экземпляра директории /tmp) "многоэкземплярную" личную директорию /tmp; эта переадресация прозрачна для пользователя, входящего в систему. Пользователь видит "стандартную" директорию /tmp и имеет право на её чтение и запись как обычно. Пользователь не видит ни пространств /tmp других пользователей (включая пользователя root), ни настоящей файловой системы /tmp.

"Многоэкземплярные" пользовательские директории не могут быть скрыты или защищены от пользователя root. Если вы заинтересованы в таком уровне защиты, вам может помочь SELinux. Примеры конфигураций, приведённые в этой статье, должны работать независимо от того, включили вы SELinux или нет. Дополнительную информацию об использовании SELinux можно найти по ссылкам в разделе Ресурсы.


Включение механизма многоэкземплярности

В этом разделе показано, как включить многоэкземплярность директории /tmp и /var/tmp для пользователей вашей системы. Также вы найдёте здесь описание дополнительных настроек, необходимых для корректной работы X Windows и графического менеджера экрана. В этой статье я использовал дистрибутив Red Hat Enterprise Linux 5.1 (RHEL 5.1), но вы можете использовать описанные здесь процедуры в любом дистрибутиве Linux, который имеет в своём составе модуль pam_namespace.

Первым делом мы отредактируем файл namespace.conf.

Редактирование файла namespace.conf

Первый файл, который нужно отредактировать - /etc/security/namespace.conf. В нём хранятся настройки модуля pam_namespace. Перечислите в этом файле директории, которые PAM должен сделать "многоэкземплярными" при входе в систему. Несколько закомментированных примеров приведены в файле, входящем в состав PAM. Чтобы посмотреть детальное руководство, выполните команду man namespace.conf. Синтаксис каждой строки в этом файле следующий - polydir instance_prefix method list_of_uids.

Вот что означают вкратце эти переменные:

  • polydir - полное имя директории, которую нужно сделать "многоэкземплярной".
  • instance_prefix - базовая директория для новой "многоэкземплярной" пользовательской директории.
  • method может принимать значения: user, level, или context.
  • list_of_uids - список пользователей, директории которых PAM НЕ будет делать "многоэкземплярными".

В этом примере мы не используем SELinux, таким образом, вы должны указать для переменной method значение user. В пределах конфигурационного файла (при необходимости) вы можете использовать переменные $USER и $HOME.

Листинг 1 создаёт индивидуальные экземпляры пространств имён /tmp и /var/tmp для каждого пользователя в системе, за исключением пользователей root и adm.

Листинг 1. /etc/security/namespace.conf
#$HOME $HOME/$USER.inst/ user root,adm 
/tmp /tmp/tmp-inst/ user root,adm 
/var/tmp /var/tmp/tmp-inst/ user root,adm

Директории /tmp и /var/tmp не обязательно должны располагаться на разных файловых системах; они могут быть расположены на одной файловой системе. Директории /tmp/tmp-inst и /var/tmp/tmp-inst необходимо создать один раз, вручную, с режимом доступа 000. Вы не сможете войти в систему, если эти директории созданы неправильно.

Чтобы создать эти директории, выполните следующие команды как пользователь root:

# mkdir /tmp/tmp-inst 
# mkdir /var/tmp/tmp-inst 
# chown root:root /tmp/tmp-inst /var/tmp/tmp-inst 
# chmod 000 /tmp/tmp-inst /var/tmp/tmp-inst

Редактирование настроек PAM

Далее, отредактируйте конфигурационные файлы PAM, добавив pam_namespace в список требуемых (required) модулей, которые будут выполнены при входе в систему с консоли или по SSH. Добавьте модуль pam_namespace.so в последнюю строку файлов /etc/pam.d/login и /etc/pam.d/sshd. Куда в файлах /etc/pam.d/login и /etc/pam.d/sshd, нужно добавить модуль, показано в листингах 2 и 3 соответственно:

Листинг 2. Добавление модуля PAM в файл /etc/pam.d/login
#%PAM-1.0 
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
# pam_selinux.so close should be the first session rule 
session required pam_selinux.so close 
session include system-auth 
session required pam_loginuid.so 
# 
session optional pam_console.so 
# pam_selinux.so open should only be followed by sessions to be executed in the 
  user context 
session required pam_selinux.so open 
session optional pam_keyinit.so force revoke 
# Polyinstantiation: 
session required pam_namespace.so 
Листинг 3. Добавление модуля PAM в файл /etc/pam.d/sshd
#%PAM-1.0 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
session optional pam_keyinit.so force revoke 
session include system-auth 
session required pam_loginuid.so 
# Polyinstantiation: 
session required pam_namespace.so 

Запуск X Windows

Из-за особенностей использования директорий для временных файлов системой X Windows, у пользователей с "многоэкземплярной" директорией /tmp может не работать графический вход в систему. PAM выполняет содержимое файла /etc/security/namespace.init во время входа в систему, если модуль pam_namespace указан в любом из файлов директории /etc/pam.d. Используйте этот файл для внесения необходимых изменений, которые позволят вам корректно запустить X Windows. Я немного изменил файл namespace.init, входящий по умолчанию в дистрибутив RHEL 5.1, как показано в листинге 4.

Листинг 4. Обеспечение возможности корректного запуска X Windows
if [ $1 = /tmp ]; then
        if [ ! -f /.tmp/.X11-unix ]; then
                mkdir -p /.tmp/.X11-unix
        fi
        mount --bind /tmp/.X11-unix /.tmp/.X11-unix
        [ -f /tmp/.X0-lock ] && cp -fp -- /tmp/.X0-lock "$2/.X0-lock"
        mkdir -p -- "$2/.X11-unix"
        ln -fs -- /.tmp/.X11-unix/X0 "$2/.X11-unix/X0"
fi
exit 0

Настройка менеджера экрана Gnome Display Manager

Настройка менеджера экрана Gnome Display Manager (GDM) проста. Добавьте модуль pam_namespace.so в список требуемых (required) модулей в файле /etc/pam.d/gdm. Пример приведён в листинге 5.

Листинг 5. Настройка менеджера экрана GDM
#%PAM-1.0 
auth required pam_env.so 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
session optional pam_keyinit.so force revoke 
session include system-auth 
session required pam_loginuid.so 
session optional pam_console.so 
# Polyinstantiation: 
session required pam_namespace.so 

Если вместо менеджера экрана GDM вы используете X Display Manager (XDM), таким же образом измените файл /etc/pam.d/xdm. Теперь директории /tmp и /var/tmp будут "многоэкземплярными" как при входе в систему с консоли, так и при графическом входе.


Окончание: Разрешаем ошибки

Если при работе модуля pam_namespace.so PAM встретит ошибку, попытки пользователя войти в систему потерпят неудачу. Пока вы не убедитесь, что всё работает, так как было запланировано - разрешите вход в систему даже в случае возникновения ошибок. Чтобы включить опцию ignore_config_error, добавьте её в конец каждого файла, содержащего модуль pam_namespace.so, в директории /etc/pam.d.

Например, отредактируйте в файле /etc/pam.d/login строку, содержащую модуль pam_namespace.so, следующим образом:

session required pam_namespace.so ignore_config_error

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


Окончание: Результаты

После того как вы отредактировали и сохранили конфигурационные файлы, выберите учётную запись пользователя без привилегий root для тестирования. Завершите все сеансы работы с системой этого пользователя. Снова войдите в систему. Для этого пользователя будут созданы новые "многоэкземплярные" директории /tmp и /var/tmp. Как выглядит директория /tmp с точки зрения системы и с точки зрения пользователя robb, показано в листингах 6 и 7.

Листинг 6. Консольная сессия с точки зрения пользователя
[robb@testbox tmp]$ cd /tmp 
[robb@testbox tmp]$ touch foo 
[robb@testbox tmp]$ ls 
foo
Листинг 7. Консольная сессия с точки зрения системы (пользователя root)
[root@testbox ~]# ls /tmp 
tmp-inst 
[root@testbox ~]# ls /tmp/tmp-inst/ 
robb 
[root@testbox ~]# ls /tmp/tmp-inst/robb/ 
foo

Благодаря тому, что задействован механизм многоэкземплярности, директория /tmp пользователя robb изолирована в отдельной поддиректории директории /tmp/tmp-inst/; robb не может видеть системную директорию /tmp или файлы внутри неё.


Заключение

Несмотря на то, что многоэкземплярность не защищает от всех видов атак, это полезное дополнение к вашему набору инструментов, обеспечивающих безопасность, которое к тому же легко настраивается. Вы можете смело экспериментировать с "многоэкземплярностью" других директорий, например, /home. С опцией ignore_config_error ошибки "не смертельны", но не забудьте удалить эту опцию, как только вы закончите тестирование вашей конфигурации.

Ресурсы

Научиться

  • Оригинал статьи "Improve security with polyinstantiation" (EN).
  • "Polyinstantiation of directories in an SE Linux system" (EN) - статья Рассела Кокера (Russell Coker), в которой описаны проблемы, связанные с совместно используемыми директориями, такими как /tmp и /var/tmp, а также проблемы, возникающие при использовании нескольких контекстов безопасности SELinux для доступа к единственной "домашней" директории.
  • "Использование пространств имён команды mount" (developerWorks, сентябрь 2007 г.) рассказывает, как самостоятельно настроить монтирование файловых систем, не ограничиваясь структурой, навязанной системным администратором. В этой статье вы найдёте несколько практических применений расширенных возможностей команды mount.
  • "Secure programmer: Minimizing privileges" (EN) (developerWorks, май 2004 г.) рассказывает о том, как ограничить привилегии путём уменьшения количества привилегированных модулей, предоставленных привилегий и времени, в течение которого привилегии действительны.
  • "What's new in SELinux for Red Hat Enterprise Linux 5?" (EN) (Дэн Уолш (Dan Walsh), журнал Red Hat Magazine, май 2007 г.) - исчерпывающий обзор SELinux дистрибутива RHEL 5.
  • В статье "Shared subtrees" (LWN.net, ноябрь 2005 г.) вы найдёте ответ на вопрос "Процесс хочет клонировать своё пространство имён и по-прежнему иметь доступ к компакт-диску, который был недавно примонтирован" с подробным перечнем особенностей, семантикой, описанием состояний монтирования и проблемами реализации. (EN)
  • "SELinux с нуля" (developerWorks, май 2006 г.) показывает, как собрать систему Gentoo с поддержкой SELinux.
  • "Управление доступом на основе ролей в SELinux" (developerWorks, февраль 2008 г.) расскажет, как работать с RBAC в SELinux, а также как совместная работа политик SELinux, ядра и пространства пользователя реализует RBAC и связывает пользователей с политикой type enforcement.
  • Следующие ресурсы помогут вам понять принципы работы SELinux: История SELinux и часто задаваемые вопросы о проекте (EN), Неофициальный сборник часто задаваемых технических вопросов о SELinux (EN) и Настройка политик SELinux (EN).
  • Узнайте больше о SELinux (Security-Enhanced Linux - Linux с повышенной безопасностью) на сайте NSA. (EN)
  • В разделе Linux сайта developerWorks вы можете найти дополнительные ресурсы по Linux для разработчиков, а также самые популярные статьи и руководства.(EN)
  • Читайте советы и руководства по Linux на сайте developerWorks.
  • Оставайтесь в курсе последних событий, посещая раздел Семинары и обучение.

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=307910
ArticleTitle=Повышение безопасности с помощью многоэкземплярности директорий
publish-date=05142008