При разработке HTTP-сервисов в 1С часто возникает необходимость защитить доступ к ним с помощью авторизации. Один из наиболее распространенных и простых способов — использование Basic-авторизации. Этот механизм позволяет клиенту передавать учетные данные (логин и пароль) в каждом запросе в закодированном виде. Мы рассмотрим два основных подхода к реализации Basic-авторизации для вашего HTTP-сервиса 1С: на уровне самой платформы 1С через файл публикации и на уровне веб-сервера (Apache или Nginx).
Выбор подхода зависит от ваших требований к безопасности, производительности и удобству администрирования. Мы подробно разберем каждый из них, чтобы вы могли принять информированное решение.
Этот метод предполагает, что основной веб-сервер (Apache, IIS или Nginx, если он используется как прокси) передает запросы к 1С, а уже сама платформа 1С отвечает за проверку учетных данных, содержащихся в заголовке Authorization.
Суть подхода:
default.vrd). Это означает, что все запросы, приходящие на ваш HTTP-сервис через эту публикацию, будут выполняться от имени этого пользователя 1С.Authorization из входящего HTTP-запроса, декодируем его и проверяем переданные клиентом логин и пароль.Прежде всего, нам необходимо создать в информационной базе 1С пользователя, от имени которого будут выполняться HTTP-сервисы. Мы рекомендуем создать отдельного пользователя с минимально необходимыми правами доступа, чтобы ограничить потенциальный ущерб в случае компрометации его учетных данных. Допустим, мы назовем его "СервисПользователь" и установим ему надежный пароль.
Файл default.vrd — это XML-файл, который генерируется при публикации информационной базы 1С на веб-сервере. Он содержит настройки публикации, включая строку подключения к базе и информацию о опубликованных HTTP-сервисах и веб-сервисах. Давайте найдем и отредактируем этот файл.
ManagedApplicationDescriptor в конфигурации Apache. Пройдем по этому пути и найдем файл с расширением .vrd (обычно default.vrd). Откроем его любым текстовым редактором.default.vrd найдем элемент <point>, который содержит атрибут ib со строкой подключения к информационной базе. Нам нужно будет дополнить эту строку учетными данными пользователя 1С, которого мы создали ранее.
Изначально строка может выглядеть так:
<point alias="MyHTTPServ" enable="true" ...>
<ib connectionString="Srvr="SERVER";Ref="BASE";" />
...
</point>
Мы должны модифицировать атрибут connectionString так, чтобы он содержал логин и пароль пользователя 1С. Обратите внимание, что внутри XML-атрибута кавычки должны быть экранированы как ":
<point alias="MyHTTPServ" enable="true" ...>
<ib connectionString="Srvr="SERVER";Ref="BASE";Usr="СервисПользователь";Pwd="НадежныйПароль";" />
...
</point>
Теперь все запросы к этому HTTP-сервису будут выполняться от имени пользователя СервисПользователь без дополнительного запроса авторизации со стороны 1С.
enable="false" в элементе point, чтобы основной веб-доступ к публикации был закрыт, оставив работающими только явно указанные сервисы (хотя это зависит от версии платформы и конфигурации).default.vrd обязательно необходимо перезапустить веб-сервер (Apache, IIS) для применения изменений.Теперь, когда запросы доходят до нашего HTTP-сервиса 1С, нам нужно извлечь и проверить учетные данные, переданные клиентом. Клиент при Basic-авторизации отправляет заголовок вида Authorization: Basic <base64_кодированные_логин_пароль>.
Запрос.Заголовки.Authorization, отрезать префикс "Basic " и затем декодировать оставшуюся Base64-строку.логин:пароль. Мы разделим ее по двоеточию, чтобы получить отдельные логин и пароль.401 Unauthorized с заголовком WWW-Authenticate: Basic realm="Restricted Area".Давайте посмотрим на пример кода в модуле HTTP-сервиса:
// Пример обработчика HTTP-сервиса 1С
Функция МойМетодHTTPСервиса(Запрос)
// Создадим объект для формирования ответа
Ответ = Новый HTTPСервисОтвет;
Ответ.КодСостояния = 200; // По умолчанию успешный ответ
// 1. Получаем заголовки запроса
ЗаголовкиЗапроса = Запрос.Заголовки;
// 2. Ищем заголовок Authorization
Если ЗаголовкиЗапроса.Свойство("Authorization") Тогда
ЗначениеЗаголовка = ЗаголовкиЗапроса.Authorization;
// Проверяем, что это Basic-авторизация
Если СтрНачинаетсяС(ЗначениеЗаголовка, "Basic ") Тогда
// Извлекаем Base64-кодированную строку
КодированныеДанные = Сред(ЗначениеЗаголовка, СтрДлина("Basic ") + 1);
Попытка
// 3. Декодируем Base64-строку
ДекодированнаяСтрока = БазовыеКодировки.ДекодироватьBase64Строку(КодированныеДанные, КодировкаТекста.UTF8);
// 4. Разбираем логин и пароль (формат "логин:пароль")
МассивДанных = СтрРазделить(ДекодированнаяСтрока, ":");
Если МассивДанных.Количество() = 2 Тогда
ПолученныйЛогин = МассивДанных[0];
ПолученныйПароль = МассивДанных[1];
// 5. Проверяем учетные данные (пример с жестко заданными, можно из регистра)
ОжидаемыйЛогин = "MyServiceUser";
ОжидаемыйПароль = "MySecretPassword";
Если ПолученныйЛогин = ОжидаемыйЛогин И ПолученныйПароль = ОжидаемыйПароль Тогда
// Авторизация успешна, продолжаем обработку запроса
Ответ.УстановитьТелоИзСтроки("Привет, " + ПолученныйЛогин + "! Авторизация успешна.", КодировкаТекста.UTF8, "text/plain");
Иначе
// Неверные учетные данные
Ответ.КодСостояния = 401;
Ответ.Заголовки.Вставить("WWW-Authenticate", "Basic realm=""Restricted Area""");
Ответ.УстановитьТелоИзСтроки("Неверный логин или пароль.", КодировкаТекста.UTF8, "text/plain");
КонецЕсли;
Иначе
// Некорректный формат данных
Ответ.КодСостояния = 401;
Ответ.Заголовки.Вставить("WWW-Authenticate", "Basic realm=""Restricted Area""");
Ответ.УстановитьТелоИзСтроки("Некорректный формат Basic-авторизации.", КодировкаТекста.UTF8, "text/plain");
КонецЕсли;
Исключение
// Ошибка декодирования Base64
Ответ.КодСостояния = 401;
Ответ.Заголовки.Вставить("WWW-Authenticate", "Basic realm=""Restricted Area""");
Ответ.УстановитьТелоИзСтроки("Ошибка декодирования авторизационных данных.", КодировкаТекста.UTF8, "text/plain");
КонецПопытки;
Иначе
// Не Basic-авторизация или некорректный формат
Ответ.КодСостояния = 401;
Ответ.Заголовки.Вставить("WWW-Authenticate", "Basic realm=""Restricted Area""");
Ответ.УстановитьТелоИзСтроки("Требуется Basic-авторизация.", КодировкаТекста.UTF8, "text/plain");
КонецЕсли;
Иначе
// Заголовок Authorization отсутствует
Ответ.КодСостояния = 401;
Ответ.Заголовки.Вставить("WWW-Authenticate", "Basic realm=""Restricted Area""");
Ответ.УстановитьТелоИзСтроки("Заголовок Authorization отсутствует.", КодировкаТекста.UTF8, "text/plain");
КонецЕсли;
Возврат Ответ;
КонецФункции
Преимущества данного подхода:
Недостатки и важные замечания:
default.vrd: Пароль пользователя 1С хранится в файле default.vrd в открытом виде. Убедитесь, что доступ к этому файлу строго ограничен.default.vrd, то этот пользователь будет использоваться для всех запросов к данной публикации, включая потенциальные другие веб-сервисы или тонкий/веб-клиент, если они не отключены. Это может создать уязвимости или нежелательное поведение, если права этого пользователя слишком широки.Этот подход считается более безопасным и производительным, поскольку аутентификация происходит до того, как запрос достигает платформы 1С. Веб-сервер сам проверяет учетные данные и только в случае успеха передает запрос дальше к 1С. Это снимает нагрузку с 1С, защищает ее от перебора паролей и DDoS-атак на этапе авторизации.
В этом случае, в файле default.vrd не нужно указывать Usr и Pwd в строке подключения ib. 1С будет использовать логин и пароль, которые переданы веб-сервером в заголовках (обычно, если веб-сервер настроен для проксирования с авторизацией) или стандартно запрашивать их. Однако, при использовании веб-серверной авторизации, 1С не будет напрямую обрабатывать Authorization заголовок, так как он будет уже проверен. Мы можем даже полностью убрать учетные данные из default.vrd или оставить стандартную форму авторизации 1С для других целей, если это необходимо.
Apache HTTP Server имеет встроенный модуль mod_auth_basic, который позволяет легко настроить Basic-авторизацию для любого каталога или URL.
mod_auth_basic: для самой Basic-авторизации.mod_authn_file: для аутентификации пользователей из текстового файла.mod_authz_user: для авторизации на основе имени пользователя.Эти модули обычно включены по умолчанию, но мы можем проверить это, например, командой apachectl -M или посмотрев конфигурационные файлы Apache (например, в каталоге mods-enabled).
.htpasswd). Для хранения пользователей и их паролей Apache использует специальный файл, обычно называемый .htpasswd. Пароли в нем хранятся в хешированном виде.
Для создания такого файла и добавления первого пользователя используем утилиту htpasswd, которая обычно входит в пакет apache2-utils (для Debian/Ubuntu) или httpd-tools (для CentOS/RHEL):
sudo htpasswd -c /etc/apache2/.htpasswd myuser
Нас попросят ввести и подтвердить пароль для пользователя myuser.
Для добавления последующих пользователей (без перезаписи файла) мы убираем ключ -c:
sudo htpasswd /etc/apache2/.htpasswd anotheruser
Мы размещаем этот файл в месте, недоступном для публичного веб-доступа (например, вне корневого каталога сайта или в каталоге конфигурации Apache).
.htaccess в каталоге публикации 1С (если разрешено использование .htaccess).
Рассмотрим пример конфигурации в блоке <Directory> для каталога, где опубликована 1С:
<Directory /var/www/html/1c_publication_dir>
AuthType Basic
AuthName "Restricted Access to 1C HTTP Service"
AuthBasicProvider file
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Разберем директивы:
AuthType Basic: Указываем использовать Basic-авторизацию.AuthName "Restricted Access to 1C HTTP Service": Это сообщение, которое отображается в диалоговом окне авторизации браузера.AuthBasicProvider file: Указываем, что аутентификация будет происходить по файлу.AuthUserFile /etc/apache2/.htpasswd: Полный путь к нашему файлу паролей.Require valid-user: Требуем, чтобы любой действительный пользователь из .htpasswd мог пройти авторизацию. Мы также можем указать конкретных пользователей, например: Require user myuser anotheruser.Если нам нужно защитить только конкретный URL нашего HTTP-сервиса, мы можем использовать блок <Location> или <LocationMatch>:
<Location /1c_publication_dir/hs/MyHTTPService>
AuthType Basic
AuthName "Restricted Access to My HTTP Service"
AuthBasicProvider file
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>
sudo systemctl restart apache2
Nginx, выступая в роли обратного прокси перед 1С, также предоставляет встроенные средства для Basic-авторизации через модуль ngx_http_auth_basic_module.
.htpasswd). Так же, как и для Apache, Nginx использует файлы .htpasswd. Утилита htpasswd та же самая.
Создадим файл паролей в безопасном месте, например:
sudo htpasswd -c /etc/nginx/.htpasswd nginxuser
server или location нашего файла конфигурации Nginx (например, /etc/nginx/sites-available/default или файл для конкретного виртуального хоста).
Пример настройки Nginx для проксирования на 1С с Basic-авторизацией:
server {
listen 80;
server_name my1cservice.example.com;
# Basic-авторизация
auth_basic "Restricted Access to 1C Service";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://localhost:8080/1c_publication_dir/; # Адрес публикации 1С на Apache/IIS
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 X-Forwarded-Proto $scheme;
# Разрешаем большие размеры тела запроса, если нужно для 1С
client_max_body_size 50m;
}
# Если требуется защитить только конкретный HTTP-сервис
location /hs/MyHTTPService {
auth_basic "Restricted Access to My HTTP Service";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:8080/1c_publication_dir/hs/MyHTTPService;
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 X-Forwarded-Proto $scheme;
}
}
Разберем директивы:
auth_basic "Restricted Access to 1C Service";: Включает Basic-авторизацию и определяет "realm" (сообщение для пользователя).auth_basic_user_file /etc/nginx/.htpasswd;: Указывает путь к файлу с паролями.proxy_pass http://localhost:8080/1c_publication_dir/;: Перенаправляет (проксирует) запросы на ваш сервер, где опубликована 1С (например, Apache на порту 8080). Обязательно указываем полный путь к публикации 1С.proxy_set_header ...;: Эти заголовки крайне важны для корректной работы 1С, поскольку они передают информацию о реальном клиенте и оригинальном хосте, что может использоваться 1С для логирования или определения прав доступа.
sudo systemctl reload nginx
Преимущества данного подхода (Apache/Nginx):
Недостатки:
Независимо от выбранного способа реализации Basic-авторизации, мы должны соблюдать ключевые принципы безопасности:
Для Apache:
<Directory /var/www/html/1c_publication_dir>
Require ip 192.168.1.0/24
Require ip 10.0.0.5
</Directory>
Для Nginx:
location / {
allow 192.168.1.0/24;
allow 10.0.0.5;
deny all;
# ... остальные настройки
}
fail2ban. Этот инструмент анализирует логи веб-сервера и автоматически блокирует IP-адреса, с которых фиксируются многочисленные неудачные попытки авторизации.default.vrd, то 1С-пользователь, чьи данные там прописаны, должен иметь строго минимальные права, достаточные только для выполнения задач HTTP-сервиса. Мы не должны давать ему права администратора или полные права на все объекты.access.log, error.log) и логи 1С. Это поможет нам своевременно выявлять попытки несанкционированного доступа, ошибки и потенциальные проблемы с производительностью.Выбирая подходящий метод и следуя рекомендациям по безопасности, мы можем эффективно защитить наш HTTP-сервис 1С с помощью Basic-авторизации.