🥢

シングルクラウドでHashiCorp Vaultを使うメリット

2023/12/14に公開

イオンスマートテクノロジー株式会社(通称:AST)CTO室SREチーム所属、あおしょんです。
下記のアドベントカレンダー14日目の記事となります。

https://qiita.com/advent-calendar/2023/aeon
https://qiita.com/advent-calendar/2023/terraform

terraformのアドベントカレンダーなのにVaultの記事でごめんなさい。
ただ説明に下記の記載があったので思い切って参加しちゃいました。

ネタに困ったら HashiCorp Product 全般でも別に構わないと思うよ。

HCP Vaultライセンス購入に至るまで

以前、下記の記事に記載した通り弊社ではシークレット管理の切り札としてHCP (HashiCorp Cloud Platform) Vaultの導入を推進しています。
https://zenn.dev/aeonpeople/articles/6625a900552311
記事をお読みいただいた方で下記の記載が気になった方がいらっしゃるかもしれません。

弊社のプラットフォームはほぼ全てAzureなのでHCP VaultのクライアントとなるKubernetesはAKS (Azure Kubernetes Service) を利用しています。

ぶっちゃけ私が弊社の人間ではなかったらこう思います。

Azure Key Vaultで良くね?

ですがあれよあれよと大人の事情でHCP Vaultのライセンス購入が決まり弊社環境での実現性検証(購入してから始めたんや…)と導入を現在進行形でやることになりました。

本記事ではVault(HashiCorp Vault)を導入する過程で確かな確信となったAzure、というかシングルクラウドでVaultを使うメリットをザックリ紹介します。

Dynamic Secretsで認証情報の流出リスクを低減できる

やはり一番のメリット、というか弊社のVault導入理由にもなるのですがDynamic Secrets(動的シークレット)があることです。
https://www.vaultproject.io/use-cases/dynamic-secrets
動的シークレットが何かをザックリ説明すると「Vaultさんが定期的にDBなどの一時的な認証情報を作ったり消したりしてくれる」です。VaultのクライアントとなるアプリケーションはVaultの認証方式のAuthMethodで許可(Token)を得ることでDBなどの認証情報を取得します。これで認証情報が外部流出しても一時的なものなのでリスクが減りますね。もちろん認証情報の再作成のインターバル、すなわちTTLは利用者自身が設定することができます。

 vault write demo-db/roles/dev-postgres \
   db_name=demo-db \
   creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \
      GRANT ALL PRIVILEGES ON DATABASE postgres TO \"{{name}}\";" \
   backend=demo-db \
   name=dev-postgres \
   default_ttl="1m" \
   max_ttl="1m"

Dynamic secretsから抜粋

詳しくはエーピーコミュニケーションズさんの技術ブログを読むことをお勧めします。
https://techblog.ap-com.co.jp/entry/2023/05/11/102542
私も大変勉強になりました!

また、Tokenについては私が拙い記事を書いているので参考にして頂けるとありがたいです。
https://zenn.dev/aeonpeople/articles/ec634244fd1437

但し、このメリットが享受出来るのはアプリケーションのデプロイ先がVM(Virtual Machine)やAKS(Azure Kubernetes Service)、所謂クラウド利用者の運用範囲が広い場合であり、App ServiceなどのマネージドサービスかつDBもマネージドサービスであればDB関連のロールを割り当てたManaged IDで認証すれば良いので不要かなとは思います。

Vault Secrets Operatorで開発者がシークレット管理を意識することがなくなる

ではAKSでDynamic Secrets使っていこう!となると次に取得した認証情報をどうやってKubernetesのSecretに突っ込むかを考えないといけないのですが、これを上手いことやってくれるのがVault Secrets Operator、略してVSOです。
https://developer.hashicorp.com/vault/docs/platform/k8s/vso
VSOの良いところを息継ぎせずに説明すると、VSO自体がVautとのAuth Methodの認証もやってくれてシークレットも取得してくれてKubernetesのSecretリソースを作成してくれてそこにシークレットを突っ込んでくれるとこです。もちろん、Dynamic Secretsと組み合わせればKubernetesのSecretのシークレットもVSOが勝手に更新してくれます。要するに開発者はVaultがシークレット管理していることを意識することがありません
VSOについてもっと詳しく知りたい場合はこれまたエーピーコミュニケーションズさんの技術ブログを読むことをお勧めします。
https://techblog.ap-com.co.jp/entry/2023/04/14/145915

CLIが使いやすい

これは完全に個人的なメリットでしかないのですが…vaultコマンド使いやすいです!分かりやすいです!

$ vault --help
Usage: vault <command> [args]

Common commands:
    read        Read data and retrieves secrets
    write       Write data, configuration, and secrets
    delete      Delete secrets and configuration
    list        List data or secrets
    login       Authenticate locally
    agent       Start a Vault agent
    server      Start a Vault server
    status      Print seal and HA status
    unwrap      Unwrap a wrapped secret

Other commands:
    audit                Interact with audit devices
    auth                 Interact with auth methods
    debug                Runs the debug command
    events
    kv                   Interact with Vault's Key-Value storage
    lease                Interact with leases
    monitor              Stream log messages from a Vault server
    namespace            Interact with namespaces
    operator             Perform operator-specific tasks
    patch                Patch data, configuration, and secrets
    path-help            Retrieve API help for paths
    pki                  Interact with Vault's PKI Secrets Engine
    plugin               Interact with Vault plugins and catalog
    policy               Interact with policies
    print                Prints runtime configurations
    proxy                Start a Vault Proxy
    secrets              Interact with secrets engines
    ssh                  Initiate an SSH session
    token                Interact with tokens
    transform            Interact with Vault's Transform Secrets Engine
    transit              Interact with Vault's Transit Secrets Engine
    version-history      Prints the version history of the target Vault server

サブコマンドも分かりやすいです!

$ vault auth --help
Usage: vault auth <subcommand> [options] [args]

  This command groups subcommands for interacting with Vault's auth methods.
  Users can list, enable, disable, and get help for different auth methods.

  To authenticate to Vault as a user or machine, use the "vault login" command
  instead. This command is for interacting with the auth methods themselves, not
  authenticating to Vault.

  List all enabled auth methods:

      $ vault auth list

  Enable a new auth method "userpass";

      $ vault auth enable userpass

  Get detailed help information about how to authenticate to a particular auth
  method:

      $ vault auth help github

  Please see the individual subcommand help for detailed usage information.

Subcommands:
    disable    Disables an auth method
    enable     Enables a new auth method
    help       Prints usage for an auth method
    list       Lists enabled auth methods
    move       Move an auth method to a new path
    tune       Tunes an auth method configuration

あとVaultはNamespaceという機能でVault上で仮想的にVaultを分割して作成することができるのですがexport VAULT_NAMESPACE="admin/path"で環境変数の値を変えるだけでNamespaceを切り替えることができるので楽です。

おわりに

以上、Azure、というかシングルクラウドでVaultを使うメリットでした。
最後のメリットが完全に個人的な志向によることでしかないので、やはり会社として導入するメリットは

  • Dynamic Secretsで認証情報の流出リスクを低減できる
  • Vault Secrets Operatorで開発者がシークレット管理を意識することがなくなる

ことだと思います。
弊社としてはVaultを導入したばかりなので他にもこんなメリットがあるぜ!という情報をお持ちの方がいらっしゃればコメントで教えて頂けると大変ありがたいです。
また、いずれは弊社もマルチクラウドへの道を進むことになる…かも…?しれないのでその時はマルチクラウドでVaultを使うメリットを記事にしたいと思います。(そもそもクラウドの違いを意識せずにシークレット管理が出来ることを目指して作られたプロダクトの筈なので記事にするまでもないかもしれませんが…)

最期にイオンスマートテクノロジーではエンジニアを絶賛採⽤中です。

https://hrmos.co/pages/ast

AEON TECH HUB

Discussion