/ usr / bin / passwd и возможность CAP_CHOWN - PullRequest
3 голосов
/ 21 октября 2011

Я экспериментировал с возможностями Linux и заметил, что для работы программы passwd без корня Set-UID она должна иметь возможность CAP_CHOWN (в дополнение к некоторым другим).Логически, зачем вообще нужно иметь CAP_CHOWN ?

Кстати, passwd выдает мне «ошибку манипуляции токеном», если я удаляю эту возможность.

Редактировать: я использую Ubuntu 11.04 без SELinux.Я пытаюсь заставить passwd работать, не будучи корнем Set-UID.

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

cap_chown не требуется для самого passwd. Требуется только изменить файл / etc / shadow, связанный с userID. Файл / etc / shadow настроен так, что он не может быть прочитан никем.

/ etc / shadow доступен только пользователю root. Поэтому, когда / etc / passwd завершит работу своего модуля аутентификации и будет готов написать новый (закодированный) пароль, он создаст токен. К которому обращается сервис Linux-PAM, который преобразует его в root и записывает в /etc/shadow.

Edit:

passwd использует файлы /etc/.pwd.lock, / etc / shadow, / etc / nshadow. Так как passwd читает и пишет из каталога / etc, он запрашивает разрешения w. Обратите внимание, что / etc / shadow никогда не пишется passwd. passwd фактически записывает в / etc / nshadow и переименовывает / etc / nshadow в / etc / shadow.

open('/etc/nshadow',O_WRONLY|O_CREAT)=fd1
open('/etc/shadow', O_RDONLY)=fd2
fchown(fd1, uid=root, gid=shadow)
chmod /etc/shadow to : rw by owner and r by group
read(fd2)
write(fd1)
rename("/etc/nshadow", "/etc/shadow")

Кроме того, я подтвердил существование /etc/nshadow с помощью этой программы на Си. FYI,

#include<stdio.h>
#include<unistd.h>
int main()
{
while(1)
if (access("/etc/nshadow",F_OK)!=-1){
    printf("Exists\n");
    break;
    }
return 0;
}
0 голосов
/ 21 октября 2011

setuid - это все, что первоначально было необходимо.

Добавление SELinux ( Security Enhanced ) требует, чтобы контекст программы был корректным, а также файлпроверка прав доступа.

Если функция SE системы отключена, passwd будет работать нормально без CAP_....Где-то я читал, что SE можно отключить, написав «1» в /selinux/disable.Предположительно, запись «0» активирует его.

См. Описание АНБ или Федоры .

...