Как загружать на VPS файлы с помощью Rsync с помощью пользователя с пониженными привилегиями?
Приведённая ниже команда работает нормально при запуске c Windows (разве что IP-адрес и имя папки скрыл):
rsync -azvr -e /bin/ssh --progress ./04-ProductionBuild/ [email protected]:/var/www/example.com
На всякий случай скажу, что Rsync для Windows доступен, только его надо специально устанавливать (например с помощью пакетного менеджера chocolatey).
Однако как Вы знаете, отправлять данные с помощью учётной записи root небезопасно. Но что будет, если отправить данные с помощью другой учётной записи?
rsync -azvr -e /bin/ssh --progress ./04-ProductionBuild/ [email protected]:/var/www/example.com
Такая вот ошибка:
rsync: change_dir#1 "/var/www/example.com" failed: Permission denied (13)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(638) [Receiver=3.1.3]
Хотя система доступа в UNIX-подобных операционных системах (одна из которых установлена на VPS) - настоящий кошмар для пользователей Windows, пока в принципе всё объяснимо с токи зрения логики: видимо по умолчанию пользователь с пониженными привелениями не может ничего создавать, удалять, а иногда и вносить измененения.
Опять же, с точки зрения логики эти права надо дать, но отсюда возникает много вопросов:
- Какие минимальные права надо дать пользователю, который загружает данные через Rsync?
- Если дать права на запись, изменение и удаление файлов из дректории "var/www/example.com", эти права будут распространяться на всё файлы, что в этой директории? Что-то мне подсказывает, что нет.
Нагугленное решение добавить нижеследующую строку
non_root_admin ALL= NOPASSWD:/usr/bin/rsync
ничего не дало.
Ответы (2 шт):
Добавьте опцию acl к монтированию диска (/etc/fstab).
Через команду setfacl установите разрешения на запись.
На моём сайте получилось как-то так:
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/example.com/
# owner: www-data
# group: www-data
user::rwx
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:www-data:rwx
default:user:siter:rwx
default:group::rwx
default:group:www-data:rwx
default:group:siter:rwx
default:mask::rwx
default:other::r-x
Можно обойтись без acl. Установить в папке группу www-data на все и дать rw к файлам и rwx к папкам на эту группу. добавить пользователя в группу www-data. После загрузки файлов менять группу на www-data ещё раз, чтоб вэбсервер не потерял доступ к файлам.
Подробные лекции? их есть у меня! xD
Есть несколько способов разрешить пользователям с непривилегированными учетными записями изменять файлы в определенных директориях на Unix-подобных системах. Вот несколько из них:
Измените владельца директории: Вы можете использовать команду
chownдля изменения владельца директории наnon_root_admin. Это позволитnon_root_adminделать всё, что он захочет, с файлами в этой директории. Команда будет выглядеть примерно так:chown -R non_root_admin /var/www/example.com.Измените группу директории: Если
non_root_adminявляется членом определенной группы, вы можете сделать эту группу владельцем директории. Затем вы можете установить разрешения так, чтобы члены этой группы могли изменять файлы. Команды будут выглядеть примерно так:chgrp -R groupname /var/www/example.comиchmod -R g+w /var/www/example.com.Используйте ACLs (Access Control Lists): ACLs предоставляют более гибкий способ управления правами доступа к файлам, чем стандартная система разрешений Unix. Вы можете установить ACL так, чтобы
non_root_adminмог изменять файлы в определенной директории, используя командуsetfacl. Сначала вам может потребоваться установить пакетaclна вашем сервере.
Обратите внимание, что все эти команды должны быть выполнены с привилегиями root.
Относительно строки non_root_admin ALL= NOPASSWD:/usr/bin/rsync в sudoers файле - это позволяет non_root_admin запускать rsync с правами root без ввода пароля. Однако, это не меняет разрешений на директории или файлы, которые rsync пытается изменить. rsync по-прежнему не сможет записать файлы в директорию, если у non_root_admin нет соответствующих разрешений на эту директорию.