Медленный запуск на Tomcat 7.0.57 из-за SecureRandom
Я использую Tomcat 7.0.57 на 32-битной CentOS 6.6 и openJDK7. Когда я запускаю 14 разных экземпляров Tomcat на моем сервере (производственная среда), многим из них требуется слишком много времени для запуска.
Это часть журнала запуска, которая говорит мне, где происходит все время
Jan 28, 2015 2:49:41 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom
INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [199,620] milliseconds.
Какова лучшая практика / решение этой проблемы?
Спасибо!
10 ответов
Безопасные случайные вызовы могут блокироваться, так как энтропии недостаточно для подачи их в / dev / random.
Если у вас есть линия
securerandom.source=file:/dev/random
в /jre/lib/security/java.security изменение этого значения на urandom может улучшить ситуацию (хотя, вероятно, это уже значение по умолчанию).
В качестве альтернативы есть несколько советов о том, как кормить бассейн здесь.
https://security.stackexchange.com/questions/89/feeding-dev-random-entropy-pool
Я столкнулся с той же проблемой, что tomcat слишком медленный, чтобы начать. Я следовал этой статье о DigitalOcean и установил hasged вместо использования urandom.
Это решение, которое не пойдет на компромисс в отношении безопасности.
hasged позволяет генерировать случайность в зависимости от времени выполнения кода на процессоре. Поскольку для одного куска кода практически невозможно выполнить одно и то же точное время, даже в одной и той же среде на одном и том же оборудовании, время запуска одной или нескольких программ должно быть подходящим для создания случайного источника. Реализация с хэджами отбирает случайный источник вашей системы (обычно /dev/random), используя различия в счетчике меток времени вашего процессора (TSC) после многократного выполнения цикла
Как установить hasged
Следуйте инструкциям в этой статье. https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged
Я разместил это здесь
Вот некоторые конкретные инструкции, чтобы настроить только кота в соответствии с ответом Генри
Создайте /etc/tomcat/fastersecurerandom.properties
securerandom.source=file:/dev/urandom
редактировать JAVA_OPTS
внутри /etc/tomcat/tomcat.conf
JAVA_OPTS="-Djava.security.properties=/etc/tomcat/fastersecurerandom.properties"
К вашему сведению, я не смог установить несколько JAVA_OPTS
с JAVA_OPTS="$JAVA_OPTS ..."
несмотря на закомментированные примеры. Бедный старый растерянный кот 7 не запустится согласно предупреждению в /var/log/messages
В разных версиях / вариантах вы можете найти варианты того, где лучше всего устанавливать переменные окружения для tomcat. Лучший способ отладки, если они вступают в силу, это проверить выполнение команды следующим образом:
$ ps aux | grep java
tomcat 4821 4.7 13.9 2626888 263396 ? Ssl 22:31 0:23 /usr/lib/jvm/jre/bin/java -DJENKINS_HOME=/opt/jenkins/ -Xmx512m -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Djava.security.properties=/etc/tomcat/fastersecurerandom.properties -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar:/usr/share/java/commons-daemon.jar -Dcatalina.base=/usr/share/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.endorsed.dirs= -Djava.io.tmpdir=/var/cache/tomcat/temp -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager org.apache.catalina.startup.Bootstrap start
Вместо изменения файла java.security
напрямую, по крайней мере с Java 8, он документирует уже поддержку следующего системного свойства:
-Djava.security.egd=file:/dev/random
В контексте Tomcat это можно использовать для создания файла bin/setenv.sh
содержащий следующую строку:
CATALINA_OPTS=-Djava.security.egd=file:///dev/urandom
Справочная информация
Сам по себе это не ответ. Но это некоторая справочная информация, если вам интересно, откуда взялась эта строка журнала.
Эта строка журнала запускается, когда генерация занимает больше десятой доли секунды (100 миллисекунд).
В 2014 году эта строка была уровнем ИНФОРМАЦИЯ ...
... но был изменен на уровень WARN в 2017 году ...
... чтобы он больше выделялся в журналах. Мотивом для этого изменения послужил вот этот отчет об ошибке:
Источник
Здесь появляется сообщение:https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/util/SessionIdGeneratorBase.java#L272
long t2 = System.currentTimeMillis();
if ((t2 - t1) > 100) {
log.warn(sm.getString("sessionIdGeneratorBase.createRandom",
result.getAlgorithm(), Long.valueOf(t2 - t1)));
}
Отсюда и читаемый человеком английский текст:https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/util/LocalStrings.properties#L46
sessionIdGeneratorBase.createRandom=Creation of SecureRandom instance for session ID generation using [{0}] took [{1}] milliseconds.
если в случае, если вы используете весеннюю безопасность, добавьте класс веб-безопасности.
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
http.cors();
//other configure params.
http.csrf().disable();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}
}
конфигурация пружинного ботинка
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and().csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) //using JWT
.and()
.authorizeRequests()
.antMatchers(PUBLIC_ENDPOINTS).permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(authFilter(), UsernamePasswordAuthenticationFilter.class);
}
.cors (). и ().csrf().disable()
Я изменил /jre/lib/security/java.security, ниже: securerandom.source=file:/dev/./urandom
Ответ @KCD выше почти сработал для меня, мне нужно было немного помассировать его:
1) мой кот был tomcat7
так я создал свой fastersecurerandom.properties
файл в /etc/tomcat7
каталог,
2) Как и на другой странице, мне пришлось изменить содержание fastersecurerandom.properties
от
securerandom.source=file:/dev/urandom
в
securerandom.source=file:/dev/./urandom
3) у меня не было tomcat.conf
файл, поэтому я добавил в свой /etc/init.d/tomcat7
(скрипт запуска tomcat - я знаю), прямо перед строкой - catalina_sh() {
JAVA_OPTS="$JAVA_OPTS -Djava.security.properties=/etc/tomcat7/fastersecurerandom.properties"
Примечание я добавил 7
в tomcat
здесь тоже.
Стоило сделать ps -deaf | grep tomcat
сначала подтвердить, что новый -D
параметр добирался до команды, а также для проверки того, что она ссылается на правильный файл и что файл был там. Это когда я заметил пропавших без вести 7
,
Я был на Java 1.7, а на Ubuntu 14.04.1.
При весенней загрузке вы можете использовать этот блок кода:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(new CookieCsrfTokenRepository())
.requireCsrfProtectionMatcher(httpServletRequest -> httpServletRequest.getMethod().equals("none"));
return http.build();
}
это хорошо для меня!!