Slide 1

Slide 1 text

© LayerX Inc. Terraformで実現するHR Driven Provisioningと アクセス制御の自動化 2024/10/18 at CorpEn Night #1

Slide 2

Slide 2 text

© LayerX Inc. 2 ● 以下、OR条件です ○ 社内のIdP、クラウドサービスのグループの管理に苦労している担当者 ○ コーポレートエンジニアリングに興味のあるSoftware Engineer、特に Platform Engineeringに造詣のある方 ● TerraformまたはInfrastructure as Codeの概要は知っている方向け 想定する聞き手 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

Slide 3

Slide 3 text

© LayerX Inc. 3 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 竹山雄也 (@yuya-takeyama) ● 株式会社LayerX ● コーポレートエンジニアリング室 ● 2023年9月入社 ● 前職はSRE ● 浅草在住 ● 趣味: メタル、麻雀、飲み歩き、散歩、ランニング

Slide 4

Slide 4 text

© LayerX Inc. 4 「すべての経済活動を、デジタル化する。」をミッションに掲げ、 法人支出管理サービス「バクラク」や企業内業務のデジタル化を支援するサービスを提供しています。 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 バクラク事業 企業活動のインフラとなる法人支出 管理(BSM)SaaSを開発・提供 Fintech事業 ソフトウェアを駆使したアセットマネジメ ント・証券事業を合弁会社にて展開 AI・LLM事業 文書処理を中心とした、LLMの活用による プロセスのリデザイン

Slide 5

Slide 5 text

どれも作ってません

Slide 6

Slide 6 text

が、これらの全てのための 仕事をしていると自負しています! 今日はそのごく一部を紹介

Slide 7

Slide 7 text

© LayerX Inc. 7 ● 以前書いた以下のブログ記事をベースにしています ● その後の話など、新しい話も盛り込んでいます 今回の発表は Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 https://tech.layerx.co.jp/entry/psuedo-abac-system-using-smarthr

Slide 8

Slide 8 text

今日伝えたいこと

Slide 9

Slide 9 text

ソフトウェアアーキテクチャの重要性

Slide 10

Slide 10 text

全体最適を諦めない。常に横を見る

Slide 11

Slide 11 text

目次 Agenda ● HR Driven Provisioningとは ● ABAC Generatorの紹介 ● 手法の解説

Slide 12

Slide 12 text

HR Driven Provisioningとは

Slide 13

Slide 13 text

© 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とアクセス制御の自動化

Slide 14

Slide 14 text

© LayerX Inc. 14 ● プロダクトの管理システムのロールごとのメンバーのメンテナンスを統制の取れ た状態にしたい ● 管理システムのロールは Microsoft Entra ID の Group として実装 ○ 管理者、一般、ReadOnly等 ● はじめに、ロールごとにどういった人たちがそれを持つべきかを定義した ○ 所属部署、役職、雇用形態、職種等 ● 属性を元にアクセス制御を自動化することで、生産性とガバナンスを両立したい ● その他、各種 SaaS でのアクセス制限にも転用したい 解決したかった問題 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

Slide 15

Slide 15 text

© 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とアクセス制御の自動化

Slide 16

Slide 16 text

ABAC Generatorの紹介

Slide 17

Slide 17 text

© LayerX Inc. 17 ABAC Generator とは Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● グループ管理をいい感じにするために作られたツール ● 従業員の属性を元に、どのグループに誰が入るべきかを判断する ● Terraform の azuread_group リソースが記述されたファイルを出力 ● 600 行未満の TypeScript で作られた小さなツール ○ ユニットテスト、設定、コメントなどを除く ● 設定ファイルにグループの設定と、どういうメンバーが所属すべきか、を記述 ○ 設定は TypeScript で記述

Slide 18

Slide 18 text

© LayerX Inc. 18 ABAC (Attribute-Based Access Control) とは Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 属性をベースにアクセスの制御を行う ○ 所属、役職、雇用形態、職種、などなど ● 例 ○ この画面には部署 A の正社員のみアクセス可能 ○ このファイルには部署 B のマネージャーのみアクセス可能 ● 類概念 ○ RBAC (Role-Based Access Control) ○ ざっくりいうと、所属グループをもとにしたアクセス管理 (例: 管理者グループ)

Slide 19

Slide 19 text

© LayerX Inc. 19 あくまでも「擬似的な」ABAC Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 属性に基づいて役割を付与することでそれっぽいことを実現 ○ 属性: 所属部署、役職、雇用形態、職種等 ○ 役割: 管理者、一般、ReadOnly ■ ABACっぽいことをRBACなシステムの上で行う ● これ自体をABACと言い切るとおそらく間違い ● 対応できる属性とできない属性がある ○ 対応できないもの: IPアドレス、アクセス時刻、デバイス種別 ○ 主に環境・コンテキストについての属性

Slide 20

Slide 20 text

© LayerX Inc. 20 ABAC Generator の実行の流れ ● 必要な情報を API を通じて全てかき集める ○ SmartHR の全従業員 (所属情報も持っている) ○ Microsoft Graph API (メールアドレスと Entra 上の User ID を持っている) ● 設定ファイル上の条件に応じて、各グループのメンバーなどあるべき状態を決定 ● 決まったメンバーの情報をもとに Terraform のファイルを出力 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化

Slide 21

Slide 21 text

© 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とアクセス制御の自動化

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

© 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] ] }

Slide 24

Slide 24 text

© 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.部長 }, // その他、マネージャーに該当する役職全て ], }, ];

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

© LayerX Inc. 26 余談: ABAC Generator の思想的ルーツ (1): Group Manager (仮称) Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 問題 ○ メンバーは全てユーザー名を記述する必要 ○ 差分をチェックして適用、をそれぞれの SaaS 向けに実装する必要があり面倒 ○ ユニットテストも難しかった

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

© LayerX Inc. 28 ユニットテストも容易に Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● SmartHR・Microsoft Entra ID からデータをかき集める処理 ○ これは副作用を伴うのでユニットテストが難しい、しかし... ● かき集めた情報をもとに、グループのあるべき状態を決定する処理 ○ 入出力はいずれもプレーンな JavaScript のオブジェクトであり、副作用を持たな いのでユニットテストが容易 ● グループのあるべき状態をもとに Terraform ファイルを出力する処理 ○ JavaScript のオブジェクトを入力に、文字列を出力するだけなのでユニットテスト が容易 ● 前述の Group Manager ではこれらが一体になっていたので、全体的にユ ニットテストが難しかった

Slide 29

Slide 29 text

手法の解説

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

© LayerX Inc. 31 プログラムから利用な形のマスターデータ (API等) Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● LayerX においては SmartHR ● 特にこれが大事、全ての根源 ● 私にとってラッキーだったこと ○ 労務管理に SmartHR を利用していたこと (API が存在) ○ HR の皆さんによって SmartHR 上のデータが整備されていたこと

Slide 32

Slide 32 text

© LayerX Inc. 32 コード生成には大きく 2 種類 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● (私見です) ● 一回限りのコード生成 ○ 最初に一回限り、雛形としてのコード生成を行い、あとは生成されたコードを手作業 でメンテナンス ○ 例: create-react-app, Rails の scaffold ● 継続的なコード生成 ○ 最初だけでなく、その後もずっとコード生成でメンテナンスし続ける ○ 例: Rails における schema.rb ● ABAC Generator は後者であることが重要なポイント

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

© LayerX Inc. 35 手法のまとめ Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 何らかのデータソースを元にあるべき状態を IaC ツールのコードとして出力する ● そのファイルを継続的にリポジトリ内のファイルと比較して、差分があった時だけ 適用する ● それを繰り返す ○ 実質Reconciliation Loop (?)

Slide 36

Slide 36 text

終わりに

Slide 37

Slide 37 text

© LayerX Inc. 37 ソフトウェアアーキテクチャの重要性 Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 宣言型の IaC ツールはクラウド分野におけるここ 10 年程での重要な成果 ○ Terraform も Kubernetes 最初のリリースは 2014 年 ● 問題を「複雑なリソースを正しい状態に収束させること」だとするなら、これらの ツールや方法論を大いに参考にできる ● より多様な人々がコーポレートエンジニアリングの分野でも活躍できる可能性があ ると言えそう

Slide 38

Slide 38 text

© LayerX Inc. 38 私自身がやったことは本当に小さい Terraformで実現するHR Driven Provisioningとアクセス制御の自動化 ● 人事システム上のデータを整備したのも、継続的にメンテナンスしているのも HR の担当者 ● 管理システムのアクセス制御を Entra の Group で表現する意思決定をしたの はプロダクトチームの担当者 ● だが、600 行にも満たない小さなツールでそれらを適切に繋ぎ合わせるだけで も、大きな価値が実現できる可能性も見えた ● 全体最適のために協調できる組織と、それを可能にする技術の両方が必要

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Bet Technology!