%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%2F%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8%3F.png)
После недавнего обновления до CentOS 6.4, две машины имеют ограничения setuid(), которые действуют как либо capabilities, либо selinux, однако оба отключены. Например, следующее не работает:
[root@host statd]# perl -e 'use POSIX; POSIX::setuid(99);system("id")'
[root@host statd]# echo $?
0
Когда он должен вернуть что-то вроде:
host:~# perl -e 'use POSIX; POSIX::setuid(99);system("id")'
uid=99(nobody) gid=0(root) groups=99(nobody),0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
При вызове perl вызов setuid() проходит успешно, однако дочерний процесс system() немедленно завершается, как будто он был завершен selinux или чем-то подобным. Однако в /var/log/audit/audit.log нет записи журнала, даже после semodule -DB.
setuid32(99) = 0
getuid32() = 99
geteuid32() = 99
pipe([3, 4]) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7705728) = 10073
close(4) = 0
rt_sigaction(SIGINT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
waitpid(10073, [{WIFEXITED(s) && WEXITSTATUS(s) == 255}], 0) = 10073
--- SIGCHLD (Child exited) @ 0 (0) ---
rt_sigaction(SIGINT, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], 0}, NULL, 8) = 0
read(3, "\r\0\0\0", 4) = 4
close(3) = 0
exit_group(0)
Эта проблема стала очевидной после первой перезагрузки, когда nfs.statd завершился с ошибкой "Не удалось получить доступ к локальной базе данных netconfig: база данных Netconfig не найдена". А rpc.rquotasd завершился с ошибкой "RPC: server localhost required stronger authentication".
Проблему nfs.statd можно решить, запустив его как root (chown root:root /var/lib/nfs/statd ). Запуск всего на машине как root не кажется хорошим решением. ;)
Попытка подключиться к другой учетной записи также не работает:
[root@host ~]# su - jboss
su: warning: cannot change directory to /opt/jboss: Permission denied
su: /bin/bash: Permission denied
[root@host ~]# su jboss
su: /bin/bash: Permission denied
Ниже приведена основная информация о системе:
[root@host statd]# getenforce
Permissive
[root@host statd]# uname -a
Linux host.example.com 2.6.32-358.14.1.el6.i686 #1 SMP Tue Jul 16 21:12:30 UTC 2013 i686 i686 i386 GNU/Linux
[root@host statd]# cat /etc/redhat-release
CentOS release 6.4 (Final)
[root@host statd]# getcap /usr/bin/perl
/usr/bin/perl =
Что может быть причиной этого, если это явно не возможности selinux или linux?
решение1
Каким-то образом процесс обновления изменил разрешения на:
[root@host ~]# ls -alZ /
drw-r--r--. 42374 5031 system_u:object_r:root_t:s0 .
drw-r--r--. 42374 5031 system_u:object_r:root_t:s0 ..
Который был исправлен с помощью
chown root:root / && chmod 755 /
Большую помощь в сужении области ошибок оказал запуск
strace perl -e 'use POSIX; POSIX::setuid(99);exec("id")'
Что показало, что вызов perl execve() каждый раз терпел неудачу с EACCES, поскольку он пробовал все каталоги $PATH.