安全矩阵

 找回密码
 立即注册
搜索
查看: 4944|回复: 0

PHP安全:Apache的使用安全

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-11-2 20:48:18 | 显示全部楼层 |阅读模式
原文链接:PHP安全:Apache的使用安全

Apache是一个优秀的全能Web服务器,作为第一个可用的Web应用服务器,随着互联网的兴起,由于它免费、稳定、性能卓越、功能强大,且跨平台和安全性被广泛使用,因此成为世界上使用排名前列的Web服务器软件。


1、运行安全

最小化原则是项目安全中最基本的原则之一,限制使用者对系统及数据进行存取所需要的最小权限,保证用户可以完成任务,同时也确保被窃取或异常操作所造成的损失尽可能小。在刚刚安装完Apache后,Apache服务通常是由root账户来运行的。如果Apache进程具有root用户特权,那么它将给系统的安全构成很大的威胁,应确保Apache进程以尽可能低的权限用户来运行。

通常使用nobody来运行Apache服务。nobody是一个普通账户,拥有很低的系统权限,同时这个用户是无法直接登录系统的,攻击者很难通过漏洞连接到你的服务器。因此nobody账户拥有比较高的安全性。

防止越权使用造成非法攻击,通过修改httpd.conf文件中的User选项,以nobody用户运行Apache达到相对安全的目的。

#vim /etc/ptthd.conf
User nobody

为了确保所有的配置是适当和安全的,同时需要严格控制Apache主目录的访问权限,使非root用户不能修改该目录中的内容。Apache的主目录对应Apache Server配置文件httpd.conf的Server Root控制项。

#vim /etc/ptthd.conf
Server Root /usr/local/apache

为了避免用户直接执行Apache服务器中的执行程序,应防止越权使用造成非法攻击,导致服务器系统的公开化。在配置文件access.conf或httpd.conf中的Options指令处加入Includes NO EXEC选项,用以禁用Apache Server中的执行功能。

#vim /etc/ptthd.conf
options Includes NO EXEC

2、访问安全

如果只希望让某个网段或者某个IP接入,可以在Apache配置文件中进行设置。如果只允许某个IP端,如10.10.0.0/16,对Web项目进行访问,可以进行下面的设置。

#vim /etc/ptthd.conf
Order Deny,Allow
Deny from all
Allow from 10.10.0.0/16
Or by IP:
Order Deny,Allow
Deny from all
Allow from 10.10.1.1

如果是内部服务,除了要限制外部IP进行访问外,还建议更改Apache服务器默认端口号,防止非法访问。如果有多个网卡可指定出口网卡IP地址,应防止其他网卡IP入口对其访问。如果是研发环境,只允许自己进行访问,可以设置为127.0.0.1:8000。

#vim /etc/ptthd.conf
Listen 127.0.0.1:8000

3、隐藏Apache版本号

图1中,默认Apache是显示版本号信息的,如果Apache软件有漏洞,攻击者很容易通过版本号来定位软件漏洞,对系统发起攻击。

图1  Apache版本号

通过修改Apache配置文件对版本号进行隐藏,将ServerTokens默认的Full修改为Prod,ServerSignature默认的On修改为Off。

ServerTokens Prod
ServerSignature Off

4、目录和文件安全

为了防止非法访问、恶意攻击,应禁止Apache访问Web目录之外的任何文件。

# 设置不可访问目录
<Directory "/">
Order Deny,Allow
Deny from all
</Directory>
# 设置可访问目录
<Directory "/wwwroot">
Order Allow,Deny
Allow from all
</Directory>

研发人员由于失误常常把SVN目录上传至服务器,可以通过Apache配置禁止访问.svn目录,降低因为敏感信息泄露而带来的风险。

在<Directory"/wwwroot"></Directory>中添加以下代码。

# 限制访问SVN目录
<LocationMatch "/(\.svn)/">
Order allow,deny
Deny from all
</LocationMatch>

同时限制访问.bak、.back、.old、.ini、.conf、filename~等类型的文件,降低因为敏感信息泄露而带来的风险。

在<Directory"/wwwroot"></Directory>中添加以下代码。

<FilesMatch \.(?i:bac?k|old|ini|conf|.*?~)$>
Order allow,deny
Deny from all
</FilesMatch>

5、防止目录遍历

图2中,当未设置Apache的默认入口文件时,Apache会将服务端的Web目录结构输出到客户端浏览器,恶意攻击者将整个Web目录结构进行遍历,同时获取一些非授权访问的文件,给服务端带来威胁。

图2  Apache目录遍历

为了防止目录列表展示,通常需要禁止Apache以列表形式显示Web目录下的文件。在Apache配置文件中找到以下代码。

Options Indexes FollowSymLinks

Indexes的作用就是当该目录下没有默认入口文件时,就显示目录结构。修改为如下配置,将Options Indexes FollowSymLinks中的Indexes去掉。

<Directory "/">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

或者在Indexes前添加减号修改为-Indexes,即可禁止Apache显示该目录结构。

<Directory "/">
Options -Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

除了修改Apache的配置文件外,还可以在Web根目录下新建或修改.htaccess配置文件来对目录结构进行隐藏。

<Files *>
Options -Indexes
</Files>

同时设置Apache的默认页面。一般使用index.html作为默认页面,可根据情况改为其他文件。

<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

6、日志配置

为了及时发现项目中的问题,查找出是否有非法访问或者恶意攻击,一定要开启Apache的日志记录功能,对运行错误、用户访问行为进行记录,记录内容包括时间、用户使用的IP地址等内容。编辑httpd.conf配置文件,设置日志记录文件、记录内容、记录格式。重要服务器除本机保存日志外,还需将日志文件发送到文件服务器保存。

LogLevel notice # 日志的级别,默认是warn,这里使用notice级别日志输出比较详细
ErrorLog "logs/error.log" # 错误日志的保存位置
CustomLog "logs/access.log" # 访问日志的保存位置
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"%I %O" combinedio
</IfModule>
CustomLog "logs/access.log" combined
</IfModule>

LogLevel用于调整记录在错误日志中的信息的详细程度,建议设置为notice。

ErrorLog指令设置错误日志文件名和位置。错误日志是最重要的日志文件,Apache httpd将在这个文件中存放诊断信息和处理请求中出现的错误。若要将错误日志送到Syslog,则设置ErrorLog syslog。

CustomLog指令设置访问日志的文件名和位置。访问日志中会记录服务器处理的所有请求。

LogFormat和CustomLog的格式化参数是一个字符串,这个字符串会在每次请求发生的时候,被记录到日志文件中。表1列出了Apache日志格式字符串的含义。


表1  Apahe日志格式字符串的含义

7、413错误页面跨站脚本漏洞

Apache HTTP服务器用于处理畸形HTTP请求时存在漏洞,远程攻击者可能利用此漏洞获取脚本源码。

如果远程用户提交的是畸形HTTP请求和无效长度数据,如表2中的ContentLength数据,就会导致Apache HTTP服务器返回客户端所提供的脚本代码,提交了无效长度数据后,Apache就会返回413 Request Entity Too Large错误,导致在用户浏览器会话中执行任意HTML和脚本代码。

表2  错误的Content-Length示例

目前的解决方法是向Apache配置文件httpd.conf添加ErrorDocument 413语句,禁用默认的413错误页面。

8、上传目录限制

如果应用有上传文件功能,则需要把上传目录的PHP解析权限去除,降低安全风险。在<Directory/Upload>标签中设置如下。

php_admin_flag engine off



php_flag engine off


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 09:27 , Processed in 0.012345 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表