2012-11-07 3 views
7

Próbuję Realms gniazdo w następujący Tomcat 7.0.32 (napisane w pseudo-XML):Tomcat 7 zagnieżdżenia CombinedRealm, LockoutRealm i DataSourceRealm

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

nie wydają się działać - jest możliwe jest zagnieżdżanie dziedzin w Tomcat na więcej niż dwóch poziomach? Otrzymuję ostrzeżenie w dziennikach:

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

Ideą jest to, że serwis internetowy ma kilka krytycznych użytkowników, że nie muszą być zablokowane (np jak DOS) i kilka zwykłych użytkowników, które mogą mieć słabsze haseł gdzie lockoutRealm powinien być aktywny. Jestem pewien, że w tej sytuacji byli inni ludzie.

Jeśli istnieje inny sposób, aby to osiągnąć (np. Biała lista LockoutRealm), proszę dać mi znać.

Wymagane jest również pojedyncze logowanie.

Domyślam się, że przedłużenie istniejącego kodu LockoutRealm z listą kont, których nigdy nie można zablokować, byłoby opcją, ale nie jestem zbyt chętny do pisania własnego Królestwa, wolałbym raczej nie dodawać niestandardowego kodu na tym poziomie do Tomcat , ponieważ utrudni to konfigurację innym, a przy każdej aktualizacji Tomcat może się zepsuć itp.

Dzięki za pomoc!

Oto odpowiednia część server.xml mojego testu config:

<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> 

Odpowiedz

3

Nowa odpowiedź brzmi teraz:

Aktualizacja Tomcat 7.0.33 lub nowszej. To działa idealnie.

Christopher Schultz był tak przyjazny, aby przekazać moje pytanie tutaj na listę użytkowników Tomcat. Wielcy twórcy Tomcat natychmiast zajęli się tą kwestią i umieścili ją w następnej wersji. Wielkie dzięki!

Więc można teraz używać budowę jak ten na pytanie czy tak z innej kolejności/„priorytetów”:

... 

<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> 

... 

Oczywiście można również użyć innych wymiarów i innych kombinacji.

Zauważ, że jedna rzecz może być myląca w dziennikach: w tej konstrukcji, jeśli podane jest błędne hasło dla jednego z krytycznych użytkowników przechowywanych w królestwie podstawowym, dziedzina pierwotna odmawia dostępu, a następnie obszarowi wtórnemu przez blokadę królestwo jest wypróbowane, a także odmawia dostępu, ostatecznie blokując nazwę użytkownika.Jest to rejestrowane przez królestwo blokady jako ostrzeżenie "Podjęto próbę uwierzytelnienia zablokowanego użytkownika ...". Nadal z poprawnym hasłem, dostęp działa dalej przez królestwo podstawowe, ponieważ nie przechodzi przez królestwo blokady. To znaczy. wszystko działa zgodnie z przeznaczeniem, tylko komunikat dziennika może prowadzić do zamieszania (oczywiście nie da się tego uniknąć).

3

Apache commons-fermentacyjnej służy do analizowania plików konfiguracyjnych, więc podejrzewam, że ten konkretny przypadek użycia po prostu nie spodziewano.

Wygląda na to, że Tomcat ma org.apache.catalina.startup.RealmRuleSet.addRuleInstances, a jego konfiguracja na poziomie tylko 2-poziomowym to Realm. Wydaje się dość proste, aby dodać kolejną warstwę.

Będę musiał sprawdzić, w jaki sposób można skonfigurować fermentor, aby zobaczyć, czy poziomy mogą być obsługiwane, lub jeśli jakiś podzbiór musiałby być ręcznie skonfigurowany.

Możesz zgłosić się pod numer Tomcat users' list, aby poprosić o taką zmianę.

+0

Christopher, dziękuję za wspaniałą odpowiedź! Będę też musiał przejrzeć listę użytkowników (prawdopodobnie czas, abym się tam zapisał, tylko że mam do czynienia z wieloma różnymi technologiami, aby subskrybować wszystkie listy użytkowników ...). Wygląda na to, że nie będę w stanie uniknąć zmiany/rozszerzenia kodu Tomcat, chyba że oficjalny kod będzie obsługiwał arbitralnie zagnieżdżone poziomy w najbliższej przyszłości. Jeśli muszę zacząć zmieniać kod Tomcat, prawdopodobnie przedłużyłbym LockoutRealm z opcją wykluczenia użytkownika - czy wiedziałbyś, że coś podobnego istnieje? Dzięki! – FelixD

+0

Zalogowałem [raport o błędzie] (https://issues.apache.org/bugzilla/show_bug.cgi?id=54141). –

+0

Świetnie, dzięki Christopher! Przepraszam, że nie robię tego samemu, trochę stresującego w tej chwili ... – FelixD