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.I6TnqhrgYh8uET91FUsNvIwVChế độ 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.