25.3K Views
January 20, 24
スライド概要
2024/01/20に開催されたBurikaigi 2024で発表したスライドです。
関連リソース:
Zanzibar Academy - https://zanzibar.academy/
OpenFGA - https://openfga.dev/
Developer Advocate for Auth0 by Okta
ReBAC⼊⾨: 「関係性」による アクセス制御とは?
今⽇のお題 ● ● ● ● ⾃⼰紹介 ReBACとは? OpenFGAを使ってみよう まとめ‧リソース
⾃⼰紹介
⾃⼰紹介 @Neri78
3つのポイント
富⼭県(⼊善町)出⾝ https://maps.app.goo.gl/jcCDt3CLT5UC6mFy6
富⼭県⽴⼤出⾝ (今⽇の会場です)
ヒカセン (ピンときたらお話ししましょ♪)
お仕事の紹介
⾃⼰紹介 Okta Japan株式会社 Principal Developer Advocate 池原 ⼤然(Daizen Ikehara) Email: [email protected] X(旧Twitter): @Neri78
ReBACとは?
ReBACとは ● ● Relationship-based Access Control (ReBAC) ○ リソースへのアクセス許可が「関係性」によって 決定されるアクセス制御 ○ 「このユーザーは、アクセスを可能にするほど、このオブジェクトや アクションと⼗分な関係があるか?」 ■ 関係性の⼀例 ● オブジェクトに関連する役割グループの⼀員である ● 直接関係がある ● ⽂章で共有されている 使⽤例: Googleの様々な製品における認可エンジン “Zanzibar” IAM⼊⾨: 認可とは? - https://auth0.com/jp/intro-to-iam/what-is-authorization Zanzibar: Google’s Consistent, Global Authorization System - https://research.google/pubs/zanzibar-googles-consistent-global-authorization-system/
https://zanzibar.academy/
基本
エディター‧ビューアー
グループ
フォルダー
他のアクセス制御⽅式との⽐較 粒度 認可 ロジック 認可 データ 粗い 集約 集約 Attribute-based access control (ABAC) 細かい アプリケーション コード アプリケーション データベース Policy-based access control (PBAC) 細かい 集約 アプリケーション データベース Relation-based access control (ReBAC) 細かい 集約 集約 名前 Role-based access control (RBAC)
OpenFGAを 使ってみよう
https://openfga.dev/
OpenFGAとは? ● ReBACのコンセプトを適⽤した きめ細やかな認可(Fine-Grained Authorization - FGA)が 可能なソリューション ○ Okta FGAのコア部分をオープンソースとして公開 ● 認可サーバーとアプリケーション向けにNode.js/Javascript、 GoLang、.NET、Python⽤のSDKを提供
OpenFGAサーバーのインストール ● 現在⽤意されているガイドは3つ ○ ローカル ○ Docker ○ Kubernates ● ローカルでのセットアップ⽅法 ○ Homebrewを使⽤ brew install openfga ○ 事前コンパイルされたバイナリをダウンロード https://github.com/openfga/openfga/releases/tag/v1.4.2 Setup OpenFGA - https://openfga.dev/docs/getting-started/setup-openfga/overview
認可チェックまでの流れ ● 次の2つを⽤いて関係性を記述 ○ Authorization Model - 1つ以上のType Definitionの組み合わせ ■ 例: ユーザーとドキュメントが定義されている ● ドキュメントは次の関係性を持つ ○ ○ ● 閲覧者 [ユーザー]、編集者 [ユーザー]、オーナー[ユーザー] Relationship Tuple - 関係性を表す構⽂、動的に変わりうる ■ 例:ユーザーのdaizenはドキュメントのスライドに対して 編集者という関係を有する OpenFGAサーバーに対して関係性の確認をリクエストする ○ Q: ユーザー:daizenはドキュメント:スライドに対して閲覧者という関係が あるか?
http://localhost:3000/playground ● モデルの定義やテストが可能
Authorization Modelの作成 ● 1個以上のType Definitionを定義 ○ Type Definitionには Relation Definitionが含まれる model schema 1.1 type user ● Type Definition 例: ユーザーとドキュメントを定義 ○ ドキュメントは次の関係性を持つ ■ 閲覧者 [ユーザー] ■ 編集者 [ユーザー] ■ オーナー[ユーザー] type document relations define viewer: [user] define editor: [user] define owner: [user] Relation Definition
Configuration Language - DSL or JSON
APIのリクエストにはJSONを使⽤する
model
{
"owner": {
"schema_version": "1.1",
schema 1.1
"type_definitions": [
{
type user
define viewer: [user]
define editor: [user]
define owner: [user]
{
"type": "user"
"type": "user",
"metadata": {
"relations": {},
"relations": {
"metadata": null
relations
"directly_related_user_types": [
}
},
},
type document
"editor": {
"this": {}
}
]
"viewer": {
},
"directly_related_user_types": [
"owner": {
{
{
"type": "document",
"type": "user"
"relations": {
"viewer": {
"this": {}
"directly_related_user_types": [
{
}
"type": "user"
]
}
},
]
},
}
"editor": {
}
"this": {}
}
},
}
]
FGA CLIで相互の変換が可能 - https://github.com/openfga/cli/
}
Relationship Tuple 例:ユーザーのdaizenはドキュメントのスライドに対して編集者という関係を有する user、relation、object、condition ● user - objectと関係を有する エンティティ ○ user: daizen ● object - システムに存在する エンティティ ○ document:slide ● relation - 関係 ○ editor ● condition - 条件(任意) ○ in_allowed_ip_range [{ "user": "user:daizen", "relation": "editor", "object": "document:slide" }]
Check ユーザー:daizenはドキュメント:スライドに対して閲覧者という関係があるか?
SDK - Storeの作成
npm install @openfga/sdk
import { OpenFgaClient } from '@openfga/sdk';
import 'dotenv/config';
// クライアントの初期化
let fgaClient = new OpenFgaClient({
apiScheme: process.env.FGA_API_SCHEME,
apiHost: process.env.FGA_API_HOST
});
// Storeの作成
console.log('Storeの作成...');
const { id: storeId } = await fgaClient.createStore({
name: "burikaigi2024",
});
console.log(`Store ID: ${storeId}`);
SDK - Authorization Modelの作成
// クライアントの初期化
// Authorization Modelの作成
let fgaClient = new OpenFgaClient({
console.log('Authorization Modelの作成...');
apiScheme: process.env.FGA_API_SCHEME,
const { authorization_model_id:
apiHost: process.env.FGA_API_HOST,
authorization_model_id } =
storeId: process.env.FGA_STORE_ID
await fgaClient.writeAuthorizationModel({
"schema_version": "1.1",
});
"type_definitions": [
{
"type": "user",
"relations": {},
"metadata": null
},
// … 省略
]
}
);
SDK - Relationship Tupleの追加
// クライアントの初期化
// Relation Tupleの追加
let fgaClient = new OpenFgaClient({
// ユーザーの daizenはドキュメントのスライドに対して編集者という
apiScheme: process.env.FGA_API_SCHEME,
関係を有する
apiHost: process.env.FGA_API_HOST,
console.log('Relation Tupleの書き込み ...');
storeId: process.env.FGA_STORE_ID,
authorizationModelId:
const { result
} = await fgaClient.write({
writes: [
process.env.FGA_FGA_AUTHORIZATION_MODEL_ID
{"user":"user:daizen",
});
"relation":"editor",
"object":"document:slide"}],
},
{
authorization_model_id:
process.env.FGA_FGA_AUTHORIZATION_MODEL_ID
});
SDK - Check
// クライアントの初期化
// チェック
let fgaClient = new OpenFgaClient({
apiScheme: process.env.FGA_API_SCHEME,
apiHost: process.env.FGA_API_HOST,
storeId: process.env.FGA_STORE_ID,
console.log('チェック...')
let { allowed } = await fgaClient.check({
user: 'user:daizen',
authorizationModelId:
process.env.FGA_FGA_AUTHORIZATION_MODEL_ID
relation: 'viewer',
});
object: 'document:slide',
});
console.log(`user:daizenはdocument:slideの閲
覧権限を持っている = ${allowed}`);
おまけ: ownerが編集‧閲覧権限を持つには? model schema 1.1 model schema 1.1 type user type user type document type document relations relations define viewer: [user] define viewer: [user] or editor define editor: [user] define editor: [user] or owner define owner: [user] define owner: [user]
まとめ‧リソース
押さえておきたい⽤語 名前 設定例 ⼀部DSLで定義 説明 Type 同じような性質を持ち ⽂字列で定義されるもの user document Relation 関係性 user can be a reader of a document Type Definition 特定のTypeに対して可能な関係性を定義したもの type document relations define viewer: [user] Object システムに存在するエンティティ Type:識別⼦で定義される document:slide User objectと関係を有するエンティティ user:daizen
まとめ ● 「関係性」を⽤いることでより細かなアクセス制御が可能 ○ 利⽤シナリオによっては使えるかも? ○ Authorization Modelがとても重要に感じる ● OpenFGA - https://openfga.dev/ ● 製品版も開発中 - https://docs.fga.dev/
認証‧認可機能を実装するなら Customer Identity Cloud(Powered by Auth0) https://a0.to/jp-cic-dev
Thank you! @Neri78