Вводные
- База 1С: Управление торговлей 11 с публикацией по HTTP
- Требуется подключить входящие уведомления то АТС, без Basic аутентификации, с Token аутентификацией
- Требуется подключить тонкий клиент по HTTPS
- Требуется подключить API для работы с мобильными клиентами (товары, заказы)
- с basic аутентификацией на уровне кода HTTP сервиса (без использования внутреннего справочника пользователи).
- с ограничением по количеству запросов в минуту
Базовая схема подключения:
Описание проблемы
Для каждого из видов подключения нужна своя аутентификация и отдельный набор ролей доступа. При одной публикации доступ пересекается, стандартные "грабли": при подключении телефонии тонкий клиент на автомате подключается под сервисным пользователем телефонии.
Разнесение на отдельные публикации
Решает проблему пересечения, но не решает вопрос контроля доступа. При публикации HTTP сервисов расширений публикуются все, потенциально под одним пользователем могут подключится к другому сервису.
Так же остается проблема если нужна Basic аутентификация на уровне кода сервиса.
Вариант решения
Использовать обратный прокси перед основным web сервером и на его уровне настроить ограничения доступа.
Схема:
Подготовка
- для тестов организовал DNS запись test.malikov.pro
- основная машина на win 10,
- сервер 1С на основной машине c apache 2.4 (IP 192.168.57.2) на порту 8080
- конфигурация УТ 11.4.11.100
- в качестве ОС использую Ubuntu, инструкция по установке Nginx в Ubuntu 18.04
- для установки ubuntu тестов использую VMWare Workstation
- в настройках сетевого адаптера VM стоит "bridge" для нахождения в одной сети с роутером и проброса портов извне (IP 192.168.57.5)
- подключаюсь к ubuntu через SSH, (клиент), отправляю файлы через WinSCP(ссылка), в тестовой среде подключаюсь под root (инструкция по включению root), в рабочей среде желательно использовать SSL ключи и использовать нестандартный порт.
1. Проверяю доступность web сервера из вне
Публикация клиента 1C
Проверяю корректность публикации
Настраиваю обратный прокси для /ut_demo_cl
По нормальному нужно в sites-available + добавить ссылку в sites-enabled, пока тестирую пишу напрямую в sites-enabled
Проверяю конфигурацию через SSH "nginx -t", перезагружаю конфигурацию "service nginx reload".
Проверяю работоспособность
Публикация HTTP сервиса телефонии
Реализовано через расширение, публикация с указанием сервисного пользователя (документация), URL /api_vpbx/*
Проверяю работоспособность
Настраиваю обратный прокси для /api_vpbx
Перезагружаю конфигурацию, проверяю работоспособность
Публикация HTTP сервиса API
Публикация с указанием сервисного пользователя, различие с "ut_demo_tel" только в пользователях которым разрешено обращаться к определенным HTTP сервисам, URL /api_v1/*
При обращении к сервису с basic аутентификацией идет перехват и замена пользователя по умолчанию на пользователя из запроса
Для обхода этой ситуации использую замену заголовка
Проверяю
Ограничение доступа по IP
Для телефонии известны IP адреса серверов (пример Манго-Офис, ссылка на описание).
Расширяю описание блока "/api_vpbx"
Проверяю, получаю 403 ответ
Ограничение на количество запросов
Если API ресурсоёмкое, то имеет смысл поставить ограничение по количеству запросов с IP адреса
Добавляю в основную конфигурацию зону
Расширяю описание блока "/api_v1"
Проверяю, при частом запросе получаю 503.
Организация HTTPS
Добавляю в настройки настройки для "/"
- Добавил репозиторий "sudo add-apt-repository ppa:certbot/certbot"
- Установил certbot "sudo apt install python-certbot-nginx"
- Запустил установку сертификата "sudo certbot --nginx -d test.malikov.pro"
- Для варианта настройки выбрал "2: Redirect"
В результате успешно получил сертификат. Проверяю работоспособность
Использование Web интерфейса для настройки
Если лезть и разбираться в конфигах и командах не очень хочется то можно поставить "Nginx Proxy Manager" https://github.com/jc21/nginx-proxy-manager.
Особенности
- Красивый и безопасный интерфейс администратора на основе Tabler
- Легко создавать домены пересылки, перенаправления, потоки и 404 хосты, ничего не зная о Nginx
- Бесплатный SSL с использованием Let's Encrypt или используя ваши собственные пользовательские SSL-сертификаты
- Списки доступа и базовая HTTP-аутентификация для ваших хостов
- Расширенная конфигурация Nginx, доступная для суперпользователей
- Управление пользователями, разрешения и журнал аудита
Запускается как докер контейнер
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
В базе на сколько понимаю работает в SQLite, можно подключить к Mysql.
После установки доступен по http://127.0.0.1:81.
Благодарю Алексея Лустина за информацию.
Применение в облачных средах
В kubernetes есть Ingress - механизм, обеспечивающий маршрутизацию входящего трафика на уровне приложения (L7), предоставляемый через Ingress-контроллер. В основе которого базово используется Nginx.
Итог
Используя Nginx можно организовать безопасный доступ к HTTP публикации базы 1C.
Благодарю за внимание.