登录站点

用户名

密码

Apache和Subversion 搭建安全源码版本控制(四)

15已有 1805 次阅读  2009-11-21 22:23   标签Subversion  Apache  版本控制  源码 
使用 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 来保存用户信息。该模块的主页在 http://modauthmysql.sourceforge.net/,你也可以在 http://modules.apache.org/ 找到它的发行版本。安装方法同上述 Apache 的模块一样,拷贝至 modules 目录并在 httpd.conf 文件中添加如下语句:

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>

然后在 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) );

在 users 表中插入用户信息

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

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

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

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

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

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

    以上两个命令都需要用户输入那个 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

然后,在配置文件的最后,加上如下 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>

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

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

总结

    Subversion 以其优良的版本控制功能,灵活的网络访问模型,以及与 Apache 服务器联合配置所带来的更强大的管理控制功能,逐渐在开源软件开发的实践当中得到广泛的应用。本文重点介绍了 Subversion 服务器端的配置以及与 Apache 服务器联合配置的基本步骤和简单应用,实现了简单的实例应用。读者如果想要进一步了解相关信息,请参考文章后面列出的相关资料。

分享 举报

发表评论 评论 (0 个评论)