在 Debian Lenny 下创建 Apache2 SSL 认证的多重 Subversion 仓库
1. 目标
(1) 对不同用户创建不同的 Subversion 仓库;
(2) 使用 Apache2 SSL 连接;
(3) 使用 Apache2 mod_auth_pgsql 认证;
(4) 为不同的仓库设置不同的用户权限。
2. 基本参数
OS: Debian Lenny
IP: 192.168.1.100
SVN 目录: /opt/svn
SVN 仓库: /opt/svn/repo1
/opt/svn/repo2
SVN 用户: test1
test2
用于访问认证管理的 PostgreSQL 数据库: svn
PostgreSQL 用户: svn
说明:
以下操作中,
$ - 普通用户
# - root 用户
3. 安装 Debian 包
- # apt-get install apache2 libapache2-mod-auth-pgsql libapache2-svn postgresql postgresql-contrib subversion cert-ssl
复制代码
4. PostgreSQL 数据库及设置
4.1 创建用户 Apache2 认证的数据库
(1) 创建数据库 svn 和用户
- $ sudo su postgres
- postgres $ createdb svn
- CREATE DATABASE
- postgres $ createuser svn
- Shall the new role be a superuser? (y/n) n
- Shall the new user be allowed to create databases? (y/n) n
- Shall the new user be allowed to create more new users? (y/n) n
- CREATE USER
复制代码
(2) 导入加密脚本,以加密保存的密码
- postgres $ psql -d svn < /usr/share/postgresql/8.3/contrib/pgcrypto.sql
- SET
- CREATE FUNCTION
- CREATE FUNCTION
- CREATE FUNCTION
- ...
复制代码
(3) 创建表
- postgres $ psql -d svn
- svn =#
复制代码
- -- user table
- CREATE TABLE users (
- user_id SERIAL PRIMARY KEY,
- username VARCAHR(32) NOT NULL,
- passwd TEXT NOT NULL,
- email VARCHAR(255)
- );
- CREATE INDEX idx_users ON users (username);
- GRANT SELECT ON users TO svn;
- -- group table
- CREATE TABLE groups (
- group_id SERIAL PRIMARY KEY,
- username VARCHAR(32) NOT NULL,
- memberof VARCHAR(64) NOT NULL -- group name
- );
- CREATE INDEX idx_groups ON groups (username, memberof);
- GRANT SELECT ON groups TO svn;
- -- log table
- CREATE TABLE logs (
- logs_id SERIAL PRIMARY KEY,
- uname VARCHAR(32),
- time TIMESTAMP(,
- uri VARCHAR(512),
- ip INET
- );
- CREATE INDEX idx_logs ON logs (uname, time);
- GRANT INSERT ON logs TO svn;
复制代码
(4)为用户 svn 设置密码
- ALTER USER svn WITH ENCRYPTED PASSWORD '123456';
复制代码
4.2 修改 PostgreSQL 服务器访问权限
编辑
- /etc/postgresql/8.3/main/pg_hba.conf
复制代码:
在
- host all all 127.0.0.1 255.255.255.255 ident sameuser
复制代码
之前加入
- host svn svn 127.0.0.1 255.255.255.255 md5
复制代码
然后重启 PostgreSQL 服务:
- # /etc/init.d/postgresql-8.3 restart
复制代码
5. 创建 Subversion 仓库
- # mkdir /opt/svn/
- # svnadmin create /opt/svn/repo1
- # svnadmin create /opt/svn/repo2
复制代码
然后
- # chown -R www-data:www-data /opt/svn
复制代码
6. 配置 Apache2 SSL
6.1 加载 SSL 模块
- # a2ensite default-ssl
- # a2enmod ssl
复制代码
6.2 创建站点 SSL 证书
- # make-ssl-cert generate-default-snakeoil --force-overwrite
复制代码
7. 设置 Apache2 WebDAV
7.1 加载模块
- # a2enmod dav
- # a2enmod dav_svn
- # a2enmod 000_auth_pgsql
复制代码
7.2 设置 mod_auth_pgsql 认证
编辑文件
- /etc/apache2/mods-available/dav_svn.conf
复制代码
- <Location /svn>
- DAV svn
- SVNParentPath /opt/svn
- AuthType Basic
- AuthName "Subversion Repository"
- Auth_PG_host localhost
- Auth_PG_port 5432
- Auth_PG_database svn
- Auth_PG_user svn
- Auth_PG_pwd 123456
- Auth_PG_pwd_table users
- Auth_PG_uid_field username
- Auth_PG_pwd_field passwd
- Auth_PG_grp_table groups
- Auth_PG_grp_group_field memberof
- Auth_PG_grp_user_field username
- Auth_PG_cache_passwords on
- Auth_PG_log_table logs
- Auth_PG_log_uname_field uname
- Auth_PG_log_date_field time
- Auth_PG_log_uri_field uri
- Auth_PG_log_addrs_field ip
- AuthzSVNAccessFile /etc/apache2/dav_svn.authz
- Require valid-user
- SSLRequireSSL
- </Location>
复制代码
7.3 在数据库 svn 中创建 Subversion 用户 test1 和 test2
- $ sudo su postgres
- postgres $ psql -d svn
- svn =#
复制代码
- -- User 'test1', for 'repo1'
- INSERT INTO users (username, passwd, email)
- VALUES ('test1', crypt('123456', gen_salt('md5'), 'test1@localhost');
- INSERT INTO groups (username, memberof)
- VALUES('test1', 'testgrp');
- -- User 'test2', for 'repo2'
- INSERT INTO users (username, passwd, email)
- VALUES ('test2', crypt('abcdef', gen_salt('md5'), 'test2@localhost');
- INSERT INTO groups (username, memberof)
- VALUES('test2', 'testgrp');
复制代码
7.4 设置 Subversion 访问目录控制文件 /etc/apache2/dav_svn.authz
其中仓库 repo1 只能由用户 test1 完全访问,其他用户无法访问;
仓库 repo2 可以被用户组 testgrp 里的用户只读,由用户 test2 完全访问。
- [groups]
- testgrp=test1,test2
- [repo1:/]
- *=
- test1=rw
- # All members in group 'testgrp' could read repository 'repo2',
- # user 'test2' has a full access previlege.
- [repo2:/]
- @testgrp=r
- test2=rw
复制代码
8. 重启 Apache2 服务
仓库 repo1 和 repo2 可以分别从
* https://192.168.1.100/svn/repo1
* https://192.168.1.100/svn/repo2
访问。
首发 CU 博客:
http://blog.chinaunix.net/u3/112335/showart_2289369.html
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论