尝试在 CentOS 上强制执行 SElinux 并允许 clamAV 扫描文件。但SElinux似乎不喜欢clamd的以下行为:
Clamd 正在侦听预定义的 TCP 端口,然后使用随机 TCP 端口交换文件以与客户端进行检查
简而言之...每个被扫描的文件都会打开一个新端口。
禁用 SElinux 一切正常,所以肯定是 SElinux 策略相关的问题。
启用 SElinux 并强制执行 clamd 时会遇到以下问题:
● clamd.service - clamd scanner () daemon
Loaded: loaded (/usr/lib/systemd/system/clamd.service; static; vendor preset: disabled)
Active: active (running) since Thu 2017-06-22 15:56:57 CEST; 27min ago
Main PID: 3671 (clamd)
CGroup: /system.slice/clamd.service
└─3671 /usr/sbin/clamd -c /etc/clamd.d/scan.conf --foreground=yes
Jun 22 15:57:06 prd-app-srv clamd[3671]: HWP3 support enabled.
Jun 22 15:57:06 prd-app-srv clamd[3671]: Self checking every 600 seconds.
Jun 22 15:58:05 prd-app-srv clamd[3671]: ScanStream: Can't find any free port.
Jun 22 15:58:05 prd-app-srv clamd[3671]: ERROR: ScanStream: Can't find any free port.
Jun 22 16:08:05 prd-app-srv clamd[3671]: SelfCheck: Database status OK.
Jun 22 16:08:05 prd-app-srv clamd[3671]: SelfCheck: Database status OK.
Jun 22 16:08:24 prd-app-srv clamd[3671]: ERROR: ScanStream: Can't find any free port.
Jun 22 16:08:24 prd-app-srv clamd[3671]: ScanStream: Can't find any free port.
Jun 22 16:18:24 prd-app-srv clamd[3671]: SelfCheck: Database status OK.
Jun 22 16:18:24 prd-app-srv clamd[3671]: SelfCheck: Database status OK.
在 /var/log/audit/audit.log 中,我找到以下日志条目:
type=AVC msg=audit(1498156946.689:4165): avc: denied { name_bind } for pid=4086 comm="clamd" src=30860 scontext=system_u:system_r:antivirus_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1498156946.689:4165): arch=c000003e syscall=49 success=no exit=-13 a0=b a1=7fdc8fc31a90 a2=10 a3=1f items=0 ppid=1 pid=4086 auid=4294967295 uid=995 gid=994 euid=995 suid=995 fsuid=995 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm="clamd" exe="/usr/sbin/clamd" subj=system_u:system_r:antivirus_t:s0 key=(null)
这似乎密切相关: https://bugzilla.redhat.com/show_bug.cgi?id=1248785
有人知道 selinux 策略会阻止服务打开它想要的所有端口吗?
我想启用并强制执行 SElinux,并以侵入性较小的方式解决问题
答案1
通过在 /etc/clamd.d/scan.conf 中定义 clamd 使用的端口范围来解决
StreamingMinPort 30000
StreamingMaxPort 32000
并通过在 selinux 策略中反映相同的端口范围
semanage port -a -t clamd_port_t -p tcp 30000-32000
有人知道一种更清洁或更侵入性较小的方法来解决这个问题吗?