3

我对正在开发的程序进行了一些更改,并将 Java 从 Java 6 更新到 Java 7。

我在 CentOS 5.8 32 位 VM 上运行该程序。

在 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一般情况。
4

1 回答 1

9

1)什么可能导致阻止我开始我的进程的错误?

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

CentOS、Fedora、Scientific Linux 和 RedHat Entrprise Linux 默认将 SELinux 设置为“强制”模式。

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

3) 简要说明 setenforce 的一般作用

运行setenforce 0是将 SELinux 切换到“Permissive”模式。

这“修复”了问题,但如果您的系统暴露在外,这不是一个好主意。SELinux 目标访问策略的想法是通过限制暴露的服务可以做的事情来保护您的系统……例如,如果它们被黑客入侵。您刚刚关闭了该保护。

更好的方法是:

  • 检查安全/审计日志,
  • 弄清楚究竟是什么触发了 AVC 警报
  • 决定服务做它正在做的事情是否真的安全
  • 找出chcon用于更改相关安全上下文或标志的临时修复。
  • 通过添加本地策略覆盖来实施永久修复。

但是您需要一些 SELinux 技能/知识才能实现这一目标。

在这种特殊情况下,另一种(并且危险性大大降低)“快速修复”将是运行此:

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

但请注意,chcon如果您需要使用restorecon.

于 2013-02-06T07:36:50.120 回答