“setenforce 0”如何以及为什么可以让Java 7运行?

3

我正在处理一个程序,进行了一些更改,并将Java从Java 6更新到Java 7。

我在CentOS 5.8 32位虚拟机上运行该程序。

在Java更新之前,它可以正常工作。

现在进程启动时出现错误:

 [root@CentOS-58-i-0 bin]# ./agent.sh start

 Starting Agent.....d. running (23442).
 Error: dl failure on line 864
 Error: failed /agent/jre/lib/i386/client/libjvm.so, 
 because /agent/jre/lib/i386/client/libjvm.so: 
 cannot restore segment prot after reloc: Permission denied

我已经查阅了网上的资料,对于此问题的解决方法/临时方案是运行以下命令:
   setenforce 0

并且它会起作用。

阅读有关setenforce命令的文档时,我不理解它的作用以及它如何解决问题。

所以我的问题是:

  1. 什么原因导致了阻止我启动进程的错误?
  2. setenforce命令为什么能够解决这个问题?
  3. 请简要说明一下setenforce通常的作用。
1个回答

9

1) 什么原因导致了阻止我启动进程的错误?

这个问题是由SELinux强制执行访问策略引起的,该策略禁止应用程序更改内存段的内存保护属性。

默认情况下,CentOS、Fedora、Scientific Linux和RedHat Entrprise Linux将SELinux设置为“强制执行”模式。

2) 为什么setenforce命令可以解决它?

3) setenforce通常做什么的简短说明

运行setenforce 0会将SELinux切换到“宽容”模式。

这样可以“修复”问题,但如果您的系统暴露在外面,这并不是一个好主意。 SELinux定向访问策略的想法是通过限制您的暴露服务可以执行的操作来保护您的系统...例如,如果它们被黑客攻击。 您刚刚关闭了该保护功能。

更好的方法是:

  • 检查安全/审计日志,
  • 确定触发AVC警报的确切原因
  • 决定服务实际上是否可以安全执行其正在执行的操作
  • 使用chcon找出临时解决方案,以更改相关的安全上下文或标志。
  • 通过添加本地策略覆盖来实施永久修复。

但是您需要一些SELinux技能/知识才能完成这项工作。

在这种特殊情况下,一个替代(且显着不那么危险)的“快速修复”方法是运行以下命令:

# chcon -t textrel_shlib_t /agent/jre/lib/i386/client/libjvm.so

需要注意的是,使用chcon进行的临时安全上下文更改可能会在需要执行restorecon操作时被撤消。


我相信 semanage fcontext -a -t textrel_shlib_t /agent/jre/lib/i386/client/libjvm.so 可能会永久改变安全上下文,虽然我不是很确定。 - dmg
是的...差不多就是这样。我必须承认,我在 SELinux 策略方面缺乏实际经验。 - Stephen C
我在运行httpd和mysqld时遇到了一些问题,因为它们使用了“奇特”的端口。错误信息显示端口已被占用或类似的内容。事实证明,你必须使用semanage显式地允许这些服务使用这些端口。 - dmg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接