認可

Unix ソケットで Incus とやり取りする際、incus-adminグループのメンバーは Incus API へのフルアクセスを得ます。 一方、incus グループのみのメンバーはそのユーザーに割り当てられた単一のプロジェクトに制限されます。

ネットワーク越しに Incus とやり取りする際は(手順はIncusをネットワークに公開するには参照)、さらに認証しユーザーアクセスを制限できます。 以下の 3 つの認可の方法がサポートされます:

TLS 認可

Incus はネイティブで 信頼できるTLSクライアント を 1 つまたは複数のプロジェクトに制限することをサポートします。 クライアント証明書が制限される際、クライアントはまたグローバルな設定変更やアクセス可能なプロジェクトの設定(限度や制約)の変更も行えません。

アクセスを制限するには、incus config trust edit <fingerprint> を使用します。 restrictedキーをtrueに設定し、クライアントのアクセスを制限するプロジェクトのリストを指定します。 プロジェクトのリストが空の場合、クライアントはどのプロジェクトへのアクセスも許可されません。

OpenFGA authorizationが設定されている場合でも、クライアントが TLS で認証する場合は、この認可の方法が使われます。

Open Fine-Grained Authorization (OpenFGA)

Incus は OpenFGA との統合をサポートします。 この認可の方法はきめ細かく設定ができます。 例えば、ユーザーアクセスを単一のインスタンスに制限するのに使えます。

OpenFGA を認可に使うには、あなた自身で OpenFGA サーバーを設定し稼働させる必要があります。 Incus は OpenFGA サーバーに接続し、OpenFGA モデル を書き込み、以降の全てのリクエストへの認可をこのサーバーに問い合わせます。

Incusでこの認可の方法を有効にするには、openfga.*サーバー設定オプションを設定してください。 OpenFGAを有効にするためにはすべてのオプションの設定が必要です。しかし、認可モデルを自身で作成する必要はありません。認証されたユーザーだけを許可するような初期設定タプルserver:incus#authenticated@user:*を含む認可モデルをIncusが生成します。

OpenFGA モデル

OpenFGA では、特定の API リソースへのアクセスはユーザーとそのリソースの関連によって決定されます。 これらの関連は OpenFGA 認可モデルで決まります。 Incus の OpenFGA 認可モデルは API リソースを他のリソースとの関連とユーザーやグループのそのリソースへの関連に基づいて記述します。

model
  schema 1.1
type user

type group
  relations
    define member: [user]

type certificate
  relations
    define server: [server]
    define can_edit: [user, group#member] or admin from server
    define can_view: viewer from server

type image
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type image_alias
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type instance
  relations
    define project: [project]
    define admin: [user, group#member] or admin from project
    define operator: [user, group#member] or admin or operator from project
    define user: [user, group#member] or operator or user from project
    define viewer: [user, group#member] or user or viewer from project
    define can_access_console: [user, group#member] or user
    define can_access_files: [user, group#member] or user
    define can_connect_nbd: [user, group#member] or user
    define can_connect_sftp: [user, group#member] or user
    define can_edit: operator
    define can_exec: [user, group#member] or user
    define can_manage_backups: [user, group#member] or operator
    define can_manage_snapshots: [user, group#member] or operator
    define can_update_state: [user, group#member] or operator
    define can_view: viewer

type network
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type network_acl
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type network_address_set
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type network_integration
  relations
    define server: [server]
    define can_edit: [user, group#member] or admin from server
    define can_view: viewer from server

type network_zone
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type profile
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type project
  relations
    define server: [server]
    define admin: [user, group#member] or admin from server
    define operator: [user, group#member] or admin or operator from server
    define user: [user, group#member] or operator or user from server
    define viewer: [user, group#member] or user or viewer from server
    define can_create_image_aliases: [user, group#member] or operator
    define can_create_images: [user, group#member] or operator
    define can_create_instances: [user, group#member] or operator
    define can_create_network_acls: [user, group#member] or operator
    define can_create_network_address_sets: [user, group#member] or operator
    define can_create_networks: [user, group#member] or operator
    define can_create_network_zones: [user, group#member] or operator
    define can_create_profiles: [user, group#member] or operator
    define can_create_storage_buckets: [user, group#member] or operator
    define can_create_storage_volumes: [user, group#member] or operator
    define can_edit: admin
    define can_view_events: [user, group#member] or user
    define can_view_operations: [user, group#member] or user
    define can_view: viewer

type server
  relations
    define admin: [user, group#member]
    define operator: [user, group#member] or admin
    define user: [user, group#member] or operator
    define viewer: [user, group#member] or user
    define authenticated: [user:*]
    define can_create_certificates: [user, group#member] or admin
    define can_create_network_integrations: [user, group#member] or admin
    define can_create_projects: [user, group#member] or admin
    define can_create_storage_pools: [user, group#member] or admin
    define can_edit: admin
    define can_override_cluster_target_restriction: [user, group#member] or admin
    define can_view_privileged_events: [user, group#member] or admin
    define can_view_metrics: authenticated
    define can_view_resources: authenticated
    define can_view_sensitive: [user, group#member] or viewer
    define can_view: authenticated

type storage_bucket
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_view: [user, group#member] or can_edit or viewer from project

type storage_pool
  relations
    define server: [server]
    define can_edit: [user, group#member] or admin from server
    define can_view: authenticated from server

type storage_volume
  relations
    define project: [project]
    define can_edit: [user, group#member] or operator from project
    define can_manage_backups: [user, group#member] or can_edit
    define can_manage_snapshots: [user, group#member] or can_edit
    define can_view: [user, group#member] or can_edit or viewer from project
    define can_access_files: [user, group#member] or can_edit
    define can_connect_nbd: [user, group#member] or can_edit
    define can_connect_sftp: [user, group#member] or can_edit

重要

ホストへのルート権限を信頼して与えられないユーザーに対しては以下の関連は許可すべきではありません:

  • server -> admin

  • server -> operator

  • server -> can_edit

  • server -> can_create_storage_pools

  • server -> can_create_projects

  • server -> can_create_certificates

  • certificate -> can_edit

  • storage_pool -> can_edit

  • project -> admin

他の関連は許可しても構いません。 しかし、適切なプロジェクトの制約を適用する必要があります。

完全な Incus の OpenFGA の認可モデル internal/server/auth/driver_openfga_model.openfga 内で定義されます:

認可スクリプトレット

Incusはきめ細やかな認可を管理するスクリプトレットの定義をサポートします。これにより外部ツールに依存することなく詳細な認可のルールを書くことができます。

認可スクリプトレットを使うためには、authorization.scriptletサーバー設定オプションにauthorizeという関数を実装するスクリプトレットを書きます。この関数は3つの引数を取ります:

  • details:以下のアトリビュートを持つオブジェクト

    • Username: ユーザー名あるいは証明書のフィンガープリント

    • Protocol: 認証プロトコル

    • IsAllProjectsRequest: リクエストがすべてのプロジェクトに対してされるかどうか

    • ProjectName: プロジェクト名

    • Chain: 切り分けられたx509証明書のリスト形式の証明書チェーン

    • Certificate: データベースに保管される証明書データ

  • object:ユーザーが認可をリクエストする対象のオブジェクト

  • entitlement:ユーザーが希望する認可レベル

この関数はユーザーが対象のオブジェクトに指定の認可レベルでアクセスできるかできないかを示すBooleanの値を返す必要があります。

さらに、アクセスAPIを使ってユーザーが一覧表示できるように、2つのオプショナルな関数を定義できます:

  • get_instance_access:2つの引数(project_nameinstance_name)を取り、指定のインスタンスにアクセスできるユーザー一覧を返す

  • get_project_access:1つの引数(project_name)を取り、指定のプロジェクトにアクセスできるユーザー一覧を返す