Перейти к основному содержимому

NGINX

Для работы серверных компонентов Indeed CM на ОС Linux настройте веб-сервер Nginx в качестве обратного прокси-сервера.

RHEL и производные дистрибутивы

Установка

Для установки Nginx должен быть подключен и настроен репозиторий пакетов nginx. Если это не было сделано автоматически, добавьте репозиторий вручную.

  1. Установите пакеты, необходимые для подключения yum-репозитория:

    sudo yum install yum-utils
  2. Для подключения yum-репозитория создайте файл с именем /etc/yum.repos.d/nginx.repo со следующим содержимым:

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
  3. Выполните следующую команду:

    sudo yum install nginx

В случае запроса подтверждения GPG-ключа проверьте, что отпечаток ключа совпадает с 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62.

Документация по установке на прочие ОС доступна на портале NGINX.

Выпуск SSL/TLS сертификата

Для настройки защищенного соединения выпустите SSL/TLS сертификат на имя рабочей станции с установленным nginx. Используйте самоподписанный сертификат или выпустите сертификат на УЦ.

  1. Создайте самоподписанный корневой сертификат утилитой openssl:

    openssl genrsa -out ca.key 2048
    openssl req -x509 -new -nodes -key ca.key -out ca.crt -days 3650 -subj "/CN=selfCA"
  2. Создайте файл конфигурации SSL.conf, который содержит настройки для генерации запроса на сертификат веб-сервера (вместо SERVER_FQDN подставьте DNS-имя рабочей станции с nginx):

    nano SSL.conf
    Пример файла SSL.conf для генерации самоподписанного сертификата
    [ req ]
    default_bits = 2048
    encrypt_key = no
    default_md = sha256
    utf8 = yes
    string_mask = utf8only
    prompt = no
    distinguished_name = req_distinguished_name
    req_extensions = req_ext
    [ req_distinguished_name ]
    commonName = SERVER_FQDN
    [ req_ext ]
    subjectAltName = @alt_names
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    basicConstraints = CA:FALSE
    extendedKeyUsage = serverAuth
    [alt_names]
    DNS.1 = SERVER_FQDN
  3. Создайте утилитой openssl запрос на сертификат и выпустите сертификат для веб-сервера с помощью самоподписанного сертификата:

    openssl genrsa -out SSL.key 2048
    openssl req -new -sha256 -out SSL.csr -key SSL.key -config SSL.conf
    openssl x509 -req -days 365 -in SSL.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile SSL.conf -extensions req_ext -out SSL.crt
  4. Скопируйте файлы сертификата и ключа в папку, которая указана в файле конфигурации nginx:

    sudo cp ./SSL.crt /etc/ssl/private/
    sudo cp ./SSL.key /etc/ssl/private/
  5. Добавьте сертификат корневого УЦ в доверенные на рабочей станции с установленным nginx.

    sudo cp ./ca.crt /etc/pki/ca-trust/source/anchors/
    sudo update-ca-trust extract
  6. Сделайте сертификат доверенным в домене, например, с помощью групповых политик.

Настройка конфигурационного файла

Для работы Indeed CM настройте nginx, чтобы веб-сервер обслуживал запросы и отправлял их на проксируемый адрес – сервис Indeed CM.

Работа nginx и его модулей определяется в конфигурационном файле nginx.conf. В зависимости от операционной системы он расположен в каталоге /usr/local/nginx/conf, /etc/nginx или /usr/local/etc/nginx.

Таблица рекомендуемых к использованию директив
КонтекстДирективаЗначение по умолчаниюРекомендуемое значениеКомментарий
httpproxy_buffer_size4k|8k16kУвеличивается размер прокси буферов для передачи необходимой информации в http-запросах.
proxy_buffers8 4k | 8 8k4 16kУвеличивается размер прокси буферов для передачи необходимой информации в http-запросах.
types_hash_max_size10244096Увеличивается размер хэш-таблиц для хранения информации в виду большого количества проксируемых сервисов.
client_max_body_size1m10mУвеличивается допустимый размер загружаемых в систему файлов.
serverlisten80443 sslИзменяется порт прослушивания на протокол HTTPS, по умолчанию nginx настроен на HTTP.
3003 sslПорт 3003 указывается для дополнительного контекста server в случае использования агентского функционала Indeed CM.
server_name** Требуется указать, обычно совпадает с именем машины, на которой установлен nginx.
Используется для фильтра обработки запросов.
ssl_certificate/etc/ssl/private/SSL.crtДля работы по HTTPS указывается путь к файлу с цепочкой сертификатов (SSL сертификат, сертификаты промежуточного и корневого УЦ).
ssl_certificate_key/etc/ssl/private/SSL.keyДля работы по HTTPS указывается путь к закрытому ключу SSL сертификата.
ssl_verify_clientoffoptional_no_caДобавляется в случае авторизации по сертификату (используется клиентскими агентами)
locationproxy_pass* Один экземпляр контекста location направляет запросы на один адрес — сервис Indeed CM. Таким образом, контекстов location должно быть столько, сколько есть сервисов Indeed CM.

Точка проксирования указывается в формате:
http://localhost:
PORT/cm/SERVICENAME
http://localhost:
PORT/AGENTSERVICENAME*
Где необходимо указать PORT — порт, на котором запущен сервис Indeed CM, а также SERVICENAME и AGENTSERVICENAME — имя запущенного сервиса.
include/etc/nginx/conf.d/proxy.confНекоторые директивы описываются для каждого location, и для компактности конфигурационного файла рекомендуется создать файл с часто используемым набором директив и подключать его в каждый location вместо описывания набора целиком.
proxy_http_version1.01.1Версия 1.1 рекомендуется для keepalive подключений и NTLM аутентификации.
proxy_cache_bypass$http_upgradeОпределяет условия, при которых ответ не будет браться из кэша.
proxy_set_headerUpgrade $http_upgradeОпределяет переход с HTTP/1.1 на веб-socket после установления соединения.
Connection keep-aliveДля использования keepalive подключений.
Host $hostДля сохранения в заголовках имени nginx сервера при их передаче сервисам Indeed CM.
X-Real-IP $remote_addrПо умолчанию работа в режиме обратного прокси использует нестандартные заголовки о пользовательском IP адресе, что требует задания данной директивы.
X-Forwarded-For $proxy_add_x_forwarded_forПодобно X-Real-IP $remote_addr, определяет формирование заголовка для корректного проксирования. Если поле X-Forwarded-For не присутствовало в изначальном заголовке, то $proxy_add_x_forwarded_for = $remote_addr.
X-Forwarded-Proto $schemeВеб-сервер принимает запросы по HTTPS и проксирует их к HTTP сервисам Indeed CM для корректной подмены протокола.
fastcgi_buffers8 4k|8k16 16kОпределяет количество и размер буферов для чтения ответов от FastCGI сервера, на одно подключение.
fastcgi_buffer_size4k|8k32kОпределяет размер буфера для чтения первой части ответа от FastCGI сервера.
proxy_set_headerx-ssl-client-cert $ssl_client_escaped_certДиректива передавать клиентский сертификат при проксировании. Используется клиентскими агентами для авторизации по сертификату.

Вследствие использования в конфигурации многократного описания контекстов location, определенный набор директив будет повторяться.

Для удобства конфигурации вынесите данный набор директив в отдельный файл, а в описании контекста включите директивы из данного файла (директива include).

  1. Создайте файл с многократно используемыми директивами. Можно разместить такой файл с расширением CONF в каталоге /etc/nginx/conf.d/.

    Рекомендуемое содержимое файла proxy.conf для работы с Indeed CM
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
  2. Сконфигурируйте основной файл конфигурации nginx. Имена контекстов location должны совпадать с путем к проксируемому сервису.

    Пример файла nginx.conf для работы с Indeed CM
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log notice;
    events { worker_connections 1024; }

    http {
    proxy_buffer_size 64k;
    proxy_buffers 4 64k;
    types_hash_max_size 4096;
    add_header X-Frame-Options sameorigin always;
    add_header X-Content-Type-Options nosniff;

    log_format main '[$time_local] $remote_addr VIA $scheme --- $status --- $request \n $ssl_client_fingerprint';
    access_log /var/log/nginx/access.log main;
    sendfile on;
    tcp_nopush on;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    server {
    listen 443 ssl;
    server_name server.demo.local;

    ssl_certificate "/etc/ssl/private/SSL.crt";
    ssl_certificate_key "/etc/ssl/private/SSL.key";

    location /cm/oidc
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5008/cm/oidc; }
    location /cm/mc
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5001/cm/mc; }
    location /cm/ss
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5002/cm/ss; }
    location /cm/rss
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5003/cm/rss; }
    location /cm/api
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5004/cm/api; }
    location /cm/credprovapi
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5005/cm/credprovapi; }
    location /cm/wizard
    { proxy_pass http://localhost:5009; }

    }

    server {
    listen 3003 ssl;
    server_name server.demo.local;

    ssl_certificate "/etc/ssl/private/SSL.crt";
    ssl_certificate_key "/etc/ssl/private/SSL.key";
    ssl_verify_client optional_no_ca;

    location /agentregistrationapi
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5006/agentregistrationapi; }
    location /agentserviceapi
    { include /etc/nginx/conf.d/proxy.conf; proxy_pass http://localhost:5007/agentserviceapi;
    proxy_set_header x-ssl-client-cert $ssl_client_escaped_cert; }
    }
    }
  3. Примените изменения в конфигурационном файле. Для этого перезагрузите конфигурацию или перезапустите nginx. Для перезагрузки конфигурации выполните команду:

    nginx -s reload