Разграничение прав пользователей Subversion

Введение

В своём предыдущем HOWTO, посвящённом установке и настройке SVN-сервера под Windows, я сознательно ничего не писал о разграничении прав пользователей репозитория, т.к. эта тема «тянет» на отдельную статью.

В этом HOWTO я подробно напишу как создать несколько пользователей и ограничить их полномочия в репозитории (выделим каждому по каталогу, а также общий каталог).

Данное HOWTO будет разделено на два больших раздела: «Настройка svnserve» (если в качестве сервера Вы используете svnserve) и «Настройка Apache» (если в качестве сервера Вы используете Apache + mod_svn).

Настройка svnserve

Шаг 1. Предварительная настройка.

В любом текстовом редакторе (рекомендуется Notepad++) откройте файл ПУТЬ_К_РЕПОЗИТАРИЮ\conf\svnserve.conf и сделайте следующие правки. В базовых правах пропишите:

anon-access = none
auth-access = write

Это запретит доступ анонимам и даст полный доступ авторизованным пользователям. Если всё-таки нужно дать доступ анонимам, то anon-access установите в read.

Раскомментируйте строку (уберите решётку перед строкой):

authz-db = authz

Эта строка включает функции, отвечающие за разграничение прав пользователей. Все настройки прав пользователей записываются в указанный здесь файл (в нашем примере — authz (без расширения)).

Остальные настройки файла svnserve.conf можно не изменять. Более подробную информацию об этом файле читайте в первом HOWTO.

Шаг 2. Создание пользователей.

Откройте в любом текстовом редакторе файл, который задан в файле svnserve.conf как файл со списком пользователей и их паролей в директиве password-db. По умолчанию этот файл называется passwd (без расширения).

Впишите в этот файл нужных Вам пользователей и их пароли (синтаксис логин = пароль). Более подробную информацию можно получить в первом HOWTO на шаге 3. Там же Вы можете посмотреть примеры такого файла.

Шаг 3. Создание групп пользователей.

Для удобства администрирования можно создать группы, но делать это не обязательно. Итак, если Вы хотите создать группы, откройте в любом текстовом редакторе файл authz (если Вы не сменили его название на шаге 1), найдите [groups] и после примеров впишите:

название_группы = пользователь1,пользователь2,...,пользовательN

Название группы должно содержать только латинские символы, цифры и символ подчёркивания. После знака равенства пишутся логины пользователей, которые будут входить в эту группу. Эти логины должны существовать в файле passwd (если Вы не изменили его название на шаге 1), в противном случае (если Вы указали логины, которых нет в файле соответствия пользователей, сервер может не запуститься).

Рассмотрим достаточно простой пример:

[groups]
admins = vova,vitaly
proj1 = kate,john,bill,sam
proj2 = dima,john

В этом примере мы создали три группы: admins (администраторы сервера), proj1 (группа, которая будет работать над проектом 1) и proj2 (группа, которая будет работать над проектом 2). Пользователь john в нашем примере входит в обе группы, т.е. имеет доступ как к проекту 1, так и к проекту 2.

На следующем шаге мы пропишем этим группам права доступа.

Шаг 4. Настройка прав доступа.

В том же текстовом файле authz, что и на предыдущем шаге, ищем «### ACCESS CONTROL SECTION«. После этой секции идёт указание прав доступа для каталогов svn-сервера. Разграничение прав лучше всего показать на примерах, поэтому представим что у нас на svn-сервере создана следующая структура каталогов:

/
/proj1/
/proj2/
/common/

Здесь нам нужно задать права:

  • для админов — разрешить полный доступ ко всем каталогам;
  • для пользователей проекта1 — дать доступ к проекту1, но заблокировать доступ к корню и к проекту2;
  • для пользователей проекта2 — дать доступ к проекту2, но заблокировать доступ к корню и к проекту1.

Если у Вас на шаге 3 были созданы группы, то всё делается очень просто:

# Указываем корневой каталог
[/]
# Даём полный доступ группе админов
@admins = rw
# Блокируем доступ всем остальным
* =

# Указываем каталог проекта1
[/proj1]
# Даём полный доступ админам
@admins = rw
# Даём полный доступ группе проекта1
@proj1 = rw
# Блокируем доступ всем остальным
* =

# Указываем каталог проекта2
[/proj1]
# Даём полный доступ админам
@admins = rw
# Даём полный доступ группе проекта2
@proj2 = rw
# Блокируем доступ всем остальным
* =

# Указываем доступный для всех каталог common
[/common]
# Даём полный доступ админам
@admins = rw
# Даём доступ только чтение для всех
* = r

Если группы созданы не были, то придётся вместо групп прописывать через запятую всех пользователей:

# Указываем корневой каталог
[/]
# Даём полный доступ админам
vova,vitaly = rw
# Блокируем доступ всем остальным
* =

# Указываем каталог проекта1
[/proj1]
# Даём полный доступ админам
vova,vitaly = rw
# Даём полный доступ группе проекта1
kate,john,bill,sam = rw
# Блокируем доступ всем остальным
* =

# Указываем каталог проекта2
[/proj1]
# Даём полный доступ админам
vova,vitaly = rw
# Даём полный доступ группе проекта2
dima,john = rw
# Блокируем доступ всем остальным
* =

# Указываем доступный для всех каталог common
[/common]
# Даём полный доступ админам
vova,vitaly = rw
# Даём доступ только чтение для всех
* = r

Таким образом, rw означает полный доступ (чтение, создание, редактирование, удаление), r (только чтение) и пустая строка — нет доступа.

Внимание! Права для подкаталога применяются рекурсивно, но если для какого-то подкаталога заданы индивидуальные права доступа, то они переопределят глобальные. Например, если какой-то группе стоят полные права доступа на корневой каталог, а в /proj1/ стоит запрет для всех, то у этой группы доступа к каталогу не будет.

Настройка Apache

Шаг 1. Предварительная настройка.

В любом текстовом редакторе откройте файл httpd.conf (основной файл конфигурации веб-сервера Apache). В самом конце файла найдите описание указание на Ваш каталог svn-проектов. Подробности настройки Apache + mod_svn читайте в первом HOWTO.

В конце файла httpd.conf найдите следующие строки:

DAV svn
SVNParentPath C:\svn_repository

и замените на такие:

DAV svn
SVNPath С:\svn_repository
AuthzSVNAccessFile С:\svn_repository\conf\authz

AuthType Basic
AuthName "Subversion repository"
AuthUserFile С:\svn_repository\conf\appswd
Require valid-user

Здесь C:\svn_repository — это путь к каталогу репозитория (измените в соответствии с Вашими настройками), authz — файл настроек доступа, а appswd — файл с логинами и паролями пользователей (стандартный htpasswd-файл Apache).

Шаг 2. Создание пользователей.

Откройте командную строку Windows («Win+R» – «cmd.exe«) и выполните следующие команды:

cd "%PROGRAMFILES%\CollabNet\Subversion Server\httpd\bin"
htpasswd -cmb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_1 ПАРОЛЬ
htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_2 ПАРОЛЬ
...
htpasswd -mb C:\svn_repository\conf\appswd ЛОГИН_ПОЛЬЗОВАТЕЛЯ_N ПАРОЛЬ

Здесь «%PROGRAMFILES%\CollabNet\Subversion Server\httpd\bin» — каталог установки сервера Apache + mod_svn (замените в соответствии с Вашими настройками), а «C:\svn_repository» — путь к локальному репозиторию (также измените в соответствии с настройками).

Внимание! Параметр -cm нужно указывать только при первом создании пользователя, т.к. он перезаписывает имеющийся файл. В пути к файлу паролей буква диска обязательно должна быть в верхнем регистре. Логин должен содержать только латинские буквы, символ подчёркивания и цифры. Пароль хранится в виде хэша MD5.

Шаг 3 и 4. Настройка прав доступа.

См. шаг 3 и 4 в разделе «Настройка svnserve» выше. Эти шаги одинаковы что для svnserve, что для Apache.

Заключение

После окончания настройки не забудьте перезапустить свой сервер. Команды перезапуска для svnserve:

net stop CSVNsvnserve
net start CSVNsvnserve

Команды перезапуска для Apache:

net stop CollabNetSubversionApache
net start CollabNetSubversionApache

Читать далее →