У меня возникли проблемы с настройкой доступа к моим репозиториям 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
.
Итак, два варианта:
Перейти к использованию SVNParentPath /var/www/svn
вместо того, чтобы жестко определять каждое репо в вашей конфигурации Apache, и измените свой файл authz, чтобы иметь разрешения, ориентированные на репо:
[/]
* =
userA = r
[repoA:/]
* =
userA = rw
[repoB:/]
* =
userB = rw
Используйте разные файлы authz для каждого репозитория, помня, что пути, для которых предоставляется доступ, относятся к корню репозитория.
Ты путаешься один проект на репозиторий структура с Авторизация на основе пути форма.
Ого. Во-первых, я бы удалил этот svn-auth.conf (и svn-access.conf) из каталога, из которого apache явно обслуживает http-запросы. Приходит какой-то злоумышленник и запрашивает этот файл, и он уже наполовину выяснил вашу безопасность, не пытаясь.
https://stackoverflow.com/questions/81361/how-to-setup-access-control-in-svn Думаю, этот ответ охватывает то, что вы ищете.