小心selinux对应用的影响
NGINX 向云原生演进,All in OpenNJet
1.背景
最近有客户报告在试用NJet时,有环境完全启动不起来,启动时就会产生core,而相同的配置在其他环境没有问题。 具体现象如下:
[root@CDN119 proxy2]# ./sbin/njet -p /data/njet-bo/proxy2/ -c /data/njet-bo/proxy2/conf/njet.conf -e logs/error.log Segmentation fault (core dumped)
这种现象比较奇怪,肯定是和该机器的某个系统设置有关。因此开发人员进行了远程调试。
2. 问题定位
2.1 定位代码
gdb调试,显示njet 在调用tcc 中的函数时,调用失败,而此时函数指针也是正常的值。同时如果在配置中去掉tcc调用,NJet也可以正常启动,因此可以初步定位core跟tcc代码有关。
更进一步分析,发现core出现在tcc 内部的mp_protect. 而查看的dmesg信息 errno 15也明确了这一点(参考附录 errno的解释)
更进一步的分析,可以看到audit日志明确了根本原因。
type=PROCTITLE msg=audit(1726625910.924:12956): proctitle=2E2F7362696E2F6E6A6574002D70002F646174612F6E6A65742D626F2F70726F7879322F002D63002F646174612F6E6A65742D626F2F70726F7879322F636F6E662F6E6A65742E636F6E66002D65006C6F67732F6572726F722E6C6F67 type=AVC msg=audit(1726625910.928:12957): avc: denied { execheap } for pid=28790 comm="njet" scontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 tclass=process permissive=0 type=SYSCALL msg=audit(1726625910.928:12957): arch=c000003e syscall=10 success=no exit=-13 a0=556a3505e000 a1=2000 a2=7 a3=7f1c02e276b0 items=0 ppid=28788 pid=28790 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1186 comm="njet" exe="/data/njet-bo/proxy2/sbin/njet" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null)
audit的日志明确是设置“execheap” 操作被阻止了。也就是mp_protect执行失败,导致了core
2.2 根源分析
NJet为了兼顾高性能及灵活性,选择了tcc JIT框架,从而可以利用c 语言脚本来实现业务逻辑,广泛应用在stream处理中的协议识别,协议解析等多处模块。在启动阶段,tcc会把c语言脚本编译产生可执行到代码,并加载到内存中。因为加载到的代码会被作为函数执行,因此tcc需要对该段代码所在的区域利用mp_protect修改为可执行模式。
但selinux 模式中,该操作被阻止了。
3. 解决方案
3.1 尝试验证
- 关闭selinux 规则: setenforce 0
可以解决 - 设置相关权限 setsebool -P allow_execheap 1
可以解决
3.2 最终解决方案
尽管3.1中的两种方案能够解决问题,但存在负面影响(影响了系统安全设置,有可能违反企业的安全规则)。仔细阅读 tcc 代码,tcc有编译选项–with-selinux , 因此在编译tcc时,需要开启该选项,应对selinux的情况
4. 其他信息
-
本方案适用于centos及其变种
-
SELinux是Linux内核的安全子系统,通过严格的访问控制机制增强系统安全性。一般情况下,建议开启SELinux来限制进程的权限,防止恶意程序通过提权等方式对系统进行攻击;然而,由于SELinux的严格访问控制机制,可能会导致一些应用程序或服务无法启动,请参考如下链接,查看,关闭/启用SELinux https://help.aliyun.com/zh/ecs/use-cases/enable-or-disable-selinux
-
getsebool -a 可以用于查询具体的SELinux控制的属性状态,并利用setsebool进行设置变更
附录1 core后 error 的解释
The RIP value is the instruction pointer register value, the RSP is the stack pointer register value. The error value is a bit mask of page fault error code bits (from arch/x86/mm/fault.c):
- bit 0 == 0: no page found 1: protection fault
- bit 1 == 0: read access 1: write access
- bit 2 == 0: kernel-mode access 1: user-mode access
- bit 3 == 1: use of reserved bit detected
- bit 4 == 1: fault was an instruction fetch
Here’s error bit definition:
enum x86_pf_error_code {
PF_PROT = 1 <<0,
PF_WRITE = 1 <<1,
PF_USER = 1 <<2,
PF_RSVD = 1 <<3,
PF_INSTR = 1 <<4,
};
The error code 15 is 1111 bit. Finally, we can know the meaning of 1111 as follows:
01111
^^^^^
||||+—>bit 0
|||+—->bit 1
||+—–>bit 2
|+——>bit 3
+——->bit 4
This message indicates that the application triggers protection fault because that process tried to write access to a reserved section of memory in user-mode.
NJet 应用引擎通过内核重构实现了独特的运行时动态配置加载能力,是新一代高性能 Web 应用引擎。NJet 拥有高性能数据面处理能力,将集群、高可用、主动健康检查、声明式 API 等多种辅助功能,通过 NJet 独特的副驾驶 CoPilot 服务框架调度,从而方便功能扩展,隔离管理 / 控制功能对数据面的影响,NJet 应用引擎性能超过 CNCF 推荐 Envoy 应用引擎的三倍。 邮件组 官网

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅
某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅 一、项目背景 某市驾培系统主要为社会公众提供驾培单位查询和学车报名,为相关合作单位提供某市驾培监管、某市驾培考核等功能。业务信息教练车培训过程视频信息、包括培训机构基本信息、教练员基本信息和学员个人等信息,其服务范围为社会公众。信息系统定级为第三级。 某市驾培系统部署在某市政务云平台互联网区域和政务外网区域,采用 B/S 结构,使用 JAVA 语言开发。使用 JAVA 语言开发。租用了十多台台虚拟化服务器,其中应用类虚拟化服务器十多台,数据库虚拟化服务器两台,十多台虚拟化服务器的操作系统均为 CentOS v7.4,应用中间使用 Tomcat 9.0 数据库使用 MySQL v5.7.29。 某市驾驶培训监管服务平台系统拓扑 二、渗透测试、系统漏洞、专家建议(等保测评后) 根据渗透测试及漏洞扫描结果,某市驾培系统平台某市云机房所使用的十多台服务器中共发现紧急漏洞三个,高风险漏洞十三个,发现安全问题四十多个,中风险问题二十多个等,其服务器漏洞已与开发单位沟通确认并制定整改计划,将持续进行整改。 序号 名称(地址) 漏洞类型 漏洞...
- 下一篇
使用 Elastic 将 AI 摘要添加到你的网站
作者:来自 ElasticGustavo Llermaly 我们目前所知道的搜索(搜索栏、结果、过滤器、页面等)已经取得了长足的进步,并实现了多种不同的功能。当我们知道找到所需内容所需的关键字或知道哪些文档包含我们想要的信息时,尤其如此。但是,当结果是包含长文本的文档时,除了阅读和总结之外,我们还需要额外的步骤来获得最终答案。因此,为了简化此过程,Google 及其搜索生成体验 (Search Generative Experience -SGE) 等公司使用 AI 通过 AI 摘要来补充搜索结果。 如果我告诉你,你可以使用 Elastic 做同样的事情,你会怎么做? 在本文中,你将学习创建一个 React 组件,该组件将显示回答用户问题的 AI 摘要以及搜索结果,以帮助用户更快地回答他们的问题。我们还将要求模型提供引用,以便答案以搜索结果为基础。 最终结果将如下所示: 你可以在此处找到完整的工作示例存储库。 步骤 创建端点 创建索引 索引数据 创建组件 提出问题 创建端点 在创建端点之前,请先查看该项目的高级架构。 从 UI 使用 Elasticsearch 的推荐方法是代理调用,因...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境