![Предоставление групповых разрешений на файлы других пользователей](https://rvso.com/image/109222/%D0%9F%D1%80%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%BE%D0%B2%D1%8B%D1%85%20%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%BD%D0%B0%20%D1%84%D0%B0%D0%B9%D0%BB%D1%8B%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D1%85%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9.png)
Я использую Debian 7 и создал нового пользователя (веб-сайт) с каталогом htdocs, например:
$ sudo adduser website
$ sudo mkdir -p /home/website/htdocs
$ sudo chown -R website /home/website
Теперь я хочу, чтобы пользователи другой группы (разработчики) имели доступ к каталогу пользователя. Я пробовал:
$ sudo chown -R :developers /home/website
Я вижу, что группа назначена (с помощью ls -la
или stat
) и что пользователи находятся в группе, но у них нет доступа, верно?
drwxr-xr-x 3 website developers 4096 May 3 09:09 website
Я также хочу:
Разрешить другой группе «подрядчиков» доступ к файлам веб-сайта
Ограничить доступ пользователей веб-сайта только к их домашним каталогам
Убедитесь, что новые файлы веб-сайта наследуют эти разрешения
Обязательно ли использовать списки контроля доступа или есть лучший способ сделать это (например, не использовать отдельного пользователя для каждого сайта)?
решение1
Трудно давать точные команды, не зная ОС или дистрибутив; и да! ACL подойдет, но есть и стандартный способ.
Есть adduser
и useradd
, один из них в вашем дистрибутиве может автоматически создать домашний каталог пользователя. Если это так, то содержимое каталога /etc/skel/
будет скопировано в домашний каталог пользователя, установлены разрешения и, возможно, могут быть выполнены некоторые другие соответствующие действия.
Могут существовать группы, предварительно определенные для совместного использования, например, «персонал»; но если мы хотим создать собственную группу для совместного использования, в этом нет ничего плохого. Поэтому создайте новую группу или используйте существующую группу. Убедитесь, что пользователи, которые должны быть членами группы, были определены как таковые с помощью usermod
, moduser
, или vigr
, возможно, в соответствии с операционной системой. Каждый пользователь, который в данный момент вошел в систему, должен выйти из системы и войти снова, чтобы стать членом новой группы.
Создайте каталог, общий для всех пользователей, например, /home/share_directory/
или любой другой каталог, который имеет наибольший смысл для вашей ситуации. Соответствующая передовая практика — не использовать каталогв пределахдомашний каталог любого пользователя. Если никто, кроме владельца и группы, не должен видеть файлы в каталоге, то измените права доступа к каталогу на 0770. Если чтение разрешено "другим", то используйте 0775. Владелец каталога почти наверняка должен быть root.
chown root:group_name /home/share_directory/
Далее измените бит setuid.
chmod +s /home/share_directory/
Если ни один пользователь не должен иметь возможности изменять файл другого пользователя, то также установите бит stick.
chmod +t /home/share_directory/
В этих примерах одновременно устанавливаются биты setuid и sticky с использованиемвосьмеричная запись.
chmod 5775 /home/share_directory/
или
chmod 5770 /home/share_directory/
Для обновленного вопроса, похоже, ACL — правильный инструмент. Большинство дистрибутивов Linux теперь включают эту acl
опцию в defaults
опцию. Если ваш дистрибутив не включает эту acl
опцию по умолчанию, то для начала ее использования нужно немного поработать. Сначала смонтируйте файловые системы с опцией acl
в /etc/fstab.
sudo vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,acl 0 1
При необходимости перемонтируйте файловую систему: sudo mount -o remount,acl /
. Затем создайте группу, к которой может принадлежать пользователь для этой цели. Возможно, вам также понадобится установить инструменты ACL: apt-get install acl
.
sudo groupadd developers
sudo usermod -a -G developers $username
(Или группа может быть "contractors".) Текущий вошедший в систему пользователь должен выйти из системы и войти снова, чтобы стать членом новой группы. Конечно, не делайте этого, если у вас есть содержимое в каталоге /var/www, которое вы хотите сохранить, но просто для иллюстрации его настройки для начала:
sudo rm -rf /var/www
sudo mkdir -p /var/www/public
sudo chown -R root:developers /var/www/public
sudo chmod 0775 /var/www/public
sudo chmod g+s /var/www/public
sudo setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -d -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
Выше, разница между setfacl
командами заключается в следующем: первый экземпляр использует группу по умолчанию (группа-владелец каталога), а второй указывает группу явно. Переключатель -d
устанавливает маску по умолчанию ( -m
) для всех новых объектов файловой системы в каталоге. Тем не менее, нам также нужно снова запустить команду без переключателя, -d
чтобы применить ACL к самому каталогу. Затем замените ссылки на "/var/www" на "/var/www/public" в конфигурационном файле и перезагрузите.
sudo vim /etc/apache2/sites-enabled/000-default
sudo /etc/init.d/apache2 reload
Если мы хотим ограничить удаление и переименование для всех, кроме пользователя, создавшего файл: sudo chmod +t /var/www/public
Таким образом, если мы хотим создать каталоги для фреймворков, которые существуют за пределами корня документов Apache или, возможно, создать каталоги с возможностью записи на сервер, это по-прежнему просто.
Каталог журналов Apache, доступных для записи:
sudo mkdir /var/www/logs
sudo chgrp www-data /var/www/logs
sudo chmod 0770 /var/www/logs
Каталог библиотеки, читаемый Apache:
sudo mkdir /var/www/lib
sudo chgrp www-data /var/www/logs
sudo chmod 0750 /var/www/logs
Небольшая «игра» с каталогом, который не имеет значения, должна помочь сделать это как раз подходящим для вашей ситуации.
Что касается ограничений, я использую два разных подхода: оболочка, rssh
, была создана для предоставления доступа SCP/SFTP, но не доступа SSH; или, чтобы ограничить использование домашним каталогом, вы можете использовать внутреннюю подсистему sftp, настроенную в /etc/ssh/sshd_config
.
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Создайте группу с именем, например, sftponly. Сделайте пользователей членами группы sftponly. Измените их домашние каталоги на /
из-за chroot. Каталог /home/username должен принадлежать пользователю root. Вы также можете установить оболочку пользователя на /bin/false, чтобы запретить доступ по SSH. В основном меня беспокоит интерактивный доступ, поэтому обычно следуйте пути rssh
. (Они не могут писать никуда, кроме тех мест, где я определил возможность записи.)