Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

В некоторых случаях, например, по требованиям безопасности, необходимо скрыть Websocket порт WCS за прокси-сервером. Рассмотрим примеры конфигурации nginx в качестве обратного прокси-сервера и соответствующие настройки WCS.

Настройка обратного прокси с Basic авторизацией для Websocket

1. Включите базовую авторизацию по имени и паролю (Basic authentication) в настройках nginx

...

Code Block
themeRDark
titleПолный файл настройки nginx
collapsetrue
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    include /etc/nginx/conf.d/*.conf;
    
    server {
		listen 443 ssl;
		ssl_certificate /etc/pki/tls/yourdomain/yourdomain.crt;
		ssl_certificate_key /etc/pki/tls/yourdomain/yourdomain.key;
		server_name wcs.yourdomain.com;
		server_tokens off;
		client_max_body_size 500m;
		proxy_read_timeout 10m;

        include /etc/nginx/default.d/*.conf;

        location / {
        }

        location /wss {
            proxy_set_header Host $host;
            proxy_pass https://localhost:8443;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        
    }
}

Настройка обратного прокси с передачей токена авторизации в cookie

Передача параметров авторизации в URL объявлена устаревшей. При этом браузеры до сих пор не предлагают способов передать дополнительные заголовки при установке Websocket соединения. Поэтому альтернативой может быть передача токена авторизации в cookie  с проверкой токена на стороне nginx.

Настройка клиента

Клиент должен установить cookie c токеном авторизации перед установкой websocket соединения:

Code Block
languagejs
themeRDark
    setCookie("AUTH", token, {secure: true, 'max-age': 3600});
    Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function (session) {
        ...
    });

Код для установки или изменения cookie  в браузере

Code Block
languagejs
themeRDark
function setCookie(name, value, options = {}) {
  options = {
    path: '/',
    ...options
  };

  if (options.expires instanceof Date) {
    options.expires = options.expires.toUTCString();
  }

  let updatedCookie = encodeURIComponent(name) + "=" + encodeURIComponent(value);

  for (let optionKey in options) {
    updatedCookie += "; " + optionKey;
    let optionValue = options[optionKey];
    if (optionValue !== true) {
      updatedCookie += "=" + optionValue;
    }
  }

  document.cookie = updatedCookie;
}

При разрыве Websocket  сессии cookie можно очистить

Code Block
languagejs
themeRDark
     Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function (session) {
        ...
    }).on(SESSION_STATUS.DISCONNECTED, function () {
        setCookie("AUTH", "", {'max-age': -1});
        ...
     }).on(SESSION_STATUS.FAILED, function () {
        setCookie("AUTH", "", {'max-age': -1});
        ...
     }); 

Настройка nginx

1. Создайте каталог для токенов авторизации

Code Block
languagebash
themeRDark
mkdir -p /var/lib/nginx/token

и назначьте пользователя, под которым запускается nginx, владельцем

Code Block
languagebash
themeRDark
chown -R nginx /var/lib/nginx/token

2. Добавьте в файл настройки nginx проверку токена

Code Block
themeRDark
        location /wss {
            if (!-f /var/lib/nginx/tokens/$cookie_AUTH) {
               return 403;
            }
            proxy_set_header Host $host;
            proxy_pass https://localhost:8443;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_read_timeout 86400;
        }

3. Перезапустите nginx

Использование

Для подключения клиента необходимо создать файл токена

Code Block
languagebash
themeRDark
touch /var/lib/nginx/tokens/ABCDEF1234565789
chown nginx /var/lib/nginx/tokens/ABCDEF1234565789

и передать значение токена на клиент для установки cookie. Возможные способы передачи находятся за пределами данного описания.

Известные проблемы

В целях безопасности, необходимо контролировать заголовок Origin , и принимать cookie только с разрешенных доменов.

Настройка передачи реального IP адреса клиента на WCS

...

Рассмотрим пример настройки nginx и WCS для передачи реального IP адреса клиента.

Настройка nginx

1. Добавьте к настройке Websocket прокси формирование заголовка X-Client-IP

...