Если вы заинтересованы в защите от несанкционированного доступа к совместно используемым директориям (например, /tmp или /var/tmp), которые доступны на запись "всему миру", вам могут помочь подключаемые модули аутентификации Linux® (PAM). При входе пользователей в систему модуль pam_namespace создаёт отдельное пространство имён. Это разделение выполняется на уровне операционной системы Linux, в результате пользователи оказываются защищены от нескольких типов атак. Эта статья предназначена для системных администраторов Linux. В ней показано, как с помощью PAM подключить механизм пространств имён.
Для повышения безопасности разумно использовать несколько способов защиты ("defense in depth" - глубоко эшелонированная защита). Таким образом, если один из способов защиты взломан, другой останется в рабочем состоянии и предотвратит дальнейшее вторжение. В этой статье описан способ, который позволит вам добавить ещё один уровень в вашу стратегию безопасности: использование PAM для включения механизма многоэкземплярности (polyinstantiation) совместно используемых директорий, доступных на запись "всему миру". Это означает, что для каждого пользователя создаётся новый экземпляр директории (например, /tmp).
Как работают PAM и многоэкземплярность
Во время входа в систему PAM создаёт (в пределах системного экземпляра директории /tmp) "многоэкземплярную" личную директорию /tmp; эта переадресация прозрачна для пользователя, входящего в систему. Пользователь видит "стандартную" директорию /tmp и имеет право на её чтение и запись как обычно. Пользователь не видит ни пространств /tmp других пользователей (включая пользователя root), ни настоящей файловой системы /tmp.
"Многоэкземплярные" пользовательские директории не могут быть скрыты или защищены от пользователя root. Если вы заинтересованы в таком уровне защиты, вам может помочь 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 ошибки "не смертельны", но не забудьте удалить эту опцию, как только вы закончите тестирование вашей конфигурации.
Источник: http://www.ibm.com |