Vaultの基本とインストールガイド:デジタルセキュリティとオブジェクトストレージの管理
1.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"