Мы пытаемся использовать clamav на сервере centos 7 для прямого сканирования файлов в наших веб-приложениях (например, Moodle). При попытке выполнить clamdscan из apache мы получили эту ошибку (файл принадлежит apache: apache и имеет правильные права 755)
<?php
exec('/usr/bin/clamdscan --stdout --fdpass /var/www/html/test/filetoscan', $output, $return);
print "<pre>";
print_r($output);
print_r($return);
?>
И возврат:
Array
(
[0] => Failed to parse reply: "No file descriptor received. ERROR"
[1] =>
[2] => ----------- SCAN SUMMARY -----------
[3] => Infected files: 0
[4] => Total errors: 1
[5] => Time: 0.000 sec (0 m 0 s)
)
2
Конечно, если мы попытаемся сделать это напрямую через командные строки, мы получим ту же ошибку ..
su -l apache -s /bin/bash
/usr/bin/clamdscan --stdout --fdpass /var/www/html/test/filetoscan
Как я могу разрешить apache выполнить clamdscan (или решить проблему с файловым дескриптором)? конечно, если команда запускается другим пользователем, все работает нормально.
Спасибо за вашу помощь :-)
С уважением. Диего
отредактируйте /etc/clamd.conf для настройки пользователя Unix, clamav должен запускаться под: User apache
Исправьте права доступа к файлу / каталогу: chown -R apache: apache /var/run/clamd.scan; chown apache: apache /var/run/clamd.scan/clamd.sock
В противном случае clamav по умолчанию будет запускаться как пользователь clamscan, у которого нет разрешений на доступ к этому файлу, даже если вы добавили --fdpass в качестве аргумента сканирования.
Ни применяя setsebool -P antivirus_can_scan_system 1
(из эта процедура настройки) или полное отключение SELinux в /etc/selinux/config
улучшили ситуацию.
В результате strace
был создан, чтобы понять, что происходит, запущен как apache
:
$ strace /usr/bin/clamdscan --stdout --fdpass /var/www/html/cours/moodledata/temp/filetoscan
[...]
rt_sigaction(SIGPIPE, {SIG_IGN, [PIPE], SA_RESTORER, 0x7ff93f13c650}, NULL, 8) = 0
lstat("/var/www/html/cours/moodledata/temp/filetoscan", {st_mode=S_IFREG|0755, st_size=7256, ...}) = 0
socket(PF_LOCAL, SOCK_STREAM, 0) = 3
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/clamd.scan/clamd.sock"}, 110) = -1 EACCES (Permission denied)
close(3) = 0
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
connect(3, {sa_family=AF_INET, sin_port=htons(3310), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
open("/var/www/html/cours/moodledata/temp/filetoscan", O_RDONLY) = 4
sendto(3, "zFILDES\0", 8, 0, NULL, 0) = 8
sendmsg(3, {msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=20, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, {4}}, msg_flags=0}, 0) = 1
close(4) = 0
recvfrom(3, "No file descriptor received. ERR"..., 5120, 0, NULL, NULL) = 35
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff93fd3b000
write(1, "Failed to parse reply: \"No file "..., 60Failed to parse reply: "No file descriptor received. ERROR"
Первый доступ к файлу сокета unix /var/run/clamd.scan/clamd.sock
сбой, затем откат к TCP-связи 127.0.0.1/3301
не удалось по другой причине.
Возможно добавление apache
в группе, необходимой для доступа к сокету unix, исправит вашу проблему.