Перейти к содержанию

Настройка параметров nginx воркспейса

Info

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

Warning

Данный функционал доступен начиная с версии: d-9.100.148.103

Warning

Все шаблоны конфигурации приведены как пример. Данные параметры можно менять в соответствии с вашими политиками ИБ.

Для начала нужно определить какие параметры nginx вам требуется изменить. Основной файл конфигурации nginx.conf задан внутри дистрибутива и не подлежит изменению. Его конфигурация определена как универсальная для большинства клиентов. Если нам требуется усилить параметры безопасности, мы можем определить их в блоке server для конечных точек. Это выполняется через переопределение шаблонов которые включаются в основную конфигурацию.

Настройка параметров шаблонов

Если воркспейс уже был настроен, то потребуется выполнить его остановку. Если мы только устанавливаем воркспейс то создаем каталог для шаблонов nginx.

mkdir -p /om/workspace1/data/nginx_templates/

Нам нужно создать, или внести правки если вы уже запускали воркспейс, шаблоны конфигураций nginx.

/om/workspace1/data/nginx_templates/workspace_common

root /home/${VAR_USER}/optimacros_middlework/bin/frontend/public;
charset utf-8;
access_log off;
error_log /var/log/nginx/error.log;

index index.html index.php;

client_max_body_size ${VAR_CLIENT_MAX_BODY_SIZE};

${VAR_ALLOW_REAL_IP_FROM}

${VAR_REAL_IP_HEADER}

# add_header X-Frame-Options SAMEORIGIN;
# add_header X-Content-Type-Options nosniff;

location ~ /\. {
    deny all;
    return 404;
}

location = / {
}

location / {
    try_files $uri @backend;
}

location /files {
    try_files $uri @backend;
}

location /auth {
    try_files $uri @backend;
}

location /download {
    try_files $uri @backend;
}

location /speedtest {
    try_files $uri @backend_nogzip;
}

location /jsonrpc {
    try_files $uri @jsonrpc;
}

location @redirect {
    return 301 /?path=$uri;
}

location @backend {
    root /home/${VAR_USER}/optimacros_middlework/app/public;
    fastcgi_read_timeout 1800;
    fastcgi_pass unix:/var/run/php/php8.1-fpm-optimacros.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root/index.php;
    include        fastcgi_params;
}

location @backend_nogzip {
    root /home/${VAR_USER}/optimacros_middlework/app/public;
    gzip off;
    fastcgi_read_timeout 30;
    fastcgi_pass unix:/var/run/php/php8.1-fpm-optimacros.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root/index.php;
    include        fastcgi_params;
}

location @jsonrpc {
    proxy_pass http://127.0.0.1:3003;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Cookie $http_cookie;
    proxy_read_timeout 1800;
    proxy_connect_timeout 1800;
}

location /admin {
    alias /home/${VAR_USER}/optimacros_middlework/admin/public;
    try_files $uri @admin;
}

location @admin {
    fastcgi_read_timeout 1800;
    root /home/${VAR_USER}/optimacros_middlework/admin/public;
    access_log off;
    fastcgi_pass unix:/var/run/php/php8.1-fpm-optimacros.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root/index.php;
    include        fastcgi_params;
}

location /api {
    alias /home/${VAR_USER}/optimacros_middlework/api/public;
    try_files $uri @api;
}

location @api {
    fastcgi_read_timeout 1800;
    root /home/${VAR_USER}/optimacros_middlework/api/public;
    access_log off;
    fastcgi_pass unix:/var/run/php/php8.1-fpm-optimacros.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root/index.php;
    include        fastcgi_params;
}

${VAR_OLTP_WEB_STATUS}include /etc/nginx/sites-available/phpmyadmin;
${VAR_CLICKHOUSE_WEB_STATUS}include /etc/nginx/sites-available/clickhouse_play;
${VAR_POSTGRESQL_WEB_STATUS}include /etc/nginx/sites-available/phppgadmin;

/om/workspace1/data/nginx_templates/workspace.https

${VAR_WS_EXTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket;

dav_methods off;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
log_format security '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '"$proxy_host" "$upstream_addr"';
limit_req_zone $binary_remote_addr zone=per_ip:10m rate=5r/s;

server {
    listen 80 default_server;

    ${VAR_WS_INTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket_common;

    if ($host != "${VAR_HOST_NAME}") {
        return 301 https://${VAR_HOST_NAME}$request_uri;
    }

    include /etc/nginx/sites-available/workspace_common;
}

/om/workspace1/data/nginx_templates/workspace.ssl

include /home/optimacros_middlework/optimacros_middlework/console/commands/container/nginx/templates/http_common;

${VAR_WS_EXTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket;

server {

    listen 443 ssl default_server;
    listen 80 default_server;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

    ssl_dhparam /home/optimacros_middlework/optimacros_middlework/console/commands/container/nginx/templates/dhparam.pem;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_session_tickets off;
    # Будет ждать 30 секунд перед закрытием keepalive соединения
    keepalive_timeout  30;
    # Максимальное количество keepalive запросов от одного клиента
    keepalive_requests 100;

    send_timeout 10s;
    client_header_timeout 10;
    client_body_timeout 10;

    large_client_header_buffers 8 32k;

    if ($scheme = "http") {
        return 301 https://${VAR_HOST_NAME}$request_uri;
    }

    if ($host != "${VAR_HOST_NAME}") {
        return 301 https://${VAR_HOST_NAME}$request_uri;
    }

    ssl_certificate /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=15768000" always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';";
    add_header Referrer-Policy "no-referrer";
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

    ${VAR_WS_INTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket_common;

    include /etc/nginx/sites-available/workspace_common;

}

/om/workspace1/data/nginx_templates/maintenance.ssl

include /home/optimacros_middlework/optimacros_middlework/console/commands/container/nginx/templates/http_common;

${VAR_WS_EXTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket;

server {
    listen 443 ssl default_server;
    listen 80 default_server;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ecdh_curve X25519:prime256v1:secp384r1;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

    ssl_dhparam /home/optimacros_middlework/optimacros_middlework/console/commands/container/nginx/templates/dhparam.pem;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_session_tickets off;

    # Будет ждать 30 секунд перед закрытием keepalive соединения
    keepalive_timeout  30;
    # Максимальное количество keepalive запросов от одного клиента
    keepalive_requests 100;

    send_timeout 10s;
    client_header_timeout 10;
    client_body_timeout 10;

    large_client_header_buffers 8 32k;

    if ($uri !~ /admin) {
        return 503;
    }

    location @maintenance {
        rewrite ^(.*)$ /index.html break;
    }

    error_page 503 @maintenance;

    if ($scheme = "http") {
        return 301 https://${VAR_HOST_NAME}$request_uri;
    }

    if ($host != "${VAR_HOST_NAME}") {
        return 301 https://${VAR_HOST_NAME}$request_uri;
    }

    ssl_certificate /etc/nginx/ssl/cert.crt;
    ssl_certificate_key /etc/nginx/ssl/cert.key;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=15768000" always;
    add_header X-Frame-Options SAMEORIGIN always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';";
    add_header Referrer-Policy "no-referrer";
    add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

    ${VAR_WS_INTERNAL_MODE_STATUS}include /etc/nginx/sites-available/websocket_common;

    include /etc/nginx/sites-available/maintenance_common;
}

Для работы этих шаблонов нужен dhparam файл. Выполняем его генерацию.

Генерируем dhparam файл

openssl dhparam -out /om/workspace1/data/nginx_templates/dhparam.pem 2048

Или используя большую длину ключа.

openssl dhparam -out /om/workspace1/data/nginx_templates/dhparam.pem 4096

В зависимости от производительности системы это может занять более продолжительное время.

задать файлам права доступа

chmod 400 /om/workspace1/data/nginx_templates/dhparam.pem
chmod 400 /om/cert/crt.key # путь директории определяется в манифесте Воркспейса (manifest.json)

Запуск воркспейса

После внесенных изменений запускаем воркспейс

Диагностика и устранение проблем

Если в конфигурации nginx нет ошибок все должно работать штатно. При проблемах с запуском входим в контейнер

lxc-attach $(lxc-ls)

И выполняем диагностику работы nginx:

  • Статус службы nginx
systemctl status nginx
  • Конфигурация nginx
nginx -T

Нам нужно найти неверный или конфликтующий параметр

После этого:

  • Останавливаем воркспейс
  • Вносим правки в шаблон
  • Запускаем воркспейс