我对我正在处理的程序进行了一些更改,并将 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
命令的文档,我不明白它的作用以及它是如何解决问题的。
所以我的问题是:
- 是什么导致了阻止我启动流程的错误?
- 为什么
setenforce
命令可以解决?
- 请简要说明
setenforce
的一般作用。
1) what may cause the error that prevents me from starting my process ?
此问题是由于 SELinux 强制执行禁止该应用程序更改内存段的内存保护属性的访问策略
CentOS、Fedora、Scientific Linux 和 RedHat Entrprise Linux 将 SELinux 默认设置为“强制”模式。
2) why does setenforce command solves it ?
3) short explanation of what setenforce does in general
运行 setenforce 0
将 SELinux 切换到“许可”模式。
这“修复”了问题,但如果您的系统暴露在外,这不是一个好主意。 SELinux 有针对性的访问策略的想法是通过限制您公开的服务可以做的事情来保护您的系统……例如,如果它们被黑客入侵。您刚刚关闭了该保护。
更好的方法是:
- 检查安全/审计日志,
- 找出触发 AVC 警报的确切原因
- 确定服务做它正在做的事情是否真的安全
- 使用
chcon
更改相关的安全上下文或标志找出临时修复。
- 通过添加本地策略覆盖来实现永久修复。
但是您需要一些 SELinux 技能/知识才能实现这一目标。
在这种特殊情况下,另一种(并且危险性大大降低)“快速修复”是运行此命令:
# chcon -t textrel_shlib_t /agent/jre/lib/i386/client/libjvm.so
但请注意,如果您需要执行 restorecon
,则使用 chcon
进行的临时安全上下文更改可能会被撤消。