повышение безопасности с помощью многоэкземплярности директорий
Если вы заинтересованы в защите от несанкционированного доступа к совместно используемым директориям (например, /tmp или /var/tmp), которые доступны на запись "всему миру", вам могут помочь подключаемые модули аутентификации Linux (PAM). При входе пользователей в систему модуль pam_namespace создает отдельное пространство имен. Это разделение выполняется на уровне операционной системы Linux, в результате пользователи оказываются защищены от нескольких типов атак. Эта статья предназначена для системных администраторов Linux. В ней показано, как с помощью PAM подключить механизм пространств имен.
Для повышения безопасности разумно использовать несколько способов защиты (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 или нет.
включение механизма многоэкземплярности
В этом разделе показано, как включить многоэкземплярность директории /tmp и /var/tmp для пользователей вашей системы. Также вы найдете здесь описание дополнительных настроек, необходимых для корректной работы X Windows и графического менеджера экрана. В этой статье я использовал дистрибутив Red Hat Enterprise Linux 5.1 (RHEL 5.1), но вы можете использовать описанные здесь процедуры в любом дистрибутиве Linux, который имеет в своем составе модуль pam_namespace.
редактируем 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.
Итак, для примера создадим индивидуальные экземпляры пространств имен /tmp и /var/tmp для каждого пользователя в системе, за исключением пользователей root и adm.
#$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, нужно добавить модуль, показано ниже:
#%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
Добавление модуля 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.
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.
#%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, показано ниже.
Консольная сессия с точки зрения пользователя:
[robb@testbox tmp]$ cd /tmp
[robb@testbox tmp]$ touch foo
[robb@testbox tmp]$ ls
foo
Консольная сессия с точки зрения системы (пользователя 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 ошибки "не смертельны", но не забудьте удалить эту опцию, как только вы закончите тестирование вашей конфигурации.
Роб Романс, инженер-программист, IBM.
Для повышения безопасности разумно использовать несколько способов защиты (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 или нет.
включение механизма многоэкземплярности
В этом разделе показано, как включить многоэкземплярность директории /tmp и /var/tmp для пользователей вашей системы. Также вы найдете здесь описание дополнительных настроек, необходимых для корректной работы X Windows и графического менеджера экрана. В этой статье я использовал дистрибутив Red Hat Enterprise Linux 5.1 (RHEL 5.1), но вы можете использовать описанные здесь процедуры в любом дистрибутиве Linux, который имеет в своем составе модуль pam_namespace.
редактируем 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.
Итак, для примера создадим индивидуальные экземпляры пространств имен /tmp и /var/tmp для каждого пользователя в системе, за исключением пользователей root и adm.
#$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, нужно добавить модуль, показано ниже:
#%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
Добавление модуля 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.
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.
#%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, показано ниже.
Консольная сессия с точки зрения пользователя:
[robb@testbox tmp]$ cd /tmp
[robb@testbox tmp]$ touch foo
[robb@testbox tmp]$ ls
foo
Консольная сессия с точки зрения системы (пользователя 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 ошибки "не смертельны", но не забудьте удалить эту опцию, как только вы закончите тестирование вашей конфигурации.
Роб Романс, инженер-программист, IBM.
Сетевые решения. Статья была опубликована в номере 06 за 2008 год в рубрике sysadmin