MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

Cung cấp Công cụ bí mật cơ sở dữ liệu MySQL / MariaDB Vault với Terraform

Mục tiêu của bài đăng này là cung cấp thông tin đăng nhập cơ sở dữ liệu động / tạm thời mà không cần phải tạo và quản lý tất cả chúng theo cách thủ công.

Tôi chỉ bắt đầu điều này bằng cách nói rằng đây chỉ là một bằng chứng về khái niệm và các phương pháp hay nhất đã không được tuân thủ. (chủ yếu là những người bảo mật). Tất cả các thủ tục từ thời điểm này chỉ là các bài kiểm tra đơn giản với trọng tâm là giảm bớt tất cả các nhiệm vụ phụ chỉ để xem toàn bộ quá trình hoạt động.

Kiểm tra vùng chứa

Chúng tôi sẽ sử dụng các vùng chứa MariaDB và Vault, (nhanh chóng) được khởi chạy như được chỉ định trên các trang DockerHub chính thức của cả hai dự án.

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

Khi vault kết thúc quá trình khởi động, chúng ta có thể thấy từ các nhật ký vùng chứa như sau:

Bạn có thể cần đặt biến môi trường sau:

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

Khóa unseal và mã thông báo gốc được hiển thị bên dưới trong trường hợp> bạn muốn
niêm phong / hủy niêm phong Vault hoặc xác thực lại.

Khóa Unseal:kSUgoPDPyBrCGWc4s93CIlMUnDLZGcxdu4doYCkWSPs =
Mã thông báo gốc:s.I6TnqhrgYh8uET91FUsNvIwV

Chế độ phát triển KHÔNG được sử dụng trong sản xuất> cài đặt!

Vì vậy, chúng tôi có địa chỉ vault và mã thông báo gốc.

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

Và ở đây chúng tôi có người dùng gốc và mật khẩu cho MariaDB.

Bởi vì người dùng gốc không được sử dụng cho bất cứ việc gì, chúng tôi sẽ tạo một người dùng chuyên dụng cho các tương tác với vault.

Đăng nhập vào cơ sở dữ liệu bằng mysql -h 127.0.0.1 -u root -p

và tạo người dùng vault

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

Terraform

Với tất cả các dịch vụ đang chạy và được định cấu hình, đã đến lúc quan tâm đến phần terraform.

Một lần nữa, đây chỉ là POC. Tất cả các mật khẩu được mã hóa cứng và mật khẩu yếu đều dành cho mục đích thử nghiệm.

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

Các tệp chính sách được sử dụng trong danh sách mã trước đó:

  • chính sách / dball.hcl
path "mariadb/creds/db-all" {
  policy = "read"
  capabilities = ["list"]
}

  • chính sách / dbro.hcl
path "mariadb/creds/db-ro" {
  policy = "read"
  capabilities = ["list"]
}

Sau đó, quy trình thông thường:
terraform init
terraform apply

Và chúng tôi có mọi thứ đã sẵn sàng cho một số thử nghiệm.

Thử nghiệm

Kiểm tra người dùng RO

Đăng nhập vào vault

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

yêu cầu thông tin đăng nhập DB

$ 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

Đăng nhập vào DB
(HÃY NHỚ:cmd tiếp theo là một THỰC HÀNH THỰC SỰ XẤU !!!)

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

... cố gắng làm những thứ

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

Kiểm tra người dùng RW

Đăng nhập vào vault

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

yêu cầu thông tin đăng nhập DB

$ 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

Đăng nhập vào DB
(HÃY NHỚ LẠI:cmd tiếp theo là một THỰC HÀNH THỰC SỰ XẤU !!!)

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

... cố gắng làm những thứ

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)

Và đó là nó. Giờ đây, chúng tôi có cơ sở cho người dùng tạm thời / động MariaDB của chúng tôi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng số bằng dấu phẩy trong MariaDB

  2. Giải thích về toán tử MariaDB MINUS

  3. Cách hoạt động của hàm INSERT () trong MariaDB

  4. MariaDB CURRENT_DATE () được giải thích

  5. Thiết lập một cụm cơ sở dữ liệu phân tán theo địa lý bằng cách sử dụng MySQL Replication