Настройка авторизации через Vault при помощи PAM (Пароль для каждого из пользователей храняться в Vault) ------------------------------------------------------------------------------------------ Шаг 1: Настройка Vault для хранения паролей Vault будет хранить пароли существующих пользователей PostgreSQL в KV Secrets Engine. Включите KV Secrets Engine ```sh vault secrets enable -path=secret kv ``` Сохраните пароли пользователей: Для каждого пользователя PostgreSQL сохраните пароль в Vault. Например: ```sh vault kv put secret/postgres-users/user1 password="securepassword123" vault kv put secret/postgres-users/user2 password="anotherpassword456" ``` Здесь: secret/postgres-users/ — путь к секрету. password — поле, содержащее пароль. Настройте политики Vault: Создайте политику, которая позволяет Python-скрипту читать пароли: ```conf path "secret/data/postgres-users/*" { capabilities = ["read"] } ``` Примените политику: ```sh vault policy write postgres-auth postgres-auth-policy.hcl ``` Создайте токен Vault: Создайте токен для скрипта с доступом к политике: ```sh vault token create -policy=postgres-auth ``` Сохраните токен (например, в /etc/vault-token), чтобы скрипт мог его использовать. ------------------------------------------------------------------------------------------ Шаг 1: Настройка PostgreSQL для PAM Редактируем pg_hba.conf: В файле /etc/postgresql//main/pg_hba.conf добавьте строку: ```text 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: ```sh sudo systemctl restart postgresql ``` Создайте Python-скрипт (vault_auth.py), который будет вызываться PAM для проверки учетных данных через Vault. Пример: ```py #!/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() ``` Сделайте скрипт исполняемым: ```sh chmod +x /path/to/vault_auth.py ``` ```sh pip install hvac ``` Или передайте токен безопасно через файл (например, /etc/vault-token) и считывайте его в скрипте: ``` with open('/etc/vault-token', 'r') as f: vault_token = f.read().strip() ``` ----------------------------------------------------------------------------------------------------