Веб-приложения в защищённой среде

В последнее время в «Вопросах и ответах» часто спрашивают о различных нюансах работы 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 и использование мандатной защиты, необходимо:

  1. Создать принципала для сервиса:
    ald-admin service-add HTTP/<сервер>
  2. Добавить его в группу mac:
    ald-admin sgroup-svc-add HTTP/<сервер> --sgroup=mac
  3. Создать файл ключей:
    ald-client update-svc-keytab HTTP/<сервер> --ktfile=/etc/apache2/keytab
  4. И установить на него режим доступа 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 необходимо:

  1. Настроить сайт в веб-сервере Apache;
  2. Настроить приложение 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. Поскольку речь идет о мандатной защите, могут использоваться следующие модули кэширования:

  1. СУБД (PostgreSQL);
  2. Файловый кэш.

В обоих случаях необходимо настроить мандатные атрибуты на контейнер (БД и каталог соответственно).

При использовании для кэша PostgreSQL возможны две стратегии использования Kerberos (посредством GSS-API) при аутентификации в PostgreSQL:

  1. Использование данных аутентификации (билетов) пользователя.
  2. Делегирование полномочий веб-приложению.

Пример сайта для 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 для аутентификации пользователей, авторизация в веб-приложении может быть выполнена стандартными функциями ППИ.

Получения идентификатора пользователя возможно двумя путями:

  1. Получение UID процесса.
  2. Получение учетной записи из 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))

3 Comments

  1. Андрей

    Спасибо за статью, отличное изложение. Но остаётся вопрос, как из приложения на Python подключиться к базе PostgreSQL от клиента с грифом, работающим в секретном режиме? В настоящее время, всё замечательно работает только под 0-ым режимом. При попытке подключения в режиме, отличного от 0 — ошибка 500.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *