> CentOS > CentOS安全 >

CentOS Web服务器安全配置指南

这一章我们将向大家介绍CentOS Web服务器安全设置,这也是很多提供Web服务功能安全设置的重中之重,作为服务器的管理员我们应该养成良好的系统维护习惯,勤打补丁,对于目录的权限设置也应该有一个非常清楚的了解,对于用户及用户组的管理也应该养成良好的习惯,如果你是刚看到这篇文章,可以先了解一下《CentOS系统安全配置指南》的部分。

1. 勤打补丁

在www.apache.org上的 changelog中都写着bug fix 、security bug的字样。所以,Linux管理员要经常关注相关网站的缺陷,及时升级系统或者打补丁。使用最高的和最新的安全版本对于加强Apache服务器的安全是至关重要的。将你的openssl升级打牌0.9.6e或更高的版本,伪造的密钥将起不了任何作用,也不能渗透到系统中。一些反病毒程序能够发现并杀死ssl病毒,但是蠕虫病毒可能产生变体,从而逃脱反病毒软件的追捕。重启Apache可以杀死这样的病毒,但是对于防止将来的感染没有什么积极的作用。

隐藏和伪装Apache的版本

通常,软件的漏洞和特定的版本是相关的,因此,版本号对黑客来说是最有价值的东西。

默认情况下,系统会把Apache版本模块都显示出来(在HTTP返回头中)。如果列举目录的话,会显示域名信息(文件列表正文),去除Apache的版本号的方法是修改配置文件http.conf。找打一下关键字:serversignature并将其设定为:

Serversignature off

Servertokens prod

然后重启服务器。

通过分析web服务器的类型,可以大致推测出操作系统的类型,比如,windows使用IIS,而Linux下最常见的是Apache。

默认的Apache配置里没有任何信息保护机制,并且允许目录浏览。通过目录浏览,通常可以获得类似“Apache/1.3.27 server at apache.linuxforum.net port 80”或者“apache/2.0.49(unix)PHP/4.38”这类的信息。

通过修改配置文件的servertokens参数,可以将Apache的相关信息隐藏起来。但是,Red Hat Linux运行的Apache是编译好的程序,提示信息被编译在程序里,要隐藏这些信息需要改动Apache的源代码,然后,重新编译安装程序,以替换里面的提示内容。

以Apache 2.0.50为例,编辑ap_release.h文件,修改“#define AP_SERVER_BASEPRODUCT\”Apache”\为“#define AP_SERVER_BASEPRODUCT\”micosoft-IIS 6.0” \”.修改完后,重新编译,安装Apache。

Apache安装按成后,修改httpd.conf配置文件,将“servertokens full”改成“servertokens prod”;将“Serversignature on”改成“Serversignature off”,然后存盘退出。重启服务器后,用工具进行扫面就会发现提示信息中显示的操作系统为windows。


 

2. 建立一个安全的目录结构

Apache服务器包括以下四个目录

·serverroot 保存配置文件(conf子目录)、二进制文件和其他服务器配置文件。

·documentroot 保存web站点内容,包括HTML文件和图片等。

·scripalias 保存CGI脚本文件。

·customlog 和errorlog 保存访问日志和错误日志。

建立设定这样一个目录,以上四个主要目录互相独立且不存在父子逻辑关系。

要求:serverroot目录应该配置成为只能由root用户访问,documentroot应该只能被管理web站点内容的用户访问和使用Apache服务器的Apache用户的Apache用户组访问。Scripalias目录只能由CGI开发人员和Apache用户访问。只有root用户可以访问日志目录。

3. 为Apache使用专门的用户和用户组

按照最小特权原则(是保证系统安全的最基本原则之一,它限制了使用者对系统及数据进行存取所需的最小权限,这样,即保证了用户能完成所需的操作,同时也确保非法用户或者异常操作所造成的损失最小化),需要Apache分配一个合适的权限,某个目录的权限错误不会影响到其他目录。

必须保证Apache使用一个专门的用户和用户组,不要使用系统预置的账号,比如nobody用户和nogroup用户组。因为只有root用户可以运行Apache,documentroot应该能够被管理web站点内容的用户访问和使用Apache服务器的Apache用户和用户组访问。所以,如果希望“A”用户在web站点发布内容,并且可以以httpd身份运行Apache服务器,通常可以这样:

Groupadd webteam

Usermod –G webteam A

Chown -R http.webteam /www/html

Chmod –R 2570 /www/htdocs

有root用户访问日志目录,这个目录的权限应设为:

Chown –R root .root /etc/logs

Chmod –R 700 /etc/htdcs


 

4. Web目录的访问策略

对于可以访问的web目录,要使用相对保守的途径进行访问,不要让用户查看任何目录索引列表。

(1)禁止使用目录索引

Apache服务器在接收到用户对一个目录的访问时,会查找directoryindex指令指定的目录索引文件,默认情况下该文件是index.html。如果该文件不存在,那么Apache会创建一个动态列表为用户显示该目录的内容。通常这样的设置会暴露web站点结构,因此需要修改配置文件来禁止显示动态目录索引。

修改配置文件httpd.conf:

Options –indexes followsymlinks

Options 指令通知Apache禁止使用目录索引。Followsymlinks表示不允许使用符号链接。

(2)禁止默认访问

一个好的安全策略是要禁止默认访问的存在,只对指定的目录开启访问权限,如果允许访问/var/www/html目录,则需要以下设置:

Order deny,allow

Allow from all

(3)禁止用户重载

为了禁止用户对目录配置文件(.htaccess)进行重载(修改)可以这样设置:

Allowoverride None

Apache服务访问控制方法

Apache的access.conf文件负责文件的访问设置,可以实现互联网域名和IP地址的访问控制。它包含一些指令,控制允许什么用户访问Apache目录,应该把deny from all 设置成初始化指令,再使用allow from 指令打开访问权限。如果允许192.168.1.1 到192.168.1.254的主机访问,可以这样设置:

Order deny,allow

Deny from all

Allow from pair 192.168.1.0/255.255.255.0

5. 配置Apache服务器访问日志

(1)相关配置文件说明

一个好的Linux管理员会密切关注服务器的日志系统,这些日志可以提供异常访问的线索。Apache可以记录所有的访问请求,同样,错误的请求也会记录。Apache配置文件中,需要关系和日志相关的配置文件有两个:

$ customLog /www/logs/access_log common # 记录对web站点的每个进入请求#

$ errorLog /www/logs/error_log common #记录产生错误状态的请求

Customlog用来指示Apache的访问日志存放的位置和格式。Errorlog用来指示Apache的错误日志存放的位置。对于不配置虚拟主机的服务器来说,只要直接在httpd.conf中查找customlog配置进行修改即可。而对于具有多个虚拟服务器的web服务器来说,需要分离各个虚拟服务器的访问日志,以便对各个虚拟服务器进行访问统计和分析,因此,需要在虚拟服务器配置中进行独立的日志配置。

(2)Web服务器日志轮循

Web服务器日志轮循比较好的方式有三种,第一种是利用Linux系统自身的日志文件轮循机制logrotate。第二种是利用Apache自带的日志轮循程序cronolog。对于大型web服务器来说,往往使用负载均衡技术提高web站点的服务能力,这样后台有多个服务器提供web服务,大大方便了服务器的分布规划和扩展。如果有多个服务器,需要对日志进行合并,统一进行统计分析。因此为了保证统计的精确性,需要严格按照每天的时段来自动生成日志。

(3)使用logrotate实现日志轮循

Linux系统自带的logrotate是专门对各种日志文件(syslog、mail)进行轮循的程序。该程序是由运行程序的服务crond每天凌晨4:02运行的。在/etc/cron.daily目录下可以看到logrotate文件:

# !/bin/sh/

$ user/sbin/logrotate/etc/logrotate.conf

每天凌晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循。

·使用rotatelogs实现日志轮循

Apache提供一个不把日志直接写入文件,而是通过管道发送给另外一个程序的能力。这样就大大加强了对日志文件的处理能力。这个通过管道得到的程序可以是任意程序,如日志分析器、压缩日志器等。要实现将日志写到管道的操作,只需要将配置文件中日志文件部分的内容替换成“|程序名”即可,例如:

#compressed logs

$ custmonlog “|/user/bin/gzip –c >>/var/log/access_log.gz” common

这样就可以使用Apache服务自带的轮循工具来对日志文件进行轮循。Rotatelogs基本是按照时间或者大小来控制日志的。

 

6. Apache服务器的密码保护

.htaccess文件是Apache服务器上一个配置文件。它是一个文本文件,可以使用任何文本编辑器来进行编写。.htaccess文件提供了针对目录改变配置的方法,即通过在一个特定的文档目录中放置一个包含一个或多个指令的文件(.htaccess),以作用于此目录及其所有子目录。.htaccess的功能包括设置网页密码、设置发生错误时出现的文件、改变首页的文件名、禁止读取文件名、重新导向文件、加上MIME类别、禁止;列出目录下的文件等。注意,.htaccess文件是一个完整的文件名。而不是**.htaccess或者其他格式。另外,上传.htaccess文件时,必须使用ASCII文件格式,并使用chmod命令改变权限为644(RW_R_R_)每一个放置.htaccess文件的目录和其子目录都会被.htaccess影响。例如,在/abc/目录下放置了一个.htaccess文件,那么/abc/和/abc/def内所有的文件都会被它所影响,这一点是很重要的。

(1)建立.htaccess文件

首先在设置存取控制的目录(如htdocs)下建立一个文件,文件名可以自定。一般服务器都会设置成.htpasswd,该文件是不能由HTTP读取的。.htpasswd文件中的每一行代表一个使用者,使用者的名字及经过加密的密码以冒号:分隔。

(2).htaccess文件的保护

.htaccess文件内容如下:

Authtype basic

Authuserfile /usr/home/***/htdocs/.acname1

Authgroupfile /usr/home/***/htdocs/.abcname2

Authname information

require valid-user

其中第二三行的***可以改成个人的ftp登录名。.abcname1和.abcname2可以是任意文件名,如.htpasswd,但不可以是.htaccess。将.htaccess上传到要进行木马保护的目录中,.htaccess文件最后的“require”告诉服务器哪些用户可以进入。Requre valid-user是指只要是.htpassword中的任何一个都可以进入。也可以指定名单上某人或者某几个人可以通过。

(3)增加新的许可用户

进入htdocs目录,在命令行状态下输入以下命令:

Echo > .abcname1

/var/www/bin/htpasswd.abcname1 abc

这样就可以生成.abcname1文件

Abc代表要增加的用户名。输入此命令后,系统会提示输入此用户的密码,这样该用户名就生效了。以后要是再增加用户,运行第二行的命令时换一个用户名即可。如果这个用户存在,则会提示更换密码。

(4)建立允许访问的组

组的设置方法是建立一个名为.htgroup的文本文件,内容如下:

Groupname1: username1 username2 username3

Groupname2: username1 username3 username4

并在.htaccess文件中加上“authgroupfile/absolute/path/.htgroup”以ASCII模式上传所有文件后,该目录下的文件都会被保护起来。

(5)禁止读取文件

如果将某些内容如密码,存在一个文件中,那么别人只要知道该文件相对应的位置,就可以一目了然。这样很不安全,其实只要在.htaccess文件中加入以下几行即可:

Order allow ,deny

Deny from all

总之,通过.htaccess文件来保护网站更为安全和方便。因为它不像利用程序来实现密码保护时,有可能通过猜测的方法来获得密码。利用.htaccess文件实现密码保护,一般是很难被破解的。

7. 减少CGI和SSI风险

CGI脚本的漏洞已经成为web服务器的首要安全隐患,通常是程序编写CGI脚本中产生了许多漏洞。控制CGI脚本的漏洞除了在编写时要注意输入数据的合法性检查、对系统调用的谨慎使用等因素外,首先使用CGI脚本所有者的uid是怎样的。这些CGI程序即使存在一些漏洞,那么其危害也只是限于该uid所能够访问的文件,也就是说,,这样只能伤害用户的文件而不会对整个系统带来危害。

通过安装使用suEXEC的应用程序,可以为Apache服务提供CGI程序的控制支持,可以把suEXEC看做一个包装器,在Apache接到对CGI程序的调用请求后,它将这个嗲用请求交给suEXEC来负责完成具体的调用,并且其从suEXEC获得返回结果。

suEXEC能解决一些安全问题,但也会降低服务性能,因为它只能运行在CGI版本的PHP上,而CGI版本比模块版本运行速度慢。原因是模块版本使用了线程,而CGI使用的进程。

因此,建议在安全性能要求比较高的时候使用suEXEC,为此要以牺牲速度为代价,

要减少SSI脚本风险,如果使用EXEC等SSI命令运行外部程序,也会存在类似CGI脚本程序的危险,除了内部调试程序时都应当可以使用option命令来禁止其使用。

让Apache在“监狱”中运行

所谓监狱,是指通过chroot机制来更改某个软件运行时所看到的根目录的权限。即将某软件运行限制在指定目录中,保证该软件只能对该目录或其子目录文件有所动作,从而保证整个服务器的安全。这样即使被破坏或入侵,损失也不会很大。

Chroot是内核中一个系统调用,软件可以通过调用库函数chroot,来更改某个进程所能看到的根目录,比如,Apache软件安装在/usr/local/httpd目录下,以root用户启动Apache,这个root权限的父进程会派生多个以nobody权限运行的子进程。这样,父进程监听80端口的TCP数据流,然后根据内部算法将这个请求分配给某个子进程来处理,这样Apache子进程所处的目录继承父进程。但是一旦目录权限设定失误,被攻击的Apache子进程可以访问/usr/local、/usr 、/tmp甚至整个系统。因为Apache进程所处的根目录仍为整个文件系统的根,如果能使用chroot将Apache限制在/usr/local/httpd,那么,Apache所能够存取的文件都是/usr/local/httpd下的文件,创建chroot监狱的作用就是将进程权限限制在文件系统目录树中的某一子树。

8. 使用SSL加固Apache

使用具有SSL功能的web服务器,可以提高网站的安全性能,SSL协议工作在Linux的TCP/IP协议和HTTP协议之间。

SSL使用加密方法来保护web服务器和浏览器之间的信息流。SSL不仅用于加密在互联网上传输的数据流,而且还能提供双方的身份验证,这样就可以安全的在线购物而不必担心别人窃取信用卡的信息。这种特性使得SSL适用于那些交换重要信息的地方。

Apache服务器使用SSL通常有两种选择,即主服务器和虚拟web站点。

如果使用Linux在3.0~4.0时,那么可以直接使用命令“rpm –qa|grep mod_ssl”检查,如果没有安装,那么可以以root的身份登录,输入命令:

System-config-packages

利用GUI套件管理工具的网页服务器,点击“详细信息”,然后勾选“mod_ssl”,提示放入适当的光盘,便可以完成安装工作。

之后,就可以以https开头的URL来访问安全的页面了。

9. Apache服务器防范DoS攻击

可同通过编辑httpd.conf文件的具体参数来防范拒绝服务攻击,或减少伤害程度。

·Timeout值:设置成300或更少

·KeepAlive:设置成 KeepAlive ON

·KeepAliveTimeout值:设置为15或更少

·StartServers:介于5和10之间

·MinSpareServers值:介于5和10

·MaxSpareServers值:为10或以下

·MaxKeepAliveRequests的值:不等于0

·MaxSpareServers值:为10或以下

·MaxClients值:256或更少

(责任编辑:IT)