目
1 概述
本文详细描述了Ubuntu环境下,SVN+Apache+SSL架构的SVN服务器的搭建过程。通过https来访问SVN服务器,采用基于Apache的用户认证管理。用户的权限使用authz配置。
2 安装Ubuntu 8.10服务器
可以是Ubuntu 8.10Server或者是Desktop。安装过程中创建一个用户名为administrator的系统帐户,作为本服务器日常管理帐户。另外,为了方便后续的说明,假设服务器的ip地址为192.168.19.3。
安装完成后,需要先运行更新管理器,以获得最新的源列表。
3 安装Apache服务器
在新立得软件包管理器里面,搜索apache2并选择安装Apache2,libapache2-svn。安装完成后,确认能通过http访问http://192.168.19.3。正常情况下,会得到如下界面:
说明apache已经正常工作了。
4 创建SVN服务器
4.1 安装SVN
在新立得软件包管理器里面,搜索subversion,并选择安装subversion,subversion-tools。安装好之后,进入下一步。
4.2 增加组
方法如下:
l
l
l
l
l
l
或者直接使用命令,增加组和成员:
sudo addgroup subversion
sudo usermod -G subversion -a www-dataadministrator
当然,修改组也可以直接修改组文件: sudo vi /etc/group。
然后需要注销(我都是直接重新启动)再登录以便能够真正成为
4.3 创建SVN仓库
现在执行下面的命令
# cd /home
# sudo mkdir svn
#/usr/local/svn# sudo chown -Rwww-data:subversion svn
#/usr/local/svn# sudo chmod -R g+rws svn
最后的一条命令赋予组成员对所有新加入文件仓库的文件拥有相应的权限。
下面的命令用于创建
#sudo svnadmin create /home/svn
4.4 配置Apache服务器
先备份一下Apache2的配置文件,执行如下命令:
#/usr/local/svn# sudo cp -R /etc/apache2/etc/apache2_bak
通过
<Location /svn >
DAV svn
SVNPath /home/svn
AuthType Basic
AuthName "welcome to subversion repository"
AuthUserFile /etc/subversion/passwd
#<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
#</LimitExcept>
</Location>
如果需要用户每次登录时都进行用户密码验证,请将<LimitExceptGET PROPFIND OPTIONSREPORT>与</LimitExcept>两行注释掉。
当您添加了上面的内容,您必须重新启动
sudo /etc/init.d/apache2 restart
接下来,您需要创建
sudo htpasswd -c /etc/subversion/passwdsuperman
它会提示您输入密码,当您输入了密码,该用户就建立了。您可以通过下面的命令来访问文件仓库:
你还可以继续创建其他用户,但是不能再用-c选项了,因为-c选项表示创建一个新的用户授权文件,一旦选用,原有的授权文件就被覆盖了。
sudo htpasswd /etc/subversion/passwduser_name
此时,应该就可以通过web方式访问svn服务器了。在浏览器的地址栏输入http://192.168.19.3/svn/会弹出用户验证的窗口:
输入正确的用户名和口令后,就能看到如下界面:
5 配置SSL
这里可以参考:http://www.cnblogs.com/passos/archive/2006/02/18/332992.html
l
l
l
l
Apache2已经在前面第2步安装好了,下面安装SSL模块:
安装SSL模块
sudo a2enmod ssl
我们可以使用openssl来创建,这里我就是此方法创建SSL证书的。
#sudo openssl req -x509 -newkey rsa:1024 -keyoutapache.pem -out apache.pem -nodes -days 999
注:在要求输入Common Name (eg, YOURname)
示例过程如下:
#sudo openssl req -x509 -newkey rsa:1024 -keyoutapache.pem -out apache.pem -nodes -days 999
Generating a 1024 bit RSA private key
.....................++++++
..++++++
writing new private key to 'apache.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:China
string is too long, it needs to be less than2 bytes long
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Haidian
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ABC
Organizational Unit Name (eg, section) []:Dep9
Common Name (eg, YOUR name) []:SvnServer
Email Address []:111@gmail.com
此时/home/administrator目录下就有了一个apache.pem的文件
创建目录,存放证书文件
sudo mkdir /etc/apache2/ssl
复制一份站点配置做为SSL配置的原型
#sudo cp /etc/apache2/sites-available/default/etc/apache2/sites-available/ssl
#sudo ln -s /etc/apache2/sites-available/ssl/etc/apache2/sites-enabled/ssl
然后编辑SSL的配置
#sudo vi /etc/apache2/sites-enabled/ssl
把端口改为443(默认是80),加入SSL认证配置,其它的根据需要自己定制
<VirtualHost *:443>
ServerSignature On
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem
ServerAdmin webmaster@localhost
DocumentRoot /var/www/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
"/etc/apache2/sites-enabled/ssl" 45L, 1055C
编辑Apache端口配置,去掉80端口的监听:
#sudo vi /etc/apache2/ports.conf
NameVirtualHost *:80
#Listen 80
<IfModule mod_ssl.c>
# SSL name based virtual hosts are not yet supported, therefore no
# NameVirtualHost statement here
Listen 443
</IfModule>
这里可以不用加“Listen
别忘了把前面生成的SSL密钥文件拷贝过来
sudo cp /home/administrator/apache.pem/etc/apache2/ssl/
sudo /etc/init.d/apache2 restart
然后
netstat –an|grep :443
如果443已经打开,则说明https服务已经启动了。在浏览器上再验证一下:
选择“是”则弹出如下验证窗口:
输入superman和口令之后:
说明加密的http访问svn也成功了。
6 远程修改svn用户口令
由于SVN+Apache架构下的用户并不是操作系统的用户,而只是Apache的用户,因此没有办法通过SSH登陆到操作系统来修改用户口令,只能另外想办法。借助Apache提供的Web服务,通过CGI或者mod_python等方式来修改authz配置文件,从而达到修改用户口令的目的。以下介绍通过perl的cgi来实现修改口令的功能,至于mod_python方法,我的实验只做了一半。
6.1 修改Apache2的配置文件
将/etc/apache2/apache2.conf文件打开,找到如下内容(如果没有就直接添加,默认情况下好像就是没有,所以我是直接添加在文件的末尾):
#AddHandlercgi-script .cgi
修改成:
AddHandler cgi-script .cgi .pl
6.2 安装mod_perl默认包
sudo apt-get installlibapache2-mod-perl2
6.3 相关配置
默认安装好后,cgi-bin的目录默认指向/usb/lib/cgi-bin/目录。而安装apache2的时候这个目录一般是不会自动创建的。之所以选择这个目录,原因在下面这个文件:
/etc/apache2/sites-enabled/000-default
该文件是个链接,指向
/etc/apache2/sites-available/default
打开看看,里面有这样的一段,把cgi-bin目录指向了实际的/usr/lib/cgi-bin/目录。
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options ExecCGI -\MultiViews +\SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
默认情况下,上述文件不用任何修改。
6.4 获得修改口令的Perl脚本
访问ftp://192.168.19.63(或者直接与本作者联系)获得ChangePasswd.zip,将压缩包中的三个文件同时copy到/usr/lib/cgi-bin/目录。
sudo cp ChangePasswd.cgi/usr/lib/cgi-bin/
sudo cp ChangePasswd.ini/usr/lib/cgi-bin/
sudo cp ChangePasswd.log/usr/lib/cgi-bin/
6.5 修改脚本执行权限
cd /usr/lib/cgi-bin/
sudo chmod 777 ChangePasswd.cgi
sudo chmod 666 ChangePasswd.log
sudo chmod 666 /etc/subversion/passwd
之后,不用重新启动Apache服务就能通过访问URL来修改口令,直接访问URL:https://192.168.19.3/cgi-bin/ChangePasswd.cgi
验证通过后,即可显示如下修改密码界面:
如果修改成果,则显示如下界面:
ChangePasswd.cgi的详细说明,请参考附录A。
7 设置SVN的权限
7.1 修改Apache的配置
为了实现细粒度的权限控制,可以通过修改svn的仓库目录下的conf/authz文件来实现。在此之前,需要告诉Apache,使用该文件
sudovi
修改后如下,其中蓝色字体为新添加的内容:
<Location /svn >
DAV svn
SVNPath /home/svn
AuthType Basic
AuthzSVNAccessFile /home/svn/conf/authz
AuthName "welcome to subversion repository"
AuthUserFile /etc/subversion/passwd
#<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
#</LimitExcept>
</Location>
7.2 认证文件的配置
sudo vi /home/svn/conf/authz
文件内容类似如下:
[groups]
admin = admin
dev1 = jack, kate
dev2 = zbh2342, yingjianhh45, tantt, arei22
docs = bob, jane, mike
training = zak
# Default access rule for ALL repositories
# Everyone can read, admins can write, Dan German is excluded.
[/]
* = r
@admin = rw
dangerman =
# Allow developers complete access to their project repos
[project:/]
* = r/其他用户只有读权限
@admin = rw /admin,dev1这个两个组有读写权限
@dev1 = rw
对子项目的控制
[project:/DDWap] /对project/DDWap子目录有读写权限,下面类似。
@dev2 = rw
[project:/DDAdmin]
@dev2 = rw
[project:/DDSync]
@dev2 = rw
[project:/DDWeb]
@dev2 = rw
[project:/DDWeb]
@dev2 = rw
[project:/docs]
@dev2 = rw
[project:/thirdparty]
@dev2 = rw
通过实践,感觉Apache的权限配置很简单,但不是太方便,如果要针对子目录设置不同的权限,则需要将每个目录的权限都显式的指定。
8 参考文献
http://www.cnblogs.com/huntercat/archive/2008/11/16/1334540.html
http://www.svn8.com/svnpz/20080202/56.html
http://www.fire3.cn/2007/06/15/howto-apache2-with-perl-cgi-in-ubuntu.html
http://linux.chinaunix.net/bbs/thread-994284-1-1.html
附录A:远程修改SVN用户口令工具使用方法
参见http://www.svn8.com/svnpz/20080202/56.html
1、将文件ChangePasswd.cgi和ChangePasswd.ini 放到apche安装目录下的cgi-bin下
2、确认ChangePasswd.cgi 程序第1行 ,prel工具的位置
3、修改ChangePasswd.cgi第84行改成htpasswd所在的路径(我的:/project/apache/bin/htpasswd)
4、修改ChangePasswd.cgi 128行ini文件改成完整路径(我的:/project/apache/cgi-bin/ChangePasswd.ini)
5、配置文件 ChangePasswd.ini 第2行authuserfile=密码存放路径(我的:/svndata/svn-auth-file/passwd)
6、配置文件 ChangePasswd.ini 第3行logfile=操作日志存放路径(我的:/project/apache/cgi-bin/ChangPasswd.log)
注意细节:
1、用htpasswd时 切勿用-m参数 如果以前用的话,可重新输入一次进行更新
2、ChangPasswd.log 必须有“w”写入权限
附录B:Ubuntu 8.10修改IP地址
参见:http://www.diybl.com/course/6_system/linux/Linuxjs/20081217/154161.html
执行命令:
sudo vi /etc/network/interface
第一步:屏蔽掉自动获取IP的设置
iface eth0 inet dhcp将这一行屏蔽掉
修改之后的内容如下:
# The primary network interface
auto eth0
#iface eth0 inet dhcp
第二步:添加静态IP的信息
# The primary network interface
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
也可以通过如下命令重启网卡,让新配置生效,好处是不影响其他网络接口。
$ sudo ifdown eth0
$ sudo ifup eth0
如果只是要临时改变IP地址,则不用修改interface.只用ifconfig使用即可,不过当系统重启动后,系统后会恢复interfaces中的配置上。
$ sudo ifconfig eth0 192.168.1.111 netmask 255.255.255.0
第三步:设置DNS
编辑 /etc/resolv.conf,设置dns
nameserver 202.96.134.133
nameserver 202.106.0.20
重启网络:/etc/init.d/networking restart
以上步骤完成之后只要重新启用一下网络就OK了.
附录C:Ubuntu下配置SSH服务
Ubuntu缺省没有安装SSH Server,可以使用以下命令安装OpenSSH:
sudo apt-get install openssh-serveropenssh-client
Ubuntu缺省安装了ssh client。
可以通过编辑 /etc/ssh/sshd_config 文件来配置 OpenSSH
sudo cp /etc/ssh/sshd_config/etc/ssh/sshd_config.original
sudo chmod a-w/etc/ssh/sshd_config.original
配置完成后重新启动:
sudo /etc/init.d/ssh restart