第23章 セキュリティー
Red Hat Data Grid のセキュリティーは、複数のレイヤーに実装されています。
- CacheManager、Caches、およびデータに粒度の細かいアクセス制御を提供するコアライブラリー内で
- リモートプロトコルを介してリモートクライアントから認証情報を取得し、暗号化を使用してトランスポートをセキュアにする。
- 承認されたノードのみが暗号化を使用してトランスポートを保護できるようにするためのクラスター内のノード間でのノード
互換性と統合を最大化するために、Red Hat Data Grid は、X.509 証明書、SSL/TLS 暗号化、Kerberos/GSSAPI など、可能な限り幅広いセキュリティー標準を使用します。また、外部依存関係をプルし、サードパーティーライブラリーやコンテナーとの統合を容易にするために、実装では標準の Java セキュリティーライブラリー(JAAS、JSSE、JCE、SASL など)が提供する機能を利用できます。このため、Red Hat Data Grid コアライブラリーは、インターフェースと基本的な実装のセットのみを提供します。
23.1. 組み込みセキュリティー リンクのコピーリンクがクリップボードにコピーされました!
アプリケーションは、同じ JVM 内の API を使用して Red Hat Data Grid と対話します。Red Hat Data Grid API によって公開される 2 つの主なコンポーネントは CacheManager と Caches です。アプリケーションがセキュアな CacheManager および Cache と相互作用する場合は、Red Hat Data Grid のセキュリティー層が必要なロールおよびパーミッションのセットに対して検証するアイデンティティーを提供する必要があります。ユーザーアプリケーションが提供するアイデンティティーに十分なパーミッションがある場合、アクセスは付与され、セキュリティー違反を示す例外が発生します。アイデンティティーは、複数の Principal のラッパーである javax.security.auth.Subject クラスによって表されます(例: ユーザーと所属するグループ)。Principal 名は独自のシステムに依存するため(LDAP の識別名など)、Red Hat Data Grid は Principal 名をロールにマップできる必要があります。これにより、ロールは 1 つ以上のパーミッションを表します。以下の図は、さまざまな要素間の関係を示しています。
図23.1 ロール/パーミッションのマッピング
23.1.1. 組み込みパーミッション リンクのコピーリンクがクリップボードにコピーされました!
キャッシュマネージャーまたはキャッシュへのアクセスは、必要なパーミッションの一覧を使用して制御されます。パーミッションは、操作されるデータタイプではなく、上記のエンティティーのいずれかで実行されるアクションのタイプに関連します。これらのパーミッションの一部は、適用可能な名前付きエンティティー(名前付きキャッシュなど)に絞り込むことができます。エンティティーのタイプに応じて、利用可能なパーミッションのタイプが異なります。
23.1.1.1. Cache Manager のパーミッション リンクのコピーリンクがクリップボードにコピーされました!
- CONFIGURATION(defineConfiguration): 新しいキャッシュ設定を定義するかどうか。
- LISTEN(addListener): キャッシュマネージャーに対してリスナーを登録するかどうか。
- LIFECYCLE(stop): キャッシュマネージャーを停止できるかどうか
- ALL: 上記のすべてを含む便利なパーミッション
23.1.1.2. キャッシュ権限 リンクのコピーリンクがクリップボードにコピーされました!
- READ(get, contains): キャッシュからエントリーを取得できるかどうか。
- WRITE(計算、putIfAbsent、置換、削除、エビクト): キャッシュからデータの書き込み/交換/削除/削除/エビクトができるかどうか。
- EXEC(distexec、stream): キャッシュに対してコード実行を実行できるかどうか。
- LISTEN(addListener): キャッシュに対してリスナーを登録できるかどうか。
- BULK_READ(keySet、value、entrySet、query): 一括取得操作を実行できるかどうか。
- BULK_WRITE(clear, putAll): 一括書き込み操作を実行できるかどうか
- LIFECYCLE(起動、停止): キャッシュを開始/停止できるかどうか
- ADMIN(getVersion, addInterceptor*, removeInterceptor, getInterceptorChain, getEvictionManager, getComponentRegistry, getDistributionManager, getAuthorizationManager, evict, getRpcManager, getCacheConfiguration, getCacheManager, getInvocationContextContainer, setAvailability, getDataContainer, getStats, getXAResource): 基礎となるコンポーネント/内部構造にアクセスできるかどうか。
- ALL: 上記のすべてを含む便利なパーミッション
- ALL_READ: READ および BULK_READ の組み合わせ
- ALL_WRITE: WRITE と BULK_WRITE を組み合わせます。
一部のパーミッションは、より有用なものにするために他のユーザーと組み合わせる必要があります。たとえば、「supervisors」のみがストリーム操作を実行できるようにし、「標準」ユーザーは配置しか実行できず、以下のマッピングを定義します。
<role name="standard" permission="READ WRITE" /> <role name="supervisors" permission="READ WRITE EXEC"/>
<role name="standard" permission="READ WRITE" />
<role name="supervisors" permission="READ WRITE EXEC"/>
23.1.2. 組み込み API リンクのコピーリンクがクリップボードにコピーされました!
DefaultCacheManager がプログラムによる設定または宣言型の設定を使用して有効化された状態で構築されると、基礎となるキャッシュで操作を呼び出す前にセキュリティーコンテキストを確認する SecureCache を返します。SecureCache は、アプリケーションが低レベルではないオブジェクト(DataContainer など)を取得できないようにします。Java では、特定のアイデンティティーでコードを実行する場合は通常、PrivilegedAction 内で実行されるコードをラップします。
Java 8 を使用している場合は、上記の呼び出しを簡素化できます。
Security.doAs(mySubject, PrivilegedAction<String>() -> cache.put("key", "value"));
Security.doAs(mySubject, PrivilegedAction<String>() -> cache.put("key", "value"));
通常の Subject.doAs()の代わりに Security.doAs()を使用することに注意してください。Red Hat Data Grid では、Security.doAs()を使用してアプリケーションのセキュリティーモデルに固有の理由で AccessControlContext を変更する必要がある場合を除き、どちらかを使用できます。現在のサブジェクトが必要な場合は、以下を使用します。
Security.getSubject();
Security.getSubject();
Red Hat Data Grid のコンテキストまたは AccessControlContext から Subject を自動的に取得します。
Red Hat Data Grid は、完全な SecurityManager での実行もサポートします。Red Hat Data Grid ディストリビューションには、security.policy ファイルのサンプルが含まれており、このファイルを JVM に提供する前に適切なパスでカスタマイズする必要があります。
23.1.3. 埋め込み設定 リンクのコピーリンクがクリップボードにコピーされました!
設定には、global および per-cache の 2 つのレベルがあります。グローバル設定はロール/パーミッションマッピングのセットを定義し、各キャッシュは承認チェックと必要なロールを有効にするかどうかを決定できます。
プログラマティック
宣言的 (Declarative)
23.1.3.1. ロールマッパー リンクのコピーリンクがクリップボードにコピーされました!
Subject の Principal を、承認時に使用するロールのセットに変換するには、適切な PrincipalRoleMapper をグローバル設定に指定する必要があります。Red Hat Data Grid には 3 つのマッパーが含まれており、カスタムマッパーを指定することもできます。
- IdentityRoleMapper(Java: org.infinispan.security.impl.IdentityRoleMapper, XML: <identity-role-mapper />): このマッパーは Principal name をロール名として使用します。
- CommonNameRoleMapper(Java: org.infinispan.security.impl.CommonRoleMapper, XML: <common-name-role-mapper />): Principal name が識別名(DN)の場合、このマッパーは Common Name(CN)を抽出し、ロール名として使用します。たとえば、DN cn=managers,ou=people,dc=example,dc=com はロールマネージャーにマッピングされます。
- ClusterRoleMapper(Java: org.infinispan.security.impl.ClusterRoleMapper XML: <cluster-role-mapper />): ClusterRegistry を使用してプリンシパルをロールマッピングに保存するマッパー。これにより、CLI の GRANT および DENY コマンドを使用して、ロールをプリンシパルに追加/削除することができます。
- カスタムロールマッパー(XML: <custom-role-mapper class="a.b.c" />): org.infinispan.security.PrincipalRoleMapper の実装の完全修飾クラス名を指定するだけです。