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.comRiavvio 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 )
- blog di dam
- 1604 letture

Invia nuovo commento