svn: apache, acl e ldap. howto?

Supponiamo di avere uno o più repository svn e di usare apache come repository browser nonchè come meccanismo di autenticazione per gli accessi al repository. Supponiamo di voler applicare anche delle acl secondo lo stile svn per regolamentare l'accesso ai progetti e alle sottodirecotry che lo compongono. E supponiamo di avere un ldap contenente proprio i contatti che dovrebbero essere contemplati nel processo di autenticazione di apache e nelle acl di svn....

Che faccio? mi metto a riscrivere di nuovo le entry dei contatti? NON ESISTE PROPRIO!

 

 

Ok, il mio approccio a ldap sta diventando ossessivo compulsivo, ma è cosi che mi piacciono le cose. E vediamo cosa può portare di buono.

Ringrazio  Jeremy Whitlock che mi è stato di grande aiuto.

Il punto di partenza è il post guida_rapida_alla_configurazione_di_svn nel quale avevo utilzzato la classica autenticazione di apache. Lo schema era il seguente:

"Il manuale di svn indica più di un modo per gestire gli accessi ai repository (acl). Tra questi ho scelto apache. Riassumendo anticipatamente quello che scriverò tra poco, utilizzerò apache per effettuare l'autenticazione dell'utente (determino CHI ha accesso) mentre utilizzero le acl di svn per limitare l'accesso a repository o a sottodirectory di repository (determino A COSA ha accesso)."

I file che si occupavano delle 2 attività erano

/etc/svn/auth-file   # autenticazione apache

e

/etc/svn/authz       # acl svn

La prima cosa che posso fare è quella di configurare apache per accedere a ldap alla ricerca degli utenti e per verificarne la password.

Abilito i moduli per apache (2.2x) in modo che possa accedere a ldap

a2enmod ldap authnz_ldap

e quelli che gli consentono di dialogare con svn

a2enmod dav dav_svn

Poi configuro apache aggiungendo un virtual host (non è necessario che sia un vhost!), apportando le modifiche necessarie al sistema in questione (in grassetto) (file: /etc/apache2/sites-available/default)

<VirtualHost *:80>
        ServerName svn.mysite.com         # Possible values include: debug, info, notice, warn, error, crit, alert, emerg
        LogLevel warn
        ErrorLog /var/log/apache2/svn.mysite.com_error.log
        CustomLog /var/log/apache2/svn.mysite.com_access.log combined


        <Location />
                # Enable Subversion
                DAV svn

                # Directory containing all repository for this path
                # any "/svn/foo" URL will map to a repository /var/svn/foo
                SVNParentPath /svn/

                # List repositories colleciton
                SVNListParentPath On

                # Enable WebDAV automatic versioning
                SVNAutoversioning on

                # Repository Display Name
                SVNReposName "SVN Mysite.com"

                # Do basic password authentication in the clear
                AuthType Basic

                # The name of the protected area or "realm"
                AuthName "SVN Mysite.com"

                # Make LDAP the authentication mechanism
                AuthBasicProvider ldap

                # Make LDAP authentication is final
                AuthzLDAPAuthoritative on

                # Active Directory requires an authenticating DN to access records
                AuthLDAPBindDN "cn=admin,dc=example,dc=com"

                # This is the password for the AuthLDAPBindDN user in Active Directory
                AuthLDAPBindPassword YOUR_PASSWORD_HERE

                # The LDAP query URL
                AuthLDAPURL "ldap://localhost:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=*)"

                # Require a valid user
                Require valid-user

                # SVN Authorization file
                AuthzSVNAccessFile /etc/apache2/svn_repos.acl

                Order deny,allow
                Deny from all
                Allow from 192.168.0.0/255.255.0.0
        </Location>
</VirtualHost>

L'albero di ldap contenente gli utenti deve avere pressappoco questa struttura:

Ogni entry deve contenere uid e userPassword. Ecco un esempio:

dn: uid=dam,ou=users,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: inetOrgPerson
uid: dam
sn: Venturin
cn: Damiano Venturin
givenName: Damiano
userPassword: {md5}XxxxXXXxxxXXXxXXx
mail: dam@mysite.com

Riavvio apache e verifico di poter accedere via browser a http://svn.myste.com/hello_world. Apache mi deve richiedere username e password.

Se voglio che solo alcuni degli utenti di ldap possano avere accesso a svn, posso ricorrere al filtro sulla objectClass

uid?sub?(objectClass=*)

volendo posso creare uno schema che descriva l'oggetto svnUser e attribuirlo solo ad alcune particolari utenti.

Questo livello di paranoia pero, potrebbe anche essere inutile visto che apache è solo un primo filtro. Subito dopo infatti intervengono le acl di svn

Identicamente a quanto visto nel primo post di configurazione di svn il file (/etc/apache2/svn_repos.acl) delle acl di svn ha questa struttura:

#ACL file for svn repos
[groups]
Administrators = dam, moreno

[/]
@Administrators = rw
* =

[hello_world:/]
@Administrators = rw
* = r

Queste acl dicono: dam e moreno fanno parte del gruppo Administrators. Il gruppo Administrators, laddove non specificato, ha accesso in lettura e scrittura su qualunque repository mentre tutti gli altri utenti autenticati non appartententi al gruppo Administrators non possono aver accesso a nulla. In particolare, per il progetto Hello_World gli altri utenti autenticati non appartententi al gruppo Administrators possono leggere (quindi effettuare il check out).

NB. le modifiche apportate al file delle acl sono immediatamente fruibili senza riavviare apache

Qual è la cosa strana a questo punto? beh, è evidente che le acl non sono definibili in ldap perchè svn non accetta altri metodi se non il file visto sopra.

Jeremy Whitlock, che la sa lunga e che forse è ancora più ossessionato di me da ldap, ha fatto uno script in python (sync_ldap_groups_to_svn_authz) che può essere lanciato con cron o manualmente per generare automaticamente il file delle acl di svn a partire da definizioni di gruppo specificate in ldap. Spiega tutto in questo post.

Lo script funziona, ma non sono ancora riuscito ad adattarlo alla struttura ldap che io utilizzo.

 

----

Nota finale:

questo post, non particolarmente brillante o straordinario sarà visto sotto tutta un'altra luce non appena riuscirò a scrivere il post in cui mostro come si integra trac con ldap ed eclipse (la quadratura del cerchio :-D )

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
12 + 2 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.