开宗明义,本文是实操指南,没有太细致的原理说明,适合有一定基础的运维人员参考。
1 svn over http的好处
端口方面的好处:svn的默认端口是3690,默认会被路由器封闭,但是80端口一般是要开启的。所以这是第一个好处:
haoyan@haoyan-PowerEdge-R230:~$ sudo netstat -natp
[sudo] password for haoyan:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2904/svnserve
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 31196/mysqld
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 7172/smbd
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1051/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1001/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 20337/cupsd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 7172/smbd
tcp 0 0 127.0.0.1:59306 127.0.0.1:3306 ESTABLISHED 7638/apache2
tcp 0 0 127.0.0.1:3306 127.0.0.1:59306 ESTABLISHED 31196/mysqld
tcp 0 64 192.168.5.169:22 192.168.5.182:27026 ESTABLISHED 23930/sshd: haoyan
tcp 0 0 192.168.5.169:22 192.168.5.182:24673 ESTABLISHED 23727/sshd: haoyan
tcp 0 0 192.168.5.169:445 192.168.5.176:49371 ESTABLISHED 16405/smbd
tcp6 0 0 :::8009 :::* LISTEN 22209/java
tcp6 0 0 :::139 :::* LISTEN 7172/smbd
tcp6 0 0 :::80 :::* LISTEN 7631/apache2
tcp6 0 0 :::22 :::* LISTEN 1001/sshd
tcp6 0 0 ::1:631 :::* LISTEN 20337/cupsd
tcp6 0 0 :::8088 :::* LISTEN 22209/java
tcp6 0 0 :::445 :::* LISTEN 7172/smbd
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 22209/java
2 权限问题。
因为svn并没有处理太多的额权限,在repository下面的文件,默认还是644或者755权限,而操作员不大可能给每一个开启svn的用户开启一个正式的linux账户,一个解决方式就是把repository的文件权限修改为777,但是这又有安全问题。
因此,此时用svn over http的话,把repository的所有权给www-data,那么任何有svn权限的用户都可以访问repository了。
3 实现方法:
实现方法见我的早先的文章:其核心在于apache的dav_svn module和htpasswd 来生成密码。
https://zhuanlan.zhihu.com/p/54758455
此文章的第7 第8 步说的很详细,再次不再赘述。
4 让用户自己可以修改密码。
用以上方法开启svn over http之后,添加用户就要在服务器操作服务器上面的authz文件和passwd文件。添加一个用户还好。但是密码自助修改就不行了。
但是此处有个问题,htpasswd只是一种加密方法,对于有权限操作目标文件的人。都可以操作。那么,此处就有个绕的地方,如果可以有权限修改此密码文件,则都可以改任何用户的密码。那么如何达到只能修改自己密码的目的呢?
自己研究了很久,找到了一种方法,就是用apache的basic auth来限制访问,访问之后,就仅修改自己的密码即可。
因此,就分两步,
第一, 在apache下面开一个需要授权的目录。
第二, 开启一个php脚本,只允许用户修改自己 的密码。
下面是具体的步骤,说一下我的环境:
Ubuntu 16.04
Apache 2.4
Php 7.0
第一步,在/etc/apache2/apache2.cnf里面,开启对一个目录的权限访问
# add by liuzhi
<Directory "/var/www/html/SVNPW/">
Options Indexes FollowSymLinks
AllowOverride authconfig
Order allow,deny
Allow from all
</Directory>
这样子操作之后,系统就会检查SVNPW下面的.htaccess文件了。
然后就在该目录下创建这个文件,内容如下:
AuthName "请输入你的SVN用户名 密码以登录"
AuthType basic
AuthUserFile /var/www/html/SVNPW/htpasswd
require valid-user
这样子用户在尝试访问此目录时,就需要在此目录下面的htpasswd里面有用户名,密码才行。
然后创建一个符号链接,指向真正的密码文件。
haoyan@haoyan-PowerEdge-R230:/var/www/html/SVNPW$ ll
total 16
drwxr-xr-x 2 www-data www-data 4096 9月 2 23:04 ./
drwxr-xr-x 4 root root 4096 8月 31 14:21 ../
-rw-r--r-- 1 www-data www-data 131 8月 31 14:01 .htaccess
lrwxrwxrwx 1 root root 27 8月 31 14:06 htpasswd -> /etc/apache2/dav_svn.passwd
-rw-rw-r-- 1 www-data www-data 3603 9月 2 23:04 index.php
然后记得把此密码文件owner修改为www-data用户
接下来就是index.php的内容了,我的文件内容放在了网盘上,供参考:
链接:https://pan.baidu.com/s/1NQOTyA1niAnKVh1JFKmepw 密码:wiq1
这样子,管理员只剩下创建用户,并初始化一个密码,其后可以让用户自主修改密码即可。
记录供各位参考。