Share
Embed
Transcript
48 slides
-
自己紹介 後藤 健汰(gotoken) @kennygt51 • SIerでの運用系SEを経て、 2019年1月 マネーフォワード入社 • インフラエンジニア
• アプリケーションのコンテナ化、サービ スのAWS移行 -
すべての人生を、 便利で豊かにする。 ビジネスの成長を加速させる。 くらしの経済メディア お金の見える化サービス 金融商品の比較・申し込みサイト 自動貯金アプリ お金を前へ。人生をもっと前へ。 パートナーと共に、 新たな金融サービスを創出する。
お金をいい方向へと動かす。 for ◦◦ 金融機関お客様向け自動家計簿・ 資産管理サービス 通帳アプリ 金融機関お客様向け通帳アプリ MF Unit 金融機関のアプリへの一部機能提供 企業間後払い決済サービス 売掛金早期資金化サービス BFM 法人向け資金管理サービス 成長企業向けフィナンシャル・ アドバイザリーサービス バックオフィス向け業務効率化ソリューション マネーフォワード MEユーザーのための FP相談窓口 マネーフォワード MEのデータを分析し最 適な行動をアドバイス DX人材特化のキャリア支援サービス -
HashiCorp Vaultとは何か HashiCorp Vaultとは HashiCorp社が開発したOSS 秘密情報を管理・保護する為のソフトウェア 特徴 • 秘密情報の保存先は拡張性が高く、様々なコンポーネントから選択可能( Storage
Backend) • 様々な秘密情報を管理できる( Secret Engine) • IdentityにPolicyを割り当てることで柔軟な認可の制御ができる( Auth Method) • 認証により発行された Tokenは時間ベースでRevokeされる(Client Token) -
特定の秘密情報は、アプリケーション間で共有する必要がある • オンプレミスで稼働するアプリケーションを、 Kubernetes(EKS)に移行 • 歴史的経緯により、アプリケーション間で値を共有しなければならない秘密情報が複数存在 • namespaceをまたいで、秘密情報を共有する必要 があった aaa-web-namespace
component-aaa-1 component-aaa-2 bbb-web-namespace component-bbb-1 component-bbb-2 ccc-web-namespace component-ccc-1 component-ccc-2 k8s cluster KubernetesのSecrestリソースは namespaceをまたいで値を共有することができない -
秘密情報管理をサービス開発者に権限移譲していきたい オンプレミス環境における秘密情報の管理フロー 秘密情報管理サーバ 秘密情報 サービスA チーム サービスB チーム サービスC チーム
インフラチーム サービスA サービスB サービスC ① サービスチームから インフラチームに登録依頼 ② インフラチームが 温かみのある手作業 で登録 ③ デプロイ時に各サービスに反映 -
秘密情報管理をサービス開発者に権限移譲していきたい 何らかの秘密情報管理ツール サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム
サービスA サービスB サービスC ① サービスチームが各サービ スの秘密情報を管理 ② 自分たちが管理する秘密情報を 任意のタイミングで反映 サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 目指したい姿 -
特定の秘密情報は、アプリケーション間で共有する必要がある Vault サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム
サービスA サービスB サービスC サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 実現方式 Vaultの提供する認証・認可の仕組みを用いて、 適切なアクセスコントロール を実現 それにより秘密情報の管理をサービスチームに委譲することが可能になる -
適切なアクセスコントロールの為に必要なこと アプリケーション • 特定のグループに属するアプリケーションが • 特定の秘密情報に対する参照の権限を持つこと サービス開発者 • 特定のグループに属するユーザが •
特定の秘密情報に対する追加・更新・削除の権限を持つこと -
Auth Method Auth Methodとはなにか • Vaultに対する認証を行うコンポーネントであり、ユーザに対して Identityと Policyを割り当てることに責務を持つ • 複数のAuth
Methodsを有効化することで、組織とVaultのユースケース に応じた認証方法を利用する事が出来る -
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の有効化 -
Policy path "secret/*" { capabilities = ["list"] } path "secret/data/service/aaa/*"
{ capabilities = ["create","read","update","delete"] } aaa_policy.hcl -
Auto MethodとPolicy Vault Policy (Policy A) Aさん ④ 認証(Auth Method)
① Policyを作成 ② Policyを登録 AさんはPolicy Aで 許可されたパスにアクセスできる Vault role (AさんとPolicy Aが紐づく) ③ role(認証の主体とPolicyを紐付ける設定)を登録 -
適切なアクセスコントロールの為に必要なこと(再掲) アプリケーション • 特定のグループに属するアプリケーションが • 特定の秘密情報に対する参照の権限を持つこと サービス開発者 • 特定のグループに属するユーザが •
特定の秘密情報に対する追加・更新・削除の権限を持つこと -
適切なアクセスコントロールの為に必要なこと(再掲) アプリケーション • 特定のグループに属するアプリケーションが • 特定の秘密情報に対する参照の権限を持つこと サービス開発者 • 特定のグループに属するユーザが •
特定の秘密情報に対する追加・更新・削除の権限を持つこと Kubernetes Auth Method + Policy AWS Auth Method + Policy -
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 のみ参照可能 -
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 -
Kubernetes Auth Method path "secret/*" { capabilities = ["list"] }
path "secret/data/service/aaa/*" { capabilities = ["read"] } aaa-k8s-auth.hcl(Policy) -
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 のみ追加更新可能 -
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 -
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 -
AWS Auth Method path "secret/*" { capabilities = ["list"] }
path "secret/data/service/aaa/*" { capabilities = ["create", "update", "read", "delete"] } aaa-aws-auth.hcl(Policy) -
できるようになったこと Vault サービスA用秘密情報 サービスA チーム サービスB チーム サービスC チーム インフラチーム
サービスA サービスB サービスC サービスB用秘密情報 サービスC用秘密情報 共有秘密情報 できるようになったこと Kubernetes Auth Method + Policy AWS Auth Method + Policy -
改善点 • 適切なアクセスコントロールは実現できたが、AWS Auth Methodでのログインフ ローが複雑 ◦ AWS SSOでログイン→Vaultトークンを取得→Web UIにコピペ
◦ 若干面倒 • OIDC Auth Methodの導入 ◦ Azure ADをOIDC Providerとして使ったVaultへのログイン ◦ ログインフローの簡略化を実現