svn 权限设置

liuxueping 2011-09-14

一、版本库及服务创建之一

通过subversion的svnserve启动apache服务:

1.Subversion的版本库(repository):

位于服务器端,统一管理和储存数据的地方。介绍在服务器端配置和管理Subversion版本库的基本方法,Linux与Windows中的配置差别不大。

2.版本库数据存储方式:

在Subversion中,版本库的数据存储有两种方式,一种是在BerkeleyDB数据库中存放数据;另一种是使用普通文件,采用自定义的格式来储存,称为FSFS。(两种存放方式各有优缺点,参考http://svnbook.org/上面的文档来了解两者详细的比较和区别)

3.版本库服务启动:

Subversion设计了一个抽象的网络层,版本库建立完毕之后,可以通过各种服务器向外公布。svnserve是Subversion自带的一个小型的服务器,它使用独立的协议与客户端。我们可以通过:

svnserve –i #作为 inetd 启动 
svnserve –d #作为守护进程启动一个服务。
svnserve –i #作为 inetd 启动  
 svnserve –d #作为守护进程启动一个服务。

同时可以指定一些选项,常用的如-r,用来指定版本库的根路径,例如假设版本库位于E:/svn:

svnserve –d -r E:/svn
svnserve –d -r E:/svn

#即创建了以E:/svn为根目录的SVN版本库服务。

4.设置为系统服务并自动启动:

svnserve --daemon --root E:\svn\repository
svnserve --daemon --root E:\svn\repository

服务启动–daemon可简写为-d、–root可简写为-r可以建立个批处理文件并放在windows启动组中便于开机

就运行SVN服务或者在这个地址http://clanlib.org/~mbn/svnservice/下载那个svnservice.exe文件拷贝到

命令行下执行:

svnservice -install --daemon --root "D:\svn\Repository" 
sc config svnservice start= auto 
net start svnservice
svnservice -install --daemon --root "D:\svn\Repository"  
sc config svnservice start= auto  
net start svnservice

5.创建子版本库(或版本库):

假设以以上”E:/svn”为根目录,并启动svn服务器,那么创建子版本库有两种方式:

通过TortoiseSVN等svn客户端工具创建版本库:在E:/svn中新建子目录project1,并进入E:/svn/project1中通过TortoiseSVN菜单创建版本库,则这个版本库可以通过svn://服务器IP/project1″访问,以此类推可建立project2等等,并且这样各个子项目库相关权限配置保持独立。

通过subSVN服务器命令创建版本库:

viewsourceprint?1$svnadmincreate--fs-typefsfs/etc/svn/repos:

2#创建版本库的命令,指定数据存储为FSFS,如果要指定为BerkeleyDB,则将fsfs改为bdb

6.版本库下目录文件说明:

conf目录:存放了版本库的配置文件,包括用户访问控制和权限控制等内容,文件本身的注释说明十分详细,读者可以根据注释自行配置;

dav目录:是提供给Apache相关模块的目录,目前为空;

db目录:存放着Subversion所要管理的所有受版本控制的数据,不同的存储方式(BerkeleyDB或者FSFS)下有着不同的目录结构,不过我们一般不用直接修改和查看这个目录下的内容,Subversion的命令可以安全的操作这个目录;

hooks目录:存放着钩子脚本及其模版(一种版本库事件触发程序)

locks目录:存放着Subversion版本库锁定数据,format文件记录了版本库的布局版本号。

7.推荐项目程序目录结构如下:

|――project_A 
| ――――branches 
| ――――tags 
| ――――trunk
|――project_A    
 | ――――branches  
 | ――――tags  
 | ――――trunk

可以通过客户端建立好相关目录,然后提交到版本库或子版本库中。

二、版本库及服务创建之二

通过ApacheHttpServer服务启动svnserve服务:

1.特点说明:

区别于第一种:svnserve只能对全局提供简单的访问控制,如果想要更加灵活的方式,可以使用ApacheHttpServer作为向外公布版本库的方式,同时可以通过HTTP访问。

2.配置步骤:

*安装mod_dav_svn插件:用途使Subversion与dav模块通信,需要安装mod_dav_svn插件,可以在Subversion的安装目录中找到。将其拷贝到Apache安装目录的modules文件夹下。(由于Subversion需要版本化的控制,因此标准的Http协议不能满足需求。要让Apache与Subversion协同工作,需要使用WebDAV(Web分布式创作和版本控制)。WebDAV是HTTP1.1的扩展,关于WebDAV的规范和工作原理,可以参考IETFRFC2518。)

*并配置Apache的httpd.conf文件,让Apache在启动的时候加载上述模块。需要添加的内容如下:

LoadModule dav_module modules/mod_dav.so 
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule dav_module modules/mod_dav.so  
LoadModule dav_svn_module modules/mod_dav_svn.so

#首先需要启用dav_module,然后加载dav_svn_module

3.版本库建立:

在Apache的httpd.conf文件中末尾加入如下配置信息:viewsourceprint?

<LOCATION repos> 
DAV svn 
SVNPath /etc/svn/repos 
</LOCATION>
<LOCATION repos>  
DAV svn  
SVNPath /etc/svn/repos  
</LOCATION>

Location标签指出访问的URL以及在服务器上的实际位置。配置完毕后重新启动Apache,打开浏览器,输入http://服务器IP/repos

4.子版本库建立:

如果想要指定多个版本库,可以用多个Location标签,也可以使用SVNParentPath代替SVNPath,例如在/etc/svn下有多个版本库repos1,repos2等等,用如下方式指定:

<LOCATION repos> 
DAV svn 
SVNParentPath /etc/svn 
</LOCATION>
<LOCATION repos>  
DAV svn  
SVNParentPath /etc/svn  
</LOCATION>

“SVNParentPath/etc/svn”表示/etc/svn下的每个子目录都是一个版本库。可以通过http://服务器IP/repos/repos1,http://服务器IP/repos/repos2来访问。

三、版本库目录权限配置

1.相关配置文件说明:

svn版本库下的子目录conf下初始会有三个文件:

*svnserve.conf

*passwd

*authz

2.svnserve.conf文件配置:

被用来配置来进行一些简单的访问权限控制。文件的初始内容大致如下:

[general] 
# anon-access = read 
# auth-access = write 
password-db = passwd 
# authz-db = authz 
# realm = My First Repository
[general]  
# anon-access = read  
# auth-access = write  
password-db = passwd  
# authz-db = authz  
# realm = My First Repository

其中:

anon-access表示匿名用户的权限

auth-access表示认证用户的权限设置

password-db指向保存用户帐号密码的文件的位置,可以使用相对路径。

去掉#即可开启对应配置功能

3.passwd文件配置:

需让svnsere.conf中开启password-db=passwd,可让以配置如下

[user] 
user1 = password1 
user2 = password2
[user]  
user1 = password1  
user2 = password2

#格式为:“用户名=密码”注意前后不要有空格,中间要有空格

4.authz文件配置:

需让svnsere.conf中开启authz-db=authz,可以配置如下

#两个分组:committers,developers

[groups] 
committers = paulex,richard 
developers = jimmy,michel,spark,sean 


[/] 
#在根目录下指定所有的用户有读权限 
* = r 
#追加 committers 组用户有读写权限 

@committers = rw 



#在 branches/dev 目录下指定 developers 组的用户有读写权限 
[/branches/dev] 

@developers = rw 



#在 /tags 组下给予用户 tony 读写权限 
[/tags] 
tony = rw 



#禁止所有用户访问 /private 目录 


[/private] 

* =
[groups]  
committers = paulex,richard  
developers = jimmy,michel,spark,sean 
   
[/]  
#在根目录下指定所有的用户有读权限
* = r  
#追加 committers 组用户有读写权限
@committers = rw  
   
#在 branches/dev 目录下指定 developers 组的用户有读写权限  
[/branches/dev]  
@developers = rw  
   
#在 /tags 组下给予用户 tony 读写权限
[/tags] 
tony = rw  
 
#禁止所有用户访问 /private 目录
[/private]  
* =

以上对于1章节中的以svnserve启动svn服务直接有效。

四、ApacheHttpServer服务启动svnserve模块权限配置说明

1.Apache提供了基本的全局粒度权限设置:

*首先需要创建一个用户文件。Apache提供了一个工具htpasswd,用于生成用户文件,可以在Apache的安装目录下找到。具体使用方法如下:

htpasswdetc/svn/passwordfileusername

如果passwordfile不存在,可以加上-c选项让htpasswd新建一个。创建好的文件内容是用户名加上密码的MD5密文。

*接下来修改httpd.conf,在Location标签中加入如下内容:

AuthType Basic 

AuthName "svn repos" 

AuthUserFile /etc/svn/passwordfile 
Require valid-user
AuthType Basic  
AuthName "svn repos"  
AuthUserFile /etc/svn/passwordfile  
Require valid-user

重新启动Apache,打开浏览器访问版本库。Apache会提示你输入用户名和密码来认证登陆了。

现在只有passwordfile文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问,替换上述“Requirevalid-user”为“Requireusertonyrobert”将只有tony和robert可以访问该版本库。

有的时候也许不需要这样严格的访问控制,例如大多数开源项目允许匿名的读取操作,而只有认证用户才允许写操作。为了实现更为细致的权限认证,可以使用Limit和LimitExcept标签。例如:

<LIMITEXCEPT REPORT OPTIONS PROPFIND GET> 
require valid-user 
</LIMITEXCEPT>
<LIMITEXCEPT REPORT OPTIONS PROPFIND GET>  
require valid-user  
</LIMITEXCEPT>

如上配置将使匿名用户有读取权限,而限制只有passwordfile中配置的用户可以使用写操作。

2.目录粒度权限访问设置:

使用Apache的mod_authz_svn模块对每个目录进行认证操作。

首先需要让Apache将mod_authz_svn模块加载进来。在Subversion的安装目录中找到mod_auth_svn模块,将其拷贝到Apache安装目录的modules子目录下。修改httpd.conf文件,找到

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule dav_svn_module modules/mod_dav_svn.so
在其后面加上
LoadModule authz_svn_module modules/mod_authz_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

现在可以在Location标签中使用authz的功能了。一个基本的authz配置如下:

<LOCATION repos> 
DAV svn 
SVNPath /etc/svn/repos 
AuthType Basic 

AuthName "svn repos" 

AuthUserFile /etc/svn/passwd 
AuthzSVNAccessFile /etc/svn/accesspolicy 
Satisfy Any 
Require valid-user 
</LOCATION>
<LOCATION repos>  
DAV svn  
SVNPath /etc/svn/repos  
AuthType Basic  
AuthName "svn repos"  
AuthUserFile /etc/svn/passwd  
AuthzSVNAccessFile /etc/svn/accesspolicy  
Satisfy Any  
Require valid-user  
</LOCATION>

其中AuthUserFile和AuthzSVNAccessFile两个文件就是指向3章节中的passwd和authz策略文件指向的是authz的策略文件

使用SVNParentPath代替SVNPath来指定多个版本库的父目录时,其中所有的版本库都将按照这个策略文件配置。例如上例中tony将对所有版本库里的/tags目录具有读写权限。如果要对具体每个版本库配置,用如下的语法:

[groups] 

02 project1_committers = paulex richard 

project2_committers = jimmy michel spark sean \ 
steven tony robert 
[repos1:/] 
* = r 
@ project1_committer = rw 
[repos2:/] 
* = r 
@ project2_committer = rw
[groups]  
02 project1_committers = paulex richard  
project2_committers = jimmy michel spark sean \  
          steven tony robert  
[repos1:/]  
* = r  
@ project1_committer = rw  
[repos2:/]  
* = r  
@ project2_committer = rw

这样项目1的committer组只能对repos1版本库下的文件具有写权限而不能修改版本库repos2,同样项目2的commiter也不能修改repos1版本库的文件。

五、补充两点

1.MySQL用户认证信息保护:

到目前为止我们的用户名密码文件还是以文本文件形式存放在文件系统中的,出于安全性的需要或者单点登陆等可扩展性的考虑,文本文件的管理方式都不能满足需求了。通过Apache的module_auth_mysql模块,我们可以用MySQL来保存用户信息。该模块的主页在http://modauthmysql.sourceforge.net/,你也可以在http://modules.apache.org/找到它的发行版本。安装方法同上述Apache的模块一样,拷贝至modules目录并在httpd.conf文件中添加如下语句:

LoadModule mysql_auth_module modules/mod_auth_mysql.so
LoadModule mysql_auth_module modules/mod_auth_mysql.so

相应的Location区域改写为:

<LOCATION repos> 

AuthName "MySQL auth" 

AuthType Basic 
AuthMySQLHost localhost 
AuthMySQLCryptedPasswords Off 
AuthMySQLUser root 
AuthMySQLDB svn 
AuthMySQLUserTable users 
require valid-user 
</LOCATION>
<LOCATION repos>  
AuthName "MySQL auth"  
AuthType Basic  
AuthMySQLHost localhost  
AuthMySQLCryptedPasswords Off  
AuthMySQLUser root  
AuthMySQLDB svn  
AuthMySQLUserTable users  
require valid-user  
</LOCATION>

然后在mysql中添加名为svn的数据库,并建立users数据表:

create database svn; 
use svn; 
CREATE TABLE users ( 

user_name CHAR(30) NOT NULL, 


user_passwd CHAR(20) NOT NULL, 


user_group CHAR(10), 

PRIMARY KEY (user_name) 
);
create database svn;  
use svn;  
CREATE TABLE users (  
user_name CHAR(30) NOT NULL,  
user_passwd CHAR(20) NOT NULL,  
user_group CHAR(10),  
PRIMARY KEY (user_name)  
);

在users表中插入用户信息

insert into users values('username','password','group');
insert into users values('username','password','group');

重新启动Apache,在访问版本库的时候Apache就会用mysql数据表中的用户信息来验证了。

2.SSL实现加密连接:

通过Apache的网络链接,版本库中的代码和数据可以在互联网上传输,为了避免数据的明文传输,实现安全的版本控制,需要对数据的传输进行加密。Apache提供了基于SSL的数据传输加密模块mod_ssl,有了它,用户就可以用https协议访问版本库,从而实现数据的加密传输了。SSL协议及其实现方式,是一个非常复杂的话题,本文只是介绍Apache提供的最基本的SSL配置方法,更加详细的介绍内容,请参考http://httpd.apache.org/docs-2.0/ssl/上的文档。

开始配置前,我们需要一个实现Apache中SSL模块的动态程序库,通常名为mod_ssl.so,及其配置文件,通常名为ssl.conf。这个实现是跟Apache的版本相关的,不匹配的版本是不能用的;而且,并不是每一个Apache的版本都自带了相关实现文件,很多情况下,我们需要自己去搜寻相关文件。另外,我们还需要OpenSSL软件及其配置文件,来生成加密密钥和数字证书。这里,我们可以使用一些免费网站,如http://hunter.campbus.com/上提供的集成版本的Apache。

有了相关的工具和文件,我们就可以开始生成SSL的证书和密钥了。首先,我们需要找到openssl程序及其配置文件openssl.cnf,运行如下命令来生成128位的RSA私有密钥文件:

my-server.key: 

openssl genrsa -des3 -out my-server.key 1024 


Loading 'screen' into random state - done 


Generating RSA private key, 1024 bit long modulus 

.....++++++ 
........++++++ 

e is 65537 (0x10001) 


Enter pass phrase for server.key:******** 


Verifying - Enter pass phrase for server.key:********
my-server.key: 
openssl genrsa -des3 -out my-server.key 1024  
Loading 'screen' into random state - done  
Generating RSA private key, 1024 bit long modulus  
.....++++++  
........++++++  
e is 65537 (0x10001)  
Enter pass phrase for server.key:********  
Verifying - Enter pass phrase for server.key:********

命令运行期间需要用户输入并确认自己的密码。

现在,我们需要SSL的认证证书,证书是由CA(certificateauthority)发放并且认证的。为此,我们可以用如下命令生成一个CSR(CertificateSigningRequest)文件发给CA,从而得到CA的认证:

openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf
openssl req -new -key my-server.key -out my-s erver.csr -config openssl.cnf

当然,一般情况下,如果Subversion的用户不是太多,安全情况不是很复杂,我们也可以生成一个自签名的认证证书,从而省去了向CA申请认证的麻烦。如下命令:

openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf
openssl req -new -key my-server.key -x509 -out my-server.crt -config openssl.cnf

以上两个命令都需要用户输入那个key文件的密码,以及一些网络设置信息,如域名,邮箱等等,这里输入的服务器域名应该与Apache配置文件当中的一致。现在,我们可以在Apache的conf目录下新建一个ssl目录,将my-server.key和my-server.crt文件都移动到ssl目录里面。然后修改ssl.conf文件,将SSLCertificateKeyFile和SSLCertificateFile项指向这两个文件。

如果Apache的module目录里面没有mod_ssl.so文件,可以将事先准备好的文件拷贝过去。然后,我们可以设置Apache的配置文件httpd.conf,将ssl模块加入其中:

LoadModule ssl_module modules/mod_ssl.so
LoadModule ssl_module modules/mod_ssl.so

然后,在配置文件的最后,加上如下SSL相关配置项:

SSLMutex default 
SSLRandomSeed startup builtin 
SSLSessionCache none 
ErrorLog logs/SSL.log 
LogLevel info 

<VIRTUALHOST svntest.ut.cn.ibm.com:443> 

SSLEngine On 
SSLCertificateFile conf/ssl/my-server.crt 
SSLCertificateKeyFile conf/ssl/my-server.key 
</VIRTUALHOST>
SSLMutex default  
SSLRandomSeed startup builtin  
SSLSessionCache none  
ErrorLog logs/SSL.log  
LogLevel info  
<VIRTUALHOST svntest.ut.cn.ibm.com:443>  
SSLEngine On  
SSLCertificateFile conf/ssl/my-server.crt  
SSLCertificateKeyFile conf/ssl/my-server.key  
</VIRTUALHOST>

这样,基本的设置工作就完成了。重新启动Apache服务器,现在可以用https协议代替http协议来访问版本库了。如果要限定版本库只能用https访问,我们可以在Apache配置文件当中Subversion部分加上“SSLRequireSSL”。如下:

<LOCATION repos> 
DAV svn 
SVNPath /etc/svn/repos 
………….#other items 
SSLRequireSSL 
</LOCATION>
<LOCATION repos>  
DAV svn  
SVNPath /etc/svn/repos  
………….#other items  
SSLRequireSSL  
</LOCATION>

文件来源:http://www.vanjor.org/blog/2010/03/svn-setup-detail/

参考:http://www.ibm.com/developerworks/cn/java/j-lo-apache-subversion/

参考:http://www.subversion.org.cn/svnbook/1.4/index.html

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/js/r20110831/r20110719/show_ads_impl.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script></script>

相关推荐

leehbhs / 0评论 2020-03-04