Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->Linux程序设计 ->正文

Apache和Subversion 搭建安全CVS

来源:BIM DW中国 作者:吴玥颢,胡睿  时间:2007-04-22 点击: [收藏] [投稿]

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

现在你的版本库任何人都可以访问,并且有完全的写操作权限。也就是说任何人都可以匿名读取,修改,提交,以及删除版本库中的内容。显然大部分场合这是不符合需求的。那么怎么样进行权限设置呢,Apache 提供了基本的权限设置:

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

htpasswd etc/svn/passwordfile username
	

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

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

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

重新启动 Apache,打开浏览器访问版本库。Apache 会提示你输入用户名和密码来认证登陆了,现在只有 passwordfile 文件中设定的用户才可以访问版本库。也可以配置只有特定用户可以访问,替换上述 "Require valid-user" 为 "Require user tony robert" 将只有 tony 和 robert 可以访问该版本库。

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

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

如上配置将使匿名用户有读取权限,而限制只有 passwordfile 中配置的用户可以使用写操作。如果这还不能满足你的要求,可以使用 Apache 的 mod_authz_svn 模块对每个目录进行认证操作。

用 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 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>

AuthzSVNAccessFile 指向的是 authz 的策略文件,详细的权限控制可以在这个策略文件中指定,如:

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

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

[groups] 
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 版本库的文件。

用 MySQL 代替文件形式存放密码

到目前为止我们的用户名密码文件还是以文本文件形式存放在文件系统中的,出于安全性的需要或者单点登陆等可扩展性的考虑,文本文件的管理方式都不能满足需求了。通过 Apache 的 module_auth_mysql 模块,我们可以用 MySQL 来保存用户信息。该模块的主页在

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:用新的PHP插件实现MySQL为基础的事务   下一篇:AIX 中Paging Space使用率过高分析与解决

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号