Apache服务安全加固及Apache优化

2023-11-17

转载来源 :https://help.aliyun.com/knowledge_detail/52981.html

一、账号设置

以专门的用户帐号和用户组运行 Apache 服务。

1、根据需要,为 Apache 服务创建用户及用户组。如果没有设置用户和组,则新建用户,并在 Apache 配置文件中进行指定。

创建 Apache 用户组。

groupadd apache

创建 Apache 用户并加入 Apache 用户组。

useradd apache –g apache

将下面两行设置参数加入 Apache 配置文件 httpd.conf 中:

User apache
 Group apache

2、检查 httpd.conf 配置文件中是否允许使用非专用账户(如 root 用户)运行 Apache 服务。

默认设置一般即符合要求。Linux 系统中默认使用 apache 或者 nobody 用户,Unix 系统默认使用 daemon 用户。

二、授权设置

严格控制 Apache 主目录的访问权限,非超级用户不能修改该目录中的内容。

1、Apache 的主目录对应于 Apache Server配置文件 httpd.conf 中的 Server Root 控制项,应设置为:

 Server Root /usr/local/apache
  • 判定条件: 非超级用户不能修改该目录中的内容。
  • 检测操作: 尝试进行修改,看是否能修改该目录中的内容。

该目录一般设置为 /etc/httpd 目录,默认情况下属主为 root 用户,其它用户不能修改该目录中的文件。默认设置一般即符合要求。

2、严格设置配置文件和日志文件的权限,防止未授权访问。

执行chmod 600 /etc/httpd/conf/httpd.conf命令设置配置文件为属主可读写,其他用户无读写权限。
执行chmod 644 /var/log/httpd/*.log命令设置日志文件为属主可读写,其他用户拥有只读权限。

注意:

  • /etc/httpd/conf/httpd.conf 配置文件的默认权限是644,可根据需要修改权限为600。
  • /var/log/httpd/*.log 日志文件的默认权限为644,默认设置即符合要求。

三、日志设置

Apache 设备应配置日志功能,对运行错误、用户访问等事件进行记录,记录内容包括时间,用户使用的 IP 地址等内容。

修改 httpd.conf 配置文件,设置日志记录文件、记录内容、记录格式。

  • 错误日志:
  LogLevel notice #日志的级别
  ErrorLog //logs/error_log #日志的保存位置(错误日志)
  • 访问日志:
  LogFormat %h %l %u %t \”%r\” %>s %b “%{Accept}i\”%{Referer}i\” \”%{User-Agent}i\””
  combined
  CustomLog //logs/access_log combined (访问日志)

注意:

  • ErrorLog指令设置错误日志文件名和位置。错误日志是最重要的日志文件。Apache httpd
    程序将在这个文件中存放诊断信息和处理请求中出现的错误。若要将错误日志传送到 Syslog,则执行ErrorLog syslog命令。
  • CustomLog指令指定了保存日志文件的具体位置以及日志的格式。访问日志中会记录服务器所处理的所有请求。
  • LogFormat命令用于设置日志格式,建议设置为 combined 格式。
  • LogLevel命令用于调整记录在错误日志中的信息的详细程度,建议设置为 notice。日志的级别,默认是 warn 级别,notice
    级别比较详细,但在实际中由于日志会占用大量硬盘空间。

四、禁止访问外部文件

禁止 Apache 访问 Web 目录之外的任何文件。

1、修改 httpd.conf 配置文件。

 Order Deny,Allow
 Deny from all

2、设置可访问的目录。

 Order Allow,Deny
 Allow from /web

说明: 其中 /web 为网站根目录。

3、默认配置如下,可根据您的业务需要进行设置。

 Options FollowSymLinks
 AllowOverride None

五、禁止目录列出

目录列出会导致明显信息泄露或下载,建议禁止 Apache 列表显示文件。在 /etc/httpd/httpd.conf 配置文件中删除 Options 的 Indexes 设置即可。

1、修改 httpd.conf 配置文件:

 #Options Indexes FollowSymLinks #删掉Indexes
 Options FollowSymLinks
 AllowOverride None
 Order allow,deny
 Allow from all

将Options Indexes FollowSymLinks中的Indexes去掉,就可以禁止 Apache 显示该目录结构。Indexes的作用就是当该目录下没有 index.html 文件时,自动显示目录结构。

重新启动 Apache 服务。

六、错误页面重定向

Apache 错误页面重定向功能可以防止敏感信息泄露。

1、修改 httpd.conf 配置文件:

ErrorDocument 400 /custom400.html
 ErrorDocument 401 /custom401.html
 ErrorDocument 403 /custom403.html
 ErrorDocument 404 /custom404.html
 ErrorDocument 405 /custom405.html
 ErrorDocument 500 /custom500.html

注意: Customxxx.html 为要设置的错误页面。

2、重新启动 Apache 服务。

注意: 此项配置需要应用系统设有错误页面,或者不在 httpd 中设置,而完全由业务逻辑实现。

七、拒绝服务防范

根据业务需要,合理设置 session 时间,防止拒绝服务攻击。

1、修改 httpd.conf 配置文件:

 Timeout 10 #客户端与服务器端建立连接前的时间间隔
 KeepAlive On
 KeepAliveTimeout 15 #限制每个 session 的保持时间是 15 秒 注:此处为一建议值,具体的设定需要根据现实情况。

2、重新启动 Apache 服务。

注意: 默认值为Timeout 120,KeepAlive Off,KeepAliveTimeout 15,该项设置涉及性能调整。

八、隐藏 Apache 的版本号

隐藏 Apache 的版本号及其它敏感信息。

修改 httpd.conf 配置文件:

ServerSignature Off ServerTokens Prod

九、关闭 TRACE功能

关闭 TRACE 功能,防止 TRACE 方法被访问者恶意利用。

在 /etc/httpd/conf/httpd.conf 配置文件中添加以下设置参数:

TraceEnable Off

注意: 该参数适用于 Apache 2.0 以上版本。

十、禁用 CGI

如果服务器上不需要运行 CGI 程序,建议禁用 CGI。

如果没有CGI程序,可以修改 /etc/httpd/conf/httpd.conf 配置文件,把 cgi-bin 目录的配置和模块都进行注释。

#LoadModule cgi_module modules/mod_cgi.so
#ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
#
#AllowOverride None
# Options None
#Order allow,deny
#Allow from all
#

十一、绑定监听地址

服务器有多个 IP 地址时,只监听提供服务的 IP 地址。

执行以下命令查看是否绑定 IP 地址。

 cat /etc/httpd/conf/httpd.conf|grep Listen

修改 /etc/httpd/conf/httpd.conf 配置文件。

 Listen x.x.x.x:80

监听功能默认监听所有地址,如果服务器只有一个 IP 地址可不修改该项设置,如果有多个 IP 可根据需要进行设置。

十二、删除缺省安装的无用文件
删除缺省安装的无用文件。

  • 删除缺省 HTML 文件:
  # rm -rf /usr/local/apache2/htdocs/*
  • 删除缺省的 CGI 脚本:
  # rm –rf /usr/local/apache2/cgi-bin/*
  • 删除 Apache 说明文件:
  # rm –rf /usr/local/apache2/manual
  • 删除源代码文件:
# rm -rf /path/to/httpd-2.2.4*
  • 删除 CGI。
    可根据实际情况删除,一般情况下 /var/www/html /var/www/cgi-bin 默认就是空的。

注意: 根据安装步骤不同和版本不同,某些目录或文件可能不存在或位置不同。

十三、禁用非法 HTTP 方法

禁用 PUT、DELETE 等危险的 HTTP 方法。

修改 httpd.conf 配置文件,只允许 get、post 方法。

<Location />  
<LimitExcept GET POST CONNECT OPTIONS> 
  Order Allow,Deny 
  Deny from all 
</LimitExcept> 
</Location>

您可根据需要进行设置,如果需要用到 PUT 或 Delete 等 HTTP 方法的话,在 /etc/httpd/conf/httpd.conf 配置文件中相应添加即可。

apache日志分析

1.查看apache的进程数

ps -aux | grep httpd | wc -l

2.分析日志查看当天的ip连接数

cat default-access_log | grep “10/Dec/2010| awk ‘{print $2}| sort | uniq -c | sort -nr

3.查看指定的ip在当天究竟访问了什么url

cat default-access_log | grep “10/Dec/2010| grep “218.19.140.242| awk ‘{print $7}| sort | uniq -c | sort -nr

4.查看当天访问排行前10的url

cat default-access_log | grep “10/Dec/2010| awk ‘{print $7}| sort | uniq -c | sort -nr | head -n 10

5.看到指定的ip究竟干了什么

cat default-access_log | grep 218.19.140.242 | awk ‘{print $1″\t”$8}| sort | uniq -c | sort -nr | less

6.查看访问次数最多的几个分钟(找到热点)

awk ‘{print $4}default-access_log |cut -c 14-18|sort|uniq -c|sort -nr|head

十四、Apache解析漏洞(换行解析+多后缀解析)复现

Apache两个解析漏洞环境在httpd目录下:

一个是换行解析漏洞(CVE-2017-15715),另一个是多后缀解析。(ssi的rce本次不复现)
在这里插入图片描述

复现一:换行解析

一、原理

Apache可以通过mod_php来运行PHP网页。

其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,解析到下面例子时候:

  1.php\x0A

将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。(%0a即编码中的换行符,于是这个解析漏洞叫换行解析)

二、复现过程

首先进入到换行解析漏洞环境目录下开启环境:

service docker start

docker-compose build

docker-compose up -d

在这里插入图片描述
接着访问虚拟机ip:8080即可:
在这里插入图片描述
先上传一个简单的小马看看:
在这里插入图片描述

被拦了,开始尝试下换行符后缀:

在Hex编码下查看,该处插入(insert byte)0a作为换行符
在这里插入图片描述
放包,访问 ip/2.php%0A:
在这里插入图片描述
phpinfo():
在这里插入图片描述
退出docker环境:
docker-compose down

在这里插入图片描述

复现二:多后缀解析

一、原理

Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如,如下配置文件:

AddType text/html .html
AddLanguage zh-CN .cn

其中,.html后缀增加了media-type,值为text/html;给.cn后缀增加了语言,值为zh-CN。此时,如果用户请求文件index.cn.html,他将返回一个中文的html页面。

以上就是Apache多后缀的特性。

如果运维人员给.php后缀增加了处理器:

AddHandler application/x-httpd-php .php

那么,在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单的解析漏洞。

二、复现过程

同上,进入多后缀解析漏洞的目录,开启环境:
在这里插入图片描述
访问 虚拟机ip:
在这里插入图片描述
先上传小马:被拦。
在这里插入图片描述
接着利用多后缀解析的漏洞,修改文件后缀名:.php.jpg

成功,并返回文件的路径
在这里插入图片描述
访问ip/路径,并输入phpinfo:
在这里插入图片描述

Apache优化方法

1、控制MaxClients的设置,以避免服务器产生太多的子进程而发生交换。

进程间的数据交换会占用很大内存,数据交换产生的滞后使用户总感觉”不够快”,所以用户就可能去按”停止”和”刷新”,从而带来更大的负载。一般建议小网站将MaxClients设置为12~24。

2、选择更好的硬件,CPU、内存、硬盘等等

这句很鸡肋啦,如果有更多的银子,谁不愿意换更好的呢?

3、定期更新操作系统,打上系统补丁;如果你的操作系统支持sendfile()系统调用,则务必安装带有此功能的版本或补丁

在支持sendfile的系统中,Apache2可以更快地发送静态内容而且占用较少的CPU时间。

4、HostnameLookups设置为off

尽量较少DNS查询的次数。如果你使用了任何”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主机名而不是IP地址),则代价是要进行两次DNS查询(一次正向和一次反向,以确认没有作假)。所以,为了得到最高的性能,应该避免使用这些指令(不用域名而用IP地址也是可以的)。

5、为Directory加上FollowSymLinks

如果网站空间中没有使用 Options FollowSymLinks ,Apache就必须执行额外的系统调用以验证符号连接。例如:在请求”/index.html”时,Apache将对”/www”、”/www/htdocs”、”/www/htdocs/index.html”执行lstat()调用。而且lstat()的执行结果不被缓存,因此对每一个请求都要执行一次。

6、将AllowOverride设置为None

对于使用虚拟主机的朋友可能会觉得不方便,这样设置将会使.htaccess中的设置失效,如果实在需要,并且在有条件的情况下,请在conf配置文件中直接写入rewrite规则

7、禁用内容协商

尽管在实践中,内容协商的好处大于性能的损失,如果你很在意那一点点的性能损失,则可以禁止使用内容协商。但是仍然有个方法可以提高服务器的速度,就是不要使用通配符。

8、MaxRequestsPerChild设置为非0以防止内存泄漏

MaxRequestsPerChild用于控制apache子进程在何时销毁,默认为0,代表永不销毁子进程,这可能会存在内存泄漏的风险,建议设置为10000

9、KeepAlive与KeepAliveTimeOut

如果你使用的使mpm_prefork模式(apache默认安装),那么建议你将KeepAlive设置为off;因为,开启keepalive会为每个客户端建立一个连接,prefork不会创建线程,估计100个用户同时访问你的网站,apache就会挂了~,如果你实在想开启,那么请将KeepAliveTimeOut 时间设置更短些,例如5,默认是60秒呢

10、不要静态编译apache

尽管会有很多人和你说静态编译的好处,同时,你自己也想自己编译一把,以体验乐趣~但是,将模块已静态方式编译进apache绝对不是一个好选择,尤其是对于缺银子的站长们来说,一个配置不当,apache会在启动时就占用光你所有的内存,最后拖垮服务器。

参考链接 :

Apache服务安全加固 :https://help.aliyun.com/knowledge_detail/52981.html

apache日志分析 :https://www.jianshu.com/p/02ac1efd5adb

Windows下 Apache Tomcat文件包含漏洞|CVE-2020-1938 漏洞复现 :jianshu.com/p/dd8c67515a56

Apache解析漏洞(换行解析+多后缀解析)复现 :https://www.jianshu.com/p/41ccabca57a2

Apache优化方法 :https://mp.weixin.qq.com/s/1LHvprP9lwTHwNn55VXraw

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache服务安全加固及Apache优化 的相关文章

  • Hadoop完全分布式集群——Hadoop 配置

    前面已完成VMware虚拟机安装与配置 参考前一篇Hadoop完全分布式集群 VMware虚拟机安装与配置 夏雨和阳阳的博客 CSDN博客 下面将进行Hadoop 配置 一 slave1 slave2节点配置修改 slave1 slave2
  • 推荐 OS X 下最方便实用的六款解压缩软件

    对于我们这种资料特别多 随时都需要跟工作伙伴沟通传递资料的人来说 一款方便的压缩软件真的太重要了 不仅可以节省时间 节省内存 更重要的是提高工作效率 今天废鱼就给大家推荐几款常用压缩软件 The Unarchiver The Unarchi

随机推荐

  • 【华为OD统一考试B卷

    在线OJ 本题通过率100 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1
  • 2021全国大学生电子设计竞赛F题(智能送药小车)国一赛后总结

    作为2022年的第一篇博客 思索了很久 就以此为题吧 11月7号随着电赛比赛的结束 我的大学竞赛生涯也差不多告一段落了 那天的心情也是无法用语言形容 第二天就又回归了正常的上课生活 2021年的电赛 既让人期盼 又存在许多变数 这一切都要从
  • java日期格式化yyyy-mm-dd

    在 Java 中 你可以使用 SimpleDateFormat 类来格式化日期 以 yyyy MM dd 为例 你可以这样写 SimpleDateFormat dateFormat new SimpleDateFormat yyyy MM
  • 回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

    回调函数传参 函数指针做函数参数 回调函数 目录 背景 回调函数是实现函数分层且单向依赖的好办法 使用函数指针运行 struct结构体回调函数代码更清晰 简单理解回调函数 Demo 其他回调函数博文 背景 这是我在实际工作中遇到的问题 线程
  • VSCode中简单使用Git

    在一个目录下clone项目 git clone 项目 git 使用VScode 打开项目 使用vscode修改代码并提交代码 修改代码 点击 相当于git add 点击对号 等于git commit m 备注信息 右边的箭头输入需要备注的信
  • Angular6学习笔记5:修改组件的属性并实时显示(ngModel)

    修改组件的属性并实时显示 ngModel 继学习笔记4以后 可以在一个AppComponent中显示了heroesComponent的属性信息 但是hero的Name往往是可以更改的 并将更改后的数据进行实时显示 1 将hero的Name重
  • umi4js集成Material UI

    umi4js集成Material UI 效果图 创建umi项目 创建umi项目 umi 目录结构 启用插件 dva 页面中使用dva 使用useDispatch useSelector 编辑layout createTheme 根据rout
  • 利用GEE计算遥感生态指数(RSEI)

    城市生态与人类生活息息相关 快速 准确 客 观地了解城市生态状况已成为生态领域的一个研究重点 基于遥感技术 提出一个完全基于遥感技术 以自然因子为主的遥感生态指数 RSEI 来对城市的生态状况进行快速监测与评价 该指数利用主成分分析技术集成
  • 这里推荐几个前端动画效果网站

    1 AnimistaAnimista 是一个 CSS 动画 转场库和在线工具 它有许多现成的 CSS 动画片段可以直接使用 也可以在线定制动画 网站地址 Animista On Demand CSS Animations Library 2
  • jmeter获取cookie值,设置集合点,参数化

    1 使用csv数据文件 进行登录会员的参数化 2 设置登录接口 3 在登录接口中设置集合点 4 在bin目录下 打开jmeter properties文件 CookieManager save cookies false改为true 并把
  • idea类图使用、时序图

    1 查看是否支持类图 idea默认已经集成了该功能 1 1 配置类图生成内容 搜索Diagrams 可以配置类图生成时的现实内容 2 自动生成类图 选择package或类 2 1 选择类 2 1 1 显示子类 ctrl alt b 可显示子
  • 关于nginx无论怎么配置都还是跳转到欢迎界面的解决方案

    hello 各位猿友们 是不是在第一使用nginx时 会遇到无论你怎么修改nginx conf文件都还是跳转到欢迎界面的问题 然后把度娘翻了个遍都然并卵 你说绝不绝望 生不生气 莫要慌 救世主来了 产生该问题的原因 兄die 你改错地方了
  • Shell排序(java版)

    博主介绍 程序员悟啦 乌拉 个人仓库 码云 座右铭 懒 对一个人的毁灭性有多大 早起的重要性就多大 免责声明 文章由博主原创 部分文章整理于网络 仅供学习和知识分享 相遇是缘 既然来了就拎着小板凳 坐下来一起唠会儿 如果在文中有所收获 请别
  • ROS 报错 ModuleNotFoundError: No module named ‘rospkg‘

    文章目录 写在前面 一 问题描述 二 出现原因 1 Anaconda base 环境下的出现原因 2 Anaconda 虚拟环境下的出现原因 三 解决方法 1 Anaconda base 环境下解决方法 2 Anaconda 虚拟环境下解决
  • 对象与Json字符串互转工具类

    import com fasterxml jackson core JsonProcessingException import com fasterxml jackson databind JavaType import com fast
  • 数据库设计DDL

    DDL 数据定义语言 用来定义数据库对象 数据库 表 DDL 数据库操作 查询 查询所有数据库 show databases 查询当前数据库 select database 使用 使用数据库 use 数据库名 创建 创建数据库 create
  • kali linux网络相关nmcli:ip、网关、路由、DNS的查看修改

    一 查看信息 设备device nmcli device show eht0 查看网卡设备的信息 ip 网关 路由 DNS 指定网卡eth0 nmcli device status 查看网卡设备的状态 nmcli device discon
  • Linux基础学习01——部署虚拟环境安装Linux 系统(VMware WorkStation Pro 16+ RHEL8 )

    VmwareWorkStation 16 虚拟机软件 必需 这是一款功能强大的桌面虚拟计算机软件 能够让用户在单一主机同时运行多个不同的操作系统 同时支持实时快照 虚拟网络 拖曳文件以及PXE等强悍功能 点此百度网盘下载密码 hh6t Re
  • swagger注释API详细说明

    API详细说明 注释汇总 作用范围 API 使用位置 对象属性 ApiModelProperty 用在出入参数对象的字段上 协议集描述 Api 用于controller类上 协议描述 ApiOperation 用在controller的方法
  • Apache服务安全加固及Apache优化

    转载来源 https help aliyun com knowledge detail 52981 html 一 账号设置 以专门的用户帐号和用户组运行 Apache 服务 1 根据需要 为 Apache 服务创建用户及用户组 如果没有设置