Files
Ubuntu_docs/PostgreSQL/PostgreSQL_Vault_PAM_python.md
2025-10-02 18:16:29 +05:00

4.9 KiB
Raw Blame History

Настройка авторизации через Vault при помощи PAM (Пароль для каждого из пользователей храняться в Vault)


Шаг 1: Настройка Vault для хранения паролей Vault будет хранить пароли существующих пользователей PostgreSQL в KV Secrets Engine.

Включите KV Secrets Engine

vault secrets enable -path=secret kv

Сохраните пароли пользователей: Для каждого пользователя PostgreSQL сохраните пароль в Vault. Например:

vault kv put secret/postgres-users/user1 password="securepassword123"
vault kv put secret/postgres-users/user2 password="anotherpassword456"

Здесь:

secret/postgres-users/ — путь к секрету. password — поле, содержащее пароль.

Настройте политики Vault: Создайте политику, которая позволяет Python-скрипту читать пароли:

path "secret/data/postgres-users/*" {
    capabilities = ["read"]
}

Примените политику:

vault policy write postgres-auth postgres-auth-policy.hcl

Создайте токен Vault: Создайте токен для скрипта с доступом к политике:

vault token create -policy=postgres-auth

Сохраните токен (например, в /etc/vault-token), чтобы скрипт мог его использовать.


Шаг 1: Настройка PostgreSQL для PAM

Редактируем pg_hba.conf: В файле /etc/postgresql//main/pg_hba.conf добавьте строку:

host all all 0.0.0.0/0 pam pamservice=postgresql

Создаем PAM-конфигурацию: Создайте файл /etc/pam.d/postgresql:

auth required pam_exec.so /path/to/vault_auth.py
account required pam_permit.so

Перезапустите PostgreSQL:

sudo systemctl restart postgresql

Создайте Python-скрипт (vault_auth.py), который будет вызываться PAM для проверки учетных данных через Vault. Пример:

#!/usr/bin/env python3
import os
import sys
import hvac

def authenticate_with_vault(username, password):
    try:
        # Чтение токена Vault
        vault_token = os.getenv('VAULT_TOKEN')
        if vault_token is None or vault_token == "":
            try:
                with open('/etc/vault-token', 'r') as f:
                    vault_token = f.read().strip()
            except FileNotFoundError:
                print("Error: Vault token file /etc/vault-token not found", file=sys.stderr)
                return False
            except Exception as e:
                print(f"Error reading vault token file: {e}", file=sys.stderr)
                return False

        if not vault_token:
            print("Error: Vault token is empty", file=sys.stderr)
            return False

        # Инициализация клиента Vault
        client = hvac.Client(url='http://127.0.0.1:8200', token=vault_token)

        # Запрашиваем пароль из Vault
        secret_path = f"secret/data/postgres-users/{username}"
        response = client.secrets.kv.v2.read_secret_version(path=secret_path)

        # Получаем хранимый пароль
        stored_password = response['data']['data']['password']

        # Сравниваем введенный пароль с хранимым
        return stored_password == password
    except Exception as e:
        print(f"Authentication failed: {e}", file=sys.stderr)
        return False

def main():
    # PAM передает имя пользователя через переменную окружения
    username = os.getenv('PAM_USER')
    # Пароль читается из стандартного ввода
    password = sys.stdin.readline().strip()

    if authenticate_with_vault(username, password):
        sys.exit(0)  # Успешная аутентификация
    else:
        sys.exit(1)  # Ошибка аутентификации

if __name__ == "__main__":
    main()

Сделайте скрипт исполняемым:

chmod +x /path/to/vault_auth.py
pip install hvac

Или передайте токен безопасно через файл (например, /etc/vault-token) и считывайте его в скрипте:

with open('/etc/vault-token', 'r') as f:
    vault_token = f.read().strip()