Безопасный доступ Tomcat

#security #authentication #tomcat #client #web.xml

#Безопасность #аутентификация #tomcat #клиент #web.xml

Вопрос:

У меня есть две веб-службы (MyService и MyProtectedService). Я хочу, чтобы оба порта были подключены к одному и тому же порту HTTPS, но только защищенный должен иметь аутентификацию клиента (clientAuth = true).

Вся система безопасности работает нормально, но проблема в том, что аутентификация клиента включена для обеих служб, а не только для защищенной. Чего бы я хотел, так это удалить клиентскую аутентификацию для одного из них или применить клиентскую аутентификацию только к другому.

У кого-нибудь есть какие-либо подсказки? Спасибо

В web.xml:

 <security-constraint>
    <web-resource-collection>
        <web-resource-name>protected element</web-resource-name>
        <description/>
        <url-pattern>/MyProtectedService</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>
  

Обновить:
Я попытался разделить службу на два ограничения:

 <security-constraint>
    <web-resource-collection>
        <web-resource-name>OpenService</web-resource-name>
        <description/>
        <url-pattern>/OpenService</url-pattern>
    </web-resource-collection>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>protected</web-resource-name>
        <description/>
        <url-pattern>/MyProtectedService</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    <login-config>
        <auth-metod>CLIENT-CERT</auth-metod>
    </login-config>
</security-constraint>
  

И иметь clientAuth= false в server.xml .

Но тогда я могу получить доступ к этому без какой-либо аутентификации клиента: https://MACHINE/MyProtectedService/MyProtectedService?wsdl

Ответ №1:

Подход заключается в том, чтобы иметь два отдельных ограничения безопасности, даже если одно для общедоступной службы вообще не имеет ограничений (ни auth-constraint , ни a user-data-constraint ). Предполагается, что две службы имеют разные URL-адреса, что, скорее всего, так и есть:

 <security-role>
    <role-name>ProtectedServiceRole</role-name>
</security-role>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Public Service</web-resource-name>
        <url-pattern>/PublicService/*</url-pattern>
    </web-resource-collection>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Service</web-resource-name>
        <url-pattern>/ProtectedService/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    <auth-constraint>
        <role-name>ProtectedServiceRole</role-name>
    </auth-constraint>
</security-constraint>
  

Имя роли, указанное в auth-constraint , инициирует аутентификацию.

Обновить:

Боюсь, я неправильно прочитал ваш вопрос и пропустил часть проверки подлинности сертификата. Хотя я использовал его в прошлом, у меня никогда не было требуемой вами смешанной настройки, поэтому я могу предложить только некоторые варианты, которые вы могли бы попробовать в следующий раз:

В настоящее время требуется аутентификация на транспортном уровне. Это слишком низкоуровневый и преждевременный. Вы пробовали устанавливать для clientAuth значение false и вместо этого добавлять следующие строки в свой web.xml:

 <login-config>
    <auth-method>CLIENT-CERT</auth-method>
</login-config>
  

Другим подходом было бы использование двух разных портов для двух служб. Для этого вы определяете два разных соединителя в server.xml .

Комментарии:

1. Спасибо вам за ваш ответ. Я попробовал это, и я думаю, что здесь замешано что-то еще, потому что у меня все еще спрашивают сертификат. Если вместо https я использую http:443 затем я получаю странных персонажей. Есть какие-нибудь идеи?

2. @Codo, похоже, что Tomcat всегда запрашивает аутентификацию клиента (server.xml проверяется перед web.xml , это имеет смысл), так что я не думаю, что то, что вы упомянули, может сработать … 😕

3. Спасибо,@Codo. По-видимому, ничего не делает… Смотрите мое обновление выше в вопросе

4. @Codo, и для разных соединителей … должно ли это работать? Потому что, если у меня есть один соединитель без clientAuth, он все равно будет обслуживать «MyProtectedService», не так ли? Или есть способ ограничить сервлет внутри приложения WAR?

5. Были необходимы два соединителя (один HTTPS с clientAuth, другой HTTP), а затем web.xml настройка для обоих сервлетов. Спасибо @Codo