見出し画像

Vaultの基本とインストールガイド:デジタルセキュリティとオブジェクトストレージの管理



1.Vault

1.デジタルセキュリティ:
Vaultは、データや資産を安全に保管するためのデジタルセキュリティツールやシステムを指します。これには、機密情報や重要なデータを暗号化し、アクセスを制御するための機能が含まれます。多要素認証やアクセス監査などのセキュリティ機能も組み込まれています。

2.オブジェクトストレージ:
Vaultは、オブジェクトストレージにおいて、ユーザが定義する識別可能なストレージ領域または場所を指します。これにより、データを保管するための特定のエリアやコンテナを指定することができます。

https://biz.kddi.com/content/glossary/v/vault/

Vault は、秘密(Secrect)および暗号化管理システムである。秘密とは、API 暗号化キー、パスワード、証明書など、アクセスを厳密に制御する。 Vault は、認証および認可方法によって制御される暗号化サービスを提供し、機密データやその他の機密データへのアクセスは、Vault の UI、CLI、または HTTP API を使用して安全に保存および管理し、厳密に制御 (制限) し、監査することができる。

2.Vaultをインストール

2.1 macOSのインストール

# Homebrewをダンウンロード
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Vaultをインストール
brew install vault

2.2 Ubuntuのインストール

sudo apt-get install vault

2.3 CentOSのインストール

sudo yum install vault
#  インストールの確認
vault --version

3.Vaultを起動

3.1 開発モード

vault server -dev


==> Vault server configuration:

Administrative Namespace: 
             Api Address: http://127.0.0.1:8200
                     Cgo: disabled
         Cluster Address: https://127.0.0.1:8201
   Environment Variables: CONDA_DEFAULT_ENV, CONDA_EXE, CONDA_PREFIX, CONDA_PROMPT_MODIFIER, CONDA_PYTHON_EXE, CONDA_SHLVL, GODEBUG, HOME, LC_CTYPE, LOGNAME, OLDPWD, PATH, PWD, SHELL, SHLVL, SSH_AUTH_SOCK, TERM, TERM_PROGRAM, TERM_PROGRAM_VERSION, TERM_SESSION_ID, TMPDIR, USER, XPC_FLAGS, XPC_SERVICE_NAME, _, _CE_CONDA, _CE_M, __CFBundleIdentifier
              Go Version: go1.21.1
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: 
                   Mlock: supported: false, enabled: false
           Recovery Mode: false
                 Storage: inmem
                 Version: Vault v1.14.4, built 2023-09-22T21:29:05Z
             Version Sha: ccdd48d1f7b95fc99fd11d67fc1c687576b338de+CHANGES

==> Vault server started! Log data will stream in below:

WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variables:

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

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: UArETO2YP2VpxxwV5P6uz2b/Ad64+K1mvIUsuPsBPlY=
Root Token: hvs.VfKa3W4420YCJTxnXheP9gdd

ブラウザで https://127.0.0.1:8200 をアクセス

Tokenは上記の「Root Token」でログイン

開発モードのサーバーは、秘密鍵を Secret/ に保存

注意:開発サーバーはすべてのキーをメモリに保存し、サーバー セッションが終了するとすべてのキーが削除される

# pip install hvac

# vault server -dev
# vault.py

import os
import hvac
from decouple import config

def init_vault_client():
    """Initialize and return the Vault client."""
    client = hvac.Client(
        url=config('VAULT_ADDR'),
        token=config('VAULT_TOKEN')
    )
    if client.is_authenticated():
        print("Vault client authenticated successfully.")
    else:
        print("Failed to authenticate Vault client.")
    return client

def write_secrets_to_vault(client):
    """Write secrets to Vault."""
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': config('DB_HOST'),
            'PORT': config('DB_PORT'),
            'USER': config('DB_USER'),
            'PASSWORD': config('DB_PASSWORD'),
            'NAME': config('DB_NAME')
        },
        'database': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': config('DB_HOST'),
            'PORT': config('DB_PORT'),
            'USER': config('DB_USER'),
            'PASSWORD': config('DB_PASSWORD'),
            'NAME': config('DB_NAME')
        },
    }
    SECRET_KEY = config('SECRET_KEY')

    try:
        # Write database secrets
        for path, data in DATABASES.items():
            response = client.secrets.kv.v2.create_or_update_secret(
                path=f'database/{path}',
                secret=data
            )
            print(f"Secrets written to database/{path}: {response}")

        # Write secret key
        response = client.secrets.kv.v2.create_or_update_secret(
            path='application/secret_key',
            secret={'SECRET_KEY': SECRET_KEY}
        )
        print(f"Secret key written to application/secret_key: {response}")

    except Exception as e:
        print(f"An error occurred while writing secrets: {e}")

def read_secret_from_vault(client, path):
    """Read a secret from Vault."""
    try:
        response = client.secrets.kv.v2.read_secret_version(path=path)
        print(f"Secrets read from {path}: {response['data']['data']}")
    except hvac.exceptions.InvalidRequest as e:
        print(f"Invalid request: {e}")
    except Exception as e:
        print(f"An error occurred while reading secret from {path}: {e}")

if __name__ == '__main__':
    client = init_vault_client()
    write_secrets_to_vault(client)

    read_secret_from_vault(client, 'database/default')
    read_secret_from_vault(client, 'database/database')
    read_secret_from_vault(client, 'application/secret_key')

Secrect KeyはVaultに保存された

しかし、Vault Server -dev でVault を起動すると、Vault は開発モードで実行され、データは非永続的である。つまり、すべてのデータがメモリに保存され、Vault プロセスを停止または再起動すると、すべてのデータが失われる。

開発モードでは、Vault は単一の「Root Token」と「Unseal Key」を使用して、開発とテストを簡素化するが、実稼働環境には推奨されない。 開発モードは開発およびテスト環境のみを目的としており、実稼働環境では使用しないでください。

3.2 実稼働環境

実稼働環境では、データの耐久性と信頼性を確保するために、永続ストレージ バックエンド (Consul、DynamoDB、MySQL など) を使用する。「vault.hcl」ファイル を作成する。

storage "file" {
  address = "127.0.0.1:8200"
  path = "/home/user/django_app/vault_data"
}

listener "tcp" {
  address = "127.0.0.1:8200"
  tls_disable = 1
}

ui = true
api_addr = "http://127.0.0.1:8200"

4.参考文献

いいなと思ったら応援しよう!