我最近注意到一个令人沮丧的小问题...在处理电子邮件时,Ubuntu 服务器(应用了所有更新)在尝试对附件进行病毒扫描时报告“权限被拒绝”。
Apr 2 14:05:20 svr amavis[6376]: (06376-01) (!)run_av (ClamAV-clamd) FAILED - unexpected , output="/var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/parts: lstat() failed: Permission denied. ERROR\n"
Apr 2 14:05:20 svr amavis[6376]: (06376-01) (!)ClamAV-clamd av-scanner FAILED: CODE(0x30cf250) unexpected , output="/var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/parts: lstat() failed: Permission denied. ERROR\n" at (eval 136) line 899.
Apr 2 14:05:20 svr amavis[6376]: (06376-01) (!)WARN: all primary virus scanners failed, considering backups
当我查看相关目录时,我看到了以下内容:
$ ls -ld /var/lib/amavis/tmp
drwxrwx--- 4 amavis amavis 4096 Apr 2 14:16 /var/lib/amavis/tmp
$ ls -ld /var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/
drwxr-x--- 3 amavis amavis 4096 Apr 2 14:05 /var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/
$ ls -ld /var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/parts
drwxr-x--- 2 amavis amavis 4096 Apr 2 14:16 /var/lib/amavis/tmp/amavis-20150402T140519-06376-PZcyHfOt/parts
我确保 clamd 用户是 amavisd 组的成员 - 但这并没有解决任何问题。有人能具体告诉我哪个组件需要什么权限吗 - 以及...理想情况下...该怎么做才能解决这个问题?
澄清:我并不是在寻找权限基础知识的解释。我正在寻找适合此特定问题的解决方案 - 至少乍一看,这个问题似乎是 amavis 套件的某个组件(可能是 clamd)使用了错误的 umask 值。当然,此故障可能是由于许多错误或配置故障而引起的。我正在寻找最适合这种情况的解决方案...其中“原始”amavis/clamav 安装无法访问它在扫描入站电子邮件时创建的临时文件夹的内容。
我知道这类似(非 Ubuntu)的问题。Redhat/Centos 的答案无法解决我在 Ubuntu 上遇到的问题。
在“Ubuntu 14.04.2 LTS”上遇到了这个问题 - 没有待处理的更新。
答案1
一个可行的解决方案是改变
允许补充组 false -> true
在 /etc/clamav/clamd.conf 中
重新启动 clamav-daemon
答案2
当clamd
用户是该组的成员时amavis
,该进程以(非)用户clamd
身份运行。clamav
clamd
加入clamav
该amavis
小组后问题得到解决。
答案3
由于AllowSupplementaryGroups
不再存在,我最后将每个用户添加到另一个组,如下所示:
usermod -a -G clamav amavis
usermod -a -G amavis clamav
(并重新启动一切以确保万无一失)
/etc/init.d/clamav-daemon restart
/etc/init.d/amavis restart
/etc/init.d/postfix restart
有了这个,就不需要更改文件夹权限了/var/lib/amavis/tmp
(而且我不确定这些权限在下一次 apt-get 升级时是否会保留原样......)
答案4
手册lstat
上说:
No permissions are required on the file itself, but—in the case of stat() and
lstat() — execute (search) permission is required on all of the directories
in path that lead to the file.
因此检查路径下的所有库是否都有执行权限。