Практический кейс

Весенний апрельский день принес сразу две новости, одна хорошая, а другая не очень.

Начну с хорошей. Акции компании Астра (ASTR ) Форум акции Группа Астра (ASTR)  упали на рекордно низкий уровень, самое время покупать дешево. Это та самая компания, которая  продает Астра Linux и вообще один из флагманов импортозамещения.

Почему «инвесторы» слили акции с 600 до 400? Сложный вопрос. Аналитики, конечно, поют о скором перемирии - вот Трамп как Путиным все порешают и заживем. Вернется Microsoft, Oracle и не нужно будет изучать Postgres, Linux. Вот только рано об этом говорить - все идет по данному прогнозу Солнечный экономический прогноз на 2025 ++  и раньше середины 2026 года, ждать охлаждения конфликта не стоит, а про снятие санкций мечтайте на более длительный срок.

А причина слива скорее всего проще. Да отчет Астры за 2024 год хороший, но нет признаков хорошего роста бизнеса, несмотря на законодательные стимулы использовать проверенный «отечественный» софт. Да и дивиденды смешные. Эта проблема у всех — iПозитив, iАрендата, Диасофт.

 А раз так, придется разбираться со второй новостью

Очередной релиз 1С:Предприятие 8.3 (8.3.26.1521) при тестировании не хотел запускаться в режиме тонкого и веб клиента по http используя Apache.

Тонкий клиент 1C по HTTP выдает невменяемое. Для меня загадка как это разобрать.

HTTP: Internal server error

Ошибка при работе с ресурсом /e1cib/login?version=8.3.26.1521&vl=en_US&clnPid=15332&nm=4553314702587704594&ld=jblw4QoT9SPskLuQZUhLrfEAZy2ozOa7tpomDJd_VRFNaZh5Rsk7DpQCOmdQrQpyEjrrEIVi-nUBhw1X3b4Szob4QTBDQrYuULaNbltIXU9CwjoyCH5o9cEVyCaJbqeqpgPnk5nmwuQwfOkwGaq5ZI9VteUSLnD7wSiJj4OCG8aBNac6Er6dNNS8QeQSnIl108l9xBB7Lk9HeqLJiO9-bn1Jy1nZCNnhxdpbXFA_IC8vPJEFewKFpC1JUNIO1dgszf-Hed5D2bL4nHP6gY2KT6YDIHx5moqDk06IVJqzTUWgo2trVGLgQAOCxgjGn31P5f_ofFymU1Tnxq4Os6rFytJiGzXxLtzp3O1DtGUTOS9M_BvAjGcJx78lJOCMOeYE6AzlRl6p4yVyxZnxZp4RQffUJdDnRMScSTEcWy_nW9GKIPjDXjJMD6PP7MJFYr0se2O1Dnx7ZQWp5-MBDzZygysKxvfueDZR275e__nsVNO2rcGaEM4PHknqjZ3z1KjrzieU1Y7h88wwFtlSHzH7PSbIHJj0paiiOzNx3tvlD2DyGYaENzZs4Mn0sRIZgkryb-s-p9ln8BI-eLLTaVxLGD0TIdZ2A4Redayuz99kbnZXy1MxmNfhzKmJJKcpmd70e-evUbXGAVoTEnQGd5qpekvzYsk6SffX-2uQkpimHjuhtsU7ahGdI-aJ08O71m2S83Pn-z3gyZD1AG3KB2O_oQ==&ni=-1373650028&screenwidthcharunits=1404&clnId=e8ac474a-61f7-487f-b250-c03f9ce62c1c

Но если запустить 1С Web клиент, сообщение более информативно

1C:Enterprise 8 application error:

Error loading component backbas: 13(0x0000000D): Permission denied

Очередная загадка. В Linux чувствуешь себя археологом, именно так — поскольку никакие модные Gui тебе не помогут  Дневник импортозамещения. Linux GUI — ложное искушение / Хабр  Ты один на один с командной стро��ой как 80х-90х, а не Индиана Джонс на свежем воздухе.

Ясно одно - какая-то подсиcтема в Linux что-то и как-то запретила.

Первая мысль -  что-то не так с правами на каталоги дистрибутива 1С. Проверяю

ls -l /opt/1cv8
total 0
drwxr-xr-x. 2 usr1cv8 grp1cv8 22 Feb 13 00:22 conf
drwxr-xr-x. 3 root    root    21 Nov  1  2024 distr1c
drwxr-xr-x. 4 usr1cv8 grp1cv8 44 Feb 11 22:17 x86_64

Права пользователя, под которым работает сервис 1С (usr1cv8) верные. А у Apache достаточно прав r-x на каталог. И что доподлинно известно - он загружает этот модуль LoadModule 1cwsmodule "/opt/1cv8/x86_64/8.3.26.1521/wsap24.so" прописанный в httpd.conf

Схема простая – Тонкий клиент 1С или Web клиент обращаются к Apache, а Apache запускает модули MPM wsap24.so, которые уже обращаются к кластеру 1С.

Для большей уверенности можно под пользователем Apache исполнить команду test -f /opt/1cv8/x86_64/8.3.26.1521/wsap24.so && echo “FILE exists.” || echo “File does not exist”

Итог проверки — это не ошибка прав файловой системы.

Я использую не Astra linux, а Oracle linux (ветвь Red hat)  поскольку считаю, что он наиболее проверен для работы  СУБД (Oracle, Postgres) .  Не все линуксы одинаковы — это видно по набору установленных пакетов. Когда будет возможность сделаю проверку Astra linux на моих нагрузочных тестах.

Поймай если сможешь в логах

Прежде чем искать в логах - нужно поискать в гугле. Как правило такой путь быстрее если проблема типичная.

Но тут у нас 1С работающий через Apache http в режиме тонкого клиента, поэтому прямого попадания нет.

Все что нам известно это то, что http загружает MPM модуль LoadModule 1cwsmodule "/opt/1cv8/x86_64/8.3.26.1521/wsap24.so" и далее уже вызываются другие модули 1С

В Linux нет полноценного аналога EventViewer как в Windows, даже если использовать GUI типа Gnome или Xfce. Но учитывая некие соглашения Linux, большинство нужных логов в текстовом виде находятся в каталоге и подкаталогах /var/log/

Первое что делаем, поиск в логах, по ключевым словам, используя root

grep -r "backbas" /var/log/* - ничего
grep -r "1cv8" /var/log/* - много результатов, но не относящихся к ошибке
grep -r "denied" /var/log/*- много результатов, выглядят они вот так

/var/log/audit/audit.log.4:type=AVC msg=audit(1738440000.247:10615): avc:  denied  { read } for  pid=3006496 comm="systemd-coredum" dev="nsfs" ino=4026531841 scontext=system_u:system_r:systemd_coredump_t:s0 tcontext=system_u:object_r:nsfs_t:s0 tclass=file permissive=0
/var/log/audit/audit.log.4:type=AVC msg=audit(1740473786.368:4355): avc:  denied  { execmem } for  pid=535703 comm="httpd" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process permissive=0
/var/log/audit/audit.log.4:type=AVC msg=audit(1740473802.303:4356): avc:  denied  { execmem } for  pid=535703 comm="httpd" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process permissive=0
/var/log/audit/audit.log.4:type=AVC msg=audit(1740473808.751:4357): avc:  denied  { execmem } for  pid=535703 comm="httpd" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process permissive=0

Намеков на 1С нет, но поскольку эта проблема возникает взаимодействии Apache и модулей *.so 1С логично отфильтровать все события связанные c httpd (Apache)

grep -r -E "denied.*httpd|httpd.*denied" /var/log/*

Проблема в том, что не видно связи с чем-то из 1С и еще даты в audit(1740473808.751:4357)  пишутся как Seconds since January  1, 1970.

date -d @1740473808.751 Tue Feb 25 12:56:48 PM +04 2025

Итак, анализ логов дал гипотезу, что данные записи показывают те самые запреты. Для подтверждения - провоцируем ошибку и смотрим последние записи в логах

journalctl -n 50 -f
journalctl -u service_name
 ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today
ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts 03/04/2025
получим
type=PROCTITLE msg=audit(1741072945.581:125865): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
type=SYSCALL msg=audit(1741072945.581:125865): arch=c000003e syscall=10 success=no exit=-13 a0=7f41d4783000 a1=7b4000 a2=7 a3=7f41b6176000 items=0 ppid=219733 pid=219738 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1741072945.581:125865): avc:  denied  { execmem } for  pid=219738 comm="httpd" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process permissive=0

Это точно наше событие.

Кто знает более удобные способы понять связь сообщений, при  вызове из  Apache модуля 1С— предлагайте варианты. Я попробовал logwatch, но он смотрит только системные журналы, а аудит игнорирует, даже если явно задать  —service.

Наверняка в Linux есть какие-то возможности трассировки процессов, но я так глубоко не искал.

Замечу, что Ausearсh работает только, если подняты соответствующие сервисы, учтите это если совсем ничего не находится.

Что ты ��акое SElinux?

Подозрение на блокировки  SElinux определяется по типу события type=AVC   в audit.log . Что бы окончательно убедится можно включить Selinux в режим Permissive 

setenforce 0

В этом режиме SELinux только логирует, но не запрещает.  Если проблема исправилась значит есть запреты SELinux. Проблема в том, их разнообразие больше, чем  вариантов прав на файловой системе. Поэтому все и сразу изучить не получится.

Верните все назад setenforce 1

Теперь пора получить необходимый минимум знаний о SELinux

49.2. Introduction to SELinux | Red Hat Product Documentation

Decision process selinux
Decision process selinux

В нашем примере,  когда Apache\Httpd (Subject) пытается получить доступ к ресурсу (в нашем случае память, не только на чтение, но и на запись — execmem), идет проверка политик в Access vector cache (AVC) . Проверяется security context Apache и требуемого ресурса

Security context можно посмотреть,  используя опцию Z  (--context) в коммандах ps, id, ls

Правда этом конкретном случае это не даст новой информации, мы видим эту информацию и в аудите. Нам важно разрешить execmem

ps auxZ | grep http
system_u:system_r:httpd_t:s0    root      357478  0.0  0.7  67704 25240 ?        Ss   Mar21   2:35 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535445  0.0  0.3  81080 10624 ?        S    May03   0:00 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535496  0.0  2.4 2793628 88208 ?       Sl   May03   0:15 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535497  0.0  0.5 2219808 18208 ?       Sl   May03   0:09 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535498  0.0  2.5 2662492 88652 ?       Sl   May03   0:13 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535499  0.0  2.4 2662492 85816 ?       Sl   May03   0:13 /usr/sbin/httpd -DFOREGROUND
system_u:system_r:httpd_t:s0    apache   2535500  0.0  2.6 2662492 92124 ?       Sl   May03   0:13 /usr/sbin/httpd -DFOREGROUND

Для этого нужно посмотреть, какие возможности включения и выключения enforcing mode для отдельных процессов. Нас интересует Apache (httpd)

getsebool -a | grep  http
Список там достаточно большой, но нас интересует httpd_execmem
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> off
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off

Разрешаем
setsebool -P httpd_execmem 1

Ура проблема решена!

А теперь, для полного понимания, пара команд, которая покажет, что запускает Apache при запуске

LoadModule 1cwsmodule "/opt/1cv8/x86_64/8.3.26.1521/wsap24.so" , который прописывается в httpd.conf

Это понадобится для решения будущих проблем, ведь и текущей проблемы не было в предыдущих релизах. Видимо 1С так поменяла код.

Определяем номера процессов, под которыми работает Apache 
ps -ef | grep httpd
Далее для номеров процессов запускаем 
 lsof -p 357478 | grep 1cv8
вывод может выглядеть примерно так 
httpd   357478 root  mem    REG              252,0   684464 50337017 /opt/1cv8/x86_64/8.3.26.1521/libunwind.so.8
httpd   357478 root  mem    REG              252,0  1352320 50336734 /opt/1cv8/x86_64/8.3.26.1521/libicuuc.so.46
httpd   357478 root  mem    REG              252,0 15431304 50336732 /opt/1cv8/x86_64/8.3.26.1521/libicudata.so.46
httpd   357478 root  mem    REG              252,0  1937656 50336733 /opt/1cv8/x86_64/8.3.26.1521/libicui18n.so.46
httpd   357478 root  mem    REG              252,0  1741152 50337014 /opt/1cv8/x86_64/8.3.26.1521/libstdc++.so.6
httpd   357478 root  mem    REG              252,0    31312 50337018 /opt/1cv8/x86_64/8.3.26.1521/nuke83.so
httpd   357478 root  mem    REG              252,0  9313424 50336713 /opt/1cv8/x86_64/8.3.26.1521/core83.so
httpd   357478 root  mem    REG              252,0   249680 54247058 /opt/1cv8/x86_64/8.3.26.1521/wsap24.so

Теперь есть понимание, что как и где запускается.

SELinux – архитектурная заплата или красивое решение безопасности?

История создания SELinux описана тут 49.3. Brief Background and History of SELinux | Red Hat Product Documentation

Если кратко решение было инициировано National Security Agency (США) , при этом Linus Torvalds настоял на модульном походе к безопасности, нежели встраивания SELinux в ядро.

К чему это приводит?

Если Вы разрешили порты в Firewall это не значит, что они будут доступны, пока не разрешите их в Selinux

Если Вы разрешили доступ Apache к файлу для скачивания, это не значит, что он будет доступен, если каталог находится вне Security context Apache.

Ну а информативность логирования и аудита Вы уже видели выше. Т.е. ради безопасности приходится делать двойную работу. Сравните с Windows, где сам Firewall определяет и предлагает открыть нужные порты при запуске приложения.

Кроме того — отказ от включения такой важной системы в ядро порождает «альтернативы».  Пример в старой статье Гонка вооружений: сравниваем популярные расширения безопасности для ОС Linux — Хакер  

Т.е. вместо того, чтобы решать практические задачи, нужно еще понимать разнообразие систем безопасности Linux из-за того что это решили не стандартизировать.

В целом история в Linux повторяется

Судя по слабому процессу стандартизации Linux, выживание и развитие лучших решений откладывается. Что-то улучшается, когда все над этим работают. А если все распыляются по разным проектам, мы получим только разнообразие, а не качество.

Альтернатива — национальные клоны Linux, которые можно превратить в более приятный Windows. Тем более Linus Torvalds уже не тянет на лидера свободного ПО, после того как он показал свое отношение к российским разработчикам.

P. S. Все-таки возьму акции Астры по таким ценам. Даже если они не смогут сделать из своего Linux конфетку и увеличить выручку, акции разгонят на очередном притоке ликвидности. Ведь других производителей софта на ММВБ можно по пальцам пересчитать... До новых встреч на нашем канале t.me/Chat1CUnlimited – лето будет жарким