У меня есть локальная установка Dokuwiki, которую я регулярно синхронизирую со своим сервером с помощью rsync. Я также собираюсь дать своему другу учетную запись ssh и разместить его публичную установку Dokuwiki. Однако у меня возникла проблема с правами доступа — даже несмотря на то, что зеркало доступно только для чтения, Dokuwiki по-прежнему нужны права на запись в каталог данных для кэша и т. д. Сервер Apache работает как пользователь www-data, и каждый раз, когда я выполняю rsync, он сбрасывает разрешения.
Основываясь на некоторых других ответах на этом сайте, я пытался использовать setfacl для установки разрешений по умолчанию, но это, похоже, не работает - getfacl указывает, что разрешения существуют, но Dokuwiki не запускается, и когда я пытаюсь записать файл как пользователь www-data, это также не работает. Что я упускаю?
wiki/data$ sudo su www-data
$ pwd
/var/www/wiki/data
$ whoami
www-data
$ touch hi
touch: cannot touch `hi': Permission denied
$ getfacl /var/www/wiki/data
getfacl: Removing leading '/' from absolute path names
# file: var/www/wiki/data
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
Вот команда, которую я использовал для установки разрешений:
setfacl -R -d -m u:www-data:7 /var/www/*
решение1
Проблема №1: Rsync сбрасывает ACL
После применения разрешений ACL вам нужно позаботиться о том, чтобы при выполнении rsync
вы использовали переключатель -A
или --acls
. Это предписывает rsync
сохранить их при выполнении синхронизации.
выдержка из страницы руководства rsync
-A, --acls preserve ACLs (implies -p)
Проблема №2: Отсутствие разрешений ACL
Если взглянуть на ваш пример, то он содержит следующие разрешения.
традиционные завивки
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
ACL-списки
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
Но эти ACL предназначены для создания новых объектов и не работают так, как вы думаете. Вам все равно нужно создать запись для пользователя www-data
в дополнение к правам ACL по умолчанию.
Пример
$ pwd
/tmp/somedir
$ mkdir data
$ setfacl -R -d -m u:gopher:7 data
$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
Эксперимент
Теперь попробуем записать файл в data
каталог от имени пользователя gopher
.
$ sudo -u gopher touch /tmp/somedir/data/afile
touch: cannot touch `/tmp/somedir/data/afile': Permission denied
Выглядит знакомо?
Добавление дополнительных разрешений ACL
Это потому, что вам нужно добавить ACL для пользователя www-data
, правила по умолчанию не предназначены для доступа, они предназначены для создания новых файлов/каталогов.
$ setfacl -R -m u:gopher:7 data
Теперь проверьте data
каталог еще раз:
$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
user:gopher:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
Единственное отличие в том, что теперь у нас есть ACL, в котором указано, что у пользователя gopher
есть rwx
доступ:
user:gopher:rwx
Повторите эксперимент.
Попробуйте снова записать данные в каталог:
$ sudo -u gopher touch /tmp/somedir/data/afile
$
Сработало!!! Дважды проверьте полученный файл:
$ ls -l /tmp/somedir/data/afile
-rw-rw-r--+ 1 gopher gopher 0 Oct 7 21:36 /tmp/somedir/data/afile