CVS是一个著名的版本控制工具,无论是对个别程序员还是一个开发团队来说,CVS都是非常有用的版本控制工具,而且它是免费的。CVS的功能也很强大,总体上它是一个C/S结构的软件,使用者首先要架设一个CVS服务器,在CVS服务器上导入项目实例、设置CVS项目访问控制等。而客户通过客户端来访问CVS服务器,客户可以取得项目最新代码副本、提交自己修改的代码等,而客户可以从Internet、LAN、甚至本机来访问CVS服务器。
事实上,许多从事软件开发的个人或且组织都在使用这个免费的软件来帮助进行软件开发。但用户一方面在使用CVS的诸多功能进行版本控制的时候,却忽视了安全方面的设定,于是问题也因此而产生了。我们都知道软件作一种特殊的产品,它是有价值的。对于一个软件公司来说,软件的源代码就是企业最宝贵的资源,如果泄漏出去,可能会给企业带到重大的损失,甚至会影响到企业的生存。许多公司为了让在家或是出差在外的同事也可以进行工作,通常会把CVS服务器放在Internet上,而放在Internet上的CVS服务器就是一个可以泄漏源代码的重要途径,所以也更要认真考虑其安全性的问题。
本文就以一家中小型的软件开发公司为例,来介绍如何在Internet上架设一个安全的CVS服务器,以供分布在各地的员工通过Internet来访问它。
在这个假设的例子当中,这家软件公司采用10M的ADSL专线接入Internet,并拥有一组固定IP。为了达到较高级别的安全,公司逐级采用了以下的策略和方法:
第一层保护:在网关使用防火墙
在接口网关处安装了防火墙,并划分了DMZ、内网、外网三个区域。CVS服务器和公司其它的对外服务器都放置在DMZ区域中,防火墙对DMZ区域实施不同内网、外网的专门安全策略,对于CVS服务器也实施专门安全策略。
第二层保护:对安装CVS服务的机器进行操作系统加固
公司使用的是Red Hat Linux,最初安装的Linux中缺乏严格的安全设定,需要进行操作系统加固才能达到更高的安全。
第三层保护:利用CVS自身的安全特性
这一部分,笔者将会在后文详细讲解CVS服务器的安装配置等
第四层保护:人员培训和制度
对于使用CVS的员工进行CVS的使用培训,介绍如何安全的从外部连入CVS服务器,以及如何保护个人的CVS账号等信息。由于开发人员可能从公司内网中来访问DMZ中的CVS服务器,也可能通过Internet从公司以外的地方来访问DMZ中的CVS服务器。所要要针对这两种情况制定相应的CVS访问制度,同时要求员工保护好自己的用户名和密码。
在以上四层保护中,本文重点要介绍的是第三层保护。
首先是CVS基本的安装:
1.下载源码
通过摸索引擎可以找到CVS的源代码包,也可从CVS的官方网站cvshome.org上开始寻找,由于CVS历史上也出现过一些安全漏洞,所以建议要定期去其官方网站看看有没有最新版本推出。目前最新的是2003年12月18日推出的1.12.5版本,大家尝试从以下链接下载:
http://ccvs.cvshome.org/servlets/ProjectDownloadList?action=download&dlID=351
2. 编译安装
[root@terry src]# tar -xjpvf cvs-1.12.5.tar.bz2
[root@terry src]# cd cvs-1.12.5
[root@terry cvs-1.12.5]# ./configure --prefix=/usr/local/terry_yu/cvs
--disable-server-flow-control
[root@terry cvs-1.12.5]# make
[root@terry cvs-1.12.5]# make install
以上指令将CVS安装到/usr/local/terry_yu/cvs这个目录上。
注:除了使用源码包进行安装之外,还可以使用RPM包来安装。
||||||3. 设置启动CVS服务
在Linux上CVS服务可以通过inetd、xinetd或tcpwrapper等来启动,其中inetd由于安全理由在许多场合已经被xinetd所取代了。这里我们使用xinetd来启动CVS服务。
在/etc/xinetd.d目录下为CVS服务创建一个配置文件,比如:/etc/xinetd.d/cvspserver,编辑/etc/xinetd.d/cvspserver,输入如下内容:
service cvspserver
{
disable = no
socket_type = stream
wait = no
user = root
env = HOME=
server = /usr/bin/cvs
server_args = -f --allow-root=/home/cvsroot pserver
}
注:
1)pserver表示是口令认证的访问方式,这是最常用的方式,其他还有gserver,kserver,ext,如果想要更高的安全性可以使用ssh来加密口令和数据流,不过这里为了用户使用的方便,仍然选的是pserver
2)--allow-root是指定Repository的目录,可以建立多个Repository
然后重新启动xinetd:
[root@terry bin]# /etc/rc.d/init.d/xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
重新启动xinetd服务后,CVS服务也开始工作了:
4.在CVS服务器端建立Repository
首先要创建一个名为cvs的组和一个名为cvsroot的用户,以后要访问CVS服务的用户加入cvs这个组:
[root@terry root]# groupadd cvs
[root@terry root]# useradd -g cvs -s /sbin/nologin cvsroot
[root@terry root]# chown -R cvsroot /home/cvsroot
接下来进行初始化:
[root@terry root]# cvs -d /home/cvsroot init
这样在/home/cvsroot目录中就产生了CVSROOT目录,其中存放了一些配置文件,如config等,然后设置权限:
[root@terry root]# chown -R cvsroot.cvs /home/cvsroot
[root@terry root]# chmod -R ug+rwx /home/cvsroot
[root@terry root]# chmod 644 /home/cvsroot/CVSROOT/config
为了CVS系统的安全,我们要修改/home/cvsroot/CVSROOT/config文件,将"#SystemAuth =no"的前而的注释号#去掉,即改为“SystemAuth =no”,然后给开发者们逐一建立账号,新建的不要分配用户目录,因为它将作为一个虚拟用户帐号来使用,具体命令如:
[root@terry root]# useradd -g cvs -M bogus
[root@terry root]# passwd bogus
上面的命令就创建了一个并没有Home目录的用户bogus,接着将系统的shadow文件复制到CVSROOT, 并重命名为passwd:
[root@terry root]# cp /etc/shadow /home/cvsroot/CVSROOT/passwd
[root@terry root]# chmod 0644 /home/cvsroot/CVSROOT/passwd
然后修改passwd文件,将除刚才设定的可使用CVS的用户bogus之外的所有行删除,然后去掉每行第二个冒号以后的所有内容,并添上字符串cvsroot, 改为如下格式:
bogus:ND5$J8N9BW5DKV.nPdxfdsh:cvsroot
然后,删除掉刚刚在系统中添加的那个用户bogus:
[root@terry root]# userdel -f bogus
好了,做到这里,CVS的服务器端就已经安装设置好了,这样你的CVS用户就只能用passwd中规定的用户来登陆你的CVS服务器了,要注意的是:本文介绍的添加用户的方法适用于小数量的用户,如果是有大规模的开发人员,推荐采用连接LDAP或者数据库来进行用户的认证服务。通过这四层保护,相信可以使用你放心的使用CVS服务了,不过本文只是作了最简单的介绍,希望可以给大家起参考的作用。另外,想要得到CVS的最新信息,可以访问CVS的主页:http://www.cvshome.org/,还有Pascal Molli的CVS网站:http://www.loria.fr/~molli/cvs-index.html