Я использую сервер, и мне нужно предоставить доступ на чтение / запись к определенному каталогу одному пользователю. Я пробовал следующее:
sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd
Вышеприведенное, кажется, работает, однако оно предоставляет пользователю доступ только для чтения к остальной части сервера.
Как настроить разрешения, чтобы пользователь мог только читать и писать в определенную папку? Пользователь также должен иметь возможность запускать такие программы, как mysql
.
permissions
files
account-restrictions
Manishearth
источник
источник
mysql
находиться программа? Пользователь должен иметь возможность читать его и все необходимые ему библиотеки и файлы данных.Ответы:
Отрицательные ACL
Вы можете запретить пользователю доступ к определенным частям файловой системы, настроив списки контроля доступа . Например, чтобы гарантировать, что пользователь
abcd
не может получить доступ к любому файлу в/home
:Этот подход прост, но вы должны помнить, чтобы заблокировать доступ ко всему, что вы не хотите
abcd
иметь доступ.корневой
Чтобы получить положительный контроль над тем, что
abcd
видите, установите chroot , то есть ограничьте пользователя поддеревом файловой системы.Вам нужно сделать все файлы, которые нужны пользователю (например,
mysql
и все его зависимости, если вы хотите, чтобы пользователь мог запускатьсяmysql
) под chroot. Скажите, что путь к chroot есть/home/restricted/abcd
;mysql
программа должна быть доступна под/home/restricted/abcd
. Символическая ссылка, указывающая вне chroot, бесполезна, потому что поиск символической ссылки затронут тюрьмой chroot. Под Linux вы можете использовать bind mounts:Вы также можете копировать файлы (но тогда вам нужно позаботиться о том, чтобы они были в курсе).
Чтобы ограничить пользователя chroot, добавьте
ChrootDirectory
директиву/etc/sshd_config
.Вы можете проверить это с:
chroot --userspec=abcd /home/restricted/abcd/ /bin/bash
Рамки безопасности
Вы также можете использовать каркасы безопасности, такие как SELinux или AppArmor. В обоих случаях вам нужно написать довольно деликатную конфигурацию, чтобы убедиться, что вы не оставляете никаких дыр.
источник
/var/www/allowfolder
и его подкаталогах должен быть доступен, а не только/var/www/allowfolder
сам по себе. И наоборот, другие файлы не должны быть доступны. Фактически решение, основанное исключительно на правах доступа к файлам и ACL, не может полностью выполнить требования: оно, по крайней мере, позволило бы пользователю проверить, существует ли данное имя/var/www
, так как ему нужно иметь x разрешение на/var/www
доступ/var/www/allowfolder
.Вы должны использовать
chroot
. Командаchroot
изменяет корневой каталог, который видят все дочерние процессы. Я приведу пример, чтобы продемонстрировать, как это работает.Это было написано на месте; Я сейчас не перед машиной UNIX. В этом примере есть директория
dir
с тремя файлами:a
,b
,c
, иls
. Первые три являются обычными файлами.ls
является жесткой ссылкой на настоящийls
двоичный файл, так что мы можем перечислять файлы, находясь в chroot.Я собираюсь
chroot
вdir
. (Обратите внимание, что я, вероятно, забыл некоторые каталоги в корневом каталоге.)Вот настройка в форме вывода оболочки:
Теперь я буду
chroot
вdir
. В/bin/bash
выбирает аргумент , что процесс должен быть запущен с новой корневой директории. По умолчанию оно/bin/sh
.Теперь мы выходим из
chroot
:Я надеюсь, что это иллюстрирует, как
chroot
работает команда. В основном, что вам нужно сделать, чтобы решить вашу проблему, это запускатьchroot
команду от имени этого пользователя каждый раз, когда он входит в систему. Возможно, поместить ее в сценарий запуска?Жесткая ссылка на файл будет продолжать работать внутри
chroot
, даже если к этому файлу нельзя получить доступ другими способами (это работает, потому что жесткие ссылки указывают на inode, а не на пути). Итак, чтобы позволить пользователю получить доступ, например, кmysql
команде, вы должны выполнить:источник
chmod
. когда вы говорите «не будет ли легче выполнить команду ... не потерять к ней доступ», эта команда будетchroot
. если вы объясните, что вы подразумеваете под «целым окружением chroot», или почему это будет проблемой, возможно, я пойму лучше. (обратите внимание , что вы можете дать доступ ко всем исполняемым с Oneliner:ln /bin/* /path/to/chroot/target
)chroot
собой или дайте мне знать, что не имеет смысла. еще лучше делай и то и другое. (и прочитайте man-страницы.)