Project

General

Profile

Repositories access control with apache mod dav svn and mod perl » History » Version 35

neil johnson, 2011-11-15 11:45

1 16 Jean-Philippe Lang
h1. Repositories access control with apache, mod_dav_svn and mod_perl
2 1 Nicolas Chuche
3 2 Nicolas Chuche
{{>TOC}}
4
5 4 Jean-Philippe Lang
h2. Overview
6 1 Nicolas Chuche
7 23 Eric Davis
In this documentation, we will configure apache to delegate authentication to mod_perl. It's tested on apache2 (@apache2-mpm-prefork@) with mysql and postgresql but should work with allmost every databases for which there is a perl DBD module.  Apache2 with the high speed thread model might not load Perl correctly (@apache2-mpm-worker@).
8 1 Nicolas Chuche
9
You need a working apache on your SVN server and you must install some modules at least mod_dav_svn, mod_perl2, DBI and DBD::mysql (or the DBD driver for you database as it should work on allmost all databases).
10 4 Jean-Philippe Lang
11 15 Jean-Philippe Lang
On Debian/ubuntu you can do :
12 11 Shaun Mangelsdorf
13 33 neil johnson
  sudo aptitude install libapache2-svn libapache-dbi-perl libapache2-mod-perl2 libdbd-mysql-perl libdigest-sha1-perl
14 1 Nicolas Chuche
15 33 neil johnson
If the repositories are not created automatically by reposman.rb, it is important that the repository name is the same as the project identifier in Redmine, otherwise Redmine.pm will fail to authenticate users.
16 1 Nicolas Chuche
17
h2. Enabling apache modules
18
19
On debian/ubuntu :
20
21
<pre>
22 15 Jean-Philippe Lang
sudo a2enmod dav
23 21 Marko Roeder
sudo a2enmod dav_svn # if you want to use svn
24
sudo a2enmod dav_fs  # if you want to use git
25 15 Jean-Philippe Lang
sudo a2enmod perl
26 4 Jean-Philippe Lang
</pre>
27 1 Nicolas Chuche
28 15 Jean-Philippe Lang
h2. Apache configuration for Subversion repositories
29 30 Steven Lu
30 31 Steven Lu
You first need to copy or link @Redmine.pm@ to @/usr/lib/perl5/Apache/Redmine.pm@
31 15 Jean-Philippe Lang
Then add the following Location directives to your apache configuration (for example in @/etc/APACHE_DIR/conf.d/@):
32 1 Nicolas Chuche
33 17 Joachim Fritschi
* the old how-to which suggested two separate locations for with @/svn@  and @/svn-private@ can be avoided
34
* with the @Satisfy any@ keyword from Apache you can define different authentication policies
35
* read access from the redmine-server or any validated user
36
* write access only validated users
37 15 Jean-Philippe Lang
38 17 Joachim Fritschi
39 15 Jean-Philippe Lang
<pre>
40 1 Nicolas Chuche
   # /svn location for users
41
   PerlLoadModule Apache::Redmine
42
   <Location /svn>
43
     DAV svn
44 19 Joachim Fritschi
     SVNParentPath "/var/svn"
45 17 Joachim Fritschi
     Order deny,allow
46
     Deny from all
47
     Satisfy any
48 1 Nicolas Chuche
49
     PerlAccessHandler Apache::Authn::Redmine::access_handler
50
     PerlAuthenHandler Apache::Authn::Redmine::authen_handler
51 17 Joachim Fritschi
     AuthType Basic
52 18 Joachim Fritschi
     AuthName "Redmine SVN Repository"
53 17 Joachim Fritschi
54
     #read-only access	
55
     <Limit GET PROPFIND OPTIONS REPORT>
56 19 Joachim Fritschi
        Require valid-user
57 17 Joachim Fritschi
        Allow from redmine.server.ip
58
        # Allow from another-ip
59
     	Satisfy any
60
     </Limit>
61
     # write access
62
     <LimitExcept GET PROPFIND OPTIONS REPORT>
63
   	Require valid-user
64
     </LimitExcept>
65
66
67 1 Nicolas Chuche
     ## for mysql
68
     RedmineDSN "DBI:mysql:database=databasename;host=my.db.server"
69 4 Jean-Philippe Lang
     ## for postgres
70 1 Nicolas Chuche
     # RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server"
71 4 Jean-Philippe Lang
     ## for SQLite3
72 1 Nicolas Chuche
     # RedmineDSN "DBI:SQLite:dbname=database.db"
73
74
     RedmineDbUser "redmine"
75
     RedmineDbPass "password"
76
  </Location>
77
78
</pre>
79
80 17 Joachim Fritschi
h3. Testing the configuration:
81 1 Nicolas Chuche
82 17 Joachim Fritschi
After reloading apache conf, you can try to browse some repository with:
83
84 1 Nicolas Chuche
<pre>
85
svn ls http://my.svn.server/svn/myproject
86 4 Jean-Philippe Lang
</pre>
87 1 Nicolas Chuche
88 17 Joachim Fritschi
Any non-public repository should ask for a username and password.
89 4 Jean-Philippe Lang
90 17 Joachim Fritschi
To test the authentication that allows you redmine server to read all repositories:
91 1 Nicolas Chuche
92 17 Joachim Fritschi
Reading a private repository:
93 3 Jean-Philippe Lang
<pre>
94 17 Joachim Fritschi
svn ls http://my.svn.server/svn/myproject
95
</pre>
96
Try writing to the repository:
97
<pre>
98
svn mkdir http://my.svn.server/svn/myproject/testdir
99
</pre>
100
This should fail and ask for a password.
101
102
103
h3. optional LDAP Authentication
104
105
If you want to connect your LDAP authentication to Apache, you can install the Authen::Simple::LDAP perl module. I found that connecting to my LDAP server to authenticate with every request can be quite slow. I added the following to my configuration and had a significant performance increase. If you have configured an encrypted connection to the LDAP server you will need the IO::Socket::SSL module.
106
107 20 Stefan Stefansson
> *NOTE: the above wording is a little confusing. I attempt to clear up the issues I had with this in the following paragraph.*
108
> 
109 28 Rahul Panwar
> First of all, make sure that you have the Net::LDAP module installed as well. I installed Authen::Simple::LDAP through CPAN and found that nothing worked. Eventually I figured out that this was because the Authen::Simple::LDAP did not require the Net::LDAP module as a dependency but it is needed for our purpose here. I did this on CentOS and it seems that the Net::LDAP module can be installed via yum (@yum install perl-LDAP@) but the Authen::Simple::LDAP had to be installed via CPAN since there's no RPM for it in the CentOS repositories.
110
> 
111 20 Stefan Stefansson
> My second point is related to the below Apache config. The @PerlLoadModule Authen::Simple::LDAP@ is actually not required for having users authenticated via LDAP. It will happen automatically if both of the above modules are installed. So there really is no difference between the config snippet below and the one above except for the @RedmineCacheCredsMax 50@ line which is probably a good idea although it can result in users that have been deleted or removed in redmine still getting access to the repositories, at least for a little while.
112
113 17 Joachim Fritschi
<pre>
114 8 Nicolas Chuche
   PerlLoadModule Apache::Redmine
115 17 Joachim Fritschi
   PerlLoadModule  Authen::Simple::LDAP
116
   # PerlLoadModule  IO::Socket::SSL
117 12 Todd Nine
   <Location /svn>
118
     DAV svn
119
     SVNParentPath "/var/svn"
120
121
     AuthType Basic
122
     AuthName redmine
123
     Require valid-user
124
125
     PerlAccessHandler Apache::Authn::Redmine::access_handler
126
     PerlAuthenHandler Apache::Authn::Redmine::authen_handler
127
  
128
     ## for mysql
129
     RedmineDSN "DBI:mysql:database=databasename;host=my.db.server"
130
     ## for postgres
131
     # RedmineDSN "DBI:Pg:dbname=databasename;host=my.db.server"
132
133
     RedmineDbUser "redmine"
134
     RedmineDbPass "password"
135 1 Nicolas Chuche
     #Cache the last 50 auth entries
136 12 Todd Nine
     RedmineCacheCredsMax 50
137 1 Nicolas Chuche
  </Location>
138 12 Todd Nine
</pre>
139 1 Nicolas Chuche
140
141 12 Todd Nine
h2. Apache configuration for Git repositories
142
143 15 Jean-Philippe Lang
Now that reposman.rb can create git repositories, you can use Redmine.pm to access them the same way than subversion. 
144 12 Todd Nine
145 35 neil johnson
* [http://www.selectfactoring.co.uk/ factoring]
146
147 15 Jean-Philippe Lang
You first need to copy or link Redmine.pm to /usr/lib/perl5/Apache/Redmine.pm, then you add this configuration to apache : 
148
149 1 Nicolas Chuche
<pre>
150 33 neil johnson
Alias /git /var/git
151 32 Spenser Gilliland
152 33 neil johnson
PerlLoadModule Apache::Redmine
153 32 Spenser Gilliland
<Location /git>
154 33 neil johnson
  DAV on
155
156 8 Nicolas Chuche
  AuthType Basic
157
  Require valid-user
158
  AuthName "Git"
159
160
  PerlAccessHandler Apache::Authn::Redmine::access_handler
161 1 Nicolas Chuche
  PerlAuthenHandler Apache::Authn::Redmine::authen_handler
162 8 Nicolas Chuche
163
  RedmineDSN "DBI:mysql:database=redmine;host=localhost"
164
  RedmineDbUser "redmine"
165 32 Spenser Gilliland
  RedmineDbPass "password"
166 8 Nicolas Chuche
</Location>
167
168
Alias /git-private /var/git
169
170
<Location /git-private>
171
   Order deny,allow
172
   Deny from all
173
   <Limit GET PROPFIND OPTIONS REPORT>
174
      Options Indexes FollowSymLinks MultiViews
175
   Allow from 127.0.0.1
176
   </Limit>
177
</Location>
178
</pre>
179
180
To verify that you can access repository through Redmine.pm, you can use curl :
181
<pre>
182
% curl --netrc --location http://localhost/git/ecookbook/HEAD   
183 13 Thomas Pihl
ref: refs/heads/master
184
</pre>
185
186 22 Diego Oliveira
h2. Apache configuration for Mercurial repositories
187
188
Create a file caled "hgweb.config" in the same folder as "hgwebdir.cgi". This foder will be the root repository folder. Then edit the "hgweb.config" with something like this:
189
190
<pre>
191
[paths]
192
/=/path/to/root/repository/**
193
194
[web]
195
allow_push = *
196
allowbz2 = yes
197
allowgz = yes
198
allowzip = yes
199
200
</pre>
201
202
Follows the instructions to install Redmine.pm as described and configure your apache like this.
203
204
<pre>
205
    RewriteEngine on
206
    PerlLoadModule Apache2::Redmine
207
    PerlLoadModule Authen::Simple::LDAP
208
    ScriptAliasMatch ^/hg(.*)  /path/to/the/hgwebdir.cgi/$1
209
    <Location /hg>
210 1 Nicolas Chuche
        AuthType Basic
211 22 Diego Oliveira
        AuthName "Mercurial"
212
        Require valid-user
213
214
        #Redmine auth
215 32 Spenser Gilliland
        PerlAccessHandler Apache::Authn::Redmine::access_handler
216
        PerlAuthenHandler Apache::Authn::Redmine::authen_handler
217
        RedmineDSN "DBI:mysql:database=redmine;host=localhost"
218
        RedmineDbUser "DB_USER"
219
        RedmineDbPass "DB_PASSWD"
220
    </Location>
221
</pre>
222 22 Diego Oliveira
223
224
h2. Gotchas
225 13 Thomas Pihl
226
If you run this in Phusion Passenger, make sure you don't turn PassengerHighPerformance on. If you do, the rewrites to catch subversion dav will be bypassed with some interesting dump in the log as a result.
227
Example: 
228 1 Nicolas Chuche
> ActionController::RoutingError (No route matches "/svn/rm-code" with {:method=>:get}):
229
(if your repo are named rm-code)
230 27 Bill Dieter
231 34 neil johnson
* [http://www.junoblinds.co.uk/ blinds]