配置安全的共享web服务器(抛砖引玉)

本文所讲的共享web服务器,并非共享文件的服务器,而是多人一起使用的web服务器,各有各自的网站、管理自己的文件,互不干涉,且对系统无影响。鉴于功力较浅,只敢对较信得过的朋友开放这种账号,本文涉及的范围也有限,所以安全漏洞可能还有,请诸位切勿直接用于生产环境。

服务器环境:Ubuntu 8.10, OpenSSH_5.1p1 Debian-3ubuntu1, Apache 2.2.9, PHP 5.2.6-2ubuntu4

登录 – SFTP

传统的 FTP 肯定是不如这个安全,telnet 更不用说了。使用 SFTP 还有一个起始想法是想配置证书自动登录,后来发现 SFTP 客户端(FileZilla)没这功能,就没再作下去,命令行下 scp 的自动登录倒是 和 ssh 的一样很好配置。

网上很多文章介绍把 sftp 用户限制在 $HOME 目录下的方法,使用的是 sshd 的 ChrootGroups 选项,这个选项在我的版本里没有找到,找到另外一篇参考文章使用的是 ChrootDirectory,也很好用。

创建一个用户组,作为所有 sftp 用户的用户组:

$ sudo groupadd sftp

创建用户,设置密码,并归入 sftp 组:

$ sudo useradd -m friend
$ sudo passwd friend
$ sudo usermod -g sftp friend

为了进一步增强安全性,还可以将用户的登录 shell 设置为 /bin/false,是个好习惯,但在本例中并非必须,下面的 sshd 设置也会让用户无法登录 shell (我观察的结果)。

$ sudo usermod -s /bin/false friend

下来就要配置 sshd 了,编辑配置文件 /etc/ssh/sshd_config

# 修改下面这句
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

然后在此配置文件末尾添加:

Match group sftp
    X11Forwarding no
    ChrootDirectory %h
    AllowTcpForwarding no
    ForceCommand internal-sftp

配置含义大概为:凡是 sftp 组的用户,关闭 X 转发,chroot 到 $HOME 目录,关闭 TCP 转发(无法使用隧道了?),强制使用 internal-sftp(这个不明白)。

现在,重启 ssh 服务,用户就只能通过 sftp 访问 /home/friend 下的文件了。

PS: 我发现 sshd 如果配置错误,在 restart 服务的时候会先检查,而不是直接 stop 服务然后在 start 的时候出现错误,搞得服务启不来。大概是考虑到很多人都是远程 ssh 上来进行维护,服务 down 了以后就麻烦了,很贴心的设置。

Apache & PHP

Apache 配置简单,创建 /home/friend/www 目录,约定网站文件都放在这个目录下,然后弄个 Alias 指向就可以了。

但有一个极大的安全隐患需要堵上,用户可以通过编写 PHP 程序,读取系统中任何 www-data 用户有权限访问的文件,包括系统的 shadow 文件,包括 其它用户的网站文件等等。解决这个问题,一种是开启 PHP 的 safe_mode ,安全模式下 PHP 将只能访问 owner 为自己(也就是 www-data)的文件;另外一种是使用 open_basedir,这将限制 PHP 只能打开某一目录树下的文件,并且不可能通过符号链接避开此限制。显然 safe_mode 的副作用太多,后一种方法更适合我的这种情况,配置写到 Apache 的 conf 里就行了:

<Directory /home/friend>
    php_admin_value open_basedir "/home/friend/"
</Directory>

注意open_basedir 后面的参数只代表文件路径的前缀,所以要带上末尾的斜杠,明确指出是目录。

不使用 safe_mode 的另外一个原因是在未来的 PHP6 里就要删掉它了。

缺点

最大的缺点就是 sftp 用户无法自己更改密码,除非自己写个守护程序啥的。这个程序在写的时候要非常小心,因为操作的是系统用户文件,如果遗留有安全漏洞可能会使别人获得其它用户权限。一个折中的方法是写个程序,定期更改密码并通过邮件告知用户,虽不方便但安全性要好一些。

更安全的原因所在

继续挑战Gregarius中积攒的未读feeds items,已经追到了2007年8月份,6666/17841条未读信息已经减少到3220/21258项:

吉利数字in my Gregarius

今天才看到fcicq的ActiveX 安全控件 = 不安全,不禁在想,到底什么原因导致ActiveX不安全呢?终于,我发现这并不能盲目归咎于微软产品质量不佳或者是ie的缺陷,也不能说是开发人员水平不行或者是不负责任,终极的原因,居然是小众和大众的区别。

简单说来,ActiveX是闭源的,那么真正了解它的完整工作机制的人必然是少数,每个人的智慧都有局限性,引申开来,每个团队也有考虑不到的地方,那么我们就可以认为,ActiveX必然存在着漏洞,并且小众之外的大众看不到、体会不到,甚至发现了一些端倪也无法判断原因出自何处,在无法得到充分、全面的用户检验的时候,维护团队仅靠一些自身质量控制和用户使用方面的反馈,也就有照顾不到的地方了。漏洞有了生存空间,安全性自然下降。更何况,ActiveX的运行平台,Windows以及ie,也具有类似性质,坏的效果往往不是累加而是乘积式的增长。

搞过一点软件开发的人都知道测试的重要性,初级一点的测试就是模仿用户操作,使用一些极限值、便捷值等来对软件进行检测,而高级一些的测试可不是谁都能作的工作,测试人员不仅要会“操作”软件,还要懂得软件实现的原理和机制,必要的时候要去翻文档、源码,来制定测试方案,这样才能找到一些深层次的问题。回到我们说的小众和大众的区别问题上来,当软件有了1000万用户时,可以把这1000万想像为初级测试用户,他们会反馈一些使用中遇到的问题,协助软件更改,这是闭源软件的方式,在开源软件的运作模式中,这些用户里可能会有万分之一的用户出于学习、好奇或进行改进的原因,去翻阅源码,在阅读过程中自然有一定的检查效果,其中的经验丰富精力充沛者还会进行测试、亲手修改,部分类似与高级测试人员的工作。只要施以得当的管理,让这些测试、修改的效果得以发挥,软件的质量及安全性自然会更高一些。

之所以会想到这些,是因为我记得以前微软还是谁在抨击开源软件的质量和安全性的时候提到过,闭源软件是由高素质的开发团队,有严谨的质量控制管理的情况下生产出来的,所以质量更好,安全性更优。我虽然不能全盘否定这一观点,但这么说太片面了。绝对的安全肯定是一个“无穷大”的数字,每一份努力都能够离这个“无穷大‘更近一些。广大人民的力量是无穷的,更不要说为了薪水工作和为了理想信念干活的结果差异了。

其实,小众和大众的影响在其它很多方面有体现:我们在颁布法律或规章的时候,要开听证会,要征集意见,就是要把小众群体起草出来的东西,让大众去检查、补充、完善;我们要讲团队合作,要讲民主,就是要避免小众决策的片面,能力的局限;我们把重要建设项目的方案公开让大家讨论,也是在借助大众的智慧。人多力量大,众人拾柴火焰高,三个臭皮匠还抵个诸葛亮呢,如果谁坚持要说有限的团队就能够生产出完美的产品,我们大可一笑置之。

最后,小众和大众都是相对的概念,应用的范围要适度,服务器的管理员只设一人是不安全的,公司里人人都是管理员也不安全,监狱安防设计图自然也不能搞什么全民共享,那《越狱》就失去大卖点了 :)。真正安全的方式是要绝对经得起推敲、检验的,在这方面,非对称加密如pgp、gpg堪称典范,充分利用公开的机制达到了保密的目的。