Один файл хочет принадлежать двум пользователям. Как? Жесткие ссылки не удается


32

Две программы setuid /usr/bin/barи /usr/bin/bazодин общий файл конфигурации foo. Режим файла конфигурации - 0640для него хранится конфиденциальная информация. Одна программа запускается как bar:bar(то есть как пользовательская панель, групповая панель ); другой как baz:baz. Изменение пользователей не вариант, и даже изменение групп не будет предпочтительным.

Я хочу жестко связать один файл конфигурации как /etc/bar/fooи /etc/baz/foo. Однако, это терпит неудачу, потому что файл, насколько я знаю, должен принадлежать root:barили к root:baz.

Потенциальное решение: создайте новую группу barbaz, членами которой являются barи baz. Пусть fooпринадлежат root:barbaz.

Это выглядит довольно сложным решением для меня. Нет ли более простого и удобного способа поделиться файлом конфигурации fooмежду двумя программами?

На данный момент я поддерживаю две идентичные копии файла. Это работает, но, очевидно, неправильно. Что было бы правильно?

Для информации: у меня мало опыта работы с группами Unix и нет опыта работы с setgid (2).


Вопрос, как правило, поэтапный. В моем конкретном случае две программы - это Exim4 и Dovecot, программы обработки почты, которые могут использовать пароли и сертификаты TLS.
THB

8
решение Ubuntu (и, я думаю, Debian) для этого - это ssl-certгруппа, которая в значительной степени является вашей barbazгруппой. Стандарт состоит в том, чтобы установить все закрытые ключи, которые будут принадлежать ssl-certгруппе, и поместить идентификаторы UID, связанные с программами, которым требуется доступ к ним, в эту группу.
abligh

1
@abligh: интересно. Моя система - Debian 8, Джесси. Очевидно, существует пакет, ssl-certчей скрипт postinst при установке создает группу, о которой вы говорите. Я не знал о ssl-cert. Apache2 (установлен на моем хосте) рекомендует ssl-cert . Различные пакеты Exim и Dovecot этого не делают, но Postfix (не установлен на моем хосте) зависит от ssl-cert. Благодаря Apache у моего хоста есть группа ssl-cert , но в этой группе еще нет участников. Спасибо за совет.
THB

5
Сделайте программы setgid, а не setuid. Программы setuid - плохая идея, потому что если они скомпрометированы, двоичный файл можно заменить, создав троянского коня. (Исключение: setuid root, потому что там у вас нет выбора.)
Жиль "ТАК - перестань быть злым"

1
Имеет ли wiki.dovecot.org/HowTo/EximAndDovecotSASL решить вашу конкретную ситуацию?
MvG

Ответы:


50

Вы можете использовать списки ACL, чтобы файл мог читать человек из обеих групп.

chgrp bar file
chmod 640 file
setfacl -m g:baz:r-- file

Теперь оба bar и bazгруппа, и группа могут читать файл.

Например, вот файл, принадлежащий bin: bin с режимом 640.

$ ls -l foo
-rw-r-----+ 1 bin bin 5 Aug 17 12:19 foo

+ средство есть Заданная ACL, так что давайте посмотрим на него.

$ getfacl foo
# file: foo
# owner: bin
# group: bin
user::rw-
group::r--
group:sweh:r--
mask::r--
other::---

Мы можем видеть линию group:sweh:r-- : это означает, что люди в группе swehмогут читать это.

Эй, это я!

$ id
uid=500(sweh) gid=500(sweh) groups=500(sweh)

И да, я могу прочитать файл.

$ cat foo
data

23

Вы можете пересмотреть эти заявления:

Потенциальное решение: Создайте новую группу barbaz, членами которой являются barи baz. Пусть fooпринадлежат root:barbaz.

Это выглядит довольно сложным решением для меня. Нет ли более простого и удобного способа поделиться файлом конфигурации fooмежду двумя программами?

Почему сложно создать новую группу? Это дает следующие преимущества по сравнению с ACL:

  • Хотя вы это сформулировано как гипотетический с командами /usr/bin/barи /usr/bin/baz, это важно , что эти две программы могут совместно использовать файл конфигурации. Это говорит о том, что программы естественно связаны между собой. Создание новой группы для них, по-видимому, описывает отношения, которые на самом деле существуют, и должны запускать поведение (например, разрешения на чтение общего файла конфигурации).
  • Решение этой проблемы с помощью групп является переносимым для каждого Unix, это означает, что вы можете положиться на один и тот же механизм, работающий точно так же, на любой Unix или Unix-подобной системе. ACL намного сложнее, и переносимость может быть проблемой.

Лично я вижу ACL как сложное решение здесь, а группы - более простой, традиционный способ Unix.


16

Я думаю, что это будет типичное использование для списков контроля доступа (ACL). Добавьте обоих пользователей (или группы) в ACL файла конфигурации:

/etc/foo  root:root rw-------  # Traditional Unix ownership and permission for foo
$ setfacl -m user: bar: rw- / etc / foo # Позволяет панели пользователя читать и писать foo
$ setfacl -m user: baz: rw- / etc / foo # Позволяет также пользователю baz читать и писать foo

Возможно, вам придется сначала установить acl-пакет.


3

Сделайте режим файла 0660(или даже 0440если запись не требуется) и владение bar:baz. Тогда один процесс может получить доступ к файлу благодаря разрешениям пользователя, другой - благодаря разрешениям группы. Это работает даже в файловых системах, где ACL не.


2

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

«Новый» «облачный» способ заключается в том, что вся конфигурация обрабатывается системой управления конфигурацией (например, chef , puppet или ansible ). Тогда не имеет значения, что у вас есть два разных, но идентичных файла на сервере, так как оба являются копией одного файла из системы управления конфигурацией.

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

(Кстати, поскольку вы не используете управление конфигурацией, я бы использовал систему групп, как в ответе @ drg).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.