Как использовать Vault для создания учетных данных Postgres для Flask

В этом руководстве мы рассмотрим быстрый реальный пример использования хранилища Hashicorp и Consul для создания динамических учетных данных Postgres для веб-приложения Flask.

Предпосылки

Перед началом у вас должно быть:

  1. Базовые навыки работы с секретами в Vault и Consul.
  2. Экземпляр Vault, развернутый с серверной частью хранилища .
  3. Развернут сервер Postgres.
  4. Раньше работал с Flask и Docker.

Начиная

Начнем с простого веб-приложения Flask.

Если вы хотите продолжить, скопируйте репозиторий vault-consul-flask , а затем проверьте ветку v1 :

$ git clone https://github.com/testdrivenio/vault-consul-flask --branch v1 --single-branch
$ cd vault-consul-flask

Взгляните на код:

├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── manage.py
├── project
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── models.py
│   │   └── users.py
│   └── config.py
└── requirements.txt

По сути, чтобы это приложение работало, нам нужно добавить следующие переменные среды в файл .env (что мы вскоре и сделаем):

  1. DB_USER
  2. DB_PASSWORD
  3. DB_SERVER

проект/config.py :

import os

USER = os.environ.get('DB_USER')
PASSWORD = os.environ.get('DB_PASSWORD')
SERVER = os.environ.get('DB_SERVER')


class ProductionConfig():
    """Production configuration"""
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = f'postgresql://{USER}:{PASSWORD}@{SERVER}:5432/users_db'

Настройка хранилища

Опять же, если вы хотите продолжить, у вас должен быть развернут экземпляр Vault с серверной частью хранилища . Этот экземпляр также должен быть инициализирован и распечатан. Хотите быстро запустить кластер? Запустите скрипт deploy.sh из vault-consul-swarm , чтобы развернуть кластер Vault и Consul в трех дроплетах DigitalOcean. Подготовка и развертывание займет менее пяти минут!

Сначала войдите в Vault (при необходимости), а затем включите серверную часть секретов базы данных из интерфейса командной строки Vault :

$ vault secrets enable database

Success! Enabled the database secrets engine at: database/

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

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@<ENDPOINT>:5432/users_db" \
    allowed_roles="mynewrole" \
    username="<USERNAME>" \
    password="<PASSWORD>"

Вы заметили, что в URL есть шаблоны для usernameи passwordв нем? Это используется для предотвращения прямого доступа для чтения к паролю и включения ротации учетных данных.

Обязательно обновите конечную точку базы данных, а также имя пользователя и пароль. Например:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@users-db.c7vzuyfvhlgz.us-east-1.rds.amazonaws.com:5432/users_db" \
    allowed_roles="mynewrole" \
    username="vault" \
    password="lOfon7BA3uzZzxGGv36j"

Это создало новый путь секретов в «database/config/users_db»:

$ vault list database/config

Keys
----
users_db

Затем создайте новую роль с именем mynewrole:

$ vault write database/roles/mynewrole \
    db_name=users_db \
    creation_statements="CREATE ROLE \"{{name}}\" \
        WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Success! Data written to: database/roles/mynewrole

Здесь мы сопоставили mynewroleимя в Vault с оператором SQL, который при запуске создаст нового пользователя со всеми разрешениями в базе данных. Имейте в виду, что это еще не создало нового пользователя. Обратите внимание на значение по умолчанию и максимальное значение TTL.

Теперь мы готовы создавать новых пользователей.

Создание учетных данных

Взгляните на то, какие пользователи у вас есть psql:

$ \du

Создайте новый файл с именем run.sh в корне проекта:

#!/bin/sh

rm -f .env

echo DB_SERVER=<DB_ENDPOINT> >> .env

user=$(curl  -H "X-Vault-Token: $VAULT_TOKEN" \
        -X GET http://<VAULT_ENDPOINT>:8200/v1/database/creds/mynewrole)
echo DB_USER=$(echo $user | jq -r .data.username) >> .env
echo DB_PASSWORD=$(echo $user | jq -r .data.password) >> .env

docker-compose up -d --build

Таким образом, это вызовет Vault API для создания нового набора учетных данных из /credsконечной точки. Последующий ответ анализируется с помощью JQ, и учетные данные добавляются в файл .env . Обязательно обновите конечные точки базы данных ( DB_ENDPOINT) и Vault ( VAULT_ENDPOINT).

Добавьте VAULT_TOKENпеременную среды:

$ export VAULT_TOKEN=<YOUR_VAULT_TOKEN>

Создайте образ и запустите контейнер:

$ sh run.sh

Убедитесь, что переменные среды были успешно добавлены:

$ docker-compose exec web env

Вы также должны увидеть этого пользователя в базе данных:

Role name                                   | Attributes                                  | Member of
--------------------------------------------+---------------------------------------------+----------
 v-root-mynewrol-jC8Imdx2sMTZj03-1533704364 | Password valid until 2018-08-08 05:59:29+00 | {}

usersСоздайте и заполните таблицу базы данных :

$ docker-compose run web python manage.py recreate-db
$ docker-compose run web python manage.py seed-db

Проверьте это в браузере по адресу http://localhost:5000/users :

{
  "status": "success",
  "users": [{
    "active": true,
    "admin": false,
    "email": "michael@notreal.com",
    "id": 1,
    "username": "michael"
  }]
}

Снесите контейнеры, как только закончите:

$ docker-compose down

Вывод

Вот и все!

Помните, что в этом примере учетные данные действительны только в течение часа. Это идеально подходит для коротких, динамичных, разовых задач. Если у вас есть более длинные задачи, вы можете настроить задание cron для запуска сценария run.sh каждый час для получения новых учетных данных. Просто имейте в виду, что максимальный TTL установлен на 24 часа.

Вы также можете рассмотреть возможность использования envconsul для размещения учетных данных в среде для Flask. Он может даже перезапустить Flask при обновлении учетных данных.

Вы можете найти окончательный код в репозитории vault-consul-flask .

Источник:  https://testdriven.io

#flask #vault #postgre 

What is GEEK

Buddha Community

Как использовать Vault для создания учетных данных Postgres для Flask

Как использовать Vault для создания учетных данных Postgres для Flask

В этом руководстве мы рассмотрим быстрый реальный пример использования хранилища Hashicorp и Consul для создания динамических учетных данных Postgres для веб-приложения Flask.

Предпосылки

Перед началом у вас должно быть:

  1. Базовые навыки работы с секретами в Vault и Consul.
  2. Экземпляр Vault, развернутый с серверной частью хранилища .
  3. Развернут сервер Postgres.
  4. Раньше работал с Flask и Docker.

Начиная

Начнем с простого веб-приложения Flask.

Если вы хотите продолжить, скопируйте репозиторий vault-consul-flask , а затем проверьте ветку v1 :

$ git clone https://github.com/testdrivenio/vault-consul-flask --branch v1 --single-branch
$ cd vault-consul-flask

Взгляните на код:

├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── manage.py
├── project
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── models.py
│   │   └── users.py
│   └── config.py
└── requirements.txt

По сути, чтобы это приложение работало, нам нужно добавить следующие переменные среды в файл .env (что мы вскоре и сделаем):

  1. DB_USER
  2. DB_PASSWORD
  3. DB_SERVER

проект/config.py :

import os

USER = os.environ.get('DB_USER')
PASSWORD = os.environ.get('DB_PASSWORD')
SERVER = os.environ.get('DB_SERVER')


class ProductionConfig():
    """Production configuration"""
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = f'postgresql://{USER}:{PASSWORD}@{SERVER}:5432/users_db'

Настройка хранилища

Опять же, если вы хотите продолжить, у вас должен быть развернут экземпляр Vault с серверной частью хранилища . Этот экземпляр также должен быть инициализирован и распечатан. Хотите быстро запустить кластер? Запустите скрипт deploy.sh из vault-consul-swarm , чтобы развернуть кластер Vault и Consul в трех дроплетах DigitalOcean. Подготовка и развертывание займет менее пяти минут!

Сначала войдите в Vault (при необходимости), а затем включите серверную часть секретов базы данных из интерфейса командной строки Vault :

$ vault secrets enable database

Success! Enabled the database secrets engine at: database/

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

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@<ENDPOINT>:5432/users_db" \
    allowed_roles="mynewrole" \
    username="<USERNAME>" \
    password="<PASSWORD>"

Вы заметили, что в URL есть шаблоны для usernameи passwordв нем? Это используется для предотвращения прямого доступа для чтения к паролю и включения ротации учетных данных.

Обязательно обновите конечную точку базы данных, а также имя пользователя и пароль. Например:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@users-db.c7vzuyfvhlgz.us-east-1.rds.amazonaws.com:5432/users_db" \
    allowed_roles="mynewrole" \
    username="vault" \
    password="lOfon7BA3uzZzxGGv36j"

Это создало новый путь секретов в «database/config/users_db»:

$ vault list database/config

Keys
----
users_db

Затем создайте новую роль с именем mynewrole:

$ vault write database/roles/mynewrole \
    db_name=users_db \
    creation_statements="CREATE ROLE \"{{name}}\" \
        WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Success! Data written to: database/roles/mynewrole

Здесь мы сопоставили mynewroleимя в Vault с оператором SQL, который при запуске создаст нового пользователя со всеми разрешениями в базе данных. Имейте в виду, что это еще не создало нового пользователя. Обратите внимание на значение по умолчанию и максимальное значение TTL.

Теперь мы готовы создавать новых пользователей.

Создание учетных данных

Взгляните на то, какие пользователи у вас есть psql:

$ \du

Создайте новый файл с именем run.sh в корне проекта:

#!/bin/sh

rm -f .env

echo DB_SERVER=<DB_ENDPOINT> >> .env

user=$(curl  -H "X-Vault-Token: $VAULT_TOKEN" \
        -X GET http://<VAULT_ENDPOINT>:8200/v1/database/creds/mynewrole)
echo DB_USER=$(echo $user | jq -r .data.username) >> .env
echo DB_PASSWORD=$(echo $user | jq -r .data.password) >> .env

docker-compose up -d --build

Таким образом, это вызовет Vault API для создания нового набора учетных данных из /credsконечной точки. Последующий ответ анализируется с помощью JQ, и учетные данные добавляются в файл .env . Обязательно обновите конечные точки базы данных ( DB_ENDPOINT) и Vault ( VAULT_ENDPOINT).

Добавьте VAULT_TOKENпеременную среды:

$ export VAULT_TOKEN=<YOUR_VAULT_TOKEN>

Создайте образ и запустите контейнер:

$ sh run.sh

Убедитесь, что переменные среды были успешно добавлены:

$ docker-compose exec web env

Вы также должны увидеть этого пользователя в базе данных:

Role name                                   | Attributes                                  | Member of
--------------------------------------------+---------------------------------------------+----------
 v-root-mynewrol-jC8Imdx2sMTZj03-1533704364 | Password valid until 2018-08-08 05:59:29+00 | {}

usersСоздайте и заполните таблицу базы данных :

$ docker-compose run web python manage.py recreate-db
$ docker-compose run web python manage.py seed-db

Проверьте это в браузере по адресу http://localhost:5000/users :

{
  "status": "success",
  "users": [{
    "active": true,
    "admin": false,
    "email": "michael@notreal.com",
    "id": 1,
    "username": "michael"
  }]
}

Снесите контейнеры, как только закончите:

$ docker-compose down

Вывод

Вот и все!

Помните, что в этом примере учетные данные действительны только в течение часа. Это идеально подходит для коротких, динамичных, разовых задач. Если у вас есть более длинные задачи, вы можете настроить задание cron для запуска сценария run.sh каждый час для получения новых учетных данных. Просто имейте в виду, что максимальный TTL установлен на 24 часа.

Вы также можете рассмотреть возможность использования envconsul для размещения учетных данных в среде для Flask. Он может даже перезапустить Flask при обновлении учетных данных.

Вы можете найти окончательный код в репозитории vault-consul-flask .

Источник:  https://testdriven.io

#flask #vault #postgre 

如何使用 Vault 為 Flask 應用程序創建 Postgres 憑據

在本教程中,我們將看一個使用 Hashicorp 的VaultConsul為 Flask Web 應用程序創建動態 Postgres 憑據的快速真實示例。

先決條件

在開始之前,您應該:

  1. 使用 Vault 和 Consul 進行秘密管理的基本工作知識。
  2. 使用存儲後端部署的 Vault 實例。
  3. 已部署 Postgres 服務器。
  4. 之前使用過 Flask 和 Docker。

入門

讓我們從一個基本的 Flask Web 應用開始。

如果您想繼續,請克隆vault-consul-flask存儲庫,然後查看v1分支:

$ git clone https://github.com/testdrivenio/vault-consul-flask --branch v1 --single-branch
$ cd vault-consul-flask

快速瀏覽一下代碼:

├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── manage.py
├── project
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── models.py
│   │   └── users.py
│   └── config.py
└── requirements.txt

本質上,為了讓這個應用程序正常工作,我們需要將以下環境變量添加到.env文件中(我們很快就會這樣做):

  1. DB_USER
  2. DB_PASSWORD
  3. DB_SERVER

項目/config.py

import os

USER = os.environ.get('DB_USER')
PASSWORD = os.environ.get('DB_PASSWORD')
SERVER = os.environ.get('DB_SERVER')


class ProductionConfig():
    """Production configuration"""
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = f'postgresql://{USER}:{PASSWORD}@{SERVER}:5432/users_db'

配置保管庫

同樣,如果您想繼續,您應該部署一個帶有存儲後端的 Vault 實例。這個實例也應該被初始化和解封。想要快速啟動並運行集群?從Vault-consul-swarm運行deploy.sh腳本,將 Vault 和 Consul 集群部署到三個 DigitalOcean 液滴。配置和部署只需不到五分鐘!

首先,登錄到 Vault(如有必要),然後從 Vault CLI啟用數據庫機密後端

$ vault secrets enable database

Success! Enabled the database secrets engine at: database/

添加 Postgres 連接以及數據庫引擎插件信息:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@<ENDPOINT>:5432/users_db" \
    allowed_roles="mynewrole" \
    username="<USERNAME>" \
    password="<PASSWORD>"

您是否注意到 URL 中包含username模板password?這用於防止對密碼的直接讀取訪問並啟用憑證輪換。

請務必更新數據庫端點以及用戶名和密碼。例如:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@users-db.c7vzuyfvhlgz.us-east-1.rds.amazonaws.com:5432/users_db" \
    allowed_roles="mynewrole" \
    username="vault" \
    password="lOfon7BA3uzZzxGGv36j"

這在“database/config/users_db”創建了一個新的秘密路徑:

$ vault list database/config

Keys
----
users_db

接下來,創建一個名為的新角色mynewrole

$ vault write database/roles/mynewrole \
    db_name=users_db \
    creation_statements="CREATE ROLE \"{{name}}\" \
        WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Success! Data written to: database/roles/mynewrole

在這裡,我們將 Vault 中的名稱映射mynewrole到一條 SQL 語句,該語句在運行時將創建一個具有數據庫中所有權限的新用戶。請記住,這實際上還沒有創建新用戶。還要注意默認和最大 TTL。

現在我們準備好創建新用戶了。

創建憑證

快速瀏覽一下您的可用用戶psql

$ \du

在項目根目錄中創建一個名為run.sh的新文件:

#!/bin/sh

rm -f .env

echo DB_SERVER=<DB_ENDPOINT> >> .env

user=$(curl  -H "X-Vault-Token: $VAULT_TOKEN" \
        -X GET http://<VAULT_ENDPOINT>:8200/v1/database/creds/mynewrole)
echo DB_USER=$(echo $user | jq -r .data.username) >> .env
echo DB_PASSWORD=$(echo $user | jq -r .data.password) >> .env

docker-compose up -d --build

因此,這將調用 Vault API 以從/creds端點生成一組新的憑據。隨後的響應通過 JQ 進行解析,並將憑據添加到.env文件中。確保更新數據庫 ( DB_ENDPOINT) 和 Vault ( VAULT_ENDPOINT) 端點。

添加VAULT_TOKEN環境變量:

$ export VAULT_TOKEN=<YOUR_VAULT_TOKEN>

構建鏡像並啟動容器:

$ sh run.sh

驗證環境變量是否添加成功:

$ docker-compose exec web env

您還應該在數據庫中看到該用戶:

Role name                                   | Attributes                                  | Member of
--------------------------------------------+---------------------------------------------+----------
 v-root-mynewrol-jC8Imdx2sMTZj03-1533704364 | Password valid until 2018-08-08 05:59:29+00 | {}

創建並播種數據庫users表:

$ docker-compose run web python manage.py recreate-db
$ docker-compose run web python manage.py seed-db

在瀏覽器中測試它http://localhost:5000/users

{
  "status": "success",
  "users": [{
    "active": true,
    "admin": false,
    "email": "michael@notreal.com",
    "id": 1,
    "username": "michael"
  }]
}

完成後放下容器:

$ docker-compose down

結論

而已!

請記住,在此示例中,憑據僅在一個小時內有效。這非常適合短期、動態、一次性的任務。如果您有更長的任務,您可以設置一個 cron 作業以每小時觸發一次run.sh腳本以獲取新憑據。請記住,最大 TTL 設置為 24 小時。

您可能還想查看使用envconsul將憑據放入 Flask 的環境中。它甚至可以在憑據更新時重新啟動 Flask。

您可以在vault-consul-flask存儲庫中找到最終代碼。

來源:  https ://testdriven.io

#vault #flask #postgres 

Vicenta  Hauck

Vicenta Hauck

1660390620

How to Use Vault To Create Postgres Credentials for A Flask App

In this tutorial, we'll look at a quick, real-world example of using Hashicorp's Vault and Consul to create dynamic Postgres credentials for a Flask web app.

Source: https://testdriven.io

#vault #flask #postgres 

Wayne  Richards

Wayne Richards

1660353840

Cómo Usar Vault Para Crear Credenciales De Postgres Para Flask

En este tutorial, veremos un ejemplo rápido y real del uso de Vault y Consul de Hashicorp para crear credenciales dinámicas de Postgres para una aplicación web de Flask.

requisitos previos

Antes de comenzar, debe tener:

  1. Un conocimiento práctico básico de la gestión de secretos con Vault y Consul.
  2. Una instancia de Vault implementada con un backend de almacenamiento .
  3. Un servidor Postgres implementado.
  4. Trabajó con Flask y Docker antes.

Empezando

Comencemos con una aplicación web Flask básica.

Si desea seguir adelante, clone el repositorio vault-consul-flask y luego consulte la rama v1 :

$ git clone https://github.com/testdrivenio/vault-consul-flask --branch v1 --single-branch
$ cd vault-consul-flask

Echa un vistazo rápido al código:

├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── manage.py
├── project
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── models.py
│   │   └── users.py
│   └── config.py
└── requirements.txt

Esencialmente, para que esta aplicación funcione, debemos agregar las siguientes variables de entorno a un archivo .env (que haremos en breve):

  1. DB_USER
  2. DB_PASSWORD
  3. DB_SERVER

proyecto/config.py :

import os

USER = os.environ.get('DB_USER')
PASSWORD = os.environ.get('DB_PASSWORD')
SERVER = os.environ.get('DB_SERVER')


class ProductionConfig():
    """Production configuration"""
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = f'postgresql://{USER}:{PASSWORD}@{SERVER}:5432/users_db'

Configuración de la bóveda

Nuevamente, si desea continuar, debe tener una instancia de Vault implementada con un backend de almacenamiento . Esta instancia también debe inicializarse y abrirse. ¿Quiere poner en marcha un clúster rápidamente? Ejecute el script deployment.sh de vault-consul-swarm para implementar un clúster de Vault y Consul en tres gotas de DigitalOcean. ¡Tomará menos de cinco minutos aprovisionar e implementar!

Primero, inicie sesión en Vault (si es necesario) y luego habilite el backend de secretos de la base de datos desde la CLI de Vault :

$ vault secrets enable database

Success! Enabled the database secrets engine at: database/

Agregue la conexión de Postgres junto con la información del complemento del motor de la base de datos:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@<ENDPOINT>:5432/users_db" \
    allowed_roles="mynewrole" \
    username="<USERNAME>" \
    password="<PASSWORD>"

¿Notaste que la URL tiene plantillas para usernamey passworden ella? Esto se usa para evitar el acceso directo de lectura a la contraseña y habilitar la rotación de credenciales.

Asegúrese de actualizar el punto final de la base de datos, así como el nombre de usuario y la contraseña. Por ejemplo:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@users-db.c7vzuyfvhlgz.us-east-1.rds.amazonaws.com:5432/users_db" \
    allowed_roles="mynewrole" \
    username="vault" \
    password="lOfon7BA3uzZzxGGv36j"

Esto creó una nueva ruta de secretos en "database/config/users_db":

$ vault list database/config

Keys
----
users_db

A continuación, cree un nuevo rol llamado mynewrole:

$ vault write database/roles/mynewrole \
    db_name=users_db \
    creation_statements="CREATE ROLE \"{{name}}\" \
        WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Success! Data written to: database/roles/mynewrole

Aquí, asignamos el mynewrolenombre en Vault a una instrucción SQL que, cuando se ejecuta, creará un nuevo usuario con todos los permisos en la base de datos. Tenga en cuenta que esto aún no ha creado un nuevo usuario. Tome nota del TTL predeterminado y máximo también.

Ahora estamos listos para crear nuevos usuarios.

Creando las Credenciales

Eche un vistazo rápido a los usuarios que tiene disponibles en psql:

$ \du

Cree un nuevo archivo llamado run.sh en la raíz del proyecto:

#!/bin/sh

rm -f .env

echo DB_SERVER=<DB_ENDPOINT> >> .env

user=$(curl  -H "X-Vault-Token: $VAULT_TOKEN" \
        -X GET http://<VAULT_ENDPOINT>:8200/v1/database/creds/mynewrole)
echo DB_USER=$(echo $user | jq -r .data.username) >> .env
echo DB_PASSWORD=$(echo $user | jq -r .data.password) >> .env

docker-compose up -d --build

Entonces, esto hará una llamada a la API de Vault para generar un nuevo conjunto de credenciales desde el /credspunto final. La respuesta posterior se analiza a través de JQ y las credenciales se agregan a un archivo .env . Asegúrese de actualizar los puntos finales de la base de datos ( DB_ENDPOINT) y Vault ( VAULT_ENDPOINT).

Agregue la VAULT_TOKENvariable de entorno:

$ export VAULT_TOKEN=<YOUR_VAULT_TOKEN>

Cree la imagen y gire el contenedor:

$ sh run.sh

Verifique que las variables de entorno se agregaron correctamente:

$ docker-compose exec web env

También debería ver a ese usuario en la base de datos:

Role name                                   | Attributes                                  | Member of
--------------------------------------------+---------------------------------------------+----------
 v-root-mynewrol-jC8Imdx2sMTZj03-1533704364 | Password valid until 2018-08-08 05:59:29+00 | {}

Crear y sembrar la userstabla de la base de datos:

$ docker-compose run web python manage.py recreate-db
$ docker-compose run web python manage.py seed-db

Pruébelo en el navegador en http://localhost:5000/users :

{
  "status": "success",
  "users": [{
    "active": true,
    "admin": false,
    "email": "michael@notreal.com",
    "id": 1,
    "username": "michael"
  }]
}

Baje los contenedores una vez hecho:

$ docker-compose down

Conclusión

¡Eso es todo!

Recuerda que en este ejemplo las credenciales solo son válidas por una hora. Esto es perfecto para tareas cortas, dinámicas y únicas. Si tiene tareas más largas, puede configurar un trabajo cron para activar el script run.sh cada hora para obtener nuevas credenciales. Solo tenga en cuenta que el TTL máximo está establecido en 24 horas.

También puede considerar usar envconsul para colocar las credenciales en el entorno de Flask. Incluso puede reiniciar Flask cuando se actualizan las credenciales.

Puede encontrar el código final en el repositorio vault-consul-flask .

Fuente:  https://testdriven.io

#vault #flask #postgres 

Como Usar O Vault Para Criar Credenciais Postgres Para Flask

Neste tutorial, veremos um exemplo rápido e real do uso do Vault e do Consul da Hashicorp para criar credenciais dinâmicas do Postgres para um aplicativo Web Flask.

Pré-requisitos

Antes de começar, você deve ter:

  1. Um conhecimento básico de gerenciamento de segredos com o Vault e o Consul.
  2. Uma instância do Vault implantada com um back- end de armazenamento .
  3. Um servidor Postgres implantado.
  4. Trabalhei com Flask e Docker antes.

Começando

Vamos começar com um aplicativo Web básico do Flask.

Se você quiser acompanhar, clone o repositório vault-consul-flask e confira a ramificação v1 :

$ git clone https://github.com/testdrivenio/vault-consul-flask --branch v1 --single-branch
$ cd vault-consul-flask

Dê uma olhada rápida no código:

├── .gitignore
├── Dockerfile
├── README.md
├── docker-compose.yml
├── manage.py
├── project
│   ├── __init__.py
│   ├── api
│   │   ├── __init__.py
│   │   ├── main.py
│   │   ├── models.py
│   │   └── users.py
│   └── config.py
└── requirements.txt

Essencialmente, para que este aplicativo funcione, precisamos adicionar as seguintes variáveis ​​de ambiente a um arquivo .env (o que faremos em breve):

  1. DB_USER
  2. DB_PASSWORD
  3. DB_SERVER

projeto/config.py :

import os

USER = os.environ.get('DB_USER')
PASSWORD = os.environ.get('DB_PASSWORD')
SERVER = os.environ.get('DB_SERVER')


class ProductionConfig():
    """Production configuration"""
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = f'postgresql://{USER}:{PASSWORD}@{SERVER}:5432/users_db'

Configurando o Vault

Novamente, se você quiser acompanhar, deverá ter uma instância do Vault implantada com um back- end de armazenamento . Essa instância também deve ser inicializada e deslacrada. Quer colocar um cluster em funcionamento rapidamente? Execute o script deploy.sh de vault-consul-swarm para implantar um cluster Vault e Consul em três droplets da DigitalOcean. Levará menos de cinco minutos para provisionar e implantar!

Primeiro, faça login no Vault (se necessário) e ative o back- end de segredos do banco de dados na CLI do Vault :

$ vault secrets enable database

Success! Enabled the database secrets engine at: database/

Adicione a conexão Postgres junto com as informações do plug -in do mecanismo de banco de dados :

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@<ENDPOINT>:5432/users_db" \
    allowed_roles="mynewrole" \
    username="<USERNAME>" \
    password="<PASSWORD>"

Você notou que a URL tem templates para usernamee passwordnela? Isso é usado para impedir o acesso de leitura direto à senha e habilitar a rotação de credenciais.

Certifique-se de atualizar o endpoint do banco de dados, bem como o nome de usuário e a senha. Por exemplo:

$ vault write database/config/users_db \
    plugin_name="postgresql-database-plugin" \
    connection_url="postgresql://{{username}}:{{password}}@users-db.c7vzuyfvhlgz.us-east-1.rds.amazonaws.com:5432/users_db" \
    allowed_roles="mynewrole" \
    username="vault" \
    password="lOfon7BA3uzZzxGGv36j"

Isso criou um novo caminho de segredos em "database/config/users_db":

$ vault list database/config

Keys
----
users_db

Em seguida, crie uma nova função chamada mynewrole:

$ vault write database/roles/mynewrole \
    db_name=users_db \
    creation_statements="CREATE ROLE \"{{name}}\" \
        WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
        GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
    default_ttl="1h" \
    max_ttl="24h"

Success! Data written to: database/roles/mynewrole

Aqui, mapeamos o mynewrolenome no Vault para uma instrução SQL que, quando executada, criará um novo usuário com todas as permissões no banco de dados. Lembre-se de que isso ainda não criou um novo usuário. Observe também o TTL padrão e máximo.

Agora estamos prontos para criar novos usuários.

Criando as credenciais

Dê uma olhada rápida em quais usuários você tem disponíveis psql:

$ \du

Crie um novo arquivo chamado run.sh na raiz do projeto:

#!/bin/sh

rm -f .env

echo DB_SERVER=<DB_ENDPOINT> >> .env

user=$(curl  -H "X-Vault-Token: $VAULT_TOKEN" \
        -X GET http://<VAULT_ENDPOINT>:8200/v1/database/creds/mynewrole)
echo DB_USER=$(echo $user | jq -r .data.username) >> .env
echo DB_PASSWORD=$(echo $user | jq -r .data.password) >> .env

docker-compose up -d --build

Portanto, isso fará uma chamada para a API do Vault para gerar um novo conjunto de credenciais do /credsendpoint. A resposta subsequente é analisada via JQ e as credenciais são adicionadas a um arquivo .env . Certifique-se de atualizar os endpoints do banco de dados ( DB_ENDPOINT) e do Vault ( ).VAULT_ENDPOINT

Adicione a VAULT_TOKENvariável de ambiente:

$ export VAULT_TOKEN=<YOUR_VAULT_TOKEN>

Construa a imagem e gire o contêiner:

$ sh run.sh

Verifique se as variáveis ​​de ambiente foram adicionadas com sucesso:

$ docker-compose exec web env

Você também deve ver esse usuário no banco de dados:

Role name                                   | Attributes                                  | Member of
--------------------------------------------+---------------------------------------------+----------
 v-root-mynewrol-jC8Imdx2sMTZj03-1533704364 | Password valid until 2018-08-08 05:59:29+00 | {}

Crie e propaga a userstabela de banco de dados:

$ docker-compose run web python manage.py recreate-db
$ docker-compose run web python manage.py seed-db

Teste-o no navegador em http://localhost:5000/users :

{
  "status": "success",
  "users": [{
    "active": true,
    "admin": false,
    "email": "michael@notreal.com",
    "id": 1,
    "username": "michael"
  }]
}

Abaixe os recipientes uma vez feito:

$ docker-compose down

Conclusão

É isso!

Lembre-se que neste exemplo as credenciais são válidas apenas por uma hora. Isso é perfeito para tarefas curtas, dinâmicas e pontuais. Se você tiver tarefas mais longas, poderá configurar um cron job para disparar o script run.sh a cada hora para obter novas credenciais. Lembre-se de que o TTL máximo está definido para 24 horas.

Você também pode usar o envconsul para colocar as credenciais no ambiente do Flask. Ele pode até reiniciar o Flask quando as credenciais forem atualizadas.

Você pode encontrar o código final no repositório vault-consul-flask .

Fonte:  https://testdrive.io

#vault #flask #postgres