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

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

Имеется сервер контроллера домена 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 производит аутентификацию пользователя, если аутентификация прошла успешно, то проксирует запрос с добавленными заголовками на веб сервер Gunicorn и создает делегируемый Kerberos кэш, если аутентификации прошла неуспешно выдает ошибку. Веб сервер Gunicorn передаёт запрос веб приложению Flask. Веб приложение Flask добавляет в окружение переменную KRB5CCNAME и в строку подключения к базе данных имя пользователя взятые из заголовка запроса. Далее коннектор Psycopg2, режиме GSS, производит запрос к БД Postgresql. БД производит аутентификацию, если требуется авторизацию и отдаёт данные пользователю.

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

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

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

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

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

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

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

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

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

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

Пункт 1#

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

sudo apt install flask psycopg2

Пункт 2#

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

sudo mkdir /var/www/flask_app

Пункт 3#

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

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

Пункт 4#

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

from flask import Flask, render_template, request
import psycopg2
import os

app = Flask(__name__)

@app.route('/')
def home():

    # Получение имени пользователя из запроса
    user = request.environ.get("HTTP_X_REMOTE_USER")

    # Получение пути к kerberos кэшу и запись его в окружение
    krb_path = request.environ.get("HTTP_X_KRB5CCNAME")
    os.environ["HTTP_X_KRB5CCNAME"] = krb_path

    # Параметры подключения
    conn_params = {
        "dbname": "postgres",
        "user": f"{ user }",  # Укажите имя пользователя PostgreSQL
        "host": "dbsrv-01.astra.bbb",
        "port": "5432",
        "sslmode": "require",  # Опционально, если используется SSL
        "gssencmode": "prefer",  # Использовать GSSAPI для шифрования
    }

    result = ""

    # Подключение к базе данных
    try:
        conn = psycopg2.connect(**conn_params)
        cursor = conn.cursor()

        # Пример выполнения запроса
        cursor.execute("SELECT version();")
        result = cursor.fetchone()

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

    finally:
        if conn:
            cursor.close()
            conn.close()
    return render_template('index.html', result=result)

if __name__ == '__main__':
    app.run()

Пункт 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: 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