Как записать ключи pre-master от tls-соединений, обрабатываемых nginx?

2019-08-27 Пенетрантность Pavel
Здравствуйте.

Мы  состоим  в  реестре  организаторов  распространения  информации  и
поэтому обязаны предоставлять в надзорный орган ключи tls сессий.

Для  таких случаев существует механизм по перехвату вызовов библиотеки
openssl: https://git.lekensteyn.nl/peter/wireshark-notes/tree/src/
Суть  простая - перед запуском демона, обрабатывающего TLS-соединения
клиентов,   через   LD_PRELOAD   подгружается  эта  библиотека  и  она
сбрасывает в текстовый файл, указанный в переменой SSLKEYLOGFILE, ключи 
pre-master.

Эта  схема  срабатывает с апачем, но с энжинксом ключи не пишутся. Нет
ли  идей  или подсказок из-за чего это может быть и как вообще  можно записать
эти самые pre-master keys в энжинксе?

Заранее спасибо.

P.S.
Пример файла с записанными ключами:
# SSL key logfile generated by sslkeylog.c
SERVER_HANDSHAKE_TRAFFIC_SECRET 
077dca0cfc53f1ba5105d7e67e1cb8aa7fba40db73580bb0997498b3260a06da 
080b47a6fea27728f15c4cb70bc7478aa4e9bf5b554e8018d9462a48fff90e9514ca6dc410154c730
CLIENT_HANDSHAKE_TRAFFIC_SECRET 
077dca0cfc53f1ba5105d7e67e1cb8aa7fba40db73580bb0997498b3260a06da 
883ec12435f3d53bc0e42f5fd0a26d006955064747786e21cda18bfa4e2b5fffe147860114036881d
EXPORTER_SECRET 
077dca0cfc53f1ba5105d7e67e1cb8aa7fba40db73580bb0997498b3260a06da 
267a950066d3c4bcc2fd3bb50287b045c213737d018f15c166dc82ce7eab5f4b4dcb3939bc11db1ec7c918a321b5d9f7
SERVER_TRAFFIC_SECRET_0 
077dca0cfc53f1ba5105d7e67e1cb8aa7fba40db73580bb0997498b3260a06da 
cdd2a750c617a721dc93595b99852a4a2436a4fb2f843617b51f7bc0de3b9a88faa5b2b5256fa4230df7fdf9f
CLIENT_TRAFFIC_SECRET_0 
077dca0cfc53f1ba5105d7e67e1cb8aa7fba40db73580bb0997498b3260a06da 
0afb1f7f7c5d8fc9aefc8aae3111045d7e837e3f87de600fcf44a583f45a313d703235e6c80f51d1fa614d96f


P.P.S.
Запускаю энжинкс с этой библиотекой для записи ключей через systemd так:

#cat /etc/systemd/system/nginx.service.d/override.conf
[Service]
Environment=SSLKEYLOGFILE=/tmp/premaster.txt
Environment=LD_PRELOAD=/usr/local/lib/libsslkeylog.so

Через  lsof  видно,  что  эта  библиотека  для  записи ключей энжиксом
подгружается (здесь я проверяю и мастер и воркер):
# lsof -n -p 10313 |grep ssl
nginx   10313 root  memREG  254,1   442984   3255 
/usr/lib/x86_64-linux-gnu/libssl.so.1.1
nginx   10313 root  memREG  254,114224  20914 
/usr/local/lib/libsslkeylog.so
# lsof -n -p 10314 |grep ssl
nginx   10314 www-data  mem   REG  254,1   442984   3255 
/usr/lib/x86_64-linux-gnu/libssl.so.1.1
nginx   10314 www-data  mem   REG  254,114224  20914 
/usr/local/lib/libsslkeylog.so


но  тем  не  менее  ключи  в файл при обращении к энжинксу по https не
пишутся.

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

nginx и аппаратное шифрование

2019-08-27 Пенетрантность grey
Привет!

Сорри, если спрошу глупость, но... выбираю между двумя серверами - в одном
установлен процессор с поддержкой аппаратного шифрования. Подскажите, будет
ли прирост в производительности для сайтов работающих на https? Умеет ли
nginx исполосовать эти возможности процессора? 

Спасибо.

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285422,285422#msg-285422

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность ngnx8810773a83
А с какими старыми клиентами не совместим 1.0.2g, который сам тоже не
слишком свеж ? В мае был релиз 1.0.2s а g, это гдето в марте 16 года было.

Если Вы про sslv2 то оно там есть.у меня специально для этих целей живет
нгинкс собранный с 1.0.2m.
если кастомный openssl собиратете через сборку nginx с --with-openssl ,  то
ему можно пихнуть кастомные параметры в configure через --with-openssl-opt
для всяких оптимизаций. если совсем какито раритеты, то пихните туда
enable-weak-ssl-ciphers enable-ssl2..

Posted at Nginx Forum: 
https://forum.nginx.org/read.php?21,285412,285421#msg-285421

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Нашел причину, проблема была в старом ssl - openssl 1.0.1u.
perf top показывал: 
http://dl3.joxi.net/drive/2019/08/27/0030/2608/1985072/72/88257baf85.jpg


Попробвал обычную версию 1.0.2g и проблемы ушли. Осталось уговорить 
менеджеров забить на 1% старых ssl клиентов.


On 27/08/2019 18:08, Dmitry Sergeev wrote:

Затестил. Без модуля vts тоже самое поведение.



--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Затестил. Без модуля vts тоже самое поведение.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev
Еще нюанс забыл указать. nginx компилировал с модулем vts. Возможно с 
ним проблема. Проверю это.



--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Прошу прощения, особенности почтового клиента.

Конфиг такой:

user www-data;
worker_processes auto;
worker_cpu_affinity auto;
worker_rlimit_nofile 65000;
pid /var/run/nginx.pid;

events
{
    worker_connections 1;
    multi_accept off;
}

http
{
    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 10;
    types_hash_max_size 2048;
    server_tokens on;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    client_body_timeout 60;
    client_header_timeout 60;
    send_timeout 60;
    reset_timedout_connection on;

    ##
    # Logging Settings
    ##

    access_log off;
    error_log /var/log/nginx/error.log;

    #
    # Caching FS
    #
    open_file_cache max=1;
    open_file_cache_errors on;


    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";
    gzip_types text/plain text/css application/json 
application/x-javascript text/xml application/xml application/xml+rss 
text/javascript application/javascript application/octet-stream;


    ##
    # Maps
    ##
    map $status $status_error
    {
    "~*^(1|2|3)"  0;
    default 1;
    }

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

И пример конфига виртуальных хостов для nodejs и php:
upstream nodejs_backend
{
    ip_hash;
    keepalive 32;
    server server1:4201 weight=1;
    server server2:4201 weight=3;
}


log_format file_c escape=json 
'{"HOST":"$host","LOCATION":"$location","IP":"$remote_addr","PROJECT":"nodejs_backend","HTTP_STATUS":"$status","RESPONSE_TIME":"$request_time","UPSTREAM_CONNECT_TIME":"$upstream_connect_time","UPSTREAM_RESPONSE_TIME":"$upstream_response_time","REQUEST_METHOD":"$request_method","REQUEST_FILE":"$uri","ARGS":"$args","BYTES_SENT":"$bytes_sent","USER_AGENT":"$http_user_agent","HTTP_REFERER":"$http_referer","ENVIRONMENT":"production","AKAMAI_IP":"$http_true_client_ip","HEADER_ACCEPT":"$http_accept","HEADER_ACCEPT_LANGUAGE":"$http_accept_language","HEADER_CONTENT_LANGUAGE":"$http_content_language","HEADER_CONTENT_TYPE":"$http_content_type","BODY":"$request_body"}';


server
{
    listen [::]:80;
    listen 80;
    # SSL
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    server_name nodejs_domain;
    root /var/www/nodejs_domain/docroot;

    ###Logs
    # Local logs
    access_log /var/log/nginx/nodejs_domain_access.log 
file_nodejs_backend if=$status_error;

    error_log /var/log/nginx/nodejs_domain_error.log;


    location = /robots.txt
    {
    set $location "robots";
    return 200 "User-agent: *\nDisallow: /\n";
    }

    location = /https:/nodejs_domain
    {
    set $location "ssl_checker";
    return 200 "for ssl checker\n";
    }

    location ~ /\.(git|svn|hg)
    {
    deny all;
    }

    location /
    {
    try_files /bpcZzfcaG82kpcm9Xxic8hWJ89YjqrJCRihmHGGmBqFnU6gV 
@backend;

    }

    location @backend
    {
    set $location "nodejs";
    proxy_pass http://nodejs_backend;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_read_timeout 10s;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /.well-known
    {
    set $location "well-known";
    root   /usr/share/nginx/html;
    }
}

пример конфига для php:

upstream php_backend
{
    ip_hash;
    server server6:4301 weight=1;
}


log_format file_php_domain escape=json 
'{"HOST":"$host","LOCATION":"$location","IP":"$remote_addr","PROJECT":"php_backend","HTTP_STATUS":"$status","RESPONSE_TIME":"$request_time","UPSTREAM_CONNECT_TIME":"$upstream_connect_time","UPSTREAM_RESPONSE_TIME":"$upstream_response_time","REQUEST_METHOD":"$request_method","REQUEST_FILE":"$uri","ARGS":"$args","BYTES_SENT":"$bytes_sent","USER_AGENT":"$http_user_agent","HTTP_REFERER":"$http_referer","ENVIRONMENT":"production","AKAMAI_IP":"$http_true_client_ip","HEADER_ACCEPT":"$http_accept","HEADER_ACCEPT_LANGUAGE":"$http_accept_language","HEADER_CONTENT_LANGUAGE":"$http_content_language","HEADER_CONTENT_TYPE":"$http_content_type","BODY":"$request_body"}';


server
{
    listen [::]:80;
    listen 80;
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    server_name php_domain;
    root /var/www/php_domain/docroot;

    access_log /var/log/nginx/php_domain_access.log file_php_domain 
if=$status_error;

    error_log /var/log/nginx/php_domain_error.log;


    location = /robots.txt
    {
    set $location "robots";
    return 200 "User-agent: *\nDisallow: /\n";
    }

    location = /https:/php_domain
    {
    set $location 

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Maxim Dounin
Hello!

On Tue, Aug 27, 2019 at 04:10:31PM +0500, Dmitry Sergeev wrote:

> Добрый день. Спасибо за ответ!

Пожалуйста.  Не надо отвечать мне лично, от этого карма портится.  
Спасибо.

> На сервере всего 64GB памяти, nginx кушает обычно около 2GB при релоадет 
> не сильно больше - 2-3GB, swap не задействуется. Свободно памяти обычно 
> больше 60GB.
> 
> Сейчас протестил. При релоаде съедает весь проц ровно 35-40 секунд. 
> Провел около 10 тестов, время всегда примерно такое.

Значит проблема не в памяти, а в чём-то ещё.  Что в конфиге?

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

Re: nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Maxim Dounin
Hello!

On Tue, Aug 27, 2019 at 03:24:03PM +0500, Dmitry Sergeev wrote:

> Версия: 1.14.2
> ОС: ubuntu 16.04
> Процессор: Intel Core i7-6700 CPU 3.40GHz
> 
> Средняя нагрузка: 5 000 rps, пиковые значения 12 000 rps.  Статики 
> практически нет, все запросы проксируются либо на бэкенды с nodejs через 
> proxy_pass либо на php-fpm через fastcgi_pass. Виртуальных хостов 16, 
> несколько из них имеют среднюю нагрузку 2K rps, остальные 500 rps.
> 
> С бэкендами nodejs включен keepalive, с php отключен.
> 
> Кроме nginx на сервере ничего нет.
> 
> Проблема в том, что при reload'e конфигурации, несколько минут nginx 
> начинает жрать весь процессор, все ядра под 100%, и запросы начинают 
> обрабатываться медленно либо совсем сбрасываются, отсюда куча ошибок у 
> клиентов. Такая проблема наблюдается только на серверах, где много 
> виртуальных хостов (15-30). На серверах с аналогичной нагрузкой, но 
> например 1-3 виртуальными хостами. Таких проблем не наблюдаю.
> 
> Может быть кто-нибудь подскажет, как можно это оптимизировать, что-то 
> подкрутить. Может можно как-то плавнее релоадить, чтобы медленее, но при 
> этом нагрузка на CPU как-то плавнее распределялась.

Для начала - имеет смысл посмотреть на количество доступной 
памяти.  При релоаде количество рабочих процессов увеличивается 
вдвое, и если памяти мало - система может уходить в свап с 
печальными последствиями.

-- 
Maxim Dounin
http://mdounin.ru/
___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru

nginx полностью загружает весь процессор при reload'e

2019-08-27 Пенетрантность Dmitry Sergeev

Версия: 1.14.2
ОС: ubuntu 16.04
Процессор: Intel Core i7-6700 CPU 3.40GHz

Средняя нагрузка: 5 000 rps, пиковые значения 12 000 rps.  Статики 
практически нет, все запросы проксируются либо на бэкенды с nodejs через 
proxy_pass либо на php-fpm через fastcgi_pass. Виртуальных хостов 16, 
несколько из них имеют среднюю нагрузку 2K rps, остальные 500 rps.


С бэкендами nodejs включен keepalive, с php отключен.

Кроме nginx на сервере ничего нет.

Проблема в том, что при reload'e конфигурации, несколько минут nginx 
начинает жрать весь процессор, все ядра под 100%, и запросы начинают 
обрабатываться медленно либо совсем сбрасываются, отсюда куча ошибок у 
клиентов. Такая проблема наблюдается только на серверах, где много 
виртуальных хостов (15-30). На серверах с аналогичной нагрузкой, но 
например 1-3 виртуальными хостами. Таких проблем не наблюдаю.


Может быть кто-нибудь подскажет, как можно это оптимизировать, что-то 
подкрутить. Может можно как-то плавнее релоадить, чтобы медленее, но при 
этом нагрузка на CPU как-то плавнее распределялась.


--
Kind regards
Dmitry Sergeev
Tel: +7 (951) 129-75-72

___
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru