Использование setfacl для создания рекурсивных разрешений для Apache с rsync

Использование setfacl для создания рекурсивных разрешений для Apache с rsync

У меня есть локальная установка 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

Связанный контент