Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vault + EKS + AWS SSOで実現する秘密情報管理

Kenta Goto
September 09, 2020

Vault + EKS + AWS SSOで実現する秘密情報管理

Vault + EKS + AWS SSOで実現する秘密情報管理

Kenta Goto

September 09, 2020
Tweet

More Decks by Kenta Goto

Other Decks in Technology

Transcript

  1. すべての人生を、 便利で豊かにする。 ビジネスの成長を加速させる。 くらしの経済メディア お金の見える化サービス 金融商品の比較・申し込みサイト 自動貯金アプリ お金を前へ。人生をもっと前へ。 パートナーと共に、 新たな金融サービスを創出する。

    お金をいい方向へと動かす。 for ◦◦ 金融機関お客様向け自動家計簿・ 資産管理サービス 通帳アプリ 金融機関お客様向け通帳アプリ MF Unit 金融機関のアプリへの一部機能提供 企業間後払い決済サービス 売掛金早期資金化サービス BFM 法人向け資金管理サービス 成長企業向けフィナンシャル・ アドバイザリーサービス バックオフィス向け業務効率化ソリューション マネーフォワード MEユーザーのための FP相談窓口 マネーフォワード MEのデータを分析し最 適な行動をアドバイス DX人材特化のキャリア支援サービス
  2. HashiCorp Vaultとは何か HashiCorp Vaultとは HashiCorp社が開発したOSS 秘密情報を管理・保護する為のソフトウェア 特徴 • 秘密情報の保存先は拡張性が高く、様々なコンポーネントから選択可能( Storage

    Backend) • 様々な秘密情報を管理できる( Secret Engine) • IdentityにPolicyを割り当てることで柔軟な認可の制御ができる( Auth Method) • 認証により発行された Tokenは時間ベースでRevokeされる(Client Token)
  3. 秘密情報管理をサービス開発者に権限移譲していきたい オンプレミス環境における秘密情報の管理フロー 秘密情報管理サーバ 秘密情報 サービスA チーム サービスB チーム サービスC チーム

    インフラチーム サービスA サービスB サービスC ① サービスチームから インフラチームに登録依頼 ② インフラチームが 温かみのある手作業 で登録 ③ デプロイ時に各サービスに反映
  4. 秘密情報管理をサービス開発者に権限移譲していきたい 何らかの秘密情報管理ツール サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム

    サービスA サービスB サービスC ① サービスチームが各サービ スの秘密情報を管理 ② 自分たちが管理する秘密情報を 任意のタイミングで反映 サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 目指したい姿
  5. 特定の秘密情報は、アプリケーション間で共有する必要がある Vault サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム

    サービスA サービスB サービスC サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 実現方式 Vaultの提供する認証・認可の仕組みを用いて、 適切なアクセスコントロール を実現 それにより秘密情報の管理をサービスチームに委譲することが可能になる
  6. Auth Method 様々なAuth Methodが提供されているので、 ユースケースに応じて選択する $ vault auth enable aws

    Auth Method 概要 Userpass Auth Method ユーザーネームとパスワードを使った一般的な認証 GitHub Auth Method GitHubのPersonal access tokenを使った認証 AWS Auth Method IAMを使った認証 Kubernetes Auth Method KubernetesのService Account Tokenを使った認証 Auth Methodの有効化
  7. Policy path "secret/*" { capabilities = ["list"] } path "secret/data/service/aaa/*"

    { capabilities = ["create","read","update","delete"] } aaa_policy.hcl
  8. Auto MethodとPolicy Vault Policy (Policy A) Aさん ④ 認証(Auth Method)

    ① Policyを作成 ② Policyを登録 AさんはPolicy Aで 許可されたパスにアクセスできる Vault role (AさんとPolicy Aが紐づく) ③ role(認証の主体とPolicyを紐付ける設定)を登録
  9. Kubernetes Auth Method • ServiceAccount Tokenを用いて認証 • roleによってPolicyと紐付ける • 特定のServiceAccountを割り当てたPodは特定の秘密情報にアクセスできる

    aaa-namespace Kubernetes Vault /secret/service/aaa /secret/service/bbb bbb-namespace aaa-k8s-auth policy bbb-k8s-auth policy aaa-role bbb-role /secret/service/aaa のみ参照可能 /secret/service/bbb のみ参照可能
  10. Kubernetes Auth Method bound_service_account_names ["default"] bound_service_account_namespaces ["aaa-namespace"] token_bound_cidrs [] token_explicit_max_ttl

    0 token_max_ttl 0 token_no_default_policy false token_num_uses 0 token_period 0 token_policies ["aaa-k8s-auth"] token_ttl 21600 token_type default auth/kubernetes/role/aaa-role
  11. Kubernetes Auth Method path "secret/*" { capabilities = ["list"] }

    path "secret/data/service/aaa/*" { capabilities = ["read"] } aaa-k8s-auth.hcl(Policy)
  12. AWS Auth Method • IAM を用いて認証し、Policyと紐付ける • 特定のIAM Entityによって認証されたとき、特定の秘密情報のみ変更できる Vault

    /secret/service/aaa /secret/service/bbb aaa-aws-auth policy bbb-aws-auth policy aaa-role bbb-role /secret/service/aaa のみ追加更新可能 /secret/service/bbb のみ追加更新可能
  13. AWS Auth Method AWS SSOとの連携 • aws cli v2を用いて、各サービスごとのIAM RoleへのSSOログイン

    • vault cliを用いて、AWS Auth MethodによるVault ログイン ◦ client tokenを取得 • Web UIにclient tokenをコピペ $ vault login -method=aws -field=token -no-store role=aaa-role $ aws sso --profile aaa-developers login
  14. AWS Auth Method auth_type iam bound_ec2_instance_id null bound_iam_principal_arn ["arn:aws:iam::XXXXXXXXXXXX:role/aws-reserved/sso.amazonaws.com/us-west-2/AWSReservedSSO_XXX.AAA_DEVELO PERS_0000000000000000"]

    bound_iam_principal_id ["XXXXXXXXXX"] role_id XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX token_explicit_max_ttl 0 token_max_ttl 3600 token_no_default_policy false token_policies ["aaa-aws-auth"] token_ttl 0 token_type default auth/aws/role/aaa-role
  15. AWS Auth Method path "secret/*" { capabilities = ["list"] }

    path "secret/data/service/aaa/*" { capabilities = ["create", "update", "read", "delete"] } aaa-aws-auth.hcl(Policy)
  16. できるようになったこと Vault サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム

    サービスA サービスB サービスC サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 できるようになったこと Kubernetes Auth Method + Policy AWS Auth Method + Policy
  17. 改善点 • 適切なアクセスコントロールは実現できたが、AWS Auth Methodでのログインフ ローが複雑 ◦ AWS SSOでログイン→Vaultトークンを取得→Web UIにコピペ

    ◦ 若干面倒 • OIDC Auth Methodの導入 ◦ Azure ADをOIDC Providerとして使ったVaultへのログイン ◦ ログインフローの簡略化を実現