Как настроить сервер - контроллер домена ALD и подключиться к нему клиентом в статье Настройка входа в систему с Astra Linux Directory.

Устанавливаем web-сервер (если еще не установлен), нужные нам модули apache и пакет с django

$ sudo apt-get install apache2 libapache2-mod-auth-kerb libapache2-mod-python python-django

Включаем модули apache, с которыми будем работать, отключаем лишний auth_pam, если ранее с ним работали, затем запускаем web-сервер

$ sudo a2dismod auth_pam
$ sudo a2enmod python
$ sudo a2enmod auth_kerb
$ sudo service apache2 reload

Создаем принципала в ALD и добавляем его в группу mac

$ sudo ald-admin service-add HTTP/ald-server.example.ru
$ sudo ald-admin sgroup-svc-add HTTP/ald-server.example.ru --sgroup=mac

Создаем файл ключа Kerberos и даем на него права пользователю www-data

$ KEYTAB="/etc/apache2/keytab"
$ sudo ald-client update-svc-keytab HTTP/ald-server.example.ru --ktfile=$KEYTAB
$ sudo chown www-data $KEYTAB
$ sudo chmod 644 $KEYTAB

Блокируем дефолтный виртуальный сайт, конфигурация которого создается по-умолчанию и создаем в /etc/apache2/sites-available/ свой конфигурационный файл astra-django-project для виртуального хоста

$ sudo a2dissite default
$ sudo vim /etc/apache2/sites-available/astra-django-project

Файл astra-django-project

<VirtualHost *:80>
    ServerName   ald-server.example.ru
    ServerAdmin  useradmin@example.ru
    DocumentRoot /var/www/django_site

    AddDefaultCharset utf-8

    <Directory /var/www/django_site>
        Options -Indexes FollowSymLinks -MultiViews
        AllowOverride None

        AuthType Kerberos
        KrbAuthRealms EXAMPLE.RU
        KrbServiceName HTTP/ald-server.example.ru
        Krb5Keytab /etc/apache2/keytab
        KrbMethodNegotiate on
        KrbMethodK5Passwd off
        KrbSaveCredentials on
        require valid-user

        Order deny,allow
        Allow from all
    </Directory>

    <Location "/">
        SetHandler    python-program
        PythonHandler django.core.handlers.modpython
        SetEnv        DJANGO_SETTINGS_MODULE django_site.settings
       PythonOption  diango.root /var/www/django_site
        PythonPath    "['/var/www/django_site/',] + sys.path"
        PythonAutoReload On
    </Location>

    <Location "/media/”>
        SetHandler None
    </Location>

    <Location "/static/">
        SetHandler None
    </Location>

    <LocationMatch "\.(jpg|gif|png)$">
        SetHandler None
    </LocationMatch>

    ErrorLog /var/www/django_site/log/error.log
    LogLevel debug
    SetEnvIf Request_URI "\.jpg$|\.gif$|\.css$|\.js" is_static
    CustomLog /var/www/django_site/log/access.log combined env=!is_static
</VirtualHost>

Добавляем созданную конфигурацию

$ sudo a2ensite astra-django-project

Но перезапускать apache еще рано, теперь надо создать наше django-приложение

$ cd /var/www/
$ sudo django-admin startproject django_site
$ cd django_site
$ sudo python manage.py startapp app

Создаем каталог для log-файлов, назначаем мандатные атрибуты каталогу с виртуальным сервером и перезапускаем web-сервер

$ cd django_site
$ sudo pdpl-file 3:0:0xffffffffffffffff:ccnr /var/www/  
$ sudo pdpl-file 3:0:0xffffffffffffffff:ccnr /var/www/django_site/
$ sudo service apache2 restart

На любом компьютере, который должен выступать в роли клиента, в firefox включаем negotiate авторизацию. Для чего открыть страницу about:config и добавить http:// в параметр network.negotiate-auth.trusted-uris.

Если все сделано правильно, то в браузере клиента, авторизованного через ald при обращении к http://ald-server.example.ru покажется стандартная начальная страница django.

Данные пользователя, в отличии от работы с PAM, передаются в зашифрованном виде, на сервере они расшифровываются и становятся доступны из стандартных http-заголовков. Напишем простое приложение, которое показываем имя пользователя, зашедшего на сервер.

В /var/www/django_site/django_site/settings.py добавляем наше приложение app

...
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'app',
)
...

В /var/www/django_site/app/views.py создаем функцию, которое будет возвращать текущее время и авторизованного пользователя из request.META['REMOTE_USER']

from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s. User: %s </body></html>" % (now, request.META['REMOTE_USER'])
    return HttpResponse(html)

В /var/www/django_site/django_site/urls.py создаем маршрут к нашему view

from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^$', 'app.views.current_datetime'),
)

Результат

Для проверки работы мандатных ограничений можно провести эксперимент на конфигурации виртуального сервера default. Деактивируем виртуальный сервер с django, добавим проверочную конфигурацию и перезапустим web-сервер

$ sudo a2dissite astra-django-project
$ sudo a2ensite default
$ sudo service apache2 reload

На контроллере домена нужно создать доменного пользователя, и выставить ему ненулевой "максимальный уровень конфиденциальности" (например, 1). На компьютере - web-сервере в папке виртуального сервера например /var/www/ создать 2 файла и установить ненулевую мандатную метку на файл 1.html

echo "Hello world! 0" | sudo tee /var/www/0.html  
echo "Hello world! 1" | sudo tee /var/www/1.html  
sudo pdpl-file 1:0:0 /var/www/1.html

После чего зайти на клиентский компьютер под пользовательской доменной учетной записью с нулевым уровнем конфиденциальности и попытаться получить доступ к странице с ненулевым уровнем конфиденциальности http://ald-server.example.ru/1.html.

Результатом должен стать отказ в доступе. При этом в диагностическом сообщении об ошибке будет указано, что объект не найден (ошибка 404), и не будет указана ошибка 403 (недостаточно прав). Такая диагностика исключает передачу информации о существовании объектов с высоким уровнем конфиденциальности, перекрывая возможный канал утечки информации.

Доступ к странице с нулевым уровнем конфиденциальности http://ald-server.example.ru/0.html должен предоставляться.

При входе на клиентский компьютер под пользовательской доменной учетной записью с ненулевым уровнем конфиденциальности должны быть доступны обе страницы.