4.9 KiB
Настройка авторизации через 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()