Как изменить разрешения Unix, если я не владею файлом, но имею разрешение на запись в каталог?

Я делюсь репозиторием git с коллегой, и поскольку git не распространяет полный набор разрешений для файлов Unix, у нас есть «крючок», который запускается при обновлении и устанавливает «другие» разрешения по мере необходимости. Эта проблема? Хук использует chmod, и получается, что когда мой коллега коммитит файл, он владеет им, поэтому я не могу запустить на нем chmod, и наоборот. Все каталоги доступны для групповой записи, липкие, поэтому я считаю, что любой из нас имеет право удалить любой файл и заменить его файлом с тем же именем, тем же содержимым, но с другим владельцем. Предположительно, тогда мы могли бы chmod это. Но это похоже на ужасно большой молот, и я немного опасаюсь его испортить. Итак, два вопроса:

  1. Кто-нибудь может придумать другой способ сделать это?

  2. Если нет, то какой лучший дизайн для пуленепробиваемого сценария оболочки, который реализует "сделать этот файл принадлежащим мне"? Никаких перемещений между файловыми системами и т. Д. И т. Д.

Для тех, кто, возможно, не понял, разрешение на запись не дает разрешения на chmod:

% ls -l value.c
-rw-rw---- 1 agallant ta105 133 Feb 10 13:37 value.c
% [ -w value.c ] && echo writeable
writeable
% chmod o+r value.c               
chmod: changing permissions of `value.c': Operation not permitted

Мы оба в группе ta105.


Примечания:

  1. Мы используем git не только для координации изменений, но и для публикации репозитория в качестве веб-сайта курса. Публикация веб-сайта является основной целью репозитория. Сценарий разрешений запускается при каждом обновлении с помощью git-хука и гарантирует, что у учащихся нет разрешения на чтение решений, которые еще не были обнародованы.

  2. Пожалуйста, не предполагайте, что у меня неправильный umask. Не все файлы в репозитории должны иметь одинаковые разрешения, и какой бы umask ни был выбран, разрешения для некоторых файлов необходимо будет изменить. Не говоря уже о том, что с моей стороны было бы невежливо навязывать коллегам свои умаски предпочтения.

  3. ОБНОВЛЕНИЕ. Я только что узнал, что в нашей среде права root отменены до nobody на всех машинах, к которым у нас есть доступ, поэтому решение, основанное на привилегиях root, не будет работать.


person Norman Ramsey    schedule 11.02.2011    source источник
comment
Извините, моды не могут изменить, какой ответ будет принят, а какой ответ получит награду.   -  person    schedule 28.02.2011
comment
Я, вероятно, упустил какую-то часть вашего полного сценария, но, похоже, вам следует посмотреть на права доступа к каталогу. Возможность изменять разрешения для файла выводится из настройки режима в каталоге, в котором находится файл. Вы не показали настройки для этого каталога. Они drwxrwxr_x или что-то в этом роде? Вы, вероятно, хотите drwxrwsr_x. Ваши текущие разрешения каталога помогут уточнить.   -  person Amit Naidu    schedule 23.04.2013
comment
@AmitNaidu, согласно man 2 chmod, вам нужно быть владельцем или суперпользователем, чтобы изменить права доступа к файлу. Разрешения родительского каталога не упоминаются и кажутся несущественными, поскольку разрешения хранятся в индексном узле, а не в каталоге (иначе две жесткие ссылки на один и тот же файл могут иметь разные разрешения).   -  person philh    schedule 17.12.2013


Ответы (8)


Существует по крайней мере один Unix, в котором я видел способ предоставить кому-либо разрешения chmod и chown на все файлы, принадлежащие определенной группе. Иногда это называется «групповой суперпользователь» или что-то подобное.

Единственная версия Unix, в которой я был уверен, это та версия Unix, в которой Encore Multimax побежал.

Я немного поискал, и хотя я помню несколько расплывчатых упоминаний о возможности такого рода в Linux, я не смог их найти. Так что это может быть не вариант. К счастью, это можно смоделировать, хотя симуляция немного опасна.

Чтобы имитировать это, нужно создать очень специфическую программу suid, которая будет выполнять chmod от имени root после проверки того, что вы являетесь членом той же группы, что и владелец файла, и что ваше имя пользователя указано как имеющее это разрешение в специальном файле /etc/chmod_group, который должен принадлежать root и доступен для чтения и записи только root.

person Omnifarious    schedule 21.02.2011
comment
Я не уверен, что мои системные администраторы пойдут на программу suid --- мне придется спросить их. Но ваше предложение кажется самым безопасным и разумным из тех, что я видел до сих пор. - person Norman Ramsey; 21.02.2011
comment
@Norman Ramsey: Возможно, можно использовать SELinux или что-то подобное, чтобы дать программе очень узкие возможности. Я также знаю, что в Fedora 15 есть попытка полностью избавиться от программ setuid, что указывает на то, что теперь есть альтернативный механизм для выполнения подобных действий более контролируемым способом. - person Omnifarious; 21.02.2011
comment
@Omnifarious, программы setuid-root постепенно будут заменены конкретным проектом posix capabilities(7), чтобы указать, какое подмножество привилегий суперпользователя будет предоставлено программе. Вы можете начать прямо сейчас :) с помощью утилиты setcap(8) предоставить, например CAP_DAC_OVERRIDE и не разрешать CAP_NET_BIND или CAP_SYS_ADMIN и т. д. - person sarnold; 22.02.2011
comment
Я отметил этот ответ принятым, потому что (а) я считаю, что программа setuid может существенно помочь, и (б) это ответ, который дал мне самые новые идеи для размышлений. Проблема остается нерешенной. - person Norman Ramsey; 26.02.2011
comment
@ Норман Рэмси: Спасибо. Я могу исследовать возможности, о которых упоминал @sarnold, и если я это сделаю, и я все еще помню этот вопрос, я приду сюда и обновлю его описанием того, как выполнить задачу с их помощью. Я думаю, что это даже лучшая идея, чем программа setuid. - person Omnifarious; 27.02.2011
comment
@Всемогущий. Дерьмо. Вы не получили свою награду. Ошибка пользователя. Я обратился за помощью к модератору. - person Norman Ramsey; 28.02.2011
comment
@Norman Ramsey: На данный момент результатом этого является потеря около 300 очков репутации. усмехается Но, возможно, случившееся произошло по другой причине. Я не очень обеспокоен, но спасибо! - person Omnifarious; 28.02.2011

Самый простой способ сделать это — сделать вас и вашего партнера членами новой группы (скажем, «devel») и использовать ее в качестве группы файла. Таким образом, он может принадлежать любому из вас, и пока группа права, вы оба можете работать с ним.

Если это не работает с вами, «sudo» можно настроить таким образом, чтобы только эти два пользователя могли запускать команду chmod для файлов в этом конкретном каталоге от имени пользователя root без пароля.

person dj_segfault    schedule 11.02.2011
comment
Это именно та ситуация, в которой мы находимся. Разрешение на запись не является разрешением chmod. Я не знаю, разрешат или поддержат ли администраторы sudo, но на это стоит обратить внимание. - person Norman Ramsey; 11.02.2011
comment
+1 за судо. Просто оберните свой chmod в сценарий bash и определите для него правила sudo. - person mindas; 22.02.2011
comment
Я не думаю, что есть больше шансов, что вы получите все правила в sudo правильно, чем если вы получите программу suid, написанную на C, чтобы делать правильные вещи. На самом деле, я думаю, что есть худший шанс. То, как вы выражаете правила в sudo, довольно загадочно. - person Omnifarious; 27.02.2011

Если вы правильно установите umask, файлы могут быть созданы с правильными разрешениями:

$ umask 0022
$ touch foo
$ ls -l foo
-rw-r--r-- 1 sarnold sarnold 0 2011-02-20 21:17 foo
$ rm foo
$ umask 0002
$ touch foo
$ ls -l foo
-rw-rw-r-- 1 sarnold sarnold 0 2011-02-20 21:17 foo
person sarnold    schedule 21.02.2011
comment
Извините, но emacs знает только один umask, а правильное значение по умолчанию для моей установки — 002. Весь вопрос в том, как поступить с несколькими файлами, для которых umask по умолчанию не подходит. - person Norman Ramsey; 21.02.2011
comment
@Нормальный Рэмси, ах! Я не понимал, что вам нужны разные разрешения только для нескольких файлов; Я думал, что они все ошибались. :) - person sarnold; 22.02.2011

Я делаю шаг назад. Дайте мне знать, если я нарушу какое-то ограничение в вашей системе, о котором я не читал.

Исходя из вашего вопроса, я предполагаю, что вы пытаетесь поделиться репозиторием git, используя URL-адреса file:// и полагаясь на разрешения файловой системы UNIX, чтобы позаботиться об авторизации и т. д. Почему бы вам не рассмотреть другой способ поделиться своими репозиториями, который не включает это хлопот?

Я могу думать о двух способах.

  • Вы можете создать пустой репозиторий на любом из ваших компьютеров, добавить его в качестве удаленного в свои рабочие репозитории и использовать для совместной работы. Подавать его можно с помощью встроенной команды git daemon. Подробности находятся здесь. Однако это не даст вам никакого контроля доступа.
  • Вы можете установить gitosis локально и использовать его для обслуживания вашего репозитория. Это позволяет использовать простую систему контроля доступа, чтобы вы могли ограничивать/разрешать доступ определенным пользователям.

Некоторое время назад возник связанный с этим вопрос, который может быть актуальным. git daemon работал на него - Администрирование репозитория git без прав root

Я также нашел кое-что об ошибке сервера, которая может иметь отношение к вашей проблеме - https://serverfault.com/questions/21126/git-daemon-and-access-control-for-multiple-repos

person Noufal Ibrahim    schedule 21.02.2011
comment
Это хорошая мысль. Я отредактировал вопрос, чтобы отразить, что основной целью репозитория является публикация в качестве веб-сайта курса. Установка соответствующих разрешений для веб-сайта — это то место, где мы сталкиваемся с проблемами. - person Norman Ramsey; 21.02.2011
comment
Публикуются ли материалы вашего курса напрямую в виде репозитория git? Я не понимаю, как ваша система разрешений будет работать с такой вещью. Репозитории Git можно клонировать только полностью, и ваши ученики будут иметь доступ ко всему контенту, не так ли? - person Noufal Ibrahim; 22.02.2011
comment
студенты не могут получить доступ к центральному репозиторию. Студенты имеют доступ только к одной реплике, и эта реплика может быть написана только преподавателями. Таким образом, рабочий процесс заключается в том, что каждое нажатие на (частное) центральное репо запускает хук, который обновляет общедоступное репо. Часть этого хука устанавливает разрешения. - person Norman Ramsey; 24.02.2011
comment
Ах хорошо. Разве не было бы тогда возможно иметь что-то вроде ветки answered, которая содержит только то, что учащимся разрешено видеть? Таким образом, вам не нужно беспокоиться о разрешениях, поскольку даже если они клонируют весь общедоступный репозиторий, они не получат то, чего не должны. - person Noufal Ibrahim; 24.02.2011

Вероятно, не самый элегантный способ, но похоже, он работает

$ umask 0002
$ mv value.c value.c.tmp
$ cat value.c.tmp > value.c
$ rm value.c.tmp

можно было бы возразить, что его можно было бы сделать пуленепробиваемым, но тут кто-то приносит с собой РПГ...

Если вам обоим нужно выполнить chmod, я не могу придумать другого способа - если это нормально, что ВЫ можете chmod, а другой парень нет, вы можете chmod 6770 . или chmod g+s,u+s . в каталог (например, установите биты SUID и GUID), чтобы тот, кто владеет каталогом, всегда был владельцем файлов. К сожалению, некоторые (если не большинство), а именно EXT2/3/4, игнорируют бит SUID.

Конечно, установка umask на 0002 решит проблему, не делая его обязательным.

person Kimvais    schedule 21.02.2011
comment
Нам обоим нужно выполнить chmod, и если двое из нас запустят этот код одновременно, value.c будет удален. - person Norman Ramsey; 21.02.2011
comment
На самом деле то, что я сказал о EXT, кажется неправдой — по крайней мере, в Debian Squeeze g+s, похоже, помогает. - person Kimvais; 22.02.2011

Предполагая, что ваш крюк публикации фактически развертывает файлы, а не просто устанавливает разрешения в рабочей копии, вы можете выполнить развертывание во временном расположении, а затем использовать rsync, чтобы убедиться, что содержимое файла и разрешения верны.

Немного лучше, но требующая некоторой инфраструктуры, которой, как я предполагаю, нет, было бы гарантировать, что сценарий развертывания работает только под одним пользователем. Вы можете сделать это, используя sudo, если ваши системные администраторы позволяют, или настроив службу сервера git, например gerrit, или даже запустив задание cron каждые пять минут, которое проверяет наличие обновлений и при необходимости развертывает.

person Andrew Aylett    schedule 25.02.2011
comment
Мой крючок для публикации просто делает «git pull» для общедоступной копии, а затем запускает «make» для получения файлов и установки разрешений. Возможно, решение состоит в том, чтобы каким-то образом запустить setuid сценария развертывания; Я не знаю. - person Norman Ramsey; 26.02.2011
comment
То есть вы публикуете рабочую копию напрямую, а не развертываете ее где-то? Ваш рабочий процесс можно улучшить, заставив шаг развертывания помещать файлы в другое место, даже если это просто означает размещение репозитория git в подкаталоге без доступа для чтения для учащихся и использование rsync для копирования файлов в родительский с правильными разрешениями для студенты. - person Andrew Aylett; 28.02.2011

Это может сработать:

touch $name.tmp
chmod 660 $name.tmp
cp $name $name.tmp
if cmp $name $name.tmp 2>/dev/null; then
    rm $name && \
        cp $name.tmp $name && \
        rm $name.tmp
fi

Это просто вариант вашей первоначальной идеи

person bluesmoon    schedule 26.02.2011
comment
Это примерно правильный подход, но временное имя должно быть сгенерировано безопасным образом, а cmp, вероятно, не нужен, пока вы проверяете статус выхода (что вам нужно делать). - person R.. GitHub STOP HELPING ICE; 03.08.2013

Хорошо, смесь вещей, основанных на предыдущих ответах:

  • вы можете установить umask папки, если вы смонтируете ее в fstab. Если бы вы могли договориться с людьми, чтобы они работали над этим ездовым животным, вы могли бы применить g+w

  • Если вы установите бит идентификатора группы этой папки (g+s), все файлы будут принадлежать группе, к которой принадлежит папка, поэтому групповое владение файлом распространяется

Это выполнимо? Конечно, обеспечение соблюдения этой точки монтирования — непростая задача. Любые лучшие идеи вокруг этого кого-нибудь?

person Miquel    schedule 26.02.2011
comment
У нас есть групповая собственность. Проблема в том, что в Unix групповое владение дает разрешение на запись, но не дает права на изменение разрешений! - person Norman Ramsey; 26.02.2011
comment
Ты прав, извини. Только владелец может изменить файл. Групповых разрешений недостаточно. - person Miquel; 07.03.2011