FreeBSD下创建安全的Web服务器

页面导航:首页 > 操作系统 > Unix/BSD > FreeBSD下创建安全的Web服务器

FreeBSD下创建安全的Web服务器

来源: 作者: 时间:2015-11-30 10:41 【

序言一、系统和服务程序的安装1. 系统安装2. 服务程序安装二、系统安全设置1. 用户控制2. 文件访问控制3. 系统服务和端口控制4. 日志管理和控制5. 文件指纹检测6. 系统指纹泄露和防范
序言 一、系统和服务程序的安装 1. 系统安装 2. 服务程序安装 二、系统安全设置 1. 用户控制 2. 文件访问控制 3. 系统服务和端口控制 4. 日志管理和控制 5. 文件指纹检测 6. 系统指纹泄露和防范 7. 系统内核安全 8. 系统安全优化 三

序言

一、和程序的
1.
2. 程序

二、安全
1. 用户控制
2. 文件访问控制
3. 和端口控制
4. 日志管理和控制
5. 文件指纹检测
6. 指纹泄露和防范
7. 内核安全
8. 安全优化

三、程序的安全
1. Apache安全
2. PHP安全
3. Mysql安全
4. vsFTPd安全
5. SSH的安全

四、防火墙的和
1. ipfw
2. 配置ipfw

五、Unix/Linux上的后门和防范
1. 帐号后门
2. shell后门
3. cron服务后门
4. rhosts后门
5. Login后门
6. Bind后门
7. 后门
8. rootkit后门
9. 内核后门
10. 其他后门

六、结束语

附录


序言

在我们跑Web服务器的时候,大家可能都会一致认为使用Linux+Mysql+Apache+PHP整个开源的是比较好的选择,但是我个人认为这是不合理的,首先要根据你的应用来觉得你使用什么。假如你需要跑Oracle等大型应用的话,而且Oracle在Linux下是支持的比较好的,那么使用Linux是个好的选择,因为在FreeBSD下Oracle是个非常麻烦的事情。那么如果是跑普通的网站应用的话,我觉得使用FreeBSD+ Mysql+Apache+PHP是个好的选择,因为对于一个网站来讲,稳定安全是第一位的,否则你的网站什么时候被人修改了都不知道怎么回事,或者被黑客入侵,把数据修改或者删除,那就糟糕了,毕竟现在什么红客、黑客的一堆,不能不防。当然,不是说Linux不安全,但是在Linux下集成了很多不安全的程序,导致了它的不安全,但如果的好,Linux一样可以很安全。在中国应急响应中心(http://www.cert.org.cn)这几个月的数据来看,每个月被入侵成功最高的是Linux系统,占百分之六十多,然后过来是Windows系统,占百分之三十多,而FreeBSD的入侵比例是百分之几。

任何都可以很安全,也可以很不安全,关键是管理员怎么做的,世界上没有最安全的,只有更安全的。下面的文章就是
在FreeBSD平台上构建一个比较安全的Web服务器,希望对网管和安全爱好者能有一些启发,权当抛砖引玉,希望能够有更好阐述的文章。


一、和程序的


1.

为了保证的安全,我们准备采用最新的FreeBSD版本,首先是安全,兼容性也比较好,这个主要是个人习惯和需求,为了简单起见,这里我们选用了最新的FreeBSd5.3版本进行。整个过程我就不讲了,如果不清楚的朋友可以参考FreeBSD中文手册(http://www.freebsd.org.cn),整个过程不是很复杂,虽然没有Windows/Linux的安全简单,但是比起有些Unix的来讲是人性许多的。中必须把基本包和内核源代码都装上,为了以后编译内核方便,如果另外,如果喜欢使用ports安装软件的话,还要把ports装上,但是尽量一些没有必要的程序不要装。如果要 Webmin等,还要把perl等包装上。文件拷贝完以后,会要求配置一些,比如把IP地址、名字器等设好,不要打开IPv6,不需要 DHCP等,不要默认的FTP服务,配置 /etc/inetd.conf 时把SSH服务打开,方便我们进行远程管理,如果不想使用inetd这个超级来管理的话,可以关闭它,在/etc/rc.conf中添加 inetd_enable="NO",然后sshd_enable="YES"一样可以打开SSH服务,后面我们会详细谈到SSH的。

装完后,在 /etc/inetd.conf 中把除了ssh之外的全部关闭,特别是telnet和rlogin等,一定要慎重,否则很可能每几天就被入侵了。完后,建议对进行升级,比如使用 make world 或 cvsup 把内核和ports进行升级。这个步骤和Windows装完后打补丁差不多。


2. 程序

装完以后,就开始我们的应用软件,我们的方针还是最新的软件是最安全的,比如能够防止一些老版本中的溢出等等。我们基本就是要让我们的有数据库,同时能够处理Web服务,同时能够远程对网站进行文件管理的FTP服务。我们基本选择的程序都是比较通常的程序。另外,为了有个可视化的管理工具,我们同时也可以一个基于浏览器的管理工具Webmin,方便没有ssh客户端等等的时候进行管理。

首先我们选用的Web服务是Apache httpd 2.0.53,这是目前的最新版本,当然你也可以考虑1.3的版本,主要是看个人习惯。我们网站是PHP程序编写,所以要PHP,版本是 4.3.11,也是最新的版本,如果你的网站程序需要PHP5的支持,那么可以下载php5.0.4。数据库还是最快速的Mysql,选择的版本是最新的 4.0.23,如果你需要外键、事务、子查询、存储过程等的支持,那么你可以考虑4.1和5.0的版本。最后我们的FTP选择最安全的vsFTPd,因为它是最安全快速的,我在局域网中测试它的最高创数速率能够达到10MB/S,proFTPd只有8MB/S,vsFTPd针对小型FTP服务器支持非常好,毕竟我用户不多,几个更新网站而已,当然,如果你喜欢简单方便,也可以考虑使用FreeBSD自带的FTPd,功能和易用性也是不错的。如果你用户比较多,并且功能要求比较高,建议使用proFTPd、pure-FTPd、wu-FTPd等,但有些FTPd不是非常安全,选择时候一定要慎重考虑。

器程序列表:
Apache 2.0.53 下载地址:http://httpd.apache.org
PHP 4.3.11 下载地址:http://www.php.net
Mysql 4.0.23 下载地址:http://dev.mysql.com
vsFTPd 2.0.2 下载地址:http://vsftpd.beasts.org

反正最少的+最少的端口+安全的 = 最大的安全,尽量能够不需要使用的就不要,比如telnetd、rlogind等,那么相反会对器安全构成威胁。

以上程序你可以采用手工编译,也可以采用FreeBSD的ports 来进行,这看个人爱好,我个人比较喜欢使用手工,如果不明白具体的朋友可以参考我的Blog上关于Apache+PHP+Mysql的。



二、安全


1. 用户控制

尽量少的用户,我们的FTP帐户是和帐户绑定在一起的,所以我们添加用户的时候先建立一个目录,然后把新建的用户主目录指向到该目录下。假设我需要一个用户能够管理我的网站,而我网站的目录是在 /usr/www 目录下,那么我们新建立的用户 www_user 的主目录就指向 /usr/www 目录,同时它的shell是没有的:/usr/sbin/nologin ,主要是为了防止它通过ssh登陆到。同时FTP的密码也要的非常复杂,防止黑客通过暴力破解获得FTP权限。另外还要说道我们的root用户的密码,我想最少应该不要少于10位的数字+字母+字符的密码(我的密码是18位),否则是非常不安全的,如果密码简单,那么黑客通过短时间的暴力破解 SSH中的root帐户,不用几天,就可能被攻破了,同时也建议最少一个月更改一次root用户的密码。(强烈建议一般帐户不要有登陆的权限,就是把shell设为/usr/sbin/nologin)
一般如果要使用root权限建议建立一个属于wheel组的小用户,然后登陆后通过su命令提升为root用户进行管理,如果黑客通过破解了我们普通用户的权限后登陆,也不能直接通过root权限进行管理,这是一种安全防范的简单。


2. 文件访问控制

有时候被黑客入侵后拿到了小权限用户,比如传了一个WebShell到中,那么对方很可能会把 /etc/passwd 等内容直接读取出来,同时查看/etc/master.passwd中对加密后的root用户的密码hash进行破解,最后拿到密码进行登陆。那么我们就要控制部分文件只有root能够访问,其他用户无权访问。比如uname,gcc等,如果黑客拿到小权限用户后就会查看版本,然后找到该版本对应的溢出程序,使用gcc来进行编译,如果我们能够限制黑客访问uname和gcc等程序,能在一定程度上减缓黑客入侵的脚步。
使用chmod来改变某个文件的权限信息,比如我要 /etc/passwd 和 /etc/master.passwd 文件只能允许root访问:
使用八进制数字来
# chmod 700 /etc/passwd
# chmod 700 /etc/master.passwd
使用字符标记来进行
# chmod u+w+r+x,go-w-r-x /etc/passwd
# chmod u+w+r+x,go-w-r-x /etc/master.passwd
中有多个重要文件需要控制访问权限,一定要控制好,否则将会构成重要威胁。


3. 和端口控制

端口开的越多就越给黑客多一个入侵的机会,越多,危险越大,因为你不知道那些是不是有潜在的漏洞或者又发现了新的漏洞,所以尽量少的,比如sendmail默认是打开的,那么些建议你把sendmail关闭,关闭防范是在 /etc/rc.conf中加上:
sendmail_enable = "NONE",如果设为"NO"那么只能够关闭掉pop3服务,不能关闭smtp的,所以要为"NONE"。
中最好除了我们能够看到的Apache、Mysql、vsFTPd、SSH之外不要打开其他任何端口和。基本的方式是使用netstat -a 查看打开的端口,然后从对应的端口来找相关的,比如我们这里应该只允许开的端口有 21, 22, 80, 3306等,如果有其他端口,那么一定要仔细检查,很可能是黑客的后门或者是会对安全构成威胁的。同时有些不需要****连接的话,只是需要本地的连接,比如Mysql,那么就可以关闭Socket****,这个将在Mysql安全中讲解,另外,可以通过防火墙来控制部分端口访问和连接状况,比如Mysql的3306端口只允许192.168.0.1访问,那么我们就在ipfw里添加规则:
ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in
这样就能够防止黑客来访问器上的Mysql服务。具体防火墙的将在下面“防火墙”中详细讲解。


4. 日志管理和控制 (未完)


5. 文件指纹检测

文件指纹就是我们文件的基本信息,比如文件权限、文件所属用户/组、文件最后修改日期、文件大小等等,这些都是重要信息,一般黑客入侵后都可能修改文件,那么文件指纹就不一样了。另外,文件的md5校验值也属于文件的指纹的一种。
为了防止黑客篡改中的部分核心文件,比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等,那么我们就可以考虑把部分重要文件进行备份,同时做一份目前有的文件的一个指纹保留,比如把 /etc,/bin, /usr/bin 目录下的文件进行指纹保留:
# ls -l /etc > /var/back/etc.txt
# ls -l /bin > /var/back/bin.txt
# ls -l /bin > /var/back/usrbin.txt
当然,还有就是给每个重要的文件加上md5校验值,如果觉得不对劲的时候就进行匹配,保证文件的安全。
你可以给你觉得需要做指纹备份的目录进行备份,一般这是为了以后被黑客入侵后的检测和恢复。比如可以通过文件被修改的时间来确定是不是被入侵,比如可以对比看 /etc/inetc.conf文件和备份的文件有什么不同来确定是不是了型后门等。


6. 指纹泄漏和防范 (未完)

一般黑客为了入侵某个,一定会先进行扫描等工作,扫描包括目标的端口开放情况和器使用程序和情况。比如很简单的手工检测Web服务的指纹:
# telnet target.com 80
那么就很可能返回Apache和PHP的版本信息,那么同时也可能使用扫描工具对Mysql、vsFTPd、SSH等的端口进行扫描,获取这些的指纹。多暴露一份信息,那么就多一份危险。那么办法就是把器上程序的Banner全部修改掉,从而能够迷惑黑客。

下面简单的说一些修改那些Banner的。

* Apache
修改httpd.conf文件,以下选项:
ServerSignature Off
ServerTokens Prod
上面的适用apache1***, apache 2.0这些都是默认 , 不过还是有server=Apache字样, 若要完全去掉需重新編译。
彻底地去掉banner, 修改httpd.h:
Include/httpd.h
Define SERVER_BASEVENDOR "Apache Group"
Define SERVER_PRODUCTVENDOR "Apache"
Define SERVER_BASEVERSION "1.3.27"
后从新编译Apache就能够完全去掉了。


* PHP
在php.ini中 expose_php = Off ,那么将无法在 http头信息中看到php的版本信息。

* Mysql


* vsFTPd
vsFTPd基本上是无法获取到一些关于vsFTPd的banner信息的,不过因为vsFTPd默认的banner信息是"Welcome to FTP Server!"对于高手来说,还是能够猜测到一点,所以我们要彻底改掉。修改vsFTPd的配置文件 vsftpd.conf 中的下面选项:
Ftpd_banner=xxxxx
把后面的xxxxx改为你想要的banner信息。


* SSH
好象FreeBSD下默认的SSH被telnet target.com 22 的时候会显示SSH和FreeBSD的信息,简直是个大祸害,什么都告诉别人了,但是目前为止我还不知道怎么修改,知道的高手请指点。


7. 内核安全

FreeBSD有个比较强的功能,就是能够定义内核的安全等级,主要是为了防止内核后门专门定制的,能通过不同的等级限制对内核的访问和对防火墙等的修改。我们首先要开启的安全等级,然后设定安全等级,我们打开 /etc/rc.conf:
# ee /etc/rc.conf
加入下面的内容:
kern_securelevel_enable="YES"
kern_securelevel="-1"
第一句是打开安全等级,第二句是定义等级。它一共五个等级,下面说说不同之处。
* kern_securelevel -1:这是默认级别,没有提供任何内核的保护错误;
* kern_securelevel 0:基本上作用不多,当你的刚启动就是0级别的,当进入多用户模式的时候就自动变成1级了。
* kern_securelevel 1:在这个级别上,有如下几个限制:
a. 不能通过kldload或者kldunload加载或者卸载可加载内核模块;
b. 应用程序不能通过/dev/mem或者/dev/kmem直接写内存;
c. 不能直接往已经装在(mounted)的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写;
d. 不能启动X-windows,同时不能使用chflags来修改文件属性;
* kern_securelevel 2:在 1 级别的基础上还不能写没装载的磁盘,而且不能在1秒之内制造多次警告,这个是防止DoS控制台的;
* kern_securelevel 3:在 2 级别的级别上不允许修改IPFW防火墙的规则。
如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用3级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。我们这里推荐使用 2 级别,能够避免比较多对内核攻击。


8. 安全优化

一般优化主要是重新编译内核,去掉一些不要的驱动等等,你可以参考我在我Blog上写的关于编译内核的文章。我们这里对和内核一些选项进行优化和安全。编辑 /etc/sysctl.conf 文件,在里面加入如下内容:(有注释)

#最大的待发送TCP数据缓冲区空间
net.inet.tcp.sendspace=65536

#最大的接受TCP缓冲区空间
net.inet.tcp.recvspace=65536

#最大的接受UDP缓冲区大小
net.inet.udp.sendspace=65535

#最大的发送UDP数据缓冲区大小
net.inet.udp.maxdgram=65535

#本地套接字连接的数据发送空间
net.local.stream.sendspace=65535

#加快性能的协议
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1

#最大的套接字缓冲区
kern.ipc.maxsockbuf=2097152

#中允许的最多文件数量
kern.maxfiles=65536

#每个进程能够同时打开的最大文件数量
kern.maxfilesperproc=32768

#当一台计算机发起TCP连接请求时,会回应ACK应答数据包。该选项是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速和低负载的情况下会略微提高性能,但在连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。
net.inet.tcp.delayed_ack=0

#屏蔽ICMP重定向功能
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0

#防止ICMP广播风暴
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0

#限制发送ICMP速率
net.inet.icmp.icmplim=100

#安全参数,编译内核的时候加了options TCP_DROP_SYNFIN才可以用
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1

#为1会帮助清除没有正常断开的TCP连接,这增加了一些带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接
net.inet.tcp.always_keepalive=1

#若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好
net.inet.ip.intr_queue_maxlen=1000

#防止DOS攻击,默认为30000
net.inet.tcp.msl=7500

#接收到一个已经关闭的端口发来的所有包,直接drop,如果为1则是只针对TCP包
net.inet.tcp.blackhole=2

#接收到一个已经关闭的端口发来的所有UDP包直接drop
net.inet.udp.blackhole=1

#为数据连接时提供缓冲
net.inet.tcp.inflight.enable=1

#如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表
net.inet.ip.fastforwarding=0

#kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用
#kern.polling.enable=1

#并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大
kern.ipc.somaxconn=32768

#禁止用户查看其他用户的进程
security.bsd.see_other_uids=0

#kernel安全级别
kern.securelevel=0

#记录下任何TCP连接
net.inet.tcp.log_in_vain=1

#记录下任何UDP连接
net.inet.udp.log_in_vain=1

#防止不正确的udp包的攻击
net.inet.udp.checksum=1

#防止DOS攻击
net.inet.tcp.syncookies=1

#仅为线程提供物理内存支持,需要256兆以上内存
kern.ipc.shm_use_phys=1

# 线程可使用的最大共享内存
kern.ipc.shmmax=67108864

# 最大线程数量
kern.ipc.shmall=32768

# 程序崩溃时不记录
kern.coredump=0

# lo本地数据流接收和发送空间
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536

# 数据包数据段大小,ADSL为1452。
net.inet.tcp.mssdflt=1460

# 为数据连接时提供缓冲
net.inet.tcp.inflight_enable=1

# 数据包数据段最小值,ADSL为1452
net.inet.tcp.minmss=1460

# 本地数据最大数量
net.inet.raw.maxdgram=65536

# 本地数据流接收空间
net.inet.raw.recvspace=65536

#ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接
net.inet.ip.fw.dyn_max=65535

#ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)
net.inet.ipf.fr_tcpidletimeout=864000



三、 程序的安全

到这里就是本文的重点所在了,我们将花费比较多的文字进行描述,当然,所以描述不一定是非常正确的,也希望能够对你有一些帮助。我们默认是运行了包括Apache、Mysql、vsFTPd,SSH等,我们以下进行一一讲解。


1. Apache的安全

Apache的核心就是在 httpd.conf 里面,我们的Apache的目录是在 /usr/local/apache2/ 下,那么我们的配置文件就是在 /usr/local/apache2/conf/httpd.conf ,如果你是使用ports等的,配置文件应该是在/etc或/usr/local/etc目录下。使用ee或者vi打开配置文件:
# ee /usr/local/apache2/conf/httpd.conf
下面我们就要进行比较多的安全了,基本的、端口、主目录等等就不说了,只讲与安全有关的。

(1)指定运行Apache服务的用户和组
这是比较重要的,因为权限是继承的,如果运行Apache服务的用户权限太高,那么很可能使得入侵者通过WebShell等就会对构成严重威胁。一般我们运行Apache的是nobody用户和nobody组。在httpd.conf的250-275行之间找到User和Group选项,比如我们默认如下(去掉了注释信息):


User nobody
Group #-1



(2) Apache的日志文件
Apache的日志文件是非常重要的,可以发现apache的运行状况和访问情况,对于判断入侵等有重要帮助。它的默认选项是:
# 错误日志存放目录,默认是存放在apache安装目录的logs下
ErrorLog logs/error_log
# 日志记录的级别,级别有debug, info, notice, warn, error, crit等,默认是“warn”级别
LogLevel warn
# 访问日志记录的格式,每一种格式都有不同的内容,根据你的需要进行定制,以获取最多访问信息
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# 使用上面格式的那一种,默认是使用common
CustomLog logs/access_log common

文件格式预定义的格式内容:
%a 远程用户IP
%A 本地httpd服务器的ip
%f 传送的文件名
%h 远程主机
%m 请求方式
%l identd给出的远程名
%p 连接的httpd端口号
%P 请求的httpd进程
%t 时间
%T 请求时间
你可以定制自己的日志格式,然后通过CustomLog logs/access_log common来进行调用。

注意,日志文件是由运行Apache的用户进行打开的,要注意该文件的安全,防止被黑客改写或者删除。

(3) Apache服务信息显示控制
在配置文件中有个选项是控制是否显示apache版本信息、主机名称、端口、支持的cgi等信息的:
ServerSignature On
默认为On,那么将显示所有信息:
我故意访问一个不存在的文件:http://www.target.com/404.html
那么就会在给的错误提示中显示如下信息:
Apache/2.0.53 (Unix) PHP/4.3.11 Server at target.com Port 80

所有Apache和PHP的信息暴露无遗,这是很不安全的。当然同时还有Off和EMail选项,Off将不显示任何信息,EMail将显示管理员的邮箱地址,建议设为Off或者EMail,这样能够避免泄漏Apache服务器的信息给黑客。

(4) 目录浏览
在httpd.conf中可以apache能够对一些没有索引文件的网页目录进行目录浏览:

Options Indexes FollowSymLinks
AllowOverride None

这是不合适也不安全的,建议不需要目录浏览:

Options FollowSymLinks
AllowOverride None


(5) 用户主页
httpd.conf中的:
UserDir public_html
能够使得每个使用的用户在自己的主目录下建立 public_html 目录后就能够把自己的网页放进该目录,然后通过:
http://www.target.com/~用户名/网页 就能够显示自己的网页,这是不安全的,而且对于我们器来讲,这没有必要,所以我们直接关闭该功能:
UserDir disabled
或者把该内容改名,改成 一个黑客比较不容易猜到的文件名,比如:
UserDir webserver_public_htmlpath
也可以只允许部分用户具有该功能:
UserDir enabled user1 user2 user3

(6) CGI执行目录
如果你的apache要执行一些perl等cgi程序,那么就要一下选项:
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
但是这也给了黑客利用一些不安全的cgi程序来进行破坏,所以如果你不需要cgi的话,建议关闭该选项:
#ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

(7) 控制PHP脚本只能访问指定目录
在httpd.conf添加如下内容:
php_admin_value open_basedir /usr/www
后面的路径是你需要PHP脚本能够访问的目录,如果PHP脚本想要访问其他目录将出项错误提示

Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<