Настройка 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