7

Tomcat 7.0.32(ここでは疑似XMLで記述)で次のようにレルムをネストしようとしています。

<CombinedRealm>
  <LockoutRealm>
     <DataSourceRealm/>
  </LockoutRealm>
  <UserDatabaseRealm/>
</CombinedRealm>

これは機能していないようです-Tomcatにレルムを2つ以上のレベルでネストすることは可能ですか?ログに警告が表示されます。

No rules found matching 'Server/Service/Engine/Realm/Realm/Realm'.

背後にある考え方は、Webサービスには、ロックアウトしてはならない重要なユーザー(DOSなど)と、lockoutRealmをアクティブにする必要のある弱いパスワードを持つ通常のユーザーがいるということです。他の人もこの状況にあったと思います。

これを実現する別の方法(たとえば、LockoutRealmのホワイトリスト)がある場合は、お知らせください。

シングルサインオンも必要です。

ロックアウトしないアカウントのリストを使用して既存のLockoutRealmコードを拡張することもできますが、自分のレルムを作成することにそれほど熱心ではありません。そのレベルのカスタムコードをTomcatに追加したくないのです。他の人のセットアップは複雑で、Tomcatを更新するたびに壊れることがあります。

助けてくれてありがとう!

これが私のテスト設定のserver.xmlの関連部分です:

<Engine name="Catalina" defaultHost="localhost">

  <Realm className="org.apache.catalina.realm.CombinedRealm">

    <!-- Lockout realm for the DB users -->
    <Realm className="org.apache.catalina.realm.LockOutRealm">
      <!-- PRIMARY: DataSourceRealm with user DB -->
      <Realm className="org.apache.catalina.realm.DataSourceRealm"
         dataSourceName="jdbc/authority"
         userTable="user" userNameCol="username" 
         userCredCol="password" digest="SHA"
         userRoleTable="user_role" roleNameCol="rolename" />
    </Realm>

    <!-- FALLBACK:
         This Realm uses the UserDatabase configured in the global JNDI
         resources under the key "UserDatabase".  Any edits
         that are performed against this UserDatabase are immediately
         available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>

  </Realm>

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

    <!-- SingleSignOn valve, share authentication between web applications
         Documentation at: /docs/config/valve.html -->
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />

    <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

  </Host>
</Engine>
4

2 に答える 2

3

Apache commons-digesterは構成ファイルの解析に使用されるため、この特定のユースケースは単に予期されていなかったと思われます。

Tomcatは、構成org.apache.catalina.startup.RealmRuleSet.addRuleInstancesのために2レベルの深さしか実行できないようにRealm設定されているようです。そこに別のレイヤーを追加するのに十分単純なようです。

任意のレベルをサポートできるかどうか、または一部のサブセットを手動で構成する必要があるかどうかを確認するために、ダイジェスターを構成する方法を確認する必要があります。

このような変更をリクエストするには、Tomcatユーザーのリストにアクセスしてください。

于 2012-11-08T19:58:56.217 に答える
3

新しい答えは今です:

Tomcat7.0.33以降に更新します。その後、それは完全に動作します。

Christopher Schultzはとても親切で、私の質問をTomcatユーザーリストに転送してくれました。優れたTomcat開発者はすぐにこの問題に対処し、これを次のリリースに入れました。どうもありがとう!

これで、質問のような構造を使用したり、順序や「優先度」を変えてこのような構造を使用したりできます。

...

<Engine name="Catalina" defaultHost="localhost">

  <Realm className="org.apache.catalina.realm.CombinedRealm">

    <!-- PRIMARY: tomcat-users.xml with critical system users
                  that should always work, DB independent and without lockout
                  NOTE: If the wrong password is given, the secondary path with
                        lockout is still attempted, so that a lockout on that path
                        will still occur and be logged. Still the primary path is not 
                        locked for access by that happening.                           -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>

    <!-- SECONDARY: DataSourceRealm with DB with lockout functionality -->
    <!-- (three level nesting of realms requires Tomcat >= 7.0.33)     -->
    <Realm className="org.apache.catalina.realm.LockOutRealm" 
      failureCount="5" lockOutTime="60" > <!-- note that when an account is locked correct password
                                               login is no longer possible (would otherwise defeat purpose of lockout),
                                               but also lockoutTime is still reset in each correct attempt -->

      <Realm className="org.apache.catalina.realm.DataSourceRealm"
         dataSourceName="jdbc/authority"
         userTable="user" userNameCol="username" 
         userCredCol="password" digest="SHA"
         userRoleTable="user_role" roleNameCol="rolename" />

    </Realm>

  </Realm>

  <Host >

    ...

  </Host>
</Engine>

...

もちろん、他のレルムや他の組み合わせを使用することもできます。

ログで誤解を招く可能性があることに注意してください。この構造では、プライマリレルムに保存されている重要なユーザーの1人に間違ったパスワードが指定された場合、プライマリレルムはアクセスを拒否し、ロックアウトレルムを介したセカンダリレルムが試行されます。また、アクセスを拒否し、最終的にユーザー名をロックアウトします。これは、「ロックされたユーザーを認証しようとしました...」という警告としてロックアウトレルムによってログに記録されます。正しいパスワードを使用しても、アクセスはロックアウトレルムを経由しないため、プライマリレルムを介して機能し続けます。つまり、すべてが意図したとおりに機能し、ログメッセージだけが混乱を招く可能性があります(もちろん、これを回避することは不可能です)。

于 2013-01-31T14:23:20.593 に答える