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

Apache DAV SVN LDAP и AuthzSVNAccessFile

Я работаю над проектом, в котором у меня есть ApacheDS, содержащий всех пользователей и их членство в группах. Членство в группах хранится как атрибут member для каждой группы, и я внес изменения в схему, поэтому у меня также есть атрибут memberOf для каждого пользователя, что упрощает проверку членства в группе при авторизации. Мне нужно предоставить пользователям доступ к репозиториям Subversion на основе их членства в группах, и теперь они должны работать.

Однако мой заказчик только что сказал мне, что забыл упомянуть одну «небольшую» деталь при определении требований. У них, по-видимому, также есть несколько репозиториев, в которых они должны иметь более строгие требования к определенным подпапкам. Поэтому, чтобы придумать простое решение, я подумал, что могу просто объединить свои директивы LDAP require с директивой AuthzSVNAccessFile.

Вот мой конфиг:

        <Location /TestClosedProject>
            SVNPath /repos/TestClosedProject
            SVNListParentPath on

            # Include shared LDAP settings, binddn, passwords, ldapurl etc.
            Include /svn/conf/ldapCommonSettings

            # LDAP Authentication & Authorization is final; do not check other databases
            AuthzLDAPAuthoritative on

            AuthName "TestClosedProject"

            # Admin group has full access
            Require ldap-attribute memberOf=cn=TestProject-admins,ou=groups,dc=somedomain,dc=somecountry

            # Members group has read-only access
            <Limit GET PROPFIND OPTIONS REPORT>
                    Require ldap-attribute memberOf=cn=TestProject-members,ou=groups,dc=somedomain,dc=somecountry
            </Limit>
    </Location>

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

Однако, когда я вставляю AuthzSVNAccessFile /svn/conf/TestClosedProject.svnAuth в приведенной выше конфигурации мои директивы require ldap-attribute могут быть переопределены в файле svnAuth, указав пользователя, который существует в LDAP, но не является членом ни -admins, ни -members группы. Содержимое /svn/conf/TestClosedProject.svnAuth:

[groups]
supporters = jrf,agata
admins = fj,jrf
members = fj,jrf

[/]
* =
@members = r
@admins = rw

[TestClosedProject:/support]
@supporters = rw
@members = r

Проблемный сценарий заключается в том, что

Есть ли способ настроить это так, чтобы только пользователи в группах LDAP-членов или администраторов могли получать доступ с помощью файла svnAuth? По сути, я просто хочу запретить доступ всем, кто не входит ни в одну из этих групп, прежде чем делегировать в файл svnAuth - возможно ли это - если да, как мне это указать?

Не уверен, что это возможно с открытым исходным кодом, но я знаю коммерческий продукт WANdisco, Subversion Access Control может с этим справиться. Вместо файла authz у продукта есть собственный список групп и правил, применимых к пользователям. Членство в группе происходит в результате опроса сервера Active Directory, поэтому он должен удовлетворять требованиям.

http://www.wandisco.com/subversion/accesscontrol

Вот как я управляю доступом к репозиторию:

  1. В каждом репозитории есть каталог «admin», в котором находится файл authz.
  2. Я настроил файл authz, чтобы ограничить доступ к каталогу «admin» для «владельцев» репозитория.
  3. У меня есть задание cron для проверки изменений в каталоге «admin» и копирование файла authz в репозиторий.

Я не делаю ничего в конфигурации Apache, кроме «требующего действительного пользователя» (таким образом, Apache нужно перезапускать только при добавлении новых репозиториев).

Таким образом, я перекладываю все обслуживание разрешений на репозиторий на владельцев репозитория. Возможно, это не решит вашу проблему напрямую, так как не включает никаких групп LDAP, но это решение работало у меня в течение нескольких лет с сотнями репозиториев.