Как запретить очистке chgrp «бит setuid»?

8

У нас есть образы Linux на основе RH; на котором я должен «применить» некоторый «специальный архив», чтобы обновить их до последней версии разработки нашего продукта.

Человек, создавший архив, понял, что в нашем базовом изображении некоторые разрешения неверны; поэтому нам сказали бежать

sudo chgrp -R nobody /whatever

Мы сделали это; и позже, когда наше приложение работает, возникли неясные проблемы.

То , что я нашел позже: призыв к команде chgrp будет ясно Setuid битовой информации о наших двоичных файлах в пределах / независимо.

И настоящая проблема в том, что для правильной работы некоторых наших двоичных файлов должен быть установлен этот бит setuid.

Короче говоря: есть ли способ выполнить эту команду "chgrp", не убивая мои биты setuid?

Я просто запустил следующее в своей локальной Ubuntu; приводя к тому же результату:

mkdir sticky
cd sticky/
touch blub
chmod 4755 blub 
ls -al blub 

-> показывает мне имя файла с красным фоном -> так что, да, setuid

chgrp -R myuser .
ls -al blub 

-> показывает мне имя файла без красного фона -> setuid ушел

GhostCat
источник
1
4XXXБит называется Setuid бит ( s), не липкий. Липкий tбит, и его назначение немного отличается: en.wikipedia.org/wiki/Sticky_bit
zuazo
2
(1) Вы устанавливаете setuidбит, а не stickyбит. (2) Не очищать setuidбит, когда вы делаете chgrpили chownбудете проблемой безопасности.
Сат Кацура
1
Это поведение меняется между распределениями. Но, как объясняется здесь , изменение бита setuid зависит от базового поведения системного вызова.
zuazo
Спасибо всем. Вы правы, это про бит setuid! Спасибо за вашу помощь. И я также принимаю, что это «работает как задумано». Теперь мне просто нужно найти самый разумный способ сделать то, что нужно сделать, не убивая эти биты. Я решил использовать gefacl для создания текстового дампа, переделать текстовый конфиг и затем применить его. Это должно дать мне полный контроль над тем, что произойдет.
GhostCat

Ответы:

7

Если вы хотите реализовать свой chgrp -R nobody /whatever, сохраняя бит setuid, вы можете использовать эти две findкоманды

find /whatever ! -type l -perm -04000 -exec chgrp nobody {} + \
                                      -exec chmod u+s {} +
find /whatever ! -type l ! -perm -04000 -exec chgrp nobody {} +

find ... -perm 04000Вариант подбирает файлы с УИП битом. Первая команда затем применяет chgrpи затем a, chmodчтобы восстановить бит setuid, который был сбит. Второй относится chgrpко всем файлам, у которых нет бита setuid.

В любом случае, вы не хотите вызывать chgrpили использовать chmodсимволические ссылки, так как это повлияет на их цели, следовательно, на ! -type l.

roaima
источник
Обратите внимание, что chgrpтакже очищает бит setgid (и возможности в Linux), который также может потребоваться восстановить.
Стефан Шазелас
@ StéphaneChazelas вы правы, но, поскольку никто не упомянул сеттинг, я не беспокоился о том, чтобы найти решение для него. Решение является тривиально расширяемым, хотя, с третьимfind
roaima
Ну, это не может быть третьей находкой, вы должны были бы покрыть дела u + g, вы один, g один. В любом случае, вы сможете сделать это за один findвызов. Мне не нравятся длинные строки в SE, когда нужно прокручивать текст. Мое добавление! Я сделал это через край
Стефан Шазелас
Что ж, с одним findподходом -exec +может быть сложно сделать надежно, если в итоге разделить chmod/ chgrps на несколько вызовов.
Стефан Шазелас
1
На самом деле, я думаю, find . ! -type l -exec chgrp nobody {} + \( -perms -6000 -exec chmod gu+s {} + -o -perms -4000 -exec chmod u+s {} + -o -perms -2000 -exec chmod g+s {} + \)должно быть в порядке. Поскольку chgrpспичек для нескольких файлов, для каждого файла должно быть сделано перед тем в chmodс.
Стефан Шазелас
5

Сброс битов SUID и SGID на chgrp(или chown) вполне разумен. Это мера безопасности для предотвращения проблем с безопасностью. Для SGID (на исполняемых файлах, я полагаю) означает запустить эту программу с эффективной группой владельца группы .

Если вы измените владельца группы, то с точки зрения безопасности и контроля доступа это будет что-то совершенно другое, то есть вместо того, чтобы работать с эффективной группой, uvwпрограмма теперь работает с эффективной группой xyz.

Таким образом, вам нужно явно восстановить бит SUID или SGID при смене владельца.

Приложение: к заявлению, что chgrp (или chown) должен очищать только SGID (или SUID, соответственно)

Используя chownили chgrpизменяя параметры безопасности для исполняемого файла, это является достаточной причиной для очистки любых атрибутов повышения привилегий. Сила Unix заключается в концептуальной простоте, а безопасность Unix уже достаточно сложна. С этой целью удаление SUID и SGID при любом изменении владельца является просто сетью безопасности - в конце концов, в истории Unix / Linux было довольно много уязвимостей из-за ошибочных настроек SUID или SGID.

Так что нет более глубокой причины, по которой Unix ведет себя так, это просто консервативное решение.

countermode
источник
1
Это прекрасно объясняет, почему смена владельца очищает бит SUID, а смена группы очищает бит SGID. Но вопрос касается бита SUID во время операции смены группы, который не влияет на пользователя, под которым запускается SUID. Так что должно быть другое объяснение.
Бен Фойгт
1
@BenVoigt: это объясняет это довольно хорошо. И chown, и chgrp вызывают системный вызов chown (), который очищает suid и sgid от обычных файлов, несмотря ни на что.
Джошуа
1
@ Джошуа: Это описание. Объяснение заключается в том, чтобы «избежать случая, когда вместо выполнения с эффективной группой uvwпрограмма теперь будет работать с эффективной группой xyz», но это не относится к обсуждаемому случаю.
Бен Фойгт
Оно делает. По chownИнгам или chgrpИНГ изменить настройки безопасности, и это является достаточным основанием для четких признаков привилегий подъемных. Высоки шансы, что в противном случае это ударяет неосторожных.
контррежим
4

Просветление setuid, setgidнемного (по крайней мере на Linux) на не-каталогах осуществляются ядром на chown()системном вызов сделанного chgrp, а не chgrpсам по себе. Так что единственный способ - это восстановить его потом.

Это также очищает возможности безопасности.

Итак, на GNU Linux:

chown_preserve_sec() (
  newowner=${1?}; shift
  for file do
    perms=$(stat -Lc %a -- "$file") || continue
    cap=$(getfattr -m '^security\.capability$' --dump -- "$file") || continue
    chown -- "$newowner" "$file" || continue
    [ -z "$cap" ] || printf '%s\n' "$cap" | setfattr --restore=-
    chmod -- "$perms" "$file"
  done
)

И запустить (как root):

chown_preseve_sec :newgroup file1 file2...

изменить группу при попытке сохранить разрешения.

Вы можете сделать рекурсивно:

# save permissions (and ACLs). Remove the "# owner" and "# group" lines
# to prevent them being restored!
perms=$(getfacl -RPn . | grep -vE '^# (owner|group): ')
# save capabilities
cap=$(getfattr -Rhm '^security\.capability$' --dump .)

chgrp -RP nobody .

# restore permissions, ACLs and capabilities
printf '%s\n' "$perms" | setfacl --restore=-
[ -z  "$cap" ] || printf '%s\n' "$cap" | setfattr -h --restore=-

(это все, если предположить, что ничего не мешает одновременно с файлами).

Стефан Шазелас
источник
1

Как обычно в админке есть много способов пройти.

Решение, которое я поставил на место, выглядит так:

cd /home/me
getfacl -R /whatever > whatever-permissions.org 2> /dev/null

# A) change lines starting with      # group: root
# to                                 # group: whatineed
sed 's/^# group: root/# group: whatineed/g' whatever-permissions.org > whatever-permissions.new

# B) change lines with               group::x.y
# to                                 group::xwy
# (where x, y mean: whatever was there before)
sed 's/^group::\(.\).\(.\)/group::\1w\2/g' whatever-permissions.new > whatever-permissions.new

cd /
setfacl --restore /home/me/whatever-permissions.new
GhostCat
источник