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

Terraformで実現するHR Driven Provisioningとアクセス制御の自動化...

Yuya Takeyama
October 18, 2024
170

Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 / HR Driven Provisioning and automation of access control using Terraform

2024/10/18 at CorpEn Night #1

Yuya Takeyama

October 18, 2024
Tweet

More Decks by Yuya Takeyama

Transcript

  1. © LayerX Inc. 2 • 以下、OR条件です ◦ 社内のIdP、クラウドサービスのグループの管理に苦労している担当者 ◦ コーポレートエンジニアリングに興味のあるSoftware

    Engineer、特に Platform Engineeringに造詣のある方 • TerraformまたはInfrastructure as Codeの概要は知っている方向け 想定する聞き手 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  2. © LayerX Inc. 3 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 竹山雄也 (@yuya-takeyama) •

    株式会社LayerX • コーポレートエンジニアリング室 • 2023年9月入社 • 前職はSRE • 浅草在住 • 趣味: メタル、麻雀、飲み歩き、散歩、ランニング
  3. © LayerX Inc. 4 「すべての経済活動を、デジタル化する。」をミッションに掲げ、 法人支出管理サービス「バクラク」や企業内業務のデジタル化を支援するサービスを提供しています。 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 バクラク事業

    企業活動のインフラとなる法人支出 管理(BSM)SaaSを開発・提供 Fintech事業 ソフトウェアを駆使したアセットマネジメ ント・証券事業を合弁会社にて展開 AI・LLM事業 文書処理を中心とした、LLMの活用による プロセスのリデザイン
  4. © LayerX Inc. 13 • 人事システムを元にしたデジタルアイデンティティの作成・管理プロセス • 参考 ◦ https://learn.microsoft.com/en-us/entra/identity/app-pro

    visioning/what-is-hr-driven-provisioning • 元のブログ記事に対する X 上での反応を見て知りました HR Driven Provisioningとは Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  5. © LayerX Inc. 14 • プロダクトの管理システムのロールごとのメンバーのメンテナンスを統制の取れ た状態にしたい • 管理システムのロールは Microsoft

    Entra ID の Group として実装 ◦ 管理者、一般、ReadOnly等 • はじめに、ロールごとにどういった人たちがそれを持つべきかを定義した ◦ 所属部署、役職、雇用形態、職種等 • 属性を元にアクセス制御を自動化することで、生産性とガバナンスを両立したい • その他、各種 SaaS でのアクセス制限にも転用したい 解決したかった問題 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  6. © LayerX Inc. 15 • 自動化設定を行ったグループは SmartHR の情報をもとにメンバーが決まる ◦ メンバーの自動割り当てを行うシステムへの設定を行う必要がある

    (未完) ◦ そもそも人事情報を元に決められないグループも (手動またはコード管理) • 各種 SaaS へ SCIM で自動プロビジョニング ◦ Google Workspace, Slack, Notion, 1Password, etc. ◦ グループメンバーも同期される • 入退社に伴う部分は人間の手入力をもとにした発行予約システムが存在 ◦ つまり HR Driven Provisioning ではない ◦ https://tech.layerx.co.jp/entry/2022/07/27/090609 LayerX における HR Driven Provisioning の現在地点 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  7. © LayerX Inc. 17 ABAC Generator とは Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

    • グループ管理をいい感じにするために作られたツール • 従業員の属性を元に、どのグループに誰が入るべきかを判断する • Terraform の azuread_group リソースが記述されたファイルを出力 • 600 行未満の TypeScript で作られた小さなツール ◦ ユニットテスト、設定、コメントなどを除く • 設定ファイルにグループの設定と、どういうメンバーが所属すべきか、を記述 ◦ 設定は TypeScript で記述
  8. © LayerX Inc. 18 ABAC (Attribute-Based Access Control) とは Terraformで実現するHR

    Driven Provisioningとアクセス制御の自動化 • 属性をベースにアクセスの制御を行う ◦ 所属、役職、雇用形態、職種、などなど • 例 ◦ この画面には部署 A の正社員のみアクセス可能 ◦ このファイルには部署 B のマネージャーのみアクセス可能 • 類概念 ◦ RBAC (Role-Based Access Control) ◦ ざっくりいうと、所属グループをもとにしたアクセス管理 (例: 管理者グループ)
  9. © LayerX Inc. 19 あくまでも「擬似的な」ABAC Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • 属性に基づいて役割を付与することでそれっぽいことを実現

    ◦ 属性: 所属部署、役職、雇用形態、職種等 ◦ 役割: 管理者、一般、ReadOnly ▪ ABACっぽいことをRBACなシステムの上で行う • これ自体をABACと言い切るとおそらく間違い • 対応できる属性とできない属性がある ◦ 対応できないもの: IPアドレス、アクセス時刻、デバイス種別 ◦ 主に環境・コンテキストについての属性
  10. © LayerX Inc. 20 ABAC Generator の実行の流れ • 必要な情報を API

    を通じて全てかき集める ◦ SmartHR の全従業員 (所属情報も持っている) ◦ Microsoft Graph API (メールアドレスと Entra 上の User ID を持っている) • 設定ファイル上の条件に応じて、各グループのメンバーなどあるべき状態を決定 • 決まったメンバーの情報をもとに Terraform のファイルを出力 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  11. © LayerX Inc. 21 1. GitHub Actions により、毎日定時または手動で実行する 2. GitHub

    の Terraform ファイルが管理されたリポジトリをチェックアウト 3. ABAC Generator で tf ファイルを出力し、元のファイルを上書き 4. ファイルに差分があれば Pull Request を作成 5. 誰か (主に私) が確認して問題なければマージ 6. Terraform 用の CI/CD パイプラインによって terraform apply が自動実行 a. 関連: コンパウンドスタートアップのためのスケーラブルでセキュアなInfrastructure as Codeパイプラインを考える https://speakerdeck.com/yuyatakeyama/scalable-and-secure-infrastructure-as-co de-pipeline-for-a-compound-startup-c8f5baa6-b9ac-48e5-a680-f8830004ed7f 実際のグループの作成・更新までの流れ Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  12. © LayerX Inc. 22 設定ファイル Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 export const

    groups: Group[] = [ { resourceId: "abac_managers", name: "マネージャー", mailNickname: "managers", memberConditions: [ { positionId: Positions.マネージャー }, { positionId: Positions.部長 }, // その他、マネージャーに該当する役職全て ], }, ];
  13. © LayerX Inc. 23 自動生成される Terraform ファイル Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

    resource "azuread_group" "abac_general_departments_members" { display_name = "マネージャー" security_enabled = true mail_enabled = true mail_nickname = "managers" types = ["Unified"] members = [ "00000000-0000-0000-0000-000000000000", # [email protected] "11111111-1111-1111-1111-111111111111", # [email protected] ] }
  14. © LayerX Inc. 24 所属部署との組み合わせ Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 export const

    groups: Group[] = [ { resourceId: "abac_div_a_managers", name: "A事業部マネージャー", mailNickname: "div-a-managers", memberConditions: [ { departmentCode: '1', positionId: Positions.マネージャー }, { departmentCode: '1', positionId: Positions.部長 }, // その他、マネージャーに該当する役職全て ], }, ];
  15. © LayerX Inc. 25 • 以前の職場にあったグループメンバー同期ツール ◦ 対象 3 サービスほどの

    SaaS で同じ名前のグループを同じメンバーで作る ◦ グループのメンバーは YAML で記述 (ABAC的ではない) ◦ GitHub Actions で各サービスのグループとメンバーを取得し、差分を適用 (追加 or 削除) ◦ Terraform 等のIaCツールは使わず、各サービスの SDK を利用 ◦ 作者の退職後、主に私がメンテナンスしていた • サービス間でグループが同期されていることの大事さを教えてくれたツール ◦ どのサービスでもスムーズなコミュニケーションが可能に (原体験) 余談: ABAC Generator の思想的ルーツ (1): Group Manager (仮称) Terraformで実現するHR Driven Provisioningとアクセス制御の自動化
  16. © LayerX Inc. 26 余談: ABAC Generator の思想的ルーツ (1): Group

    Manager (仮称) Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • 問題 ◦ メンバーは全てユーザー名を記述する必要 ◦ 差分をチェックして適用、をそれぞれの SaaS 向けに実装する必要があり面倒 ◦ ユニットテストも難しかった
  17. © LayerX Inc. 27 ABAC Generator によって解決した問題 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

    • 属性情報をもとに条件で指定することで、個別指定が不要に ◦ 個別指定する機能もあるにはある • Entra 以外のサービスへの同期は SCIM での自動プロビジョニングにお任せ ◦ (ABAC Generator 自体の機能ではない) • 「あるべき状態」を Terraform のファイルとして出力するだけ ◦ 差分の検知や追加・削除の処理を自分で書く必要がない ◦ ユニットテストも容易
  18. © LayerX Inc. 28 ユニットテストも容易に Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • SmartHR・Microsoft

    Entra ID からデータをかき集める処理 ◦ これは副作用を伴うのでユニットテストが難しい、しかし... • かき集めた情報をもとに、グループのあるべき状態を決定する処理 ◦ 入出力はいずれもプレーンな JavaScript のオブジェクトであり、副作用を持たな いのでユニットテストが容易 • グループのあるべき状態をもとに Terraform ファイルを出力する処理 ◦ JavaScript のオブジェクトを入力に、文字列を出力するだけなのでユニットテスト が容易 • 前述の Group Manager ではこれらが一体になっていたので、全体的にユ ニットテストが難しかった
  19. © LayerX Inc. 30 ABAC Generator における手法は、他ツールでも再現可能です (たぶん) Terraformで実現するHR Driven

    Provisioningとアクセス制御の自動化 • 基本的にはこれらさえあれば実現できるはず ◦ プログラムから利用な形の組織情報 (API、データベース等) ◦ API アクセス可能な IdP • 状態を保持できる宣言型の IaC ツール ◦ かつ、対象の IdP を管理できることが必要
  20. © LayerX Inc. 31 プログラムから利用な形のマスターデータ (API等) Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 •

    LayerX においては SmartHR • 特にこれが大事、全ての根源 • 私にとってラッキーだったこと ◦ 労務管理に SmartHR を利用していたこと (API が存在) ◦ HR の皆さんによって SmartHR 上のデータが整備されていたこと
  21. © LayerX Inc. 32 コード生成には大きく 2 種類 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

    • (私見です) • 一回限りのコード生成 ◦ 最初に一回限り、雛形としてのコード生成を行い、あとは生成されたコードを手作業 でメンテナンス ◦ 例: create-react-app, Rails の scaffold • 継続的なコード生成 ◦ 最初だけでなく、その後もずっとコード生成でメンテナンスし続ける ◦ 例: Rails における schema.rb • ABAC Generator は後者であることが重要なポイント
  22. © LayerX Inc. 33 余談: ABAC Generator の思想的ルーツ (2): Kubernetes

    Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • Kubernetes も Terraform 同様に宣言型の IaC ツールとしての側面を持つ ◦ 実際は「プラットフォームを作るためのプラットフォーム」ぐらい壮大 • 特に、Reconciliation Loop と呼ばれるコアの仕組み ◦ システムの現在の状態とあるべき状態を比較し、あるべき状態への変更を行う ▪ これ自体は Terraform と同じ ◦ これを無限にやり続けるループ ▪ クラウド側のエラーで失敗しても、ループによってあるべき状態に収束する ▪ 差分がなければ何もしない • 宣言的かつ継続的であることがポイント
  23. © LayerX Inc. 34 余談: ABAC Generator の思想的ルーツ (3): K8s向けに作ったCD基盤

    Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • kustomize等複数のツールを使って、ベースとなるマニフェスト (アプリケーショ ン定義) に各環境 (dev, stg, prd) ごと差異部分のマニフェストを組み合わせ て、最終的なマニフェストを生成 • Pull Request ごとにステージング環境をることができた • これを Argo CD を使って Kubernetes にデプロイ ◦ 手順が複雑でも、マニフェストさえ生成さえできれば、あとはいい感じに適用してくれる • (プロトタイプだけ作って、最終的には別の人がプロダクションレディなものを作り 上げた)
  24. © LayerX Inc. 35 手法のまとめ Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • 何らかのデータソースを元にあるべき状態を

    IaC ツールのコードとして出力する • そのファイルを継続的にリポジトリ内のファイルと比較して、差分があった時だけ 適用する • それを繰り返す ◦ 実質Reconciliation Loop (?)
  25. © LayerX Inc. 37 ソフトウェアアーキテクチャの重要性 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • 宣言型の

    IaC ツールはクラウド分野におけるここ 10 年程での重要な成果 ◦ Terraform も Kubernetes 最初のリリースは 2014 年 • 問題を「複雑なリソースを正しい状態に収束させること」だとするなら、これらの ツールや方法論を大いに参考にできる • より多様な人々がコーポレートエンジニアリングの分野でも活躍できる可能性があ ると言えそう
  26. © LayerX Inc. 38 私自身がやったことは本当に小さい Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 • 人事システム上のデータを整備したのも、継続的にメンテナンスしているのも

    HR の担当者 • 管理システムのアクセス制御を Entra の Group で表現する意思決定をしたの はプロダクトチームの担当者 • だが、600 行にも満たない小さなツールでそれらを適切に繋ぎ合わせるだけで も、大きな価値が実現できる可能性も見えた • 全体最適のために協調できる組織と、それを可能にする技術の両方が必要