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

Subversion: все или ничего, доступ к дереву репо

У меня возникли проблемы с настройкой доступа к моим репозиториям Subversion на сервере Linux. Проблема в том, что мне кажется, будто я работаю по принципу «все или ничего». Либо каждый получает доступ для чтения ко всему, либо никто не получает доступа для чтения или записи чего-либо.

Настройка:

Репозитории SVN расположены в / www / svn / repoA, repoB, repoC ...

Репозитории обслуживаются Apache, а местоположения определены в etc / httpd / conf.d / subversion.conf как:

<Location /svn/repoA>
 DAV svn
 SVNPath /var/www/svn/repoA
 AuthType Basic
 AuthName "svn repo"
 AuthUserFile /var/www/svn/svn-auth.conf
 AuthzSVNAccessFile /var/www/svn/svn-access.conf
 Require valid-user
</Location>

<Location /svn/repoB>
 DAV svn
 SVNPath /var/www/svn/repoB
 AuthType Basic
 AuthName "svn repo"
 AuthUserFile /var/www/svn/svn-auth.conf
 AuthzSVNAccessFile /var/www/svn/svn-access.conf
 Require valid-user
</Location>

...

svn-access.conf настроен как:

[/]
* =

[/repoA]
* =
userA = rw

[/repoB]
* =
userB = rw

Но проверка URL / svn / repoA как userA приводит к запрету доступа.

Изменив его на

[/]
* =
userA = r

[/repoA]
* =
userA = rw

[/repoB]
* =
userB = rw

дает userA доступ на чтение ко ВСЕМ репозиториям (включая repoB), но только на чтение к repoA!

поэтому для того, чтобы userA получил доступ для чтения и записи к repoB, мне нужно добавить

[/]
userA = rw

что ментально.

Я тоже пробовал менять

 Require valid-user

к

 Require user userA

для repoA в subversion.conf, но это дало мне доступ только для чтения.

Мне нужен способ по умолчанию запрещать всем доступ к каждому репозиторию, предоставляя доступ для чтения / записи только при явном указании.

Может ли кто-нибудь сказать мне, что я здесь делаю не так? Я потратил пару часов на тестирование и поиск в Google, но ничего не нашел, так что теперь я пишу пост позора.

РЕДАКТИРОВАТЬ

Я выбрал первое решение Шейна и получил следующую рабочую конфигурацию:

/etc/httpd/conf.d/subversion.conf:

<Location /svn>
    DAV svn
    SVNParentPath /var/www/svn

    AuthType Basic
    AuthName "Subversion repo"
    AuthUserFile /var/svn-auth.conf
    Require valid-user
</Location>

/var/svn-access.conf:

[/]
* =

[repoA:/]
* =
userA = rw

[repoB:/]
* =
userB = rw

Общей темой в ваших проблемах является то, что вы [/repoA] и [/repoB] разделы вообще ничего не делают, верно? Для этого есть причина.

Пути, которые вы разрешаете, не относительно расположения файла доступа authz; они относятся к репозиторию SVN, для которого он управляет доступом.

Так что ваши [/] раздел? Он предоставляет доступ к обоим /svn/repoA/ и /svn/repoB/; оно делает не предоставить доступ к /svn/. Точно так же ваш [/repoA] раздел предоставляет доступ к /svn/repoA/repoA и /svn/repoB/repoA; правило для [/trunk] предоставит доступ к обоим /svn/repoA/trunk и /svn/repoB/trunk.

Вы установили SVNPath директивы для каждого из ваших репозиториев, но вы указываете на одни и те же файлы авторизации для каждого, поэтому каждый репозиторий имеет одинаковые правила доступа. Есть синтаксис для установки разной авторизации для разных репозиториев, но это когда вы используете SVNParentPath.

Итак, два варианта:

  1. Перейти к использованию SVNParentPath /var/www/svn вместо того, чтобы жестко определять каждое репо в вашей конфигурации Apache, и измените свой файл authz, чтобы иметь разрешения, ориентированные на репо:

    [/]
    * =
    userA = r
    
    [repoA:/]
    * =
    userA = rw
    
    [repoB:/]
    * =
    userB = rw
    
  2. Используйте разные файлы authz для каждого репозитория, помня, что пути, для которых предоставляется доступ, относятся к корню репозитория.

Ого. Во-первых, я бы удалил этот svn-auth.conf (и svn-access.conf) из каталога, из которого apache явно обслуживает http-запросы. Приходит какой-то злоумышленник и запрашивает этот файл, и он уже наполовину выяснил вашу безопасность, не пытаясь.

https://stackoverflow.com/questions/81361/how-to-setup-access-control-in-svn Думаю, этот ответ охватывает то, что вы ищете.