Чи можу я зробити файл доступним лише для сценарію, а не для користувача?


11

У мене є користувач з обмеженим доступом у системі (тобто він не судоер); назвемо його Боб .

У мене є скрипт або двійковий файл, якому я, системний адміністратор, довіряю, і не маю жодних проблем запустити його як root; назвемо сценарій get-todays-passphrase.sh. Завдання цього сценарію полягає в тому, щоб читати дані з "приватного" (належить користувачеві / групі, крім Боба, або навіть кореневого) файлу, розташованому в /srv/daily-passphrases, і виводити з файлу лише певний рядок: рядок, який відповідає сьогоднішній даті .

Користувачі , як Боб НЕ дозволено знати завтрашню фразу, навіть якщо він вказаний у файлі. З цієї причини, файл /srv/daily-passphrasesзахищений правами Unix, так некореневим користувачі , як Боб НЕ має права доступу до файлу. Однак їм дозволено запускати get-todays-passphrase.shсценарій у будь-який час, що повертає "відфільтровані" дані.


Підводячи підсумок (версія TL; DR ):

  1. Боб не може прочитати захищений файл
  2. Сценарій може читати захищений файл
  3. У будь-який час Боб може запустити сценарій, який може прочитати файл

Чи можливо це зробити в межах дозволів файлів Unix? Або якщо Боб запустить сценарій, чи завжди сценарій буде приречений працювати з тими ж дозволами, що й Боб?

Відповіді:


13

Це насправді є загальним і досить очевидним. sudoдозволяє обмежити конкретні програми, до яких користувач може викликати. Іншими словами, вам не потрібно давати їм корінь або нічого; ви можете дати їм sudoдозволи для виконання певної команди . Це саме те, що ви хочете, і дуже поширена практика для таких речей, як дозволити користувачам пересувати Git-сховища через SSH тощо.

Для цього все, що вам потрібно зробити, - це додати рядок, /etc/sudoersякий виглядає приблизно так

bob ALL=(root) NOPASSWD: /path/to/command/you/trust

( NOPASSWD:Частина не потрібна, але дуже часто зустрічається в цій ситуації.) У цей момент bobможна звертатися /path/to/command/you/trustза допомогою судо, але нічого іншого.

Це говорить, що давати комусь корінь - що ми тут робимо - може бути не зовсім тим, що ви хочете. Зокрема, якщо у вашому сценарії був якийсь недолік, ви ризикуєте впустити коробку. З цієї причини ви можете скоріше віддати перевагу створенню користувача спеціально для володіння спеціальним файлом, скажімо, - specialuserтоді chownфайл до них, і /etc/sudoersзробити так, bobщоб це був спеціальний користувач. У такому випадку рядок, який ви додаєте, був sudoersби просто

bob ALL=(specialuser) NOPASSWD: /path/to/command/you/trust

7
Я б запропонував не йти «кореневим» шляхом - створити для цього спеціального користувача / групу.
guntbert

Влучне зауваження; Я допомню відповідь.
Бенджамін Поллак

7

Передмова:

Як було зазначено в коментарях та з причин, пояснених у цій відповіді, ядро Linux ігнорує біт setuid / setguid під час обробки сценарію. Я не буду дублювати відповідь Бенджаміна , але замість цього буде замінити скрипт з executabe , щоб моя відповідь правильним.


Коротка відповідь: використовувати setgid

Детальні кроки:

  1. Створіть нову групу (наприклад, перепрограму)
  2. Зробіть цю групу власником файла парольної фрази sudo chown :readpass thatfile
  3. Зробити файл читабельним лише для його групи sudo chmod g=r,o= thatfile
  4. Зробіть свій виконуваний SGID readpass:sudo chmod g+s thatfile

Таким чином ваш виконуваний файл буде працювати з дозволами групи, що володіє, і таким чином зможе прочитати файл.


2
Setgid та setuid не просто піддаються виконанню сценаріїв, правда?
муру

1
Ви не можете зробити скрипт setgid в Linux: біт setgid буде проігноровано. Натомість додайте правило sudo, яке дозволяє bob бігати thatfileз групою readpass.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.