# 35、等保2.0 Nginx中间件测评 安全审计

LLMS index: [llms.txt](/wikis/llms.txt)

---

nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器，一般主要功能会有两种，一种作为一个HTTP服务器进行网站的发布处理，另外一种nginx可以作为反向代理进行负载均衡的实现。所以这里填主要功能的时候就要分清。

## 安全审计
### a）应启用安全审计功能，审计覆盖到每个用户，对重要的用户行为和重要安全事件进行审计
针对于各类的中间件来说，日志一般会分为两种，一种是 error.log 错误日志，另一种是 access.log 网页访问日志。都开启的情况下，我们就可以判符合（前提日志级别配置正确）。

先来看一下 errlog_log：

error_log：设置服务器运行的相关日志

设置格式

error_log  路径  级别

默认值：error_log  logs/error.log  error；

配置段：main，http，server，location

关闭error_log：error_log off

日志的级别：

debug:调试级别，记录的信息最多；

info:普通级别；

notice:可能需要注意的信息；

warn:警告消息；

error:错误消息；

crit:严重错误消息；

access_log：

访问日志主要记录客户端访问Nginx的每一个请求，格式可以自定义。通过访问日志，你可以得到用户地域来源、跳转来源、使用终端、某个URL访问量等相关信息。

access_log:用来配置访问日志的输出格式和输出的路径；

语法: access_log path [format [buffer=size [flush=time]]];

默认值: access_log logs/access.log combined;

后续版本好像有变更，默认为 main;

配置段: http, server, location, if in location, limit_except

关闭access_log：access_log off

path：指定日志的存放位置

format：指定日志的格式。默认使用预定义的combined

buffer：用来指定日志写入时的缓存大小。默认是64k

gzip：日志写入前先进行压缩。压缩率可指定，从1到9数值越大压缩比越高，同时压缩的速度也越慢。默认是1。

flush：设置缓存的有效时间。如果超过flush指定的时间，缓存中的内容将被清空。

if：条件判断。如果指定的条件计算为0或空字符，那么当前作用域下的所有的请求日志都会被关闭。

所以我们这里先在 Nginx 主目录下找到conf文件夹

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/4e696f9d46fd663c740802aef64e2b6f_MD5.jpg)

其中会有一个叫 nginx.conf 的文件

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/fd78706206c448b9dec79e0b3c510640_MD5.jpg)

查看对应error_log和access_log配置情况，默认情况下都是为注释状态

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/5a748edfec241484683191ae69c1690e_MD5.jpg)

若为注释状态，nginx 会有一个默认值，如下：

error_log  logs/error.log  error；

access_log logs/access.log main;

### b）审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息
日志文件在nginx主目录下的log目录中

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/b3edbdf93453a1cd7ec23ac28ab73fba_MD5.jpg)

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/3da37f2ff62ea12a5942b5d459d39f66_MD5.jpg)

默认情况下都是满足条款要求的，比如查看一下 access.log 日志

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/bc5a419d65a8c1f27a1b800b132b8eab_MD5.jpg)

另外考虑的点就是日志记录的时间是否准确，中间件时间一般跟随操作系统时钟，如果操作系统时间正确，那么基本也不会有问题。

或者我们可以去配置文件中，配置我们自己想要的日志记录内容。

对应参数：log_format

log_format：用来设置日志格式

nginx的log_format有很多可选的参数用于标示服务器的活动状态，默认为：

‘$remote_addr – $remote_user [$time_local] “$request” ‘ ‘$status $body_bytes_sent “$http_referer” ‘ ‘”$http_user_agent” “$http_x_forwarded_for”‘;

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/c93e1bd07b17b09cedbc067960b37b37_MD5.jpg)

如果要记录更详细的信息需要自己修改log_format，具体可设置的参数格式及说明如下：

这条日志是之前实验访问应用留下的，我们可以分析一下。

192.168.21.176 - - [28/Sep/2020:14:34:48 +0800] "GET /favicon.ico HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

| 参数 | 说明 | 示例 |
| --- | --- | --- |
| $remote_addr | 客户端地址 | 192.168.21.176 |
| $remote_user | 客户端用户名称 | -- |
| $time_local | 访问时间和时间 | [28/Sep/2020:14:34:48 +0800] |
| $request | 请求的URI和HTTP协议 | "GET /favicon.ico HTTP/1.1" |
| $http_host | 请求地址，即浏览器中你输入的地址（域名或IP） | [www.test.com](https://www.freebuf.com/articles/system/user_cancel)<br/>192.168.0.23 |
| $status | HTTP请求状态 | 404 |
| $upstream_status | upstream状态 |     |
| $body_bytes_sent | 服务器发送客户端的相应body字节数 | 555 |
| $http_referer | url跳转来源 | -<br/>https://www.google.com/ |
| $http_user_agent | 用户终端浏览器等信息 | "Mozilla/5.0 (Windows NT……" |
| $http_x_forwarded_for | 当前端有代理服务器时，设置web节点记录客户端地址的配置，此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置 |     |
| $ssl_protocol | SSL协议版本 | TLSv1 |
| $ssl_cipher | 交换数据中的算法 | Rc4-SHA |
| $upstream_addr | 后台upstream的地址，即真正提供服务的主机地址 | 10.36.10.80:80 |
| $request_time | 整个请求的总时间 | 0.165 |
| $upstream_response_time | 请求过程中，upstream响应时间 | 0.002 |


所以如果想要记录更详细，可以自己进行配置。

### c）应对审计记录进行保护，定期备份，避免受到未预期的删除、修改或覆盖等
1. 确认本机的日志文件权限

确认是否仅管理员组具有日志的管理权限，其他组没有修改权限![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/7c48b8e7d6bff75e2ec2f3238e337270_MD5.jpg)

如users组无权管理修改

![](/wikis/_resources/35%E3%80%81%E7%AD%89%E4%BF%9D2.0-nginx%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%B5%8B%E8%AF%84-%E5%AE%89%E5%85%A8%E5%AE%A1%E8%AE%A1/b3834909064b89864015a36a2e1bc69b_MD5.jpg)

Linux系统下同理，对应的日志文件不高于644

2. 是否对日志文件进行定期备份

这个好像默认自带的方式没有找到，那么就去询问一下运维人员，是否有备份措施对中间件日志进行备份。

一般有的现场看到好像是通过FTP同步，会将日志文件同步一份到备份服务器上。

3. 日志留存时间

查看日志留存时间是否达到6个月以上，满足法律法规要求。

### d）应对审计进程进行保护，防止未经授权的中断
审计进程与中间件主进程关联，无法单独中断审计进程，只要开启即符合。
