API7 Enterprise 3.2.14.4:精细化权限管理的权限边界
August 15, 2024
API7 Enterprise v3.2.14.4が正式にリリースされ、企業におけるより細かいユーザー権限管理のニーズに対応するため、パーミッション境界(Permission Boundary)が導入されました。
パーミッション境界とは?
パーミッション境界とは、その名の通り、ユーザーが持つことができる権限の最大範囲を定義する「権限の壁」のようなものです。これは、ユーザーやロールがシステム内で実行できるアクションを制限するために使用されます。その主な目的は、システムのセキュリティを強化し、権限の悪用を防ぐことです。この「壁」を設定することで、ユーザーが自分の責任範囲内でのみ操作を行い、権限を超えてシステム内のデータにアクセスしたり変更したりできないようにすることができます。
パーミッション境界は、システム内の既存の権限ポリシーを再利用することも、新たに権限ポリシーを作成することもできます。ユーザーにパーミッション境界が割り当てられると、そのユーザーの権限は制限されますが、直接的に権限が付与されるわけではありません。
例
例えば、すべてのゲートウェイグループにわたるサービスの操作および閲覧権限を付与する権限ポリシーを作成し、このポリシーをユーザーTomのパーミッション境界として割り当てたとします。
{
"statement": [
// すべてのゲートウェイグループにわたる閲覧権限
{
"effect": "allow",
"resources": [
"arn:api7:gateway:gatewaygroup/<.*>"
],
"actions": [
"<.*>Get<.*>"
]
},
// すべてのゲートウェイグループにわたるサービス操作権限
{
"effect": "allow",
"resources": [
"*"
],
"actions": [
"arn:api7:gateway:gatewaygroup/<.*>/publishedservice/<.*>"
]
}
]
}
この場合、Tomの最大権限はこの権限ポリシー内に制限されます。パーミッション境界が設定されているからといって、Tomがすでにこれらの権限を持っているわけではありません。次に、Tomに以下の権限ポリシーを持つロールを割り当てます。
{
"statement": [
// すべてのゲートウェイグループにわたる閲覧権限
{
"effect": "allow",
"resources": [
"arn:api7:gateway:gatewaygroup/<.*>"
],
"actions": [
"<.*>Get<.*>"
]
},
// すべてのゲートウェイグループにわたるサービス操作権限
{
"effect": "allow",
"resources": [
"arn:api7:gateway:gatewaygroup/<.*>/publishedservice/<.*>"
],
"actions": [
"<.*>"
]
},
// カスタムプラグインの操作権限
{
"effect": "allow",
"resources": [
"arn:api7:gateway:gatewaysetting/*"
],
"actions": [
"gateway:<.*>CustomPlugin<.*>"
]
}
]
}
Tomはすべてのゲートウェイグループにわたるサービス操作、閲覧、およびカスタムプラグインの操作権限を付与されていますが、カスタムプラグインの編集権限を持っていないことに気づくでしょう。これは、Tomに対してパーミッション境界が設定されているためです。パーミッション境界がカスタムプラグインに関連する権限を含むように調整されない限り、境界を超える追加の権限は無効です。
パーミッション境界機能の使用方法
権限ポリシーの作成
パーミッション境界は、システム内の権限ポリシーを直接再利用できます。ユーザーにパーミッション境界を割り当てる前に、権限ポリシーを作成する必要があります。システムの組織メニューで「権限ポリシー」をクリックし、リストページに移動します。

次に、リストの右上にある「権限ポリシーを追加」をクリックして、作成フォームに移動します。
フォームに権限ポリシーの基本情報を入力し、対応するポリシーステートメントを設定して権限ポリシーを作成します。理論的には、同じ権限ポリシーを複数のロールに関連付け、複数のユーザーのパーミッション境界として使用できますが、この方法は推奨されません。
権限ポリシーの概念的な紹介については、記事「API7 Enterprise 3.4.14の新機能: IAMによる細かいアクセス制御」を参照してください。一般的なポリシー設定例については、ドキュメント「権限ポリシーの例」を参照してください。リソースとアクションの取り得る値と対応するAPIについては、ドキュメント「権限ポリシーのアクションとリソース」を参照してください。
パーミッション境界の割り当て
権限ポリシーを作成した後、パーミッション境界を割り当てることができます。組織メニューで「ユーザー」をクリックし、ユーザーリストページに移動します。

新しいユーザーを招待する際に、直接パーミッション境界を割り当てることができます。招待フォームには、パーミッション境界の新しいフィールドが含まれており、ユーザーがシステムにログインすると、このパーミッション境界がデフォルトで割り当てられます。

既存のユーザーについては、ユーザー詳細ページのパーミッション境界の編集アイコンをクリックして、パーミッション境界を設定できます。

ユーザーの権限を設定する際、特定の操作権限にpermission_boundaries
条件を追加することができます。例えば、iam:InviteUser
(ユーザー招待)やiam:UpdateUserBoundary
(ユーザーのパーミッション境界更新)のアクションに、permission_boundaries
条件を追加することで、さらに細かい権限制御を行うことができます。
この条件下では、ユーザーに設定する必要がある権限ポリシーのIDを指定できます。これにより、新しいユーザーを招待したり、他のユーザーのパーミッション境界を更新したりする際に、システムはこれらの事前設定されたルールに基づいて適切なパーミッション境界を強制的に割り当てます。
以下は、これを実現する方法を示す例です。
{
"statement": [
{
"effect": "allow",
"resources": ["arn:api7:iam:user/<.*>"],
"actions": [
"iam:InviteUser",
"iam:UpdateUserBoundary"
],
"conditions": {
"permission_boundaries": {
"type": "AllOfStrings",
"options": [
"d3698967-1d28-4e37-b5e7-ef00a93304cc",
"f863a233-f732-4af0-bb21-3fbe4013be69"
]
}
}
}
]
}
パーミッション境界マッピング
システム内で特定のパーミッション境界を直接設定するだけでなく、API7 Enterpriseは「パーミッション境界マッピング」もサポートしており、IdP(Identity Provider)でのユーザーのIDと権限に基づいて、対応するパーミッション境界を自動的に割り当てることができます。組織設定ページで「ログインオプションを追加」をクリックします。どのプロバイダーを選択しても、設定フォームの下部に「パーミッション境界マッピング」スイッチが追加されます。これを有効にすると、パーミッション境界マッピングを設定できます。
-
権限ポリシー: これはAPI7 Enterpriseで定義された権限ポリシーリソースで、ユーザーのアクセスと操作範囲を制御するために使用されます。パーミッション境界マッピングでは、外部IdPからの設定をこれらのパーミッション境界にマッピングして、ユーザーがログイン時に適切なパーミッション境界を割り当てることができます。
-
マッピングされたパーミッション境界属性: IdPから返されるユーザーのパーミッション境界情報の識別子で、IdPの応答内でユーザーのパーミッション境界データを特定するために使用されます。例えば、「role」や「groups」などの属性名を指定すると、システムはこの属性名に基づいてIdPの応答からパーミッション境界の値を抽出します。
-
操作: IdPのパーミッション境界属性からパーミッション境界値をマッチングするために使用される方法です。完全一致、部分一致、配列内の一致など、さまざまな方法がサポートされています。IdPがパーミッション境界値の文字列配列を返す場合、「配列内の完全一致」を選択して一致を見つけることができます。
-
マッピングされたパーミッション境界値: IdP内でユーザーのパーミッション境界を表す具体的な値です。
まとめ
全体的に見て、パーミッション境界はシステムのセキュリティを確保し、権限の悪用を防ぐための重要なツールです。ユーザーの権限範囲を明確に定義することで、重要なシステムリソースを不正アクセスから保護し、各ユーザーが許可された範囲内でのみ操作できるようにすることができます。複雑なシステム環境では、パーミッション境界を効果的に活用することで、企業のデータセキュリティに強力な保護を提供します。