巧用SSH Tunnel加密SVN,抛弃Apache SSL【原创】

很多时候有这样的尴尬。SVN传输需要SSL加密,但是偏偏VPS上面只有Nginx 目前Nginx还不完全支持webDAV,支持SVN需要有三个东西

1) full WebDAV support,
2) DeltaV support,
3) SVN repo format support.

而在nginx里的NginxHttpDavModule,仅仅对以上三项中的第一项WebDAV有了初步的支持。

网上的方案是,要么使用nginx来反向代理本机开着的apache(感觉像脱裤子放屁),要么是配置使用繁琐的SVN+SSH协议(SVN原生支持,但是配置和使用非常繁琐)来解决。实际上,巧用ssh tunnel,完全可以非常容易的解决。

ssh隧道一般来说是我们用来翻长城用的,一般使用的是他的动态特性,即用的最多的ssh -D,其实 ssh还可以实现定向端口加密转发。见http://ihipop.info/2010/03/934.html
所以我们的基本思路就是让服务器上的SVN监听在127.0.0.1,然后用ssh的定向端口转发到本地即可。检出数据时候从本地检出。

[bash]svnserve -d -r /svnroot/ --listen-port 3389 --listen-host 127.0.0.1
useradd -m svn
#创建SVN用户
#生成密钥等略[/bash]

本机嘛只要使用一个批处理进行映射就可了

@echo off
title SSH+SVN 加密转发器
color 0d
set a=30
set b=3
mode con: cols=%a% lines=%b%
echo 开启SVN端口转发到本地3690端口
:start
plink -C -N -L 3690:localhost:3389 svn@host -i svn.ppk
echo 连接终止.正在重试
goto start


当然你也可以设置一个域名svn.youname.com 解析到127.0.0.1 然后用SVN客户端对本机进行检出即可,所有通信全程加密。


额外的安全策略
需要对svn这个用户进行一定的限制,包括限制登录和使用iptables对用户的网络访问做限制。
Iptables设置
[bash]iptables -I OUTPUT -m state --state NEW -m owner --gid-owner svn -o lo -m tcp -p tcp --dport 3389 -j ACCEPT
iptables -A OUTPUT -m state --state NEW -m owner --gid-owner svn -j DROP[/bash]
sshd_config设置

AllowGroups root anyoneelse svn fwd
AllowUsers ooxx ooo xxx

这里只列出来允许登录的用户和组,其他用户和组不得登录,由于svn用户需要开启转发,所以这个需要允许,但是该用户的shell要修改为/bin/false (记得在/etc/shells里增加一行/bin/false,否则日后要让此用户使用FTP就没门了)

关于iptables的--gid-owner,参见iptables的man Owner match

参考:
http://heiher.info/1186.html
http://heiher.info/1763.html

Author Info :
  • From:巧用SSH Tunnel加密SVN,抛弃Apache SSL【原创】
  • URL:https://blog.ihipop.com/2011/02/2067.html
  • Please Reserve This Link,Thanks!
  • 发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注