我有一个位于 /usr/lib/systemd/system 下的服务。该服务运行我一直在开发的应用程序(.net core 2.0)。相同的应用程序在不同的机器上运行(centos7 都是)。他们使用 udp 套接字来查找对方。
在准备之前我已经测试这个应用程序很长时间了。服务为他们归档,一切都很顺利。他们能够互相广播消息。
当服务运行应用程序时,实例可以获得的唯一消息是同一实例首先广播的消息。其他机器上也有同样的情况。他们可以得到自己的广播,但不能得到对方的广播。
由于我是 Linux 新手,不确定在哪里查找以及应该搜索什么,所以我遇到了一些无用的信息,这就是为什么我在这里需要一些帮助。
谢谢
.service 文件内容
[Unit]
Description=Apix
[Service]
WorkingDirectory=/apix
ExecStart=/usr/bin/dotnet /APIX/Apix.dll
[Install]
WantedBy=multi-user.target
当我自己启动应用程序时,我可以看到 udp 端口正在被 dotnet 使用。但是当服务运行应用程序时,这条线就会消失。
netstat -lntup
udp 0 0 0.0.0.0:14235 0.0.0.0:* 11319/dotnet
答案1
Dan Walsh 2014 年的 Livejournal有 的描述unconfined_service_t
,尽管其中包含大量 SELinux 术语,恐怕以您当前的 SELinux 知识水平可能无法从中获得太多信息。
根据您的评论,该进程的 SELinux 标签是:
- 当使用 .service 文件启动时:
system_u:system_r:unconfined_service_t:s0
- 手动启动时:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
SELinux 标签有四个部分:
- SELinux 用户(带
_u
后缀) - SELinux角色(带
_r
后缀) - SELinux 类型(带
_t
后缀) - 以及 SELinux 级别定义,仅与完整的多级安全SELinux策略(军事安全之类),不带默认有针对性的政策。
在 SELinux 默认策略中,SELinux 用户标识符与您的常规用户名不同:实际上,SELinux 并不关心任何文件或进程到底属于谁,只关心您是基本系统进程还是由 ( system_u
)启动的进程、管理员 ( sysadm_u
)、普通用户 ( user_u
) 或已指定为不受 SELinux 策略限制的用户 ( unconfined_u
)。
角色部分可用于指定多个“部分管理员”角色,例如dbadm_r
数据库管理或logadm_r
系统日志访问。
关于的最重要的部分有针对性的SELinux 策略是类型规范,或者带有后缀的部分_t
。
unconfined_service_t
应该是不受限制的类型,所以我不确定那里出了什么问题。也许目录树下的文件/APIX/
都没有标签,这可能会导致问题?
与进程一样,文件也应该有一个 SELinux 标签,可以使用ls -Z
.一般来说,SELinuxdefault_t
为任何没有指定标签的文件提供一个 。当面对 时default_t
,SELinux 会“想”:“我不知道这是什么;它可能是丢失了标签的 Ultra Top Secret,所以让我们保持它的额外安全,直到某个管理员告诉我们它的正确标签。”简而言之,default_t
这是您需要解决的问题。
文件通常会继承创建时所在目录的标签,除非指定了 SELinux 规则另有说明。但是,如果您创建一个新的顶级目录,例如/APIX
,您需要决定如何标记它,否则您最终会得到default_t
,这可能会导致问题。
您可以尝试设置semanage permissive -a unconfined_service_t
:它允许任何服务使用unconfined_service_t
免费访问,同时仍然记录任何 SELinux 策略违规行为,就/var/log/auth/
好像 SELinux 已为它们完全启用一样。然后运行audit2why
审计日志的相关部分应该可以让您更清楚地描述为什么 SELinux 阻止程序做它想做的事情。
正确的修复可能只是/APIX/
使用合适的文件系统标签来标记目录。