Назад | Перейти на главную страницу

Как ограничить доступ к репозиторию через WebSVN?

У меня есть несколько репозиториев Subversion, которые обслуживаются через Apache 2.2 и WebDAV. Все они расположены в центре, и я использовал это debian-administration.org в качестве основы (я отказался от использования аутентификации базы данных для простого файла htpasswd).

С тех пор я также начал использовать WebSVN. Моя проблема в том, что не все пользователи в системе должны иметь доступ к различным репозиториям, а настройка WebSVN по умолчанию - разрешить любому, кто может пройти аутентификацию.

Согласно документации WebSVN, лучший способ обойти это - использовать систему доступа к путям Subversion, поэтому я попытался создать ее с помощью директивы AuthzSVNAccessFile.

Когда я это делаю, я продолжаю получать сообщения «403 запрещено».

Мои файлы выглядят следующим образом:

У меня есть настройки политики по умолчанию в файле:

<Location /svn/>
  DAV svn
  SVNParentPath  /var/lib/svn/repository

  Order deny,allow
  Deny from all
</Location>

Каждый репозиторий получает файл политики, как показано ниже:

<Location /svn/sysadmin/>
    Include  /var/lib/svn/conf/default_auth.conf
    AuthName "Repository for sysadmin"
    require user joebloggs jimsmith mickmurphy
</Location>

Файл default_auth.conf содержит следующее:

SVNParentPath      /var/lib/svn/repository
AuthType           basic
AuthUserFile       /var/lib/svn/conf/.dav_svn.passwd
AuthzSVNAccessFile /var/lib/svn/conf/svnaccess.conf

Я не совсем уверен, зачем мне второй SVNParentPath в default_auth.conf, но я только что добавил это сегодня, так как получал сообщения об ошибках в результате добавления директивы AuthzSVNAccessFile.

С файлом с полностью разрешенным доступом

[/]
joebloggs = rw

система работала нормально (и практически не изменилась), но как только я начинаю пытаться добавлять какие-либо ограничения, такие как

[sysadmin:/]
joebloggs = rw

вместо этого я снова получаю сообщение об ошибке «В разрешении отказано». Записи файла журнала:

[Thu May 28 10:40:17 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET websvn:/
[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'joebloggs' GET svn:/sysadmin

Что мне нужно сделать, чтобы это сработало? Неправильно настроен apache, или я неправильно понимаю файл svnaccess.conf?

Если я иду неверным путем, у меня нет особой привязанности к моему общему подходу, поэтому не стесняйтесь предлагать и альтернативы.

ОБНОВЛЕНИЕ (20090528-1600):

Я попытался реализовать этот ответ, но я все еще не могу заставить его работать должным образом.

Я знаю, что большая часть конфигурации верна, поскольку я добавил

[/]
joebloggs = rw

в начале, а затем у joebloggs есть все необходимые права доступа.

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

[/]
joebloggs = rw

[sysadmin:/]
mickmurphy = rw

затем я получил ошибку отказа в разрешении для mickmurphy (joebloggs все еще работает) с ошибкой, аналогичной той, что у меня уже была ранее

[Thu May 28 10:40:20 2009] [error] [client 89.100.219.180] Access denied: 'mickmurphy' GET svn:/sysadmin

Кроме того, я забыл объяснить ранее, что все мои репозитории находятся под

/var/lib/svn/repository

ОБНОВЛЕНИЕ (20090529-1245):

По-прежнему не удается заставить это работать, но все признаки, похоже, указывают на то, что проблема с контролем доступа в Subversion не работает должным образом. Я предполагаю, что я не настроил apache или svn для правильного распознавания структуры моего репозитория.

Это потому, что запись '[/]' работает идеально.

Мне также приходит в голову, что этот вопрос лучше подходит для StackOverflow?

ОБНОВЛЕНИЕ (20090603-1740):

В ответ на один из комментариев к этому вопросу моей настройке WebDAV для самой Subversion указано местоположение / svn /РЕПО но websvn установлен в / websvn.

Вероятно, проблема связана с разделением конфигурации между двумя директивами местоположения, но я не уверен.

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

httpd.conf

<Location /svn>
  DAV svn
  SVNParentPath /var/lib/svn/repository

  Require valid-user
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /path/to/.htpasswd

  SVNPathAuthz on
  AuthzSVNAccessFile /path/to/svn.authz
</Location>

svn.authz

[groups]
sysadmins = joebloggs jimsmith mickmurphy

# By default, nobody has any permissions
[/]
* = 

# sysadmins get access to the sysadmin repository
[sysadmin:/]
@sysadmins = rw

Очевидно, вам понадобятся соответствующие пользователи в файле htpasswd.

Понятия не имею, решили ли вы эту проблему, но эта процедура мне подходит.

Забудьте возиться с директивами apache, вместо этого отредактируйте файл config.php WebSVN и включите / раскомментируйте следующую директиву:

$ config-> useAuthenticationFile ('/ путь / к / вашему / authz / файлу');

это работает для меня.

пользователь1 может видеть "/" и "/ проект1" пользователь3 может видеть только "/ проект1"

[группы]

groupa = пользователь1, пользователь2

groupb = user3, user4

[/]

@groupa = rw

[/ project1]

@groupb = rw

Я много с этим боролся, и единственная конфигурация, которая мне подходит, это следующая:

Authz file
------
[groups]
group1=user1
group2=user2

#Read and write for everyone defined in some group, others denied
[/]
@group1=rw
@group2=rw
*=

[project1:/]
@group1=rw
*=

[project2:/]
@group2=r
*=
----end authz file

В результате группа group1 имеет доступ для чтения и записи к проекту project1, а группа group2 имеет доступ для чтения к проекту2. У всех остальных нет доступа ни к каким проектам.

Я должен подчеркнуть, что «проект1» и «проект2» - это проекты внутри репозитория, определенного в файле конфигурации Apache. subversion.conf так как.

Subversion.conf
----
LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn
   AuthType Basic
   AuthName "Name of the root repositories"
   Require valid-user
</Location>

<Location /svn/repos>
   AuthName "Subversion subrepository"
   AuthUserFile /var/www/svn/repos/conf/passwdfile
#Authz control
   AuthzSVNAccessFile /var/www/svn/repos/conf/authz
</Location>

-----end

Моя текущая проблема в том, что невозможно перечислить проекты в репозитории. /svn/repos вообще (хотя к ним можно нормально получить доступ). SVNListParentPath по директиве, куда бы вы ее ни положили, это не помогает.

В настоящее время мой /var/www/svn не репозиторий, а просто каталог в файловой системе сервера. /var/www/svn/repos это репозиторий, созданный с помощью svnadmin create

Вы бы прочитали документ websvn и все было бы очевидно :)

Также обратите внимание, что вы не должны использовать команду AuthzSVNAccessFile для определения файла доступа.

Теперь, когда вы определили аутентификацию, вам будет предложено ввести имя пользователя и пароль для доступа к каталогу WebSVN. Осталось только настроить WebSVN на использование вашего файла доступа Subversion для управления доступом. Добавьте эту строку в свой файл config.php:

$ config-> useAuthenticationFile ('/ путь / к / файлу доступа');