Как стать автором
Обновить

Security-Enhanced Linux против  1С + Apache. Выключить нельзя мучаться

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров2.4K

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

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

Начну с хорошей. Акции компании Астра (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 – лето будет жарким

Теги:
Хабы:
+5
Комментарии21

Публикации