1 CVSACL简介

       目前北京的配置库使用的是CVS,虽然CVS已经比较成熟,但是在权限控制上还存在不足,目前只能控制到root一级,无法实现权限的精确控制。CVSACL就是实现访问控制的CVS补丁,可以将权限精确控制到最小一级目录,而且定义了8级不同的访问权限,完全能满足对权限的控制要求.
 

2 CVSACL安装及配置

2.1 下载CVSACL
下载地址:
[url]https://sourceforge.net/project/showfiles.php?group_id=75057&package_id=77484&release_id=423655[/url]
共有2个文件
cvsacl-1.2.5-for-cvs-1.11.22.tar.gz
cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
2.2 安装CVSACL

[root@localhost root]# tar -zxvf cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
//解压缩cvs-1.11.22-cvsacl-1.2.5-patched.tar.gz
[root@localhost root]# mv cvs-1.11.22-cvsacl-1.2.5-patched cvs-1.11.22
//修改cvs-1.11.22-cvsacl-1.2.5-patched目录名称为 cvs-1.11.22
[root@localhost root]# cd cvs-1.11.22    //进入cvs-1.11.22
[root@localhost cvs-1.11.22]# ./configure    //编译安装
[root@localhost cvs-1.11.22]# make
[root@localhost cvs-1.11.22]# make install
[root@localhost setup_cvs]# cvs –version    //查看cvs版本

    如果显示以下内容表示安装成功
Concurrent Versions System (CVS) 1.11.22 (client/server)
with CVSACL Patch 1.2.5 (cvsacl.sourceforge.net)

    注:如果系统中已安装CVS,不必删除,直接安装CVSACL即可.

2.3 CVS服务配置

     和普通的CVS配置相同,CVS日常培训中已经介绍过了。就不在此文中重复说明了,如有必要可以考虑写个CVS安装说明文档。
    有一点要强调一下,配置完CVS别忘了重启一下xinetd服务
[root@localhost /]# service xinetd restart //重启xinetd服务
[root@localhost /]# netstat -l | grep cvspserver //查看是否启动:

     屏幕显示:tcp 0 0 *:cvspserver *:* LISTEN,说明已经正常启动,如果没有请做如下检查:

1) 检查vi /etc/xinetd.d/cvspserver文件中的server = /usr/bin/cvs路径和实际执行文件所在位置是否一致(建立多个仓库时, server的路径是cvs.run文件的路径,而且cvs.run文件的属性是可执行的(x));
2) 重新检查配置过程是否有错误或者遗漏;
3) 最后还必须检查防火墙的设置,把2401端口打开

2.4 CVSACL权限设置

1. 创建用于CVS的专用系统组和用户
[root@localhost /]# groupadd cvs
[root@localhost /]# useradd –g cvs cvsroot

2. 初始化cvs服务器环境
[root@localhost /]# cvs -d /home/cvsroot/pro1 init

    其实就是cvs初始化cvs环境的命令,会在/home/cvsroot/pro1目录下生成CVSROOT文件夹,但是安装了CVSACL后,使用此命令CVSROOT文件夹中生成的文件会和不安装CVSACL的文件有所区别,会增加几个文件,稍后会详细介绍这几个文件的作用.
Aclconfig
Access
aclconfig,v

3.  设置CVS配置库归属及权限:
[root@localhost /]# chown –R cvsroot.cvs /home/cvsroot/pro1 //修改pro1的用户和用户组
[root@localhost /]# chmod –R 770  /home/cvsroot/pro1     /修改权限为用户和组用户可以读\写\执行

4. 修改CVSROOT/CVSROOT/aclconfig配置文件:

    取消使用系统的组用户,使用CVS的组用户,具体操作
[root@localhost /]# vi /home/cvsroot/pro1 aclconfig
UseSystemGroups=yes 行首添加“#”,表示注释掉。
UseCVSGroup=yes 去除行首的“#”,表示启用此句。

5. 创建CVS用户 
[root@localhost /]# cd /home/cvsroot/pro /CVSROOT
[root@localhost /]# htpasswd –c passwd liujt //创建用户liut并设置密码,会将用户信息保存在CVSROOT目录中的passwd文件中

    有一点注意, Passwd的文件完整格式是login_name:password:uid:gid: user_name:home:shell
使用htpasswd –c生成的passwd文件中的用户并没有指定user_name,即只有两项login_name:password
    使用此用户能成功登录CVS,但是如果进行任何的操作会提示没有此系统用户,我之前因为这个问题耽误了很长时间才找出原因。
    需要补全passwd文件内容,将格式改为login_name:password: user_name:
[root@localhost /]# vi passwd
liujt:fi1jDweCweiJQ:cvsroot
zhangsan:Um2VUilrjXBAI:cvsroot
lisi:Yceb9eaI.liQI:cvsroot
zhaowu:FPh2DSwXnNEe.:cvsroot
wangliu:YzoZfZqjvZ1Gk:cvsroot

6. 创建CVS组

    在CVSROOT文件夹中创建group文件,并将cvs的用户添加到此组中
[root@localhost /]# touch /home/cvsroot/pro1 /CVSROOT/group
[root@localhost /]# vi  /home/cvsroot/pro1/CVSROOT/group

    Group文件格式如下
        group1:x:1: login_name1, login_name2, login_name3
        login_name之间以”,”隔开
    注:cvsacl有个bug,必须在组用户最前边添加一个不存在的cvs用户,group文件才会生效。即login_name1为一个不存在的cvs用户(没有在passwd文件中无此用户)

7. 使用cvsacl细化权限:

    使用cvs -d racl 命令设置权限,命令执行成功后,会在屏幕中显示执行结果,并且会在access文件(就是我在”初始化cvs服务器环境”中提到的使用acl在CVSROOT中多出来的3个文件之一)中记录用户对于指定目录的权限信息.
命令说明

1. 命令格式:cvs –d 配置库位置 racl [用户||组:权限] [-Rl] [-r tag] [模块…] [文件…]
2. 权限参数

权限
参数
说明
没有权限
n
用户不能做任何cvs操作
读权限
r
可以执行annotate, checkout, diff, export, log, rannotate, rdiff, rlog, status命令
写权限
w
可以执行commit/checkin命令
tag
t
可以执行tag/rtag命令,依赖读权限
创建
c
可以执行add import 命令
删除
d
可以执行rm命令
全部权限
a
可以执行所有cvs命令处理cvsacl管理命令
管理权限
p
可以执行所有命令
3. 命令参数
- R 进行目录递归
- r rev 设定版本/标签
- l列出已定义的ACLs权限
4. 如果没有通过cvs -d racl指定用户或组对某个文件的权限,那么这个用户或组会对此目录具有最大权限( 只受文件本身属性限制)
因此在实际对CVS中的项目进行权限设置时,必须指定用户对每一个文件的权限.
5. 最后举个例子,以下命令会使test无权访问通讯程序/mm7_batch下的所有文件
[root@localhost CVSROOT]# cvs -d /home/cvsroot/pro3 racl test:n -R 通讯程序/mm7_batch
查看access文件会发权限设置信息,由于在命令中使用了-R(递归),你会发现,access对通讯程序/mm7_batch的每个目录都进行了权限设定.
[root@localhost CVSROOT]# vi access
# CVS ACL definitions file. DO NOT EDIT MANUALLY
具体的文件列表就不给大家看了,这可是公司机密:)


3 使用CVSACL对已有仓库进行权限控制


之前提到的都是在给CVS打上CVSACL后对新的仓库的权限控制,那么如何对CVS中已有的库进行权限控制呢?
其实方法十分简单,只需要将安装CVSACL后在初始化仓库时额外生成的文件复制到原有的仓库的CVSROOT里,再按照此文2.4CVSACL权限设置中的第3-7步进行操作就可以了.需要增加的文件只有3个
Access
Aclconfig
aclconfig,v