tcb

Материал из ALT Linux Wiki

В ALT для работы с паролями пользовательских входов используется схема TCB, в которой при добавлении новой учётной записи добавляется новая строка в файл /etc/passwd, новый подкаталог /etc/tcb/имя и файл shadow в нём. Для совместимости с другими схемами имя может содержать только латинские буквы, цифры и символ подчёркивания. Для задания полного имени пользователя можно использовать ключ -c "полное имя".

Переключение между схемой хранения паролей TCB, классической схемой (с единым файлом /etc/shadow) и строгой схемой (классическая, при которой команду passwd имеет право запускать только суперпользователь) управляется командой control passwd с параметрами tcb, traditional и restricted соответственно.

Импорт учётных записей из других систем, использующих shadow, не вызывает неприятностей, нужно только иметь в виду, что небезопасный ключ пребудет в shadow неизменным до тех пор, пока пользователь не сменит пароль (преобразование невосстановимого ключа из одного формата в другой, конечно, невозможно). При решении задач импорта-экспорта учётных записей стоит воспользоваться содержимым пакета tcb-utils.

Историческая справка

HP-UX действительно умеет размещать хеши по файлам в /tcb и имеет схожие утилиты конвертирования туда-сюда при включении-выключении trusted режима. Он умел/имел это еще до реализации нашего tcb в Owl, и мы не случайно используем то же название tcb для каталога. Но на этом внешняя схожесть заканчивается и начинаются принципиальные отличия. HP-UX не использует свой /tcb для безопасности сверх того что позволяет /etc/shadow. Как я понимаю, исторически у них /tcb появился как первый и когда-то единственный способ password shadowing - не в trusted режиме хеши лежали прямо в /etc/passwd, а поддержка /etc/shadow появилась позже чем поддержка /tcb. (Конвертировал когда-то свой HP-UX 10.20 туда-сюда, наблюдал это дело.) В этот же trusted режим они привязали и поддержку bigcrypt (которым лучше не пользоваться) - видимо, формально удовлетворяли требования сертификации. Зачем они вообще раскидали хеши по отдельным файлам если сами это никак для безопасности не используют (всё равно запись только от root, команда passwd(1) - SUID root), я могу только гадать, и моя догадка в том что это потенциально позволяет применять MAC, что опять же могло быть нужно для сертификации на какой-нибудь уровень, и что реально никто не делает. В нашем же tcb выставлены другие права доступа, что учтено в нашей libtcb (недоверие к содержимому каталогов при доступе от root) и что позволило снизить привилегии passwd(1) (и в Owl полностью избавиться от SUID root программ).
-- Solar Designer

SGID Directory treversal

Этот трюк кажется общеизвестным — и вместе с тем текст с внятным его описанием не гуглится.

Что ж, переведём кусок вот этой лекции

Хеш пароля пользователя george лежит в файле /etc/tcb/george/shadow:

-rw-r----- 1 george auth 80 сен 19  2018 /etc/tcb/george/shadow

⇒ Процесс с UID=george имеет доступ на чтение и запись, а процесс с GID=auth — только на чтение

Каталог /etc/tcb/george полностью доступен пользователю george, а создаваемые в нём файлы принудительно оказываются в группе auth (для того, чтобы процессы с GID=auth могли их читать)

drwx--s--- 2 george auth 4096 сен 19  2018 /etc/tcb/george 

А вот каталог /etc/tcb вообще недоступен никому, кроме root:

drwx--x--- 62 root shadow 4096 мар 24 13:41 /etc/tcb

…с одним исключением: если процесс принадлежит группе shadow, то может получить доступ к конкретному подкаталогу этого каталога (бит x), хотя прочесть или модифицировать их список не может.

⇒ Таким образом, чтобы получить доступ к файлу /etc/tcb/george/shadow, процесс должен одновременно принадлежать пользователю george и группе shadow.

…и именно так запускается программа passwd!

-rwx--s--x 1 root shadow 14552 июл  1  2018 /usr/bin/passwd

В самом деле:

  • Процесс наследует UID у запустившего его пользователя george
  • Процесс получает участие в группе shadow благодаря биту s
  • Процесс не получает прав суперпользователя, и не имеет доступа к другим файлам /etc/tcb/<user>/shadow

Алсо: чтобы найти все SGID-ные программы, можно запустить

find /usr/*bin -perm -2000 -ls

Ссылки