第7章 Red Hat Developer Hub の条件付きポリシー


Red Hat Developer Hub の権限フレームワークでは、RBAC バックエンドプラグイン (backstage-plugin-rbac-backend) によってサポートされる条件を使用できます。条件は、RBAC バックエンドプラグインによって提供される Developer Hub リソースのコンテンツフィルターとして機能します。

RBAC バックエンド API は、ロールに割り当てられた条件をデータベースに保存します。ユーザーがフロントエンドリソースへのアクセスを要求すると、RBAC バックエンド API は、対応する条件を検索し、プラグイン ID を使用して適切なプラグインに条件を委譲します。異なる条件を持つ複数のロールにユーザーが割り当てられている場合、RBAC バックエンドは anyOf 基準を使用して条件をマージします。

条件基準

Developer Hub の条件は、ルールとパラメーターを含む単純な条件です。ただし、条件には、条件基準によって結合されたパラメーターまたはパラメーターの配列を含めることもできます。サポートされている条件基準は次のとおりです。

  • allOf: 結合された条件が満たされるためには、配列内のすべての条件が true でなければならない。
  • anyOf: 結合された条件が満たされるためには、配列内の条件の少なくとも 1 つが true でなければならない。
  • not: 結合された条件が満たされるためには、その中の条件が true であってはならない。
条件オブジェクト

条件でサポートされるパラメーターは、プラグインによって指定されます。RBAC API エンドポイントから条件オブジェクトスキーマにアクセスすると、RBAC バックエンドプラグイン API で使用される JSON 条件オブジェクトの構築方法を確認できます。

条件オブジェクトには次のパラメーターがあります。

表7.1 条件オブジェクトのパラメーター
パラメーター説明

result

String

常に CONDITIONAL の値を持ちます。

roleEntityRef

String

RBAC ロールへの文字列エンティティー参照 (role:default/dev など)

pluginId

String

対応するプラグイン ID (catalog など)

permissionMapping

文字列配列

権限アクションの配列 (['read', 'update', 'delete'] など)

resourceType

String

プラグインによって提供されるリソースタイプ (catalog-entity など)

conditions

JSON

条件によって結合されたパラメーターまたは配列パラメーターを含む条件 JSON

条件付きポリシーエイリアス

RBAC バックエンドプラグイン (backstage-plugin-rbac-backend) は、条件付きポリシールールパラメーターでのエイリアスの使用をサポートしています。条件付きポリシーエイリアスは、ポリシー評価中に対応する値に動的に置き換えられます。条件付きポリシー内の各エイリアスには、その特殊な機能を示す $ 記号が先頭に付きます。

サポートされている条件付きエイリアスは次のとおりです。

  • $currentUser: このエイリアスは、リソースへのアクセスを要求するユーザーのユーザーエンティティー参照に置き換えられます。たとえば、デフォルトの namespace のユーザー Tom がアクセスを要求すると、$currentUseruser:default/tom になります。

$currentUser エイリアスを使用した条件付きポリシーオブジェクトの例

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["delete"],
  "conditions": {
    "rule": "IS_ENTITY_OWNER",
    "resourceType": "catalog-entity",
    "params": {
      "claims": ["$currentUser"]
    }
  }
}

  • $ownerRefs: このエイリアスは所有者参照に置き換えられます。通常は、ユーザーエンティティー参照とユーザーの親グループエンティティー参照を含む配列として表されます。たとえば、team-a のユーザー Tom の場合、$ownerRefs['user:default/tom', 'group:default/team-a'] になります。

$ownerRefs エイリアスを使用した条件付きポリシーオブジェクトの例

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["delete"],
  "conditions": {
    "rule": "IS_ENTITY_OWNER",
    "resourceType": "catalog-entity",
    "params": {
      "claims": ["$ownerRefs"]
    }
  }
}

7.1. 条件付きポリシーの参照

Red Hat Developer Hub では、条件付きポリシー用の API エンドポイントにアクセスできます。たとえば、条件付きポリシーを定義するのに役立つ利用可能な条件ルールを取得するために、GET [api/plugins/condition-rules] エンドポイントにアクセスできます。

api/plugins/condition-rules は、条件パラメータースキーマを返します。次に例を示します。

[
   {
      "pluginId": "catalog",
      "rules": [
         {
            "name": "HAS_ANNOTATION",
            "description": "Allow entities with the specified annotation",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "annotation": {
                     "type": "string",
                     "description": "Name of the annotation to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the annotation to match on"
                  }
               },
               "required": [
                  "annotation"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_LABEL",
            "description": "Allow entities with the specified label",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "label": {
                     "type": "string",
                     "description": "Name of the label to match on"
                  }
               },
               "required": [
                  "label"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_METADATA",
            "description": "Allow entities with the specified metadata subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities metadata to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_SPEC",
            "description": "Allow entities with the specified spec subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities spec to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_KIND",
            "description": "Allow entities matching a specified kind",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "kinds": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of kinds to match at least one of"
                  }
               },
               "required": [
                  "kinds"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_OWNER",
            "description": "Allow entities owned by a specified claim",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "claims": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of claims to match at least one on within ownedBy"
                  }
               },
               "required": [
                  "claims"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         }
      ]
   }
   ... <another plugin condition parameter schemas>
]

RBAC バックエンド API は、上記の条件スキーマに基づいて JSON 条件オブジェクトを構築します。

7.1.1. 条件付きポリシーの例

Red Hat Developer Hub では、基準のある、または基準のない条件付きポリシーを定義できます。次の例を使用して、ユースケースに応じて条件を定義できます。

基準のない条件

ユーザーが所有者グループに属する場合にのみカタログを表示する、基準のない条件を考えてみます。この条件を追加するには、カタログプラグインスキーマ IS_ENTITY_OWNER を次のように使用します。

基準のない条件の例

{
  "rule": "IS_ENTITY_OWNER",
  "resourceType": "catalog-entity",
  "params": {
    "claims": ["group:default/team-a"]
  }
}

上記の例では、条件パラメーターとして、ユーザーまたはグループエンティティー参照のリストを含む Claims だけが使用されています。

次のように追加のパラメーターを追加することで、上記の例の条件を RBAC REST API に適用できます。

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "rule": "IS_ENTITY_OWNER",
    "resourceType": "catalog-entity",
    "params": {
      "claims": ["group:default/team-a"]
    }
  }
}
基準のある条件

ユーザーが所有者グループに属する場合にのみカタログを表示するか、すべてのカタログユーザーグループのリストを表示する、基準のある条件を考えてみます。

基準を追加するには、次のように、条件に IS_ENTITY_KIND として別のルールを追加します。

基準のある条件の例

{
  "anyOf": [
    {
      "rule": "IS_ENTITY_OWNER",
      "resourceType": "catalog-entity",
      "params": {
        "claims": ["group:default/team-a"]
      }
    },
    {
      "rule": "IS_ENTITY_KIND",
      "resourceType": "catalog-entity",
      "params": {
        "kinds": ["Group"]
      }
    }
  ]
}

注記

作成中に条件を並行して実行することは、サポートされていません。したがって、利用可能な基準に基づいて、ネストされた条件付きポリシーを定義することを検討してください。

ネストされた条件の例

{
  "anyOf": [
    {
      "rule": "IS_ENTITY_OWNER",
      "resourceType": "catalog-entity",
      "params": {
        "claims": ["group:default/team-a"]
      }
    },
    {
      "rule": "IS_ENTITY_KIND",
      "resourceType": "catalog-entity",
      "params": {
        "kinds": ["Group"]
      }
    }
  ],
  "not": {
    "rule": "IS_ENTITY_KIND",
    "resourceType": "catalog-entity",
    "params": { "kinds": ["Api"] }
  }
}

次のように追加のパラメーターを追加することで、上記の例の条件を RBAC REST API に適用できます。

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "anyOf": [
      {
        "rule": "IS_ENTITY_OWNER",
        "resourceType": "catalog-entity",
        "params": {
          "claims": ["group:default/team-a"]
        }
      },
      {
        "rule": "IS_ENTITY_KIND",
        "resourceType": "catalog-entity",
        "params": {
          "kinds": ["Group"]
        }
      }
    ]
  }
}

以下の例は、Developer Hub プラグインで使用できます。以下の例は、条件付きポリシーを定義する方法を決定するのに役立ちます。

Keycloak プラグイン用に定義した条件付きポリシー

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["update", "delete"],
  "conditions": {
    "not": {
      "rule": "HAS_ANNOTATION",
      "resourceType": "catalog-entity",
      "params": { "annotation": "keycloak.org/realm", "value": "<YOUR_REALM>" }
    }
  }
}

上記の Keycloak プラグインの例では、role:default/developer のユーザーが、Keycloak プラグインからカタログに取り込まれたユーザーを更新または削除できないようにしています。

注記

上記の例では、アノテーション keycloak.org/realm<YOUR_REALM> の値が必要です。

Quay プラグイン用に定義した条件付きポリシー

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "scaffolder",
  "resourceType": "scaffolder-action",
  "permissionMapping": ["use"],
  "conditions": {
    "not": {
      "rule": "HAS_ACTION_ID",
      "resourceType": "scaffolder-action",
      "params": { "actionId": "quay:create-repository" }
    }
  }
}

上記の Quay プラグインの例では、ロール role:default/developer が Quay の scaffolder アクションを使用できないようにしています。permissionMappinguse が含まれていることに注意してください。これは、scaffolder-action リソースタイプ権限に権限ポリシーがないことを示しています。

Red Hat Developer Hub の権限の詳細は、6章パーミッションポリシーの参照 を参照してください。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.