MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Udostępnianie mechanizmu tajemniczych baz danych MySQL/MariaDB Vault za pomocą Terraform

Celem tego posta jest zapewnienie dynamicznych/tymczasowych danych uwierzytelniających do bazy danych bez konieczności ręcznego tworzenia ich wszystkich i zarządzania nimi.

Zacznę to od stwierdzenia, że ​​jest to tylko dowód koncepcji, a najlepsze praktyki w ogóle nie były przestrzegane. (głównie bezpieczeństwa). Wszystkie procedury od tego momentu to tylko proste testy, które koncentrują się na ułatwieniu wszystkich zadań pobocznych, aby zobaczyć, jak cały proces działa.

Testowanie kontenerów

Będziemy używać kontenerów MariaDB i Vault, (szybko) uruchomionych zgodnie z opisem na oficjalnych stronach DockerHub obu projektów.

  • Skarbiec
docker run --rm \
    --name vault \
    --cap-add=IPC_LOCK \
    -e 'VAULT_LOCAL_CONFIG={"backend": {"file": {"path": "/vault/file"}}, "default_lease_ttl": "168h", "max_lease_ttl": "720h"}' \
    -p 8200:8200 \
    -d vault

Po uruchomieniu skarbca możemy zobaczyć w dziennikach kontenera następujące informacje:

Może być konieczne ustawienie następującej zmiennej środowiskowej:

$ export VAULT_ADDR='http://0.0.0.0:8200

Klucz odpieczętowania i token roota są wyświetlane poniżej w przypadku, gdy>chcesz
zapieczętować/odpieczętować Kryptę lub dokonać ponownego uwierzytelnienia.

Klucz odpieczętowania:kSUgoPDPyBrCGWc4s93CIlMUnDLZGcxdu4doYCkWSPs=
Token roota:s.I6TnqhrgYh8uET91FUsNvIwV

Tryb rozwoju NIE powinien być używany w>instalacjach produkcyjnych!

Mamy więc nasz adres skarbca i token główny.

  • MariaDB
docker run --rm \
    --name mariadb \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=mysecretpw \
    -d mariadb:latest

A tutaj mamy naszego użytkownika root i hasło do MariaDB.

Ponieważ użytkownik root nie powinien być używany do niczego, stworzymy dedykowanego użytkownika do interakcji z repozytorium.

Zaloguj się do bazy danych za pomocą mysql -h 127.0.0.1 -u root -p

i utwórz użytkownika skarbca

grant CREATE USER, SELECT, INSERT, UPDATE ON *.* TO 'vault'@'%' identified by 'myvaultsecretpw' WITH GRANT OPTION;

Terraformacja

Po uruchomieniu i skonfigurowaniu wszystkich usług nadszedł czas, aby zająć się częścią terraformowania.

Po raz kolejny to tylko POC. Wszystkie zakodowane i słabe hasła są przeznaczone do celów testowych.

provider "vault" {
    address = "http://localhost:8200"
        #Token provided from vault container log
    token = "s.I6TnqhrgYh8uET91FUsNvIwV" 
}

resource "vault_auth_backend" "userpass" {
  type = "userpass"
}

# USERS
resource "vault_generic_endpoint" "user_userro" {
  depends_on           = [vault_auth_backend.userpass]
  path                 = "auth/userpass/users/userro"
  ignore_absent_fields = true

  data_json = <<EOT
{
  "policies": ["db-ro"],
  "password": "userro"
}
EOT
}

resource "vault_generic_endpoint" "user_userrw" {
  depends_on           = [vault_auth_backend.userpass]
  path                 = "auth/userpass/users/userrw"
  ignore_absent_fields = true

  data_json = <<EOT
{
  "policies": ["db-all", "db-ro"],
  "password": "userrw"
}
EOT
}

# POLICIES
# Read-Only access policy
resource "vault_policy" "dbro" {
  name   = "db-ro"
  policy = file("policies/dbro.hcl")
}

# All permissions access policy
resource "vault_policy" "dball" {
  name   = "db-all"
  policy = file("policies/dball.hcl")
}


# DB
resource "vault_mount" "mariadb" {
  path = "mariadb"
  type = "database"
}

resource "vault_database_secret_backend_connection" "mariadb_connection" {
  backend       = vault_mount.mariadb.path
  name          = "mariadb"
  allowed_roles = ["db-ro", "db-all"]
  verify_connection = true

  mysql{
    connection_url = "{{username}}:{{password}}@tcp(192.168.11.71:3306)/"
  }

# note that I have my database address hardcoded and I'm using my lan IP, since I'm running the mysql client directly from my host and vault/mariadb are running inside containers with their ports exposed.

  data = {
    username = "vault"
    password = "myvaultsecretpw"
  } 

}

resource "vault_database_secret_backend_role" "role" {
  backend             = vault_mount.mariadb.path
  name                = "db-ro"
  db_name             = vault_database_secret_backend_connection.mariadb_connection.name
  creation_statements = ["GRANT SELECT ON *.* TO '{{name}}'@'%' IDENTIFIED BY '{{password}}';"]
}

resource "vault_database_secret_backend_role" "role-all" {
  backend             = vault_mount.mariadb.path
  name                = "db-all"
  db_name             = vault_database_secret_backend_connection.mariadb_connection.name
  creation_statements = ["GRANT ALL ON *.* TO '{{name}}'@'%' IDENTIFIED BY '{{password}}';"]
}

Pliki zasad używane w poprzednim wykazie kodu:

  • polityki/dball.hcl
path "mariadb/creds/db-all" {
  policy = "read"
  capabilities = ["list"]
}

  • polityki/dbro.hcl
path "mariadb/creds/db-ro" {
  policy = "read"
  capabilities = ["list"]
}

Następnie zwykły proces:
terraform init
terraform apply

I mamy wszystko gotowe do testów.

Testowanie

Testowanie użytkownika RO

Zaloguj się do skarbca

$ vault login -method userpass username=userro
Password (will be hidden): 
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
(...)

poproś o poświadczenia bazy danych

$ vault read mariadb/creds/db-ro
Key                Value
---                -----
lease_id           mariadb/creds/db-ro/uGldyp0BAa2GhUlFyrEwuIbs
lease_duration     168h
lease_renewable    true
password           8vykdcZNHp-I0pajVtoN
username           v_userpass-d_db-ro_75wxnJaL69FW4

Zaloguj się do DB
(PAMIĘTAJ:Kolejne polecenie to naprawdę ZŁA PRAKTYKA !!!)

$ mysql -h 127.0.0.1 -u v_userpass-d_db-ro_75wxnJaL69FW4 -p'8vykdcZNHp-I0pajVtoN'

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 101
Server version: 10.3.13-MariaDB-1:10.3.13+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

... próbuj robić różne rzeczy

MariaDB [(none)]> create database my_database;
ERROR 1044 (42000): Access denied for user 'v_userpass-d_db-ro_75wxnJaL69FW4'@'%' to database 'my_database'

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_db              |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> use my_db;

Database changed
MariaDB [my_db]> show tables;
+-----------------+
| Tables_in_my_db |
+-----------------+
| my_table        |
+-----------------+
1 row in set (0.00 sec)

MariaDB [my_db]> select * from my_table;
Empty set (0.00 sec)

MariaDB [my_db]> 

Testowanie użytkownika RW

Zaloguj się do skarbca

$ vault login -method userpass username=userrw
Password (will be hidden): 
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
(...)

poproś o poświadczenia bazy danych

$ vault read mariadb/creds/db-all
Key                Value
---                -----
lease_id           mariadb/creds/db-all/GHRHvpuqa2ITP9tX54YHEePl
lease_duration     168h
lease_renewable    true
password           L--8mPBoprFZcaItINKI
username           v_userpass-j_db-all_DMwlhs9nGxA8

Zaloguj się do DB
(PAMIĘTAJ PONOWNIE:Następne polecenie to naprawdę ZŁA PRAKTYKA !!!)

$ mysql -h 127.0.0.1 -u v_userpass-j_db-all_DMwlhs9nGxA8 -p'L--8mPBoprFZcaItINKI'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 109
Server version: 10.3.13-MariaDB-1:10.3.13+maria~bionic mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>  

... próbuj robić różne rzeczy

MariaDB [(none)]> create database my_database;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> use my_db;
Database changed

MariaDB [my_db]> create table the_table (i integer);
Query OK, 0 rows affected (0.03 sec)

MariaDB [my_db]> show tables;
+-----------------+
| Tables_in_my_db |
+-----------------+
| my_table        |
| the_table       |
+-----------------+
2 rows in set (0.00 sec)

I to wszystko. Mamy teraz bazę dla naszych dynamicznych/tymczasowych użytkowników MariaDB.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak SIGN() działa w MariaDB

  2. Jak przeprowadzić migrację bazy danych WHMCS do klastra MariaDB Galera

  3. Zainstaluj WordPress z Nginx, MariaDB 10 i PHP 7 na Debianie 9

  4. Jak zainstalować i skonfigurować MaxScale dla MariaDB

  5. Jak BIN() działa w MariaDB