Защитить Tomcat 6 апреля SSL от атаки BEAST
Мы запускаем веб-приложение на Tomcat 6, используя собственный коннектор Apache Portable Runtime SSL для обеспечения SSL-соединения. Как мы можем настроить сервер для предотвращения атаки BEAST? Предлагаемое решение (1) не может быть настроено в конфигурации Tomcat, поскольку оно не позволяет установить параметр SSLHonorCipherOrder (2).
В настоящее время мы используем только настройку SSLCipherSuite="ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:! ANULL:!EDH:!AESGCM", но сканирование с использованием теста сервера SSL показывает, что сервер все еще работает уязвимы против атаки Зверя. Я знаю, что мы можем решить эту проблему, предоставив Tomcat прокси-сервер Apache, но это изменение слишком агрессивно, чтобы реализовать его в краткосрочной перспективе. Я также могу пропатчить Tomcat, чтобы добавить поддержку, но это предотвратит автоматическое обновление пакета Tomcat, что противоречит политикам.
1: https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls
3 ответа
Я никогда не публиковал свое решение это. Это что-то вроде хака, но вам не нужно исправлять / перекомпилировать ни JSSE, ни Tomcat.
Создайте следующий класс:
/*
SSLSettingHelper prevents BEAST SSL attack by setting the appropriate option.
Due to protected variable must be in org.apache.tomcat.util.net package...
Instruction:
1) Compile and place JAR in tomcat /lib
2) Add protocol="org.apache.tomcat.util.net.SSLSettingHelper" to SSL APR connector
*/
package org.apache.tomcat.util.net;
public class SSLSettingHelper extends org.apache.coyote.http11.Http11AprProtocol {
@Override
public void init() throws Exception {
super.init();
org.apache.tomcat.jni.SSLContext.setOptions(endpoint.sslContext, org.apache.tomcat.jni.SSL.SSL_OP_CIPHER_SERVER_PREFERENCE);
log.info("SSLSettingHelper set SSL_OP_CIPHER_SERVER_PREFERENCE to prevent BEAST SSL attack");
}
}
Затем настройте соединитель на использование этого вспомогательного класса:
<Connector server="Server" protocol="org.apache.tomcat.util.net.SSLSettingHelper" port="8443" maxThreads="256" scheme="https" secure="true" SSLEnabled="true" SSLCertificateFile="..." SSLCertificateKeyFile="..." SSLCertificateChainFile="..." SSLCipherSuite="ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json,text/css,text/javascript" maxPostSize="1024000"/>
Это исправляет атаку Зверя.
Логическим способом решения этой проблемы для Tomcat является реализация директивы CipherOrder, которая, как показывает эта ссылка на BugZilla, кажется, включена в Tomcat 7.0.30 и далее. Мне больше всего интересно попробовать это, будут отзывы после попытки. https://issues.apache.org/bugzilla/show_bug.cgi?id=53481
Я нашел решение, чтобы включить в простой Java такой же, как "SSLHonorCipherOrder". Исправление некоторых строк в исходном Sun JSSE через (bootclasspath), чтобы заставить работать сервер-сервер.
Класс: sun.security.ssl.ServerHandshaker
Добавить поле
public static boolean preferServerOrder = true;
Заменить метод chooseCipherSuite:
private void chooseCipherSuite(final HandshakeMessage.ClientHello mesg) throws IOException {
if(preferServerOrder) {
final CipherSuiteList clientList = mesg.getCipherSuites();
for(final CipherSuite serverSuite : getActiveCipherSuites().collection()) {
if (this.doClientAuth == 2) {
if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue;
if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue;
}
if(!serverSuite.isNegotiable()) continue;
if(clientList.contains(serverSuite)) {
if (trySetCipherSuite(serverSuite)) return;
}
}
} else {
final Collection list = mesg.getCipherSuites().collection();
for(final CipherSuite suite : list) {
if (!(isNegotiable(suite))) continue;
if (this.doClientAuth == 2) {
if (suite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue;
if (suite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue;
}
if (trySetCipherSuite(suite)) return;
}
}
fatalSE(Alerts.alert_handshake_failure, "no cipher suites in common");
}