В последнее время в «Вопросах и ответах» часто спрашивают о различных нюансах работы Apache, WSGI и веб-приложений в Astra Linux Special Edition.
Работа веб-приложений в ОС СН Astra Linux Special Edition имеет ряд особенностей, обусловленных наличием мандатного разграничения доступом и режимов аутентификации пользователей.
Разработчик веб-приложения вправе самостоятельно решать вопросы идентификации и аутентификации пользователей его системы. Однако, при разработке подобных функций следует учесть возникающую необходимость сертификации разрабатываемых программных средств по требованиям отсутствия несанкционированного доступа (НСД) к данным.
Мы рекомендуем использовать встроенные механизмы защиты и идентификации пользователей с помощью защищённого веб-сервера Apache. Штатный веб-сервер Astra Linux Special Edition требует принудительной аутентификации во всех случаях взаимодействия и обеспечивает мандатное разграничение доступа.
Для разработчиков и администраторов предлагаются два механизма:
- PAM (использование базы локальных пользователей);
- ALD (использование базы доменных пользователей).
В основе PAM-аутентификации лежит метод простой аутентификации протокола HTTP (RFC 7617). Для использования в распределенных сетевых системах более подходящим является метод на базе протокола GSS-API (SPNEGO) с использованием механизма Kerberos.
Для того, чтобы настроить Apache на аутентификацию по Kerberos и использование мандатной защиты, необходимо:
- Создать принципала для сервиса:
ald-admin service-add HTTP/<сервер>
- Добавить его в группу mac:
ald-admin sgroup-svc-add HTTP/<сервер> --sgroup=mac
- Создать файл ключей:
ald-client update-svc-keytab HTTP/<сервер> --ktfile=/etc/apache2/keytab
- И установить на него режим доступа 0644 для пользователя и группы www-data.
WSGI
После подключения пользователя Apache выполняет аутентификацию пользователя и определяет мандатные атрибуты подключения. После этого запрос обрабатывается процессом-обработчиком с UID аутентифицированного пользователя и соответствующими мандатными аттрибутами.
Модуль mod_wsgi для работы с приложениями WSGI присутствует в дистрибутиве ОС. Штатно поддерживается аутентификация и учитываются мандатные метки. Особенностью mod_wsgi в Astra Linux SE является возможность работы только в режиме embbeded. Т.о. при каждом запросе сервер в принудительном порядке создает процесс для запроса пользователя и происходит загрузка приложения. На данный процесс устанавливается мандатные атрибуты и UID подключенного пользователя.
Веб-сервер Apache из состава Astra Linux Special Edition запускает приложения WSGI для каждого пользовательского запроса. Такой подход обеспечивает необходимые условия для работы мандатной защиты данных. Следствием является увеличение потребления ресурсов и времени ответа на запросы.
Существует возможность использования запущенного WSGI-процесса для обработки последовательности запросов от пользователя в рамках постоянного HTTP-соединения. Веб-сервер не завершает запущенные обработчики WSGI в пределах параметра KeepAliveTimeout. Клиенты могут повторно использовать установленное соединение для ускорения обработки запросов.
Приложение Django
Настройка Django-приложения необходима для работы с переменной окружения REMOTE_USER, через которую Apache передает в веб-приложение идентификатор аутентифицированного пользователя.
Для этого необходимо в файле settings.py приложения указать следующие параметры:
MIDDLEWARE_CLASSES = ( '...', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.RemoteUserMiddleware', '...', ) AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.RemoteUserBackend', )
Аутентификация по Kerberos
Для правильной работы аутентификации по Kerberos необходимо:
- Настроить сайт в веб-сервере Apache;
- Настроить приложение Django.
Настройка сайта сводится к указанию типа аутентификации для обслуживаемого каталога:
<Directory /> AuthType Kerberos Krb5Keytab /etc/apache2/keytab KrbMethodNegotiate on KrbMethodK5Passwd off Require valid-user Order allow,deny Allow from all Require all granted </Directory>
При использовании аутентификации по Kerberos (Astra Linux Directory) возникает необходимость получения билетов для подключения к внутренним модулям и сервисам, скрытым от пользователя. Для каждого подключения необходимо получить билет Kerberos на основе пользовательского запроса, что влечет за собой обращение к Kerberos KDC. Получается, что один пользовательский запрос приводит к необходимости нескольких запросов в Kerberos и, скорее всего, в LDAP.
Естественным способом повышения производительности служит использования функций кэширования, предоставляемых библиотекой Django. Поскольку речь идет о мандатной защите, могут использоваться следующие модули кэширования:
- СУБД (PostgreSQL);
- Файловый кэш.
В обоих случаях необходимо настроить мандатные атрибуты на контейнер (БД и каталог соответственно).
При использовании для кэша PostgreSQL возможны две стратегии использования Kerberos (посредством GSS-API) при аутентификации в PostgreSQL:
- Использование данных аутентификации (билетов) пользователя.
- Делегирование полномочий веб-приложению.
Пример сайта для Apache
Listen *:8004 <VirtualHost *:8004> WSGIScriptAlias / /usr/share/myapp/app.wsgi DocumentRoot /usr/share/myapp <Directory "/"> Options Includes FollowSymLinks MultiViews Order allow,deny Allow from all Require all granted KrbSaveCredentials on AuthType Kerberos KrbAuthRealms LAB50 Krb5Keytab /etc/apache2/keytab KrbMethodNegotiate on KrbMethodK5Passwd off require valid-user </Directory> Alias /media /tmp Alias /static /usr/share/myapp/data/static LogLevel info ErrorLog /var/log/apache2/myapp.err CustomLog /var/log/apache2/myapp.log common </VirtualHost>
Авторизация пользователей в веб-приложении
При использовании ALD для аутентификации пользователей, авторизация в веб-приложении может быть выполнена стандартными функциями ППИ.
Получения идентификатора пользователя возможно двумя путями:
- Получение UID процесса.
- Получение учетной записи из REMOTE_USER.
Самый простой способ авторизации — использование групп ALD. В этом случае возможно использовать стандартные функции: pwd.getpwnam, grp.getgrgid и др. Такой подход исключает необходимость непосредственного обращения в базу LDAP.
Получение метки текущего процесса
При создании сложных веб-приложений возникает задача получения мандатной метки пользователя. Получить мандатную метку в WSGI приложении можно используя библиотеку python-parsec.
Исходный код доступен по адресу https://github.com/laboratory50/python-parsec.
Пример:
import parsec mac = parsec.mac_get_pid(0) print "Мандатная метка данного процесса '{}'.".format(parsec.mac_to_text(mac))
Спасибо администрации за данную статью.
Спасибо за статью, отличное изложение. Но остаётся вопрос, как из приложения на Python подключиться к базе PostgreSQL от клиента с грифом, работающим в секретном режиме? В настоящее время, всё замечательно работает только под 0-ым режимом. При попытке подключения в режиме, отличного от 0 — ошибка 500.
Андрей, а как вы пытаетесь осуществить подключение в приложении? У меня получалось подключаться с помощью библиотеки psycopg2.
а никто не сталкивался с тем что apach и wsgi не берут настройки parsec_caps
и в результате процессы создаваемые страницей под пользователем не имеют привилегий caps .. не знаете как это можно обойти ?
Вот извращения то. Kerberos авторизация в Apache… ЗАЧЕМ???