Настройка Kerberos аутентификации в ЕПП, WSGI Apache2#

Исходные данные#

Имеется сервер контроллера домена FreeIPA:

  • имя домена astra.aaa

  • администратор домена admin@astra.aaa

  • пользователь домена user-01@astra.aaa

  • имя сервера dc-01.astra.aaa

  • сервер имеет постоянный IP-адрес, например, 192.168.1.20

Веб-сервер располагается отдельно:

  • имя сервера websrv-01.astra.aaa

  • сервер должен быть введен в домен

  • на сервере установлен и настроен web-сервер Apache2

  • сервер имеет постоянный IP-адрес, например, 192.168.1.21

Сервер базы данных располагается отдельно:

  • имя сервера dbsrv-01.astra.aaa

  • сервер должен быть введен в домен

  • на сервере должна быть установлена и настроенная СУБД Postgresql

  • сервер имеет постоянный IP-адрес, например, 192.168.1.23

Пользовательский компьютер располагается на отдельном компьютере:

  • имя компьютера pc-01.astra.aaa

  • компьютер должен быть введен в домен

  • компьютер имеет постоянный IP-адрес, например, 192.168.1.22

Основная концепция, реализация веб-приложения на языке программирования Python#

Пользователь домена со своего компьютера отправляет запрос c аутентификацией Kerberos, на сервер приложения Apache2. Веб сервер Apache2 производит аутентификацию пользователя, если аутентификация прошла успешно, то запускает WSGI приложение и создает делегируемый Kerberos кэш, если аутентификации прошла неуспешно выдает ошибку. Веб сервер Apache2 передаёт запрос веб приложению Flask. Веб приложение Flask добавляет в окружение переменную KRB5CCNAME и в строку подключения к базе данных имя пользователя взятые из заголовка запроса. Далее коннектор Psycopg2, режиме GSS, производит запрос к БД Postgresql. БД производит аутентификацию, если требуется авторизацию и отдаёт данные пользователю.

Настройка компьютера пользователя#

Для настройки компьютера пользователя необходимо перейти по ссылке и выполнить действия по инструкции:

Настройка сервера базы данных#

Для настройки сервера базы данных необходимо перейти по ссылке и выполнить действия по инструкции:

Установка и настройка веб-сервера Apache2#

Для установки и настройки веб-сервера Apache2 необходимо перейти по ссылке и выполнить действия по инструкции:

Установка веб-приложения#

Для установки и настройки веб-приложения необходимо:

Пункт 1#

  • установить следующие пакеты пакет:

sudo apt install python3-flask python3-psycopg2

Пункт 2#

  • создать по пути /var/www папку flask_app:

sudo mkdir /var/www/flask_app

Пункт 3#

  • развернуть приложение Flask, со структурой:

flask_app/
├── wsgi.py               # Точка входа в WSGI приложение
├── app/                  # Приложение
    ├── __init.py__       # Основной файл приложения
    ├── templates/        # HTML-шаблоны
    │   └── index.html
    └── static/           # Статические файлы (CSS, JS, изображения)
        ├── css/
        ├── js/
        └── images/

Пункт 4#

  • файл wsgi.py должен иметь следующее содержимое:

import os
import sys

# Добавляем директорию текущего файла в Python path
# Это необходимо для корректного импорта модуля app
sys.path.append(os.path.dirname(__file__))

# Импортируем функцию создания Flask-приложения
from app import create_app

# Создаем экземпляр Flask-приложения
flask_app = create_app()

def application(environ, start_response):
    """
    WSGI-интерфейс для интеграции с веб-сервером

    Args:
        environ (dict): Переменные окружения и параметры запроса
        start_response (callable): Функция для отправки HTTP-заголовков

    Returns:
        Ответ Flask-приложения

    Особенности:
        - Устанавливает переменную KRB5CCNAME для Kerberos-аутентификации
        - Передает управление основному Flask-приложению
    """
    # Настраиваем Kerberos credentials из окружения WSGI
    os.environ['KRB5CCNAME'] = environ['KRB5CCNAME']

    # Делегируем обработку запроса Flask-приложению
    return flask_app(environ, start_response)

Пункт 5#

  • файл __init.py__ должен иметь следующее содержимое:

from flask import Flask, render_template, request
import psycopg2

def create_app():
    """
    Фабрика для создания Flask-приложения с подключением к PostgreSQL
    с использованием Kerberos-аутентификации через GSSAPI.
    """
    # Создаем экземпляр Flask-приложения
    app = Flask(__name__)

    @app.route('/')
    def home():
        """
        Обработчик главной страницы, который:
        1. Устанавливает соединение с PostgreSQL используя Kerberos (GSSAPI)
        2. Выполняет тестовый запрос
        3. Возвращает результат в шаблон
        """

        # Параметры подключения к PostgreSQL
        conn_params = {
            "host": "dbsrv-01.astra.aaa",  # Хост сервера БД
            "user": request.environ.get("REMOTE_USER"),  # Логин из Kerberos
            "port": "5432",  # Стандартный порт PostgreSQL
            "dbname": "postgres",  # Имя базы данных
            "sslmode": "require",  # Обязательное использование SSL
            "gssencmode": "prefer"  # Предпочитать GSSAPI для шифрования
        }

        result = ""  # Переменная для хранения результата запроса

        try:
            # Устанавливаем соединение с базой данных
            conn = psycopg2.connect(**conn_params)

            # Создаем курсор для выполнения запросов
            cursor = conn.cursor()

            # Выполняем тестовый запрос для получения версии PostgreSQL
            cursor.execute("SELECT version();")

            # Получаем результат (первая строка, первый столбец)
            result = cursor.fetchone()[0]

        except psycopg2.Error as e:
            # Обработка ошибок подключения/запросов
            result = f"Ошибка при подключении к PostgreSQL: {e}"

        finally:
            # Всегда закрываем соединение, если оно было установлено
            if conn:
                cursor.close()
                conn.close()

        # Рендерим шаблон с результатом запроса
        return render_template("index.html", result=result)

    return app  # Возвращаем созданное приложение

Пункт 6#

  • файл index.html должен иметь следующее содержимое:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>{{ result }}</div>
</body>
</html>

Тестирование веб-приложения#

Пункт 1#

  • запустите предварительно настроенный браузер и вставьте следующую ссылку:

http:\\websrv-01.astra.aaaa

Пункт 2#

  • возвращённая страница должна содержать ответ:

PostgreSQL 15.6 (Debian 15.6-astra.se2+b1) on x86_64-pc-linux-gnu, compiled by gcc (Astra 12.2.0-14.astra3+b1) 12.2.0, 64-bit