MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Bereitstellung von MySQL/MariaDB Vault Database Secrets Engine mit Terraform

Das Ziel dieses Beitrags ist es, dynamische/temporäre Datenbankanmeldeinformationen bereitzustellen, ohne sie alle manuell erstellen und verwalten zu müssen.

Ich werde dies nur damit beginnen, dass ich sage, dass dies nur ein Proof of Concept ist und Best Practices überhaupt nicht befolgt wurden. (hauptsächlich Sicherheits-). Alle Verfahren ab diesem Punkt sind nur einfache Tests mit dem Schwerpunkt, alle Nebenaufgaben zu erleichtern, nur um zu sehen, wie der gesamte Prozess funktioniert.

Container testen

Wir werden MariaDB- und Vault-Container verwenden, die (schnell) gestartet werden, wie auf den offiziellen DockerHub-Seiten beider Projekte angegeben.

  • Tresor
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

Wenn der Vault hochgefahren ist, können wir aus den Containerprotokollen Folgendes entnehmen:

Möglicherweise müssen Sie die folgende Umgebungsvariable festlegen:

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

Der Entsiegelungsschlüssel und das Root-Token werden unten angezeigt, falls Sie dies wünschen
Vault versiegeln/entsiegeln oder erneut authentifizieren.

Entsiegelungsschlüssel:kSUgoPDPyBrCGWc4s93CIlMUnDLZGcxdu4doYCkWSPs=
Root-Token:s.I6TnqhrgYh8uET91FUsNvIwV

Der Entwicklungsmodus sollte NICHT in>Produktionsinstallationen verwendet werden!

Wir haben also unsere Vault-Adresse und das Root-Token.

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

Und hier haben wir unseren Root-Benutzer und das Passwort für MariaDB.

Da der Root-Benutzer für nichts verwendet werden sollte, werden wir einen dedizierten Benutzer für Vault-Interaktionen erstellen.

Melden Sie sich mit mysql -h 127.0.0.1 -u root -p bei der Datenbank an

und erstellen Sie den Tresorbenutzer

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

Terraform

Wenn alle Dienste laufen und konfiguriert sind, ist es an der Zeit, sich um den Terraform-Teil zu kümmern.

Noch einmal, dies ist nur ein POC. Alle hartcodierten und schwachen Passwörter sind für Testzwecke gedacht.

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}}';"]
}

Richtliniendateien, die im vorherigen Code-Listing verwendet wurden:

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

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

Danach der übliche Ablauf:
terraform init
terraform apply

Und wir haben alles bereit für einige Tests.

Testen

Testen des RO-Benutzers

Melden Sie sich beim Tresor an

$ 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.
(...)

Fordern Sie DB-Anmeldeinformationen an

$ 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

Melden Sie sich bei der DB an
(Denken Sie daran:Das nächste cmd ist eine wirklich SCHLECHTE PRAXIS !!! )

$ 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)]> 

... versuchen, Sachen zu tun

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]> 

Testen des RW-Benutzers

Melden Sie sich beim Tresor an

$ 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.
(...)

Fordern Sie DB-Anmeldeinformationen an

$ 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

Melden Sie sich bei der DB an
(Denken Sie noch einmal daran:Das nächste cmd ist eine wirklich SCHLECHTE PRAXIS !!! )

$ 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)]>  

... versuchen, Sachen zu tun

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)

Und das ist es. Wir haben jetzt die Basis für unsere dynamischen/temporären MariaDB-Benutzer.