环境:
1.
CentOS6.4 x86_64位 采用最小化安装,系统经过了基本优化篇
2.
apache版本:httpd-2.4.6
3.
apr版本:apr-1.4.8
4.
apr-util版本:apr-util-1.5.2
5.
pcre版本:pcre-7.8
6.
源码包存放位置:/server/tools
7.
源码包编译安装位置:/etc/
local
/软件名称
一、源码官方下,补丁及时打
正如我们在apache部署篇讲到的我们需要对下载的源码包进行验证一样,我们在挑选apache源码安装包的时候,一定要去官网,不要去乱七八糟的站点进行下载,防止源码包被别有用心的人动过手脚,导致后面对公司业务造成不必要损失。
另外为了apache的安全性和性能考虑,我们一定要多多关注apache的官网的补丁发布情况,一旦有新的补丁,我们一定要及早打上。特别是一些安全补丁,防止受到损失。
二、屏蔽apache版本等敏感信息
1)我们在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,并解开注释
1.
[root@c64-web /]
# grep "httpd-default.conf" /usr/local/apache/conf/httpd.conf
2.
#Include conf/extra/httpd-default.conf
3.
[root@c64-web /]
# sed -i 's#\#Include conf/extra/httpd-default.conf#Include conf/extra/httpd-default.conf#g' /usr/local/apache/conf/httpd.conf
注意:编译安装的情况下,只有此行解开注释了,后面的修改才能生效。
2)打开httpd-default.conf文件,修改如下两个地方
1.
[root@sunsky /]
# grep Server conf/extra/httpd-default.conf|grep -v "#"
2.
ServerTokens full
3.
ServerSignature Off
修改为
1.
ServerTokens Prod
2.
ServerSignature Off
经过上面的修改,当你在curl-Iwww.sunsky.pw的时候,还是会出现下面的信息
1.
Server: Apache
彻底让版本等敏感信息消失
如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件
1.
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
2.
#define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
3.
#define AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
4.
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
5.
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
6.
#define AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
7.
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
上述列出的行,我已经给出了注释,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。
三、更改apache的默认用户
我们通过更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线程的控制。
1.
[root@c64-web /]
# useradd -M -s /sbin/nologin apache 创建apache用户
编辑apache配置文件,修改默认的用户。
1.
[root@c64-web /]
# vim /usr/local/apache/conf/httpd.conf
2.
User apache
#更改默认的daemon用户为apache用户
3.
Group apache
#更改默认的daemon用户为apache用户
四、apache目录及文件权限设置
在生产环境的网站架构中,我们应把资源文件,例如用户上传的图片及附件等和程序做好分离,最好是把上传程序也分离开来。这样才能更方便我们做好授权,保证apache服务和整个服务器安全。
这里我们设置apache的网站目录属主和属组是root,权限是755,文件的权限为644。
1.
lrwxr-xr-x 1 root root 23 11月 5 02:04 apache -&
gt
; /usr/
local
/apache-2.4.6
2.
drwxr-xr-x 14 root root 4096 11月 5 12:37 apache-2.4.6
并且,在对日志的授权商,我们要将属主和属组都设置为root,权限设置为700。
1.
drwx------ 2 root root 4096 11月 5 02:46 logs
由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这里设置700是不影响日志记录了。这也是日志记录的最安全的方法。
五、配置cronolog进行日志轮询
由于apache自带的日志轮询工具rotatelogs,据专家说在进行日志切割时容易丢日志,因此我们通常使用cronolog进行日志轮询。
1、下载并安装cronolog
1.
[root@sunsky /]
# cd /server/tools/
2.
[root@sunsky tools]
# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
3.
[root@sunsky tools]
# tar zxf cronolog-1.6.2.tar.gz
4.
[root@sunsky tools]
# cd cronolog-1.6.2
5.
[root@sunsky cronolog-1.6.2]
# ./configure
6.
[root@sunsky cronolog-1.6.2]
# make&&make install
2、配置apache使用cronolog
由于实验用的apache开启了虚拟主机功能,所以以下范例配置都在虚拟主机中进行。
1.
[root@sunsky cronolog-1.6.2]
# vim /usr/local/apache/httpd/extra/httpd-vhosts.conf
将配置文件中的CustomLog和ErrorLog替换为下面的(由于我们要对多站点,所以这里要替换两个虚拟主机的,并且将日志存放名字做有效的区分才好)
1.
CustomLog
"|/usr/local/sbin/cronolog /app/logs/sunsky_access_%Y%m%d.log"
combined
2.
ErrorLog
"|/usr/local/sbin/cronolog /app/logs/sunsky_error_%Y%m%d.log"
更多日志格式参考:
1.
按天轮询(生产环境常见用法,推荐使用):
2.
CustomLog
"|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log"
combined
3.
按小时轮询(生产环境较常见用法):
4.
CustomLog
"|/usr/local/sbin/cronolog /app/logs /access_www_ %Y%m%d%H.log"
combined
六、错误页面优雅显示
为了提升网站的用户体验,避免404,403之类的丑陋的默认错误提示出现,我们需要对错误页面进行优化,让他们变的漂亮一点。错误页面不仅在于告诉用户访问出现了问题,而且需要引导用户到正确的页面。
错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:
第一种:在apache的主配置文件httpd.conf中的<Directory></Directory>标签内添加ErrorDocument配置。
1.
[root@sunsky /]
# vi /usr/local/apache/conf/httpd.conf
2.
&
lt
;Directory
"/www/html"
&
gt
;
3.
AllowOverride None
4.
Options None
5.
Require all granted
6.
ErrorDocument 404 /404.html
#将404错误跳转到/www/html下的404.html页面上
7.
&
lt
;/Directory&
gt
;
第二种方法:在apache的虚拟主机配置文件httpd-vhost.conf中的<VirtualHost*:80></VirtualHost>中添加ErrorDocument配置。
01.
&
lt
;VirtualHost *:80&
gt
;
02.
ServerAdmin 274546888@qq.com
03.
DocumentRoot
"/www/html"
04.
ServerName www.sunsky.pw
05.
ServerAlias sunsky.pw
06.
CustomLog
"|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log"
combined
07.
ErrorLog
"|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
08.
ErrorDocument 404 http://www.sunsky.pw ;
#将404错误跳转到http://www.sunsky.pw页面上
09.
&
lt
;/VirtualHost&
gt
;
从上面的两种解决方案,我们可以看出ErrorDocument的命令格式如下
1.
ErrorDocument 错误代码 跳转到的页面或文件
另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。另外文件必须在站点目录内,不然会报错。
在跳转到文件的测试中,我用全路径和别名路径进行测试,当把404错误页面跳转文件放到其他目录的时候,不报错,但是页面跳转不过去。若跳转为未链接,则不影响。