RabbitMQ
This commit is contained in:
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal file
145
PostgreSQL/PostgreSQL_Vault_PAM_python.md
Normal file
@ -0,0 +1,145 @@
|
||||
Настройка авторизации через 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/<username> — путь к секрету.
|
||||
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/<version>/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()
|
||||
```
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user