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

          Если вы заинтересованы в защите от несанкционированного доступа к совместно используемым директориям (например, /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 ошибки не смертельны, но не забудьте удалить эту опцию, как только вы закончите тестирование вашей конфигурации.