認可¶
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 -> adminserver -> operatorserver -> can_editserver -> can_create_storage_poolsserver -> can_create_projectsserver -> can_create_certificatescertificate -> can_editstorage_pool -> can_editproject -> 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_nameとinstance_name)を取り、指定のインスタンスにアクセスできるユーザー一覧を返すget_project_access:1つの引数(project_name)を取り、指定のプロジェクトにアクセスできるユーザー一覧を返す