Задача: Нужно настроить доступ через браузер к опубликованным базам данных на CentOS 7

Вот такая вот задача поступила мне от моего непосредственного руководителя в пятницу 01.11.2019 почти в конце рабочего дня. А срок вторник 05.11.2019. Для меня это соответственно новая задача с которой я никогда до этого не сталкивался. Опрос знакомых показал, что ни такое делали, но только в роли Web-сервиса у них использовался IIS, а меня задача организовать на базе CentOS 7 + httpd. Жаль, что не на Ubuntu с которой я работаю легко. Ну да ладно. За выходные я на своем тестовом полигоне разобрался как опубликовываются базы в и как осуществляется доступ к ним через IIS. Об это будет заметка чуть позже. Это же усовершенствованная и реальная рабочая применяема в компании.

Шаг №1: От сетевых администраторов (точнее из списка в файла учета) получаю внешний свободный IP из DMZзоны который можно взять дабы можно было из вне подключаться.

Шаг №2: В локальной сети (polygon.ru) на сервере с ролью DNS создаю A запись на VM с CentOS 7 на борту ответственной на доступ к базам через браузер

C:\Users\olloa>nslookup

> set type=any

> module.cse.ru

Ответ: srv-dc.polygon.ru

Address: 10.90.90.5

module.polygon.ru internet address = 185.65.220.50

Шаг №3: Т.к. у меня в роли шлюза выступает FortiGate то создаю правило разрешающее трафик из вне на VM в DMZзоне:

https://10.100.200.252:222 – user&pass – Policy & Objects – Ipv4 Policy, т.к. я все создаю не с нуля, а применяю к уже существующей инфраструктуре, то в группе DMZ Group создаю правило:

  • Name: WAN to DMZ (module)
  • From: CSE-AS.20 (port3)
  • To: CSE-AS.22 (port4)
  • Source: all
  • Destination: _MODULE 185.65.220.50
  • Schedule: always
  • Service: ALL_ICMP, HTTPS
  • Action: ACCEPT

Также нужно правило разрешающее доступ из DMZ (для этой машины) к серверам локальной сети (в частности, к кластеру )

https://10.10.200.252:222 – user&pass – Policy & Objects – Ipv4 Policy

  • Name: DMZ to LAN 220.50
  • From: CSE-AS.22 (port4)
  • To: LAN (port1)
  • Source: _MODULE 185.65
  • Destination: 10.0.X.X 172.17.200.X
  • Service: ALL
  • Action: ACCEPT

Шаг №4: Поднимаю на хосте через vSphere Client виртуальную машину на базе CentOS 7

  • CPU: 1
  • RAM: 4Gb
  • HDD: 40Gb
  • Eth: cse-as-22 (смотрит в DMZ сеть)

Настраиваю:

[root@localhost ~]# rm -Rf /var/cache/yum

[root@localhost ~]# yum -y update && yum -y upgrade

[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

[root@localhost ~]# rm -f /etc/localtime

[root@localhost ~]# ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

[root@localhost ~]# firewall-cmd --state

running

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@localhost ~]# systemctl mask firewalld

Created symlink from /etc/systemd/system/firewalld.service to /dev/null.

[root@localhost ~]# firewall-cmd --state

not running

[root@localhost ~]#

[root@localhost ~]# localectl set-locale LANG=en_US.UTF_8

[root@localhost ~]# yum install -y mc nano htop

[root@localhost ~]# nano /etc/environment

LC_ALL="en_US.UTF-8"

[root@localhost ~]# nano /etc/ssh/sshd_config

#PermitRootLogin yes

PermitRootLogin yes

PasswordAuthentication yes

[root@localhost ~]# systemctl restart sshd

[root@localhost ~]# reboot

На заметку: По сути за основу настройки брал заметку “Подготовка CentOS 7 для работы в DMZ

Шаг №5: Прописываю настройки /etc/hosts & /etc/hostname

[root@localhost ~]# nano /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.0.43 sp1.polygon.ru sp1 → Кластер 1С

10.0.1.47 u2-sp5.polygon.ru u2-sp5 → Кластер 1С

185.65.220.50 module.polygon.ru module

[root@localhost ~]# nano /etc/hostname

module.polygon.ru

[root@localhost ~]#

[root@localhost ~]# reboot

Шаг №6: Устанавливаю Webсервис httpd:

[root@module ~]# yum install -y httpd

[root@module ~]# yum install httpd -y

[root@module ~]# httpd -v

Server version: Apache/2.4.6 (CentOS)

Server built: Aug 8 2019 11:41:18

systemctl status httpd

systemctl start httpd

[root@module ~]#

Отключаем тестовую дефолтную страницу:

[root@module ~]#

[root@module ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.backup

[root@module ~]# systemctl restart httpd

Итого порты которые случает система:

[root@module ~]# netstat -tulpn | grep LISTEN

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10049/httpd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 15194/sshd

tcp6 0 0 :::22 :::* LISTEN 15194/sshd

[root@module ~]#

Шаг №7: Уточняю у ответственных за какая версия платформы у нас используется

У нас версия пакета использующаяся 8.3.13.1690

Шаг №8: С сайта 1C скачиваю «Сервер 1С:Предприятия»:

Т.к. я обращаюсь к сайту с рабочей системы под управлением Windows 7 x64 Pro и Скачиваю «Cервер 1С:Предприятия (64-bit) для RPM-based Linux-систем»

«https://releases.1c.ru/version_file?nick=Platform83&ver=8.3.13.1690&path=Platform\8_3_13_1690\rpm64_8_3_13_1690.tar.gz»

Скачанный архив располагаю в папке C:\Soft\1C

Шаг №9: Подключаюсь через ssh клиент (MTPutty + putty.exe) к CentOS 7, затем устанавливаю утилиты посредством которых смогу подключить ресурс Windows и скопировать пакет и файл (default.vrd) опубликованной базы или баз данных чтобы с ней(ними) можно было работать через Webинтерфейс.

[root@module ~]# yum install -y cifs-utils

[root@module ~]# mount.cifs //10.90.90.5/c$ /media -o username=Administrator,password=712mbddr@,domain=WORKGROUP

[root@module ~]# cp /media/Soft/1C/ rpm64_8_3_13_1690.tar.gz ~/

[root@module ~]# cp /media/inetpub/wwwroot/polygon/default.vrd /var/www/html/polygon/

[root@module ~]# umount /media

После по команде history посмотреть номер строки команды mount

History -d <номер_строки> дабы не святить пароль в консоли

Шаг №10: Распаковываю скачанный пакет

[root@module ~]# tar zxf rpm64_8_3_13_1690.tar.gz

Устанавливаю пакеты (в частности, пакет 1c-enterprise83-ws) на текущую систему CentOS 7 в определенном порядке:

[root@module ~]# rpm -i 1C_Enterprise83-common-8.3.13-1690.x86_64.rpm

[root@module ~]# rpm -i 1C_Enterprise83-server-8.3.13-1690.x86_64.rpm

[root@module ~]# rpm -i 1C_Enterprise83-ws-8.3.13-1690.x86_64.rpm

[root@module ~]# find / -name wsap22.so

/opt/1C/v8.3/x86_64/wsap22.so

[root@module ~]# systemctl status srv1cv83

● srv1cv83.service - SYSV: Starts and stops the 1C:Enterprise daemons

Loaded: loaded (/etc/rc.d/init.d/srv1cv83; bad; vendor preset: disabled)

Active: inactive (dead)

Docs: man:systemd-sysv-generator(8)

[root@module ~]#

[root@module ~]# systemctl stop srv1cv83

[root@module ~]# systemctl daemon-reload

Получаю справку по использованию утилиты webinst:

[root@module ~]# /opt/1C/v8.3/x86_64/webinst
1C:Предприятие 8. Утилита публикации веб-клиента

Публикация:

webinst [-publish] websrv -wsdir VirtualDir -dir Dir -connstr connStr [-confPath confPath]

Публикация на основе существующего vrd файла:

webinst [-publish] websrv [-wsdir VirtualDir] -descriptor vrdPath -dir Dir [-connstr connStr] [-confPath confPath]

Удаление публикации:

webinst -delete websrv -wsdir VirtualDir [-dir Dir] [-connstr connStr] [-confPath confPath]

Удаление публикации по существующему vrd файлу:

webinst -delete websrv [-wsdir VirtualDir] -descriptor vrdPath [-dir Dir] [-connstr connStr] [-confPath confPath]

Ключи:

-publish: опубликовать, ключ по умолчанию

-delete: удалить публикацию

websrv

-apache2: публикация Веб-клиента для Apache 2.0

-apache22: публикация Веб-клиента для Apache 2.2

-apache24: публикация Веб-клиента для Apache 2.4

-wsdir VirtualDir: виртуальный каталог

-dir Dir: физический каталог, в который будет отображен виртуальный

-descriptor vrdPath: путь к существующему vrd файлу

-connstr connStr: строка соединения ИБ

-confPath confPath: полный путь к конфигурационному файлу Apache

[root@module ~]#

Шаг №11: Добиваюсь чтобы при обращении через браузер к этой системе я могу получить окно авторизации через браузер в базе 1С:

/opt/1C/v8.3/x86_64/webinst -publish -apache24 -wsdir polygon -dir /var/www/html/polygon -connstr "Srvr=10.0.0.43;Ref=polygon;" -confPath /etc/httpd/conf/httpd.conf

Обзор используемых параметров:

  • ./webinst -> утилита ответственная за публикацию доступ к базе 1С
  • "-apache24" - публикуем на апаче
  • "-wsdir polygon" - имя, по которому будет доступна ваша база из-вне, в данном случае адрес будет выглядеть http://ВашИПАдрес/test
  • "-dir /var/www/html/polygon" - пусть к папке, где будет располагаться файл default.vrd
  • "-connstr "Srvr=10.0.0.43;Ref=polygon;" – строка подключения к информационной базе, где 10.0.0.43 – это IP адрес кластера 1С, а polygon – это наименование информационной базы
  • "-confPath /etc/httpd/conf/httpd.conf" - путь к конфигурационному файлу апача
[root@module ~]# systemctl restart httpd

Окно авторизации в опубликованной базе при обращении через Web-интерфейс

Авторизуюсь:

  • Пользователь: web
  • Пароль: web

И нажимаю ОК, в моем случае база выглядит так:

в моем случае база 1С выглядит так:

Если Вы подключились переходим к следующему шагу

Шаг №12: Следующий шаг настроить автоматический запуск Webсервисе с настройками доступа к базе, а не ручной способ:

[root@module ~]# nano /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"

Listen 80

Include conf.modules.d/*.conf

User apache

Group apache

ServerAdmin root@localhost

ServerName module.polygon.ru

<Directory />

AllowOverride none

Require all denied

</Directory>

DocumentRoot "/var/www/html"

<Directory "/var/www">

AllowOverride None

Require all granted

</Directory>

<Directory "/var/www/html">

Options Indexes FollowSymLinks

AllowOverride None

Require all granted

</Directory>

<IfModule dir_module>

DirectoryIndex index.html

</IfModule>

<Files ".ht*">

Require all denied

</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "%h %l %u %t \"%r\" %>s %b" common

<IfModule logio_module>

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

</IfModule>

CustomLog "logs/access_log" combined

</IfModule>

<IfModule alias_module>

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

<Directory "/var/www/cgi-bin">

AllowOverride None

Options None

Require all granted

</Directory>

<IfModule mime_module>

TypesConfig /etc/mime.types

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

</IfModule>

AddDefaultCharset UTF-8

<IfModule mime_magic_module>

MIMEMagicFile conf/magic

</IfModule>

EnableSendfile on

IncludeOptional conf.d/*.conf

LoadModule _1cws_module "/opt/1C/v8.3/x86_64/wsap24.so"

Alias "/tablet" "/var/www/html/tablet/"

<Directory "/var/www/html/tablet/">

AllowOverride None

Options None

Order allow,deny

Allow from all

SetHandler 1c-application

ManagedApplicationDescriptor "/var/www/html/tablet/default.vrd"

</Directory>

Alias "/polygon_copy" "/var/www/html/polygon_copy/"

<Directory "/var/www/html/polygon_copy/">

AllowOverride None

Options None

Order allow,deny

Allow from all

SetHandler 1c-application

ManagedApplicationDescriptor "/var/www/html/polygon_copy/default.vrd"

</Directory>

Alias "/bitrix" "/var/www/html/bitrix/"

<Directory "/var/www/html/bitrix/">

AllowOverride None

Options None

Order allow,deny

Allow from all

SetHandler 1c-application

ManagedApplicationDescriptor "/var/www/html/bitrix/default.vrd"

</Directory>

Alias "/polygon" "/var/www/html/polygon/"

<Directory "/var/www/html/polygon/">

AllowOverride None

Options None

Order allow,deny

Allow from all

SetHandler 1c-application

ManagedApplicationDescriptor "/var/www/html/polygon/default.vrd"

</Directory>

[root@module ~]# chown -R root:apache /var/www/html/*

[root@module ~]# httpd -t

Syntax OK

[root@module ~]# systemctl restart httpd

Отправляю систему в перезагрузку и проверяю что при обращении через браузер по URL вида http://module.polygon.ru/polygon или http://IP/polygon получаю окно авторизации в опубликованной базе .

Отлично. Работает.

Шаг №13: Активирую работу через https, т.к. доступ и вне следует ограничивать все чем можно + в компании есть сертификат на wildcard name.

[root@module ~]# rpm -qa | grep mod_ssl

[root@module ~]# yum install mod_ssl openssl

[root@module ~]# nano /etc/httpd/conf.d/ssl.conf

Listen 443 https

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog

SSLSessionCache shmcb:/run/httpd/sslcache(512000)

SSLSessionCacheTimeout 300

SSLRandomSeed startup file:/dev/urandom 256

SSLRandomSeed connect builtin

SSLCryptoDevice builtin

<VirtualHost *:443>

DocumentRoot "/var/www/html"

ServerName module.polygon.ru

ErrorLog logs/ssl_error_log

TransferLog logs/ssl_access_log

LogLevel warn

SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

SSLCertificateFile /etc/ssl/certs/STAR_cse_ru.crt

SSLCertificateKeyFile /etc/ssl/private/STAR_cse_ru.key

<Files ~ "\.(cgi|shtml|phtml|php3?)$">

SSLOptions +StdEnvVars

</Files>

<Directory "/var/www/cgi-bin">

SSLOptions +StdEnvVars

</Directory>

BrowserMatch "MSIE [2-5]" \

nokeepalive ssl-unclean-shutdown \

downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \

"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

[root@module ~]#

[root@module ~]# systemctl restart httpd

[root@module ~]# netstat -tulpn | grep LISTEN

tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 10049/httpd

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10049/httpd

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1226/sshd

tcp6 0 0 :::22 :::* LISTEN 1226/sshd

Вот собственно и всё, работает. Доступ из вне идет по https://<DMZ_WAN_DNS&IP>:443 -> IP:443

Доработка от 06.11.2019
Нужно отключить листинг каталогов корня и настроить редирект с http на https

[root@module ~]# nano /etc/httpd/conf/httpd.conf
#в ключе
<Directory "/var/www/html">
Options -Indexes -FollowSymLinks
</Directory>
#и в ключах доступа к опубликованным базам созданных соответствующий каталогов:
<Directory "/var/www/html/tablet/">
#привести к виду
Options -Indexes -FollowSymLinks
</Directory>
<Directory "/var/www/html/polygon_copy/">
#привести к виду
Options -Indexes -FollowSymLinks
</Directory>
<Directory "/var/www/html/polygon/">
#привести к виду
Options -Indexes -FollowSymLinks
</Directory>
<Directory "/var/www/html/bitrix/">
#привести к виду
Options -Indexes -FollowSymLinks
</Directory>
[root@module ~]# httpd -t
[root@module ~]# systemctl restart httpd
[root@module ~]# nano /var/www/html/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
[root@module ~]# chown root:apache /var/www/html/.htaccess
[root@module ~]

Итого задача выполнена, настроен запрет листинга корня и настроен редирект.

Заметка реальна и документировалась по мере настройке боевой задачи. С уважением, Олло Александр aka ekzorchik.