sql >> データベース >  >> RDS >> MariaDB

Terraformを使用したMySQL/MariaDBVaultデータベースシークレットエンジンのプロビジョニング

    この投稿の目的は、すべてを手動で作成および管理することなく、動的/一時的なデータベース資格情報を提供することです。

    これは、概念実証にすぎず、ベストプラクティスにまったく従わなかったということから始めます。 (主にセキュリティのもの)。この時点からのすべての手順は、プロセス全体が機能していることを確認するためだけに、すべてのサイドタスクを緩和することに焦点を当てた単純なテストです。

    コンテナのテスト

    両方のプロジェクトの公式DockerHubページで指定されているように(すばやく)起動されるMariaDBおよび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
    
    

    ボールトの起動が完了すると、コンテナログから次のことがわかります。

    次の環境変数を設定する必要がある場合があります。

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

    >必要に応じて、開封キーとルートトークンを以下に表示します。
    Vaultを封印/開封するか、再認証します。

    キーの開封:kSUgoPDPyBrCGWc4s93CIlMUnDLZGcxdu4doYCkWSPs =
    ルートトークン:s.I6TnqhrgYh8uET91FUsNvIwV

    開発モードは、本番環境でのインストールでは使用しないでください!

    つまり、ボールトアドレスとルートトークンがあります。

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

    そして、ここにMariaDBのrootユーザーとパスワードがあります。

    rootユーザーは何にも使用されるべきではないため、ボールトの相互作用専用のユーザーを作成します。

    mysql -h 127.0.0.1 -u root -pを使用してデータベースにログインします

    ボールトユーザーを作成します

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

    テラフォーム

    すべてのサービスが実行および構成されたら、テラフォーム部分の処理を行います。

    繰り返しますが、これは単なるPOCです。ハードコードされた弱いパスワードはすべて、テストを目的としています。

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

    以前のコードリストで使用されたポリシーファイル:

    • policys / dball.hcl
    path "mariadb/creds/db-all" {
      policy = "read"
      capabilities = ["list"]
    }
    
    
    • ポリシー/dbro.hcl
    path "mariadb/creds/db-ro" {
      policy = "read"
      capabilities = ["list"]
    }
    
    

    この後、通常のプロセス:
    terraform init
    terraform apply

    そして、すべてをテストする準備ができています。

    テスト

    ROユーザーのテスト

    ボールトにログイン

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

    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
    

    DBにログイン
    (覚えておいてください:次のコマンドは本当に悪い習慣です!!!)

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

    ...何かをしよう

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

    RWユーザーのテスト

    ボールトにログイン

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

    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
    

    DBにログイン
    (もう一度覚えておいてください:次のコマンドは本当に悪い習慣です!!!)

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

    ...何かをしよう

    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)
    

    以上です。これで、MariaDBの動的/一時ユーザーの基盤ができました。


    1. 1つのSQLクエリで複数のカウントを取得するにはどうすればよいですか?

    2. パフォーマンスチューニング迷路

    3. cx_Oracleと例外処理-グッドプラクティス?

    4. Oracleで科学的記数法で数値をフォーマットする方法