ReBAC入門 「関係性」によるアクセス制御とは?

25.3K Views

January 20, 24

スライド概要

2024/01/20に開催されたBurikaigi 2024で発表したスライドです。

関連リソース:
Zanzibar Academy - https://zanzibar.academy/
OpenFGA - https://openfga.dev/

profile-image

Developer Advocate for Auth0 by Okta

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

ReBAC⼊⾨: 「関係性」による アクセス制御とは?

2.

今⽇のお題 ● ● ● ● ⾃⼰紹介 ReBACとは? OpenFGAを使ってみよう まとめ‧リソース

3.

⾃⼰紹介

4.

⾃⼰紹介 @Neri78

5.

3つのポイント

6.

富⼭県(⼊善町)出⾝ https://maps.app.goo.gl/jcCDt3CLT5UC6mFy6

7.

富⼭県⽴⼤出⾝ (今⽇の会場です)

8.

ヒカセン (ピンときたらお話ししましょ♪)

9.

お仕事の紹介

10.

⾃⼰紹介 Okta Japan株式会社 Principal Developer Advocate 池原 ⼤然(Daizen Ikehara) Email: [email protected] X(旧Twitter): @Neri78

12.

ReBACとは?

13.

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/

14.

https://zanzibar.academy/

15.

基本

16.

エディター‧ビューアー

17.

グループ

18.

フォルダー

19.

他のアクセス制御⽅式との⽐較 粒度 認可 ロジック 認可 データ 粗い 集約 集約 Attribute-based access control (ABAC) 細かい アプリケーション コード アプリケーション データベース Policy-based access control (PBAC) 細かい 集約 アプリケーション データベース Relation-based access control (ReBAC) 細かい 集約 集約 名前 Role-based access control (RBAC)

20.

OpenFGAを 使ってみよう

21.

https://openfga.dev/

22.

OpenFGAとは? ● ReBACのコンセプトを適⽤した きめ細やかな認可(Fine-Grained Authorization - FGA)が 可能なソリューション ○ Okta FGAのコア部分をオープンソースとして公開 ● 認可サーバーとアプリケーション向けにNode.js/Javascript、 GoLang、.NET、Python⽤のSDKを提供

23.

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

24.

認可チェックまでの流れ ● 次の2つを⽤いて関係性を記述 ○ Authorization Model - 1つ以上のType Definitionの組み合わせ ■ 例: ユーザーとドキュメントが定義されている ● ドキュメントは次の関係性を持つ ○ ○ ● 閲覧者 [ユーザー]、編集者 [ユーザー]、オーナー[ユーザー] Relationship Tuple - 関係性を表す構⽂、動的に変わりうる ■ 例:ユーザーのdaizenはドキュメントのスライドに対して 編集者という関係を有する OpenFGAサーバーに対して関係性の確認をリクエストする ○ Q: ユーザー:daizenはドキュメント:スライドに対して閲覧者という関係が あるか?

25.

http://localhost:3000/playground ● モデルの定義やテストが可能

26.

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

27.
[beta]
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/

}

28.

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

29.

Check ユーザー:daizenはドキュメント:スライドに対して閲覧者という関係があるか?

30.
[beta]
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}`);

31.
[beta]
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
},
// … 省略
]
}
);

32.
[beta]
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
});

33.
[beta]
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}`);

34.

おまけ: 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]

35.

まとめ‧リソース

36.

押さえておきたい⽤語 名前 設定例 ⼀部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

37.

まとめ ● 「関係性」を⽤いることでより細かなアクセス制御が可能 ○ 利⽤シナリオによっては使えるかも? ○ Authorization Modelがとても重要に感じる ● OpenFGA - https://openfga.dev/ ● 製品版も開発中 - https://docs.fga.dev/

38.

認証‧認可機能を実装するなら Customer Identity Cloud(Powered by Auth0) https://a0.to/jp-cic-dev

39.

Thank you! @Neri78