5.3. LDAP および RBAC
ロールベースのアクセス制御 (RBAC) は管理ユーザーにパーミッション (ロール) を指定するメカニズムです。これにより、無制限にすべてのアクセス権を付与することなく、さまざまな管理責任を付与できます。RBAC の詳細は、JBoss EAPセキュリティーアーキテクチャーのロールベースのアクセス制御 を参照してください。
RBAC は承認にのみ使用され、認証は個別に処理されます。LDAP は認証と承認に使用できるため、JBoss EAP は以下の方法で設定できます。
- 承認にのみ RBAC を使用し、LDAP、または別のメカニズムは認証にのみ使用する。
- RBAC と LDAP を統合して使用し、管理インターフェイスで承認の意思決定を行う。
5.3.1. LDAP および RBAC の個別使用
JBoss EAP では、セキュリティーレルムで認証と承認を個別に分けて設定できます。そのため、LDAP を認証メカニズムとして、RBAC を承認メカニズムとして設定できます。このように分けて設定されている場合には、ユーザーが管理インターフェイスにアクセスしようとすると、最初に設定済みの LDAP サーバーを使用して認証されます。成功すると、ユーザーのロールおよびそのロールに設定されたパーミッションは、LDAP サーバーにあるグループ情報とは独立して RBAC だけを使用し、決定されます。
RBAC を管理インターフェイスの承認メカニズムとして使用する方法は、JBoss EAPサーバーセキュリティーの設定方法 を参照してください。管理インターフェイスで認証できるように LDAP を設定する方法は、前述のセクション を参照してください。
5.3.2. 承認用に LDAP と RBAC を統合する手順
LDAP サーバーまたはプロパティーファイルを使用して認証されたユーザーは、ユーザーグループのメンバーにすることができます。ユーザーグループは、1 つ以上のユーザーに割り当てることのできる任意のラベルです。RBAC では、このグループ情報を使用して自動的にロールをユーザーに割り当てたり、ロールからユーザーを除外したりする設定が可能です。
LDAP ディレクトリーには、ユーザーアカウントおよびグループのエントリーが含まれており、このエントリーは属性によりクロス参照されます。LDAP サーバーの設定に応じて、ユーザーエンティティーはユーザーが属するグループを memberOf
属性で、グループエンティティーは uniqueMember
属性またはこの 2 つの組み合わせを使用してそのグループに所属するユーザーをマッピングできます。ユーザーが LDAP サーバーに正常に認証されると、グループ検索を実行してそのユーザーのグループ情報を読み込みます。使用中のディレクトリーサーバーによっては、グループ検索は SN (通常、認証で使用されるユーザー名)、またはディレクトリー内のユーザーのエントリーの DN を使用して実行できます。グループ検索 (group-search
) およびユーザー名と識別名 (username-to-dn
) のマッピングは、セキュリティーレルムで LDAP を承認メカニズムとして設定する時に設定されます。
ユーザーのグループメンバーシップ情報が LDAP サーバーをもとに判断されると、RBAC 設定内のマッピングを使用して、ユーザーのロールが決まります。このマッピングを設定して、明示的にグループおよび個別ユーザーを包含または除外します。
サーバーに接続するユーザーの認証ステップは常に最初に行われます。ユーザーが正常に認証されると、サーバーのグループが読み込まれます。認証ステップと承認ステップではいずれも、LDAP サーバーに接続できる必要があります。セキュリティーレルムは、グループの読み込みステップの認証接続を再利用することでこのプロセスを最適化します。
5.3.2.1. group-search の使用
グループメンバーシップ情報の検索時に使用するスタイルは 2 つ (Principal to Group および Group to Principal) あります。Principal to Group には、所属グループへの参照を含むユーザーのエントリー (memberOf
属性を使用) が含まれます。Group to Principal には、対象のグループに所属するユーザーへの参照を含むグループのエントリー (uniqueMember
を使用) が含まれます。
JBoss EAP は、Principal to Group と Group to Principal の検索の両方をサポートしますが、Group to Principal よりも Principal to Group が推奨されます。Principal to Group を使用すると、検索を行わずに既知の識別名の属性を読み取り、直接グループ情報を読み込むことができます。Group to Principal には、ユーザーを参照する全グループを識別するための大規模な検索が必要です。
Principal to Group および Group to Principal はいずれも、以下の属性を含む group-search
を使用します。
属性 | 説明 |
---|---|
group-name |
この属性を使用して、グループ名に使用すべきフォームを指定します。このグループ名は、対象のユーザーが所属するグループの一覧として返されます。これには、グループ名の単純形式またはグループの識別名のいずれかを使用できます。識別名が必要な場合は、この属性を |
iterative |
この属性を使用して、ユーザーが所属するグループを特定した後に、グループをもとに繰り返し検索を行い、グループに所属するグループを特定します。反復検索が有効な場合は、他のグループやサイクルが検出されると、メンバーではないグループに到達するまで継続されます。デフォルトは |
group-dn-attribute |
属性が識別名であるグループのエントリー。デフォルトは |
group-name-attribute |
属性が簡単な名前のグループのエントリー。デフォルトは |
巡回群メンバーシップは問題ではありません。検索済みのグループを再び検索しないように、各検索の記録が保持されます。
反復検索を機能させるには、グループエントリーとユーザーエントリーの内容を同じようにする必要があります。ユーザーが所属するグループの特定に使用するアプローチと同じアプローチを使用して、グループが所属するグループを特定します。グループ間のメンバーシップの場合に、クロス参照に使用する属性名が変更されるか、参照の方向が変更されると、このアプローチでグループが所属するグループは特定できません。
グループ検索の Principal to Group (memberOf)
GroupOne
に所属するユーザー TestUserOne
があり、GroupOne
が GroupFive
に所属する場合の例を見ていきます。グループメンバーシップは、メンバーレベルで memberOf
属性を使用すると表示されます。つまり、TestUserOne
の memberOf
属性は、GroupOne
の dn
に設定されます。このような場合に GroupOne
の memberOf
属性は GroupFive
の dn
に設定されます。
この種の検索を使用するには、principal-to-group
要素が group-search
要素に追加されます。
Principal to Group, memberOf の設定
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=principal-to-group:add(group-attribute="memberOf",iterative=true,group-dn-attribute="dn", group-name="SIMPLE",group-name-attribute="cn") run-batch
上記の例では、ldap-connection
がすでに定義されていることを前提としています。認証メカニズムも このセクションで前述したように 設定しておく必要があります。
group-attribute
属性が group-search=principal-to-group
と合わせて使用されている点に注意してください。詳細は以下を参照してください。
表5.2 principal-to-group
属性 | 説明 |
---|---|
group-attribute |
ユーザーがメンバーであるグループの識別名と一致するユーザーエントリーの属性名。デフォルトは |
prefer-original-connection |
この値を使用して、参照元の照会情報に従う場合にどのグループ情報を優先するかを指定します。プリンシパルがロードされるたびに、続いて各グループメンバーシップの属性が読み込まれます。また、属性が読み込まれるたびに、元の接続または最後の参照元からの接続のいずれかを使用できます。デフォルト値は |
Group to Principal、uniqueMember のグループ検索
GroupOne
に所属するユーザー TestUserOne
があり、GroupOne
が GroupFive
に所属する場合の Principal to Group と同様の例を見ていきます。ただし、今回の例では、グループのメンバーシップは、グループレベルで設定されている uniqueMember
属性を使用して表示されます。つまり、GroupFive
の uniqueMember
は GroupOne
の dn
に、GroupOne
の uniqueMember
は TestUserOne
の dn
に設定されます。
この種の検索を使用するには、group-to-principal
要素が group-search
要素に追加されます。
Group to Principal、uniqueMember の設定
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") run-batch
上記の例では、ldap-connection
がすでに定義されていることを前提としています。認証メカニズムも このセクションで前述したように 設定しておく必要があります。
principal-attribute
属性は group-search=group-to-principal
と合わせて使用されている点に注意してください。group-to-principal
は、ユーザーエントリーを参照するグループの検索方法を、principal-attribute
はプリンシパルを参照するグループエントリーを定義するのに使用します。
詳細は以下を参照してください。
表5.3 group-to-principal
属性 | 説明 |
---|---|
base-dn | 検索を開始するために使用するコンテキストの識別名。 |
recursive |
サブコンテキストも検索されるかどうか。デフォルトは |
search-by |
検索で使用するロール名のフォーム。有効な値は |
prefer-original-connection | この値を使用して、参照元の照会情報に従う場合にどのグループ情報を優先するかを指定します。プリンシパルがロードされるたびに、続いて各グループメンバーシップの属性が読み込まれます。また、属性が読み込まれるたびに、元の接続または最後の参照元からの接続のいずれかを使用できます。 |
表5.4 membership-filter
属性 | 説明 |
---|---|
principal-attribute |
ユーザーエントリーを参照するグループエントリーの属性の名前。デフォルトは |
5.3.2.2. username-to-dn の使用
承認セクションでルールを定義して、ユーザーの簡単なユーザー名を識別名に変換できます。username-to-dn
要素は、ユーザー名を LDAP ディレクトリー内のエントリーの識別名にマップする方法を指定します。この要素は 任意 で、以下の両方に該当する場合にのみ必要です。
- 認証および承認手順は異なる LDAP サーバーに対するものである。
- グループ検索が識別名を使用する。
セキュリティーレルムが LDAP およびケルベロス認証の両方をサポートするインスタンスや、ケルベロス用に変換が必要なインスタンスにも該当します。LDAP 認証が実行された場合には、認証時に検出された DN を使用できます。
これには、以下の属性が含まれます。
表5.5 username-to-dn
属性 | 説明 |
---|---|
force |
認証中のユーザー名から識別名のマッピング検索の結果はキャッシュされ、force 属性が |
username-to-dn
は、以下のいずれかで設定できます。
- username-is-dn
リモートユーザーによって入力されたユーザー名はユーザーの識別名であると指定します。
username-is-dn の例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=username-is-dn:add(force=false) run-batch
これは 1:1 マッピングを定義し、追加の設定はありません。
- username-filter
入力されたユーザー名を照会し、指定の属性を検索します。
username-filter の例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=username-filter:add(force=false, base-dn="dc=people,dc=harold,dc=example,dc=com", recursive="false", attribute="sn", user-dn-attribute="dn") run-batch
属性 説明 base-dn
検索を開始するコンテキストの識別名。
recursive
検索がコンテキストのサブコンテキストを拡張するかどうか。デフォルトは
false
です。attribute
入力したユーザー名に対して照合を試行するユーザーのエントリーの属性です。デフォルトは
uid
です。user-dn-attribute
ユーザーの識別名を取得するために読み込む属性です。デフォルトは
dn
です。- advanced-filter
このオプションは、カスタムのフィルターを使用してユーザーの識別名を見つけます。
advanced-filter の例
/core-service=management/security-realm=ldap-security-realm:add batch /core-service=management/security-realm=ldap-security-realm/authorization=ldap:add(connection=ldap-connection) /core-service=management/security-realm=ldap-security-realm/authorization=ldap/group-search=group-to-principal:add(iterative=true, group-dn-attribute="dn", group-name="SIMPLE", group-name-attribute="uid", base-dn="ou=groups,dc=group-to-principal,dc=example,dc=org", principal-attribute="uniqueMember", search-by="DISTINGUISHED_NAME") /core-service=management/security-realm=ldap-security-realm/authorization=ldap/username-to-dn=advanced-filter:add(force=true, base-dn="dc=people,dc=harold,dc=example,dc=com", recursive="false", user-dn-attribute="dn",filter="sAMAccountName={0}") run-batch
username-filter
の例と同じ属性は、意味とデフォルト値も同じです。属性がもう 1 つあります。属性 説明 filter
ユーザーのエントリーの検索に使用するカスタムフィルター。ユーザー名は
{0}
のプレースホルダーに置き換えられます。重要これは、フィルターの定義後も有効でなければなりません。特殊文字を使用する場合には (例
&
) 正しい形式を使用するようにしてください。たとえば、&
文字には&
を使用します。
5.3.2.3. LDAP グループ情報の RBAC ロールへのマッピング
LDAP サーバーへの接続を作成してグループ検索を適切に設定したら、LDAP グループと RBAC ロールの間にマッピングを作成する必要があります。このマッピングには、包含と除外の設定両方があり、グループメンバーシップをもとに 1 つまたは複数のロールを自動的にユーザーに割り当てることができます。
RBAC がまだ設定されていない場合は、特に新規作成した LDAP 対応のレルムに切り替える場合など、設定時には最新の注意を払ってください。ユーザーとロールを適切に設定せずに RBAC を有効にすると、管理者が JBoss EAP 管理インターフェイスにログインできなくなることがあります。
ここで使用する管理 CLI コマンドは、JBoss EAP スタンドアロンサーバーを実行していることを仮定しています。JBoss EAP 管理対象ドメインの管理 CLI を使用する場合の詳細は 管理 CLI ガイド を参照してください。
RBAC が有効で設定されていることの確認
RBAC を有効にして初期設定してから、LDAP と RBAC ロールの間のマッピングを使用する必要があります。
/core-service=management/access=authorization:read-attribute(name=provider)
この設定では、以下のような結果になります。
{ "outcome" => "success", "result" => "rbac" }
RBAC の有効化および設定の詳細は、JBoss EAPサーバーセキュリティーの設定方法の ロールベースアクセス制御の有効化 を参照してください。
既存のロール一覧の確認
read-children-names
操作を使用して、設定されたロールの完全なリストを取得します。
/core-service=management/access=authorization:read-children-names(child-type=role-mapping)
上記の設定で、以下のようにロールの一覧が生成されます。
{ "outcome" => "success", "result" => [ "Administrator", "Deployer", "Maintainer", "Monitor", "Operator", "SuperUser" ] }
さらに、ロールの既存のマッピングをすべて確認できます。
/core-service=management/access=authorization/role-mapping=Administrator:read-resource(recursive=true)
{ "outcome" => "success", "result" => { "include-all" => false, "exclude" => undefined, "include" => { "user-theboss" => { "name" => "theboss", "realm" => undefined, "type" => "USER" }, "user-harold" => { "name" => "harold", "realm" => undefined, "type" => "USER" }, "group-SysOps" => { "name" => "SysOps", "realm" => undefined, "type" => "GROUP" } } } }
ロールマッピングエントリーの設定
ロールに Role-Mapping
エントリーがまだない場合は、作成する必要があります。例:
/core-service=management/access=authorization/role-mapping=Auditor:read-resource()
{ "outcome" => "failed", "failure-description" => "WFLYCTL0216: Management resource '[ (\"core-service\" => \"management\"), (\"access\" => \"authorization\"), (\"role-mapping\" => \"Auditor\") ]' not found" }
ロールマッピングを追加するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor:add()
{ "outcome" => "success" }
確認するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor:read-resource()
{ "outcome" => "success", "result" => { "include-all" => false, "exclude" => undefined, "include" => undefined } }
ロールにグループを追加して包含または除外設定
ロールに対してグループを追加することで包含または除外設定できます。
除外マッピングが優先され、それ以外は包含マッピングが優先されます。
包含するグループを追加するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor/include=group-GroupToInclude:add(name=GroupToInclude, type=GROUP)
除外するグループを追加するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-GroupToExclude:add(name=GroupToExclude, type=GROUP)
結果を確認するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor:read-resource(recursive=true)
{ "outcome" => "success", "result" => { "include-all" => false, "exclude" => { "group-GroupToExclude" => { "name" => "GroupToExclude", "realm" => undefined, "type" => "GROUP" } }, "include" => { "group-GroupToInclude" => { "name" => "GroupToInclude", "realm" => undefined, "type" => "GROUP" } } } }
RBAC ロールグループから除外または包含されないようにグループを削除する手順
包含されていたグループを削除するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor/include=group-GroupToInclude:remove
除外されていたグループを削除するには、以下を実行します。
/core-service=management/access=authorization/role-mapping=Auditor/exclude=group-GroupToExclude:remove