Как ограничить запуск команд в определенном каталоге через SUDOERS?

13

Я могу настроить Sudo (через файл sudoers) , чтобы позволить пользователю для запуска chownи chmodкоманды на любой файл или каталог в системе. Однако я хочу предоставить пользователю только разрешение на запуск этих команд для файлов, находящихся в /var/www/htmlкаталоге.

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

Например: следующая команда предоставляет 777 разрешений для index.htmlфайла.

sudo chmod 777 /var/www/html/index.html

Теперь я хочу выполнить два действия

  1. Ограничить sudoтаким образом, что пользователь может работать только chmodи chownизнутри/var/www/html

  2. Запретить пользователю выполнять эти команды в другом месте системы (например, команды не могут быть запущены в /var/wwwили /var/ftp)

PrashantB
источник
1
Пожалуйста, не кросспостите - superuser.com/questions/456662/…
Ульрих Дангел
7
Это действительно правильный путь? Как насчет www-dataгруппы, исключающей необходимость chmod/ chownчто-нибудь?
sr_
Здорово. Таким образом, вы получите root довольно легко. Это очень плохая идея отдать chown. Кроме того, я не вижу причин, почему chmodнужно запускать с правами root.
Нильс

Ответы:

13

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

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

Обычно пользователи, которым необходимы дополнительные разрешения для создания и изменения файлов /var/www, добавляются в группу (часто www-data, или у вас могут быть разные группы для разных частей сайта). Вы можете использовать владение группой и каталоги setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlпозволяет каждому члену www-dataгруппы записывать в /var/www/htmlкаталог, а файлы, созданные в этом каталоге, будут принадлежать www-dataгруппе, а не основной группе пользователя, создавшего файл. Однако это не очень гибко.

Что вы, вероятно, должны сделать, это настроить списки контроля доступа для файлов в /var/www. Во-первых, убедитесь, что ACL включены: включенная файловая система /var/wwwдолжна быть смонтирована с aclопцией. См. Сделать все новые файлы в каталоге доступным для группы для помощи по этому вопросу. Также установите утилиты ACL ( getfaclи setfacl). Затем предоставьте дополнительные права доступа к дереву /var/www/htmlпользователям, которые должны их иметь. Вы можете установить списки ACL для каждого пользователя, но часто проще поместить пользователей, которые должны иметь одинаковые права на часть файловой системы, в группу и установить ACL для этой группы. Например, если у пользователей в группе html-writersдолжен быть доступ на чтение и запись к дереву под /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Жиль "ТАК - перестань быть злым"
источник
Что касается "это не очень гибко" (в конце пункта 3) - почему это не так? Это потому, что люди должны быть в определенной группе? (Я почти ничего не знаю о разрешениях, ACL и связанных с ними вещах.)
KajMagnus
3
@KajMagnus Это негибко, потому что root должен управлять группами, а файлы могут принадлежать только одной группе. ACL позволяет любому пользователю выбирать, кто может иметь доступ к своим файлам, и в ACL можно указать несколько пользователей и групп.
Жиль "ТАК - перестань быть злым"
2

Вы можете ограничить использование команды «myuser» всеми аргументами в /etc/sudoersфайле командой visudoadd:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

включить ведение журнала для каждой операции, добавив:

Defaults logfile=/var/log/sudo.log

образец вывода:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Когда вы используете sudo, следует исходить из того, что «myuser» является доверенным лицом. Будьте осторожны с правами доступа к файлам, не существует простого способа помешать злоумышленнику sudo связать файл с внешним ресурсом и изменить его.

tombolinux
источник
Я пробовал это раньше, но выдает ошибку: Извините, пользователю prashant не разрешено выполнять '/ bin / chmod 777 / var / www / html / a' как root на prashant.xyz.com.
PrashantB
Вы переключили пользователя с su - prashantили su prashant?
tombolinux
Да, я выполняю команду пользователем prashant. Я читаю форумы, говорят, команды запускаются по всей системе. Никто не писал о такой проблеме.
PrashantB
Я запускаю это все! :). Но это будет статическая команда. Можем ли мы сделать его общим, чтобы я мог применить любое разрешение к любому файлу в / var / www / html?
PrashantB
3
Это совершенно небезопасно: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdи если вы как-нибудь это исправите,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Жиль, ТАК, перестаньте быть злыми
1

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

В вашем примере это будет выглядеть так:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Затем вы должны изменить файл sudoers, чтобы разрешить www-data выполнять / usr / local / bin / mychmod.

Имейте в виду, однако, что разрешить ввод данных пользователем (например, разрешить пользователю изменять, какой файл или каталог chmodded) в это пространство чрезвычайно опасно, и вам нужно знать, как отфильтровать атаки с использованием инъекций, если вы хотите сделать что-то вроде тот. Злоумышленник может легко выполнить любую команду с правами root таким образом, что может поставить под угрозу безопасность вашей системы.

Эрни
источник
это исключительно опасно и действительно не решает проблему ...
SomeGuy