JBoss-5.1.0.GA アプリケーション サーバーで認証されていないプリンシパルからリモート EJB を保護するにはどうすればよいですか? ejb セキュリティを構成した後でも、プリンシパルとクレデンシャルが渡されなくても、JNDI ルックアップを使用してリモート EJB にアクセスできますか? これはセキュリティ上のリスクです。基本的に、リモート EJB で認証されていない JNDI ルックアップをすべて無効にしたいと考えています。
これが私のserver/conf/login-config.xml設定です:
<application-policy name="<my security domain name>">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="dsJndiName">**java:jdbc/<my datasource name>**</module-option>
<module-option name="principalsQuery"><my users query></module-option>
<module-option name="rolesQuery"><my roles query></module-option>
<module-option name="debug">true</module-option>
</login-module>
</authentication>
</application-policy>
ejb jarのjboss.xml構成は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC
"-//JBoss//DTD JBOSS 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss_5_0.dtd">
<jboss>
<security-domain><my security domain name from login-config></security-domain>
</jboss>
クライアントとしてBeanにアクセスするためにJNDIルックアップを行う方法は 次のとおりですプリンシパルと資格情報はコンテキストに渡されないことに注意してください
Hashtable<String, String> props = new Hashtable<String, String>();
props.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
props.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
props.put(Context.PROVIDER_URL,"jnp://localhost:1099");
//props.put(Context.SECURITY_PRINCIPAL,"");
//props.put(Context.SECURITY_CREDENTIALS,"");
ctx = new InitialContext(props);
ctx.lookup("<earname>/<ejb interface definition>/remote">
どうした? プリンシパル/クレデンシャルが渡されないか間違っている場合、ユーザーは匿名プリンシパルとして認証され、JNDI を介してリモート EJB にフル アクセスできます。
問題を解決するために私がすでに試したこと:
server/conf/login-config.xml のすべてのログイン モジュールから次の行を削除しましたが、効果はありませんでした
<module-option name="unauthenticatedIdentity">anonymous</module-option>
問題が解決すると考えてserver/conf/jboss-service.xmlから次の行を削除しましたが、効果はありませんでした
<attribute name="DefaultUnauthenticatedPrincipal">anonymous</attribute>
DatabaseLoginModuleを使用しているため、デフォルトでそこにあるlogin-config.xmlからアプリケーションポリシー「client-login」を削除しました
server/depoly/security/security-policies-jboss-beans.xml のjboss -ejb-policyとjboss-web-policyがlogin-config.xml の DatabaseLoginModule ポリシーを拡張しています
ejb クラス/インターフェースにセキュリティ関連の注釈がありません
その他の注意事項
このシナリオを Jboss-as-7.1.1.final でテストしたところ、正しいEjbAccessException: invalid Userが返されました (これを jboss-ejb3.xml に追加すると、セキュリティ ドメイン経由ですべての EJB が保護されます)
<assembly-descriptor> <s:security> <ejb-name>*</ejb-name> <s:security-domain><security domain name here></s:security-domain> </s:security> </assembly-descriptor>
ここでの問題は承認ではありませんが、すべての ejb セキュリティ アノテーションが役に立たない認証です。
私がしたいことは、匿名プリンシパルが JNDI 呼び出しを行うのを完全に防ぐことです
org.jboss.security で TRACE ロギングを有効にしました。JNDI を呼び出すたびに、ログに次のヒットが記録されることがわかります。
Principal: anonymous:callerRunAs=null:callerRunAs=null:ejbRestrictionEnforcement=false:ejbVersion=null]; policyRegistration=org.jboss.security.plugins.JBossPolicyRegistration@1f51a2f;
すべての構成が機能することを確認しました。WebAuthetication を介してプログラムによるログインを使用すると、DatabaseLoginModule が機能します。
データベースから有効なプリンシパル/クレデンシャルを初期コンテキストに渡す場合でも、匿名のプリンシパルが使用され、プリンシパル/クレデンシャルがコンテキストによって処理されていないことを示します
おそらく @RolesAllowed @DeclareRoles を介して EJB を保護できます ... しかし、前述のように、これは認証ではなく承認の問題であり、多くのロールと EJB がある場合、これは保守性に関しては良くありません。
JBoss 7.1.1 で自動的に行われるように、アプリケーション全体の認証されていない匿名 JNDI ルックアップを無効/防止するにはどうすればよいですか? アプリケーション サーバーを 1 つのソリューションとしてアップグレードできることはわかっていますが、そうするオプションがありません。これは、Jboss 5.1.0 で可能かつ簡単に実行できるはずです。しかし、どこでも答えを探しましたが、見つかりませんか? ご協力いただきありがとうございます。