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


32

Дві програми встановлення /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-сертифікатами.
вт

8
рішення Ubuntu (і я думаю, що Debian) для цього - це ssl-certгрупа, яка значною мірою є вашою barbazгрупою. Стандарт - встановити всі приватні ключі, які належать ssl-certгрупі, та поставити UID, пов'язані з програмами, які потребують доступу до них, до цієї групи.
abligh

1
@abligh: Цікаво. Моя система - Debian 8 jessie. Судячи з ssl-certусього , існує пакет , сценарій поштового розміщення при встановленні створює групу, про яку ви говорите. Я не знав про це ssl-cert. Apache2 (встановлений на моєму хості) рекомендує ssl-cert . Різні Exim і Dovecot пакетів немає, але Postfix (не встановлено на моєму хості) залежить від ssl-cert. Через Apache у мого господаря є група ssl-cert , але ця група ще не має членів. Дякую за пораду.
вт

5
Зробіть програми жорсткими, а не налаштованими. Програми Setuid - це погана ідея, тому що, якщо вони будуть поставлені під загрозу, бінарне можна замінити, створивши троянську коня. (Виняток: встановлений корінь, тому що там у вас немає вибору.)
Жил "ТАК - перестань бути злим"

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 користувач: bar: rw- / etc / foo # Дозволяє панелі користувачів читати та писати foo
$ setfacl -m user: baz: rw- / etc / foo # Дозволяє також користувачеві baz читати та писати foo

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


3

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


2

Я надішлю це, оскільки він ще не згадується. Хоча це, мабуть, не те, чого ви хочете, це може бути відповіддю для інших людей із подібним запитанням.

"Новий" "хмарний" спосіб полягає в тому, щоб вся конфігурація оброблялася системою управління конфігурацією (наприклад, шеф-кухарем , маріонетками або особами ). Тоді не має значення, що у вас на сервері є два чіткі, але однакові файли, оскільки обидва є копією одного файлу з системи управління конфігурацією.

Основні переваги роблять це так, що ваша конфігурація версіоніруется (поряд з усіма іншими з ваших конфігурацій), і що розгортання нового ідентичну або майже ідентичний сервера стає настільки легко , що ВЗ може бути автоматизований.

(Для запису, оскільки ви не використовуєте управління конфігурацією, я б пішов із груповою системою, як у відповіді @ drg).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.