我已经在 Oracle Linux 9 上构建了一个 Apache Tomcat 9.0.83 服务器,它不会作为systemd
服务启动,但如果您从命令行运行它,它确实可以工作。
sudo su - tomcat /u01/tomcat/my_server/bin/startup.sh
错误消息表明禁止启动startup.sh
Tomcatbin
目录中的 shell 脚本。我做错了什么?
这是我所知道的。
journalctl -xeu my_server_tomcat.service
这表明它因以下错误而死亡。
systemd[4508]:我的服务器tomcat.服务:无法找到可执行文件 /u01/tomcat/my_server/bin/startup.sh:权限被拒绝
- 主题:无法执行进程 /u01/tomcat/my_server/bin/startup.sh
- 进程 /u01/tomcat/my_server/bin/startup.sh 无法执行,失败。
12月05日 10:35:49 myserver.sunyjcc.edu systemd[4508]: my_server_tomcat.service:步骤 EXEC 生成 /u01/tomcat/my_server/bin/startup.sh 失败:权限被拒绝
- 主题:无法执行进程 /u01/tomcat/my_server/bin/startup.sh
- 进程 /u01/tomcat/my_server/bin/startup.sh 无法执行,失败。
startup.sh 文件存在且可执行
$ ls -lrtZ /u01/tomcat/my_server/bin/startup.sh
-rwxrwxr-x. 1 tomcat tomcat system_u:object_r:default_t:s0 1904 Nov 9 21:57 /u01/tomcat/my_server/bin/startup.sh
我在 Oracle Linux 7 服务器上有一个 Tomcat 服务,具有相同的 selinux 安全上下文,我可以毫无困难地启动它
/etc/systemd/system/my_server_tomcat.service
[Unit]
Description=PROD my_server (Tomcat 9.0.83)
After=syslog.target network.target
[Service]
User=tomcat
Group=tomcat
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
Environment=CATALINA_PID=/u01/tomcat/my_server/tomcat.pid
Environment=CATALINA_HOME=/u01/tomcat/my_server
Environment=CATALINA_BASE=/u01/tomcat/my_server
ExecStart=/u01/tomcat/my_server/bin/startup.sh
ExecStop=/u01/tomcat/my_server/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
类似问题
编辑
我使用 关闭了 SELinux,sudo setenforce 0
然后服务启动了,所以我知道 SELinux 是问题的原因。经过一番折腾之后,我从审计日志中得到了以下消息,并使用 对其进行了解释audit2allow
。
sudo cat /var/log/audit/audit.log | grep 1702649015.089:80 | audit2allow -lw
type=AVC msg=audit(1702649015.089:80): avc: denied { execute } for pid=1336 comm="(artup.sh)" name="startup.sh" dev="dm-0" ino=67467631 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
这是 建议的模块audit2allow
。
sudo cat /var/log/audit/audit.log | grep 1702649015.089:80 | audit2allow -m my_server | tee junk.dat
module my_server 1.0;
require {
type root_t;
type init_t;
class file execute;
}
#============= init_t ==============
allow init_t root_t:file execute;
我不明白为什么它建议为此创建一个模块。在我看来应该有一个更简单的解决方案。
答案1
我决定使用audit2allow
创建一个允许访问的模块。下面是我让它工作的方法。
首先,将 SELinux 设置为宽容模式。
sudo setenforce 0
sudo systemctl start my_server_tomcat.service
然后重新启动服务器并让 Tomcat 服务器运行一小会儿。从 Tomcat 服务器拉取几个页面以确保它已经运行了一点。完成后,使用它audit2allow
来创建一个新模块。
sudo audit2allow -al -M my_tomcat # Create a new module definition
该-l
选项表示仅查看自上次启动以来发生的事情。由于系统尚未准备好投入生产,因此不应有任何不必要的权限。您仍应查看my_tomcat.te
以确保其中没有不该有的东西。如果没问题,则将其作为模块安装并重新打开 SELinux。
sudo semodule -i my_tomcat.pp # Load the new module.
sudo setenforce 1 # Set SELinux back to enforcing mode.
重启服务器,它仍然在运行。你可能不得不回去修改并重新编译策略,但至少我们知道我们可以让它运行。