Разграничение прав пользователей 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

26 commentaries to post

  1. Добрый день! Сделал всё по инструкциям — установил SlikSVN, TortoiseSVN (был уже раньше), ну и попытался создать тестовый репозиторий с разграничением прав. И вот проблема — выдаёт мне TortoiseSVN сообщение Authorization failed. В чем может быть проблема?

    Если закомментировать строку authz-db = authz, то всё работает нормально, но у всех пользователей равные права. Пробовал распределять по группам и просто отдельным пользователям давать права. Результат один.

    Используется SlikSVN 1.7.9 x64, TortoiseSVN 1.7.11 x64.

  2. @Deltinos
    Скорее всего неправильная настройка файла авторизации, либо главного конфига. Выложите свой файл authz на pastebin, а ссылку сюда.

  3. Здравствуйте!
    Прежде всего спасибо за ответ! Глядя на дату написания HOWTO, надежды почти не было, однако уже за это я благодарен Вам! )
    Что ж, к файлам. Файл authz: VBHRobBd
    Файл svnserve.conf: c8Z8H8by
    Файл passwd: hzrFgmnL
    Залил на русский pastebin, ссылки в виде ссылок у Вас здесь не разрешается публиковать, я так понимаю.

    Структура же репозитария представляет из себя те самые каталоги, в корне, которые указаны в файле authz.

  4. @Deltinos
    Как я и думал, у вас в конфиге authz указано [/ ] вместо [/] (лишний пробел перед закрывающей квадратной скобкой). Во всех остальных локейшенах аналогично. В статье так указано ибо иначе ломается подсветка синтаксиса.

  5. @Vitaly

    И снова здравствуйте.
    Действительно, Вы абсолютно правы! Убрал пробелы, и всё заработало. Как, оказывается, было близко решение. Надеюсь, наш здеший диалог кому-то ещё поможет решить такую же проблему.
    Спасибо Вам большое, данная статья и Ваша помощь значительно облегчили дальнейшее ведение репозитария!

  6. @Deltinos
    Обновил движок подсветки синтаксиса и теперь всё работает корректно. Исправил фрагменты кода прямо в статье.

  7. @Vitaly

    Отлично! Минус один вопрос у пользователей, и плюс добрых слов в сторону автора статьи и сайта от пользователей, успешно разграничивших права. )

  8. Снова здравствуйте!
    В ходе работы с разграниченными правами нашлась ошибка — уже два пользователя, у которых есть логины и пароли, но которые ещё не прописаны в файле authz, смогли загрузить файлы в репозитарий. Они загружали их и ранее, но после разграничения прав, по идее, должны были потерять доступ до указания их в том самом файле authz. Причем загружать файлы эти люди могут абсолютно в любой каталог, что не есть хорошо.

    В чем может быть причина этого?

  9. @Deltinos
    Нужно прописывать права для корня (распространяются рекурсивно) в самом начале файла authz:

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

    Это указано в статье. Если далее переопределяются права на определённый проект или бранч, то не забудьте дописать в конце и запрет доступа всем остальным, кто не указан в списке.

  10. @Vitaly
    Ну у меня так и сделано, за исключением того, что всем остальным доступ не закрыт, а ограничен правами на чтение.
    [/]
    @admins = rw
    * = r

  11. Deltinos :

    @Vitaly
    Ну у меня так и сделано, за исключением того, что всем остальным доступ не закрыт, а ограничен правами на чтение.

    Пропишите аналогично для всех остальных проектов внутри authz, т.к. переопределённые права не наследуются.

  12. @Vitaly
    Так и сделано — некие юзеры 1, 2 и 3 имеют права на чтение и запись в определенных каталогах определенного проекта, также указано, что админы имеют те же права. Для остальных указано, что они имеют права только на чтение.

    [/]
    @admins = rw
    * = r
    
    [/Proj1/folder1]
    @admins = rw
    User1,User2 = rw
    * = r
    [/Proj1/folder2]
    @admins = rw
    User1,User2,User3 = rw
    * = r
    [/Proj1/folder3]
    @admins = rw
    User1,User2,User3 = rw
    * = r
    

    Такое впечатление, что есть какая-то дыра и User4, который нигде не фигурирует кроме файла passwd, спокойно грузит файлы не подозревая о том, что у него это не должно получаться.

  13. Deltinos :

    Такое впечатление, что есть какая-то дыра и User4, который нигде не фигурирует кроме файла passwd, спокойно грузит файлы не подозревая о том, что у него это не должно получаться.

    Действительно очень странно. Когда у нас стоял SVN-сервер, всё работало отлично. Сейчас проверить на свежей версии не могу ибо мы перешли полностью на Git.

    Как временную меру могу порекомендовать создать группу @all с полным списком юзеров и прописать ей права только для чтения.

  14. @Vitaly
    Спасибо, но похоже, необходимость в данной мере пропала. Пока я был в отпуске, у товарища User4, вдруг, пропала возможность грузить файлы в репозитарий. Кроме меня репозитарий администрирует ещё один человек, который ничего в мое отсутствие не менял.

    До этого, как я уже говорил, был ещё один такой пользователь, но у него в клиенте стояла галочка «сохранить данные авторизации», по снятию которой возможность грузить файлы пропала, и не появилась при поставлении галочки вновь. Так что похоже, что это таки «дыра» какая-то.

  15. Добрый день!
    Вот, спустя столько времени, снова вернулся я к вопросу репозитария.

    Ситуация такова — нужно группам пользователей работать и смотреть ТОЛЬКО свои папки.

    Я разрешаю просмотр корня только админам, всем остальным запрещаю. Если авторизуюсь как админ, то всё хорошо. Если как один из пользователей тех групп — Authorization failed.

    Если же я разрешаю только читать корень репозитария, а на каждой папке разрешаю всё только некоторым, а остальным запрещаю, то любой пользователь всё равно может прочитать всё в папке, но не может изменить.

    Как правильно подойти к этой проблеме?

  16. @Deltinos
    Похоже у вас не совсем правильная структура репозитория. Права доступа наследуются, поэтому если вы блокируете доступ к корню, то вполне логично, никто не может получить доступ к репозиториям.

    Правильным вариантом в вашем случае будет доступ к корню для чтения для всех, а для каждого проекта следует прописать группы тех, кто может его просматривать/изменять, а всем остальным группам доступ закрыть.

  17. Сделал «Шаг 1. Предварительная настройка» применитльно для локального репозитория. Доступ осуществляю через tortoise — file:///D:/.. Ожидал блокирования репозитория — но этого не произошло. Как и прежде могу выполнять любые действия без ввода логина и пароля. Получается в такой конфигурации доступ осуществляется минуя svnserve.conf? Занялся доступом потому, что не получается изменять комментарии в локальном хранилище. Может кто нибудь сталкивался с подобными проблемами?

  18. Александр :

    Доступ осуществляю через tortoise — file:///D:/.. Ожидал блокирования репозитория — но этого не произошло. Как и прежде могу выполнять любые действия без ввода логина и пароля. Получается в такой конфигурации доступ осуществляется минуя svnserve.conf?

    Локальный файловый доступ => неограниченные права. Поднимите сервер например svnserve.

  19. А то, что не получается изменить комментарий для ревизии в локальном хранилище почему — как выдумаете? Можно ли это как то исправить без разграничения доступа.

  20. Александр :

    А то, что не получается изменить комментарий для ревизии в локальном хранилище почему — как выдумаете?

    Возможно ли это при использовании локального файлового доступа к репозиторию я не в курсе, а по сети это делается так:

    svn propset --revprop -r NNN svn:log "Новый комментарий."

    Здесь NNN — номер ревизии, комментарий к которой следует изменить.

  21. Добрый день.
    Подскажите как настроить httpd, если апач уже был установлен на компе?

    1. Чтобы Apache начал поддерживать работу с SVN, вы должны установить модули mod_dav и mod_svn. Бинарные сборки для Windows можно найти в Apache Haus. Далее смотрите шаг 4 данной статьи о настройке Apache.

  22. Уточните пожалуйста, можно ли разграничивать права доступа к папкам на русском языке.
    Все в UTF8. Стоит сервер Centos+Apache+mod_svn. Соответственно в репозитарии есть папки на русском языке. Можно ли так? При создании acl с русскими именами проблем не возникает, но и не работает разграничение доступа. Что посоветуете?

    1. В открытом виде и не будет работать. Закодируйте пути посредством urlencode.

  23. Какая долгоиграющая статья)) Написана в 2010, последние комменты в 2018)) Решил освежить ленту. Автору огромное спасибо.

    1. В Subversion с 2010 года так ничего особо и не поменялось. Максимум перешли с устаревшего и незашифрованного транспорта svn на https.

Обсуждение закрыто.