Я установил сценарий для выполнения обновлений Subversion на двух серверах - локальном и удаленном, - которые вызываются ловушкой после фиксации, запускаемой пользователем www-data.
/ srv / svn / mysite / hooks / post-commit содержит:
sudo -u cli /usr/local/bin/svn_deploy
/ usr / local / bin / svn_deploy принадлежит пользователю cli и содержит:
#!/bin/sh
svn update /srv/www/mysite
ssh cli@remotehost 'svn update /srv/www/mysite'
Чтобы это сработало, мне пришлось добавить в файл sudoers следующее:
www-data ALL = (cli) NOPASSWD: /usr/local/bin/svn_deploy
cli ALL = NOEXEC:NOPASSWD: /usr/local/bin/svn_deploy
Записи для www-data и cli были необходимы, чтобы избежать ошибки:
post commit hook failed: no tty present and no askpass program specified
Я опасаюсь давать какие-либо повышенные права на www-data. Есть ли что-нибудь еще, что мне нужно сделать, чтобы уменьшить или устранить любую угрозу безопасности?
Что вы можете сделать, так это использовать что-то вроде svnsync.
Из их сайт :
svnsync - это инструмент зеркалирования удаленного репозитория Subversion. Проще говоря, это позволяет вам воспроизводить версии одного репозитория в другом.
Итак, что вы можете сделать, так это поместить такую запись в раздел обработчиков после фиксации:
/ usr / bin / svnsync синхронизировать svn: //X.X.X.X/ --username XXXX --password 'XXXXXX' --non-interactive
Это синхронизирует обновления с удаленным сервером, и вам также не нужно будет предоставлять какие-либо особые привилегии любому пользователю.
Надеюсь, это помогло.
Я бы не стал использовать непривилегированного пользователя (www-data) для выполнения административных задач. svn update кажется больше работой root. Поэтому я бы не стал добавлять эту дополнительную привилегию для www-данных. Когда вы используете SSH-соединение, вы можете подключиться с помощью аутентификации по ключу и создать команду force, чтобы ограничить действие, выполняемое пользователем root, до «svn update». Открытый ключ, который будет сохранен в /root/.ssh/authorized_keys, будет выглядеть так:
command='svn update /srv/www/mysite',ssh-rsa dedllrfflr[...]
Таким образом, ваше соединение будет ограничено этой конкретной командой, и www-data не получит дополнительных прав.
На стороне клиента команда для запуска обновления:
ssh -i /path/to/private/key root@server whatEverCommandYouMayImagine
Только команда, содержащаяся в force-command, будет запущена, если аутентификация прошла успешно.
Затем вы можете иметь дело с группами / правами Unix загруженных файлов. Для apache обычно включается:
find /srv/www/mysite -type f -print0 | xargs -0 chmod 640
find /srv/www/mysite -type d -print0 | xargs -0 chmod 750
find /srv/www/mysite -print0 | xargs -0 chown root:www-data