安全和权限
- 对于以svnserve -d启动的服务器,修改代码库目录/conf/svnserve.conf,主要步骤:(在配置文件中,变量前不要有空格。)
1) 对于svnserve.conf,注意[general]段,其中4项的主要含义:
Ø anon-access 定义匿名用户的权限(write,read,none)。
Ø auth-access 定义认证过用户的权限(write,read,none)
Ø password-db 定义用户密码列表文件名
Ø realm 一般是版本库的uuid。如果有2个版本库的这个属性一样,那么password-db的值也必须一样。反之亦然。
2) 定义用户密码列表文件内容,格式:
[users]
用户名=密码,注意这个是大小写敏感的。
3) 启动服务器,在提示用户输入安全信息时,缺省是用户的OS的登录名,此时直接提示输入密码。如果密码不对,则会提示输入用户名,然后是密码。
例子:
svnserve.conf |
[general] ### 禁止匿名用户访问
anon-access = none ### 验证过的用户具有读写权限
auth-access = write ### 定义用户密码列表文件名文件名为 userlist.txt
password-db = userlist.txt ### 定义 realm
realm = My First Repository |
用户密码列表文件名 (userlist.txt) |
[users] foxgem1=foxgem1 |
对于这种方式,无法定义对于代码库下具体目录的权限。如果有这个需要,那么可以采用与Apache2集成的方式解决。
- 对于与Apache2集成的服务器,修改httpd.conf,主要步骤:(需要在Apache2中配置mod_authz_svn,建议先安装Apache2,再安装Subversion。此处主要是利用Apache2对于目录的访问控制,可以从Apache2的手册中获得更多的信息。)
1) 使用htpasswd建立userlist。如果文件不存在,那么使用htpasswd -cm;文件存在,则使用htpasswd -m。其中c代表create;m代表使用MD5加密口令。如:
$ ### First time: use -c to create the file
$ ### Use -m to use MD5 encryption of the password, which is more secure
$ htpasswd -cm /etc/svn-auth-file harry
New password: *****
Re-type new password: *****
Adding password for user harry
$ htpasswd /etc/svn-auth-file -m sally
New password: *******
Re-type new password: *******
Adding password for user sally
2) 在httpd.conf中的<location>,2种使用方式:
Ø 只允许指定用户
<Location /svn>
DAV svn
SVNParentPath /usr/local/svn
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /etc/svn-auth-file
Require valid-user
</Location>
Ø 对于指定操作之外的用户,应用权限认证
<Location /svn>
DAV svn
SVNParentPath /usr/local/svn
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /path/to/users/file
# 对于get操作之外,需要验证。
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
3) 以上2步建立了和svnserve -d相同的访问控制。如果要应用目录控制,那么:
a) 建立目录访问策略文件,文件格式与svnserve.conf的语法类似。对于每个要控制的路径:
[repos-name:path]或[path]
username= (r,rw)
如果没有提及用户,那么就没权限;如果指明用户,但是等号右边什么也不写,即是显式的拒绝。如果左边使用*,则表示所有的用户。对于使用了SVNParentPath,需要指明repos-name。否则,可以省略。在文件中还可以使用[groups]建立组,例子:
[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane
[calc:/projects/calc]
###使用时注意,组名前有@。
@calc-developers = rw
[paint:/projects/paint]
@paint-developers = rw
jane = r
b) 在<location>中使用AuthzSVNAccessFile,典型的3种配置方式:
方式一:允许匿名存取
<Location /repos>
DAV svn
SVNParentPath /usr/local/svn
AuthzSVNAccessFile /path/to/access/file
</Location>
方式二:不允许匿名存储
<Location /repos>
DAV svn
SVNParentPath /usr/local/svn
AuthzSVNAccessFile /path/to/access/file
# 只有认证用户可以存取
Require valid-user
# 认证方式
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /path/to/users/file
</Location>
方式三:方式1和2的混合模式
<Location /repos>
DAV svn
SVNParentPath /usr/local/svn
AuthzSVNAccessFile /path/to/access/file
# 先尝试匿名,如果不行再尝试认证用户
Satisfy Any
Require valid-user
# 认证方式
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /path/to/users/file
</Location>
例子:
httpd.conf
|
<Location /repo> DAV svn svnpath D:/studycases/subversion/repository AuthzSVNAccessFile D:/studycases/subversion/pathright.txt Satisfy Any Require valid-user AuthType Basic AuthName "Subversion repository" AuthUserFile D:/studycases/subversion/svnuser.txt </Location> |
用户密码列表文件名 (svnuser.txt) |
foxgem:$apr1$kY/…..$rXDeLPlm9b0uacF7zM.dl. (注意这是使用htpasswd产生的)
|
目录访问策略文件 (pathright.txt)
|
[/project] foxgem= r [/test] foxgem=rw |