scribble

ottocho's blog

Home About GitHub

03 Mar 2013
Rsync Security

rsync安全问题

这篇文章记录下最近自己犯的一个错误,并对此做的总结思考。


缘起

puppet服务需要利用rsync获取代码。而rsync权限设置不安全导致了某些很严重的问题。


不安全范例

这个不安全的范例是这样的:

uid = root
gid = root

[files]
path = /path/to/files/
read only = no
list = true

它的问题非常大。来用nc简单的扫描这台机的端口。

nc -v -z -w2 test.host.com 800-900

如果开放了端口,它会有这样的输出:

test.host.com [1.2.3.4] 873 (rsync) open

显然它在873端口开放了rsync服务,这是默认开放端口。如上配置并不限制list,因此可以利用rsync list。这时候这个非常有问题的配置下,它会把模块名输出列表。如果指定了模块名,那么它可以输出模块文件列表。

[ottocho@i:~] # rsync localhost::
files
[ottocho@i:~] # rsync localhost::files
drwxr-xr-x        4096 2013/03/11 19:51:41 .
-rw-r--r--     1234567 2013/03/12 20:37:08 filename.rpm
drwxr-xr-x        4096 2013/02/13 11:58:20 lb

...... 这个时候只需要:

rsync -av test.host.com::files .

悲剧就是这样发生的。


最小权限原则

principle of least privilege 一直都知道,但是知易行难。以后要加倍安全问题的考虑。

Every program and every privileged user of the system should operate using the least amount of privilege necessary to complete the job. [wiki here]


rsync安全设置

下面总结下rsync设置中要注意的安全问题

设置别的端口

虽然这个效果有限,但是有总比没有的好。

隐藏module信息

list = false

只读设置

不需要写入权限的module的设置为只读:

read only = true

IP限制

白名单限制,只允许必要访问的主机访问。

hosts allow = 123.123.123.123

基本用户验证

只允许指定的用户利用指定的密码使用rsync服务。

服务端配置:

auth users = ottocho
secrets file = /etc/rsyncd.secrets

而文件/etc/rsyncd.secrets中写入使用的帐号密码,格式为每行username:password。这里password是明文

而客户端使用时,可以利用 --password-file=/etc/rsyncd.secrets 参数,在/etc/rsyncd.secrets中写入密码

rsync -av --password-file=/etc/rsyncd.secrets test.host.com::files /des/path

以上提到的/etc/rsyncd.secrets密码文件,用户用户组必须和使用者一致,且权限必须是600

ssh

rsync并没有直接支持加密传输。也就是说,它是直接明文传输的。如果需要rsync重要性很高的数据,自然想到了ssh。

rsync同步有两种模式:当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用ssh传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。

所以还是这样用吧,在配置好ssh后:

rsync -av test.host.com:/path/to/files /des/path

ref: first, second

配置文件

rsync的配置文件的键值用等号连接。但是如果手抖漏了这个等号,它是不会报错的!!!!!它只会把语法出错的一行直接忽视!!!!!所以配置时,务必进行测试,对没有权限的情况进行特别的测试。

其他

对ip和端口利用ipfilter或iptables进行更低层级的限制。


反思

只能亡羊补牢了。因此检查了所有服务进行了修补,对负责的服务都加上了更强的权限设置。上文即从技术角度进行补充。

另外更多让我感觉到自己很多东西掌握得很有问题,做事也不够谨慎。除了不能再犯外,也更加提醒自己认真学习。如果我对技术管理、对安全管理等有足够意识,我也就不会犯这样的错误。更加重要的是,做事要认真,要谨慎,要三思,要胆大心细。

引以为戒。

You are too young, always simple, forever naive.

【完】

ottocho 2013.03.03


Til next time,
at 20:25

scribble

Home About GitHub