NGINX基准-日志记录
目录
1.1确保启用详细的日志记录... 3
1.2确保访问日志已启用... 4
1.3确保错误日志已启用并设置为info日志级别... 4
1.4确保日志文件滚动... 5
1.5确保错误日志被发送到远程syslog服务器... 6
1.6确保访问日志被发送到远程syslog服务器... 7
1.7确保代理通过IP信息来源... 7
1.1确保启用详细的日志记录
描述:
应该配置系统日志以满足您的组织安全和隐私策略。启用详细的日志记录来包括关于事件、事件源、时间戳和用户的信息,可以帮助进行事件响应活动。注意:目的是将敏感信息排除在日志之外。例如,将敏感信息置于查询字符串和uri之外以避免这种情况。
理由:
执行详细的日志记录可以确保事件响应者、审计员和其他人能够清楚地查看在服务器上发生的活动。
审计:
验证日志格式是否符合组织的安全和隐私策略。所有必需的日志变量都应该包含/etc/nginx/nginx.conf的描述性定义。以下是一个例子:
log_format main
'server="$server_name" host="$host” dest_port="$server_port"'
'src="$remote_addr" ip="$realip_remote_addr" user="$remote_user" '
'time_local="$time_local" http_status="$status" '
'http_referer="$http_referer" http_user_agent="$http_user_agent" ' 'http_x_forwarded_for="$http_x_forwarded_for" '
'http_x_header="$http_x_header" uri_query="$query_string" uri_path="$uri" ' 'request=$request http_method="$request_method";
修复:
编辑/etc/nginx/nginx.conf中的日志格式指令,以便它记录满足组织策略所需的所有内容。以下变量可能被认为是有用的示例,包括您的log_format和描述性日志记录。您应该参考NGINX文档和您的组织策略,以确保您记录了足够的信息,并在需要时删除了敏感信息。
$remote_addr - client address
$remote_user - the user if basic authentication is used
$status - the HTTP response status
$content_type - Content-Type request header field
$time_local - local time in the Common Log Format
$request_method - request method, usually GET or POST
$request - full original request line
$uri - normalized URI in request
$server_port - port of the server which accepted a request
$server_name - name of the server which accepted a request
$http_user_agent - user agent of the client requesting access
$http_x_forwarded_for - client address a proxy or load balancer is forwarding traffic for
默认值:
log_format main '$remote_addr - $remote_user [$time_local]
"$request" ' '$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
参考文献:
1. http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
负载平衡器不是源IP透明的。我们必须在代理和日志中配置x - forwarding头,以显示请求来自何处。
1.2确保访问日志已启用
描述:
access_log指令应该为每个核心站点打开。它是默认启用的。
理由:
访问日志允许事件响应者和审核员在发生事件时调查对系统的访问。
审计:
运行以下程序来验证访问日志是否已启用:
grep -ir access_log /etc/nginx
输出应该显示配置的访问日志,而不是禁用的。如果输出与下面类似,则应该手动检查nginx配置文件,以确保您记录了对所有核心站点和代理的访问。
access_log off;
修复:
确保为您的组织需要日志记录的每个核心站点配置access_log指令。这应该类似于下面的配置片段。您可以根据需要使用不同的日志文件位置。
access_log /var/log/nginx/host.access.log main;
默认值:
默认情况下启用访问日志。
1.3确保错误日志已启用并设置为info日志级别
描述:
应该记录应用程序的所有错误。
理由:
错误日志记录对于识别试图利用系统的攻击者和重新创建攻击者的步骤非常有用。错误日志记录还有助于识别应用程序中可能出现的问题。
审计:
运行以下命令来验证/etc/nginx/nginx.conf中的错误日志配置:
grep error_log /etc/nginx/nginx.conf
如果没有输出,输出将被注释掉,或者日志级别被设置为info之外的任何内容,则不执行此建议。
修复:
编辑/etc/nginx/nginx.conf,这样error_log指令就会出现,而不会被注释掉。error_log应该配置为您选择的日志位置。配置如下所示:
error_log /var/log/nginx/error.log info;
1.4确保日志文件滚动
描述:
日志滚动确保日志文件不会占用过多的磁盘空间,从而避免可能导致的拒绝服务。
理由:
日志文件对于跟踪服务器上发生的活动非常重要,但是它们会占用大量的空间。应该配置日志滚动,以确保日志不会占用太多的磁盘空间,从而使日志变得不可用。
审计:
运行以下命令来验证日志滚动配置。它们应该显示日志压缩每周发生一次,日志滚动每13周发生一次。
cat /etc/logrotate.d/nginx | grep weekly
cat /etc/logrotate.d/nginx | grep rotate
修复:
按照以下步骤将默认配置更改为推荐的日志滚动配置。如果配置不是默认的,您可能需要手动编辑或更改下面的命令。要将日志压缩从每日改为每周:
sed -i "s/daily/weekly/" /etc/logrotate.d/nginx
将日志滚动从每年改为每13周:
sed -i "s/rotate 52/rotate 13/" /etc/logrotate.d/nginx
默认值:
cat /etc/logrotate.d/nginx
/var/log/nginx/*.log
{
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
1.5确保错误日志被发送到远程syslog服务器
描述:
集中式日志管理有助于确保日志是可靠的,并且可以在中心位置进行审计和事件调查。
理由:
集中式日志记录解决方案聚合来自多个系统的日志,以确保可以在事件系统中引用日志。集中式日志服务器还常常用于将日志与潜在的攻击模式关联起来。如果没有使用集中式日志记录解决方案,并且系统(及其日志)被认为受到了危害,则可能不允许将日志用作证据。
审计:
使用此命令,以验证您的服务器配置为中央日志:
grep -ir syslog /etc/nginx
输出应该显示发送到中央服务器的错误日志,类似于下面命令的输出。192.168.2.1应该替换为您的中央日志服务器,日志级别应该设置为info。
error_log syslog:server=192.168.2.1 info;
修复:
要启用错误日志的中央日志记录,请将下面的行添加到服务器配置文件中的服务器块中。192.168.2.1应该替换为您的中央日志服务器的位置。
error_log syslog:server=192.168.2.1 info;
默认值:
默认情况下没有配置Syslog。
参考:
1. http://nginx.org/en/docs/syslog.html
1.6确保访问日志被发送到远程syslog服务器
描述:
集中式日志管理有助于确保日志是可靠的,并且可以在中心位置进行审计和事件调查。
理由:
集中式日志记录解决方案聚合来自多个系统的日志,以确保可以在事件系统中引用日志。集中式日志服务器还常常用于将日志与潜在的攻击模式关联起来。如果没有使用集中式日志记录解决方案,并且系统(及其日志)被认为受到了危害,则可能不允许将日志用作证据。
审计:
使用此命令验证您的服务器已配置为中央日志记录:
grep -ir syslog /etc/nginx
输出应该显示发送到中央服务器的访问日志,类似于下面命令的输出。192.168.2.1应该替换为您的中央日志服务器。本地日志记录功能可以是服务器上任何未配置的功能。
access_log syslog:server=192.168.2.1,facility=local7,tag=nginx,severity=info combined;
修复:
要启用访问日志的中央日志记录,请将下面的行添加到服务器配置文件中的服务器块中。192.168.2.1应该替换为您的中央日志服务器的位置。本地日志记录功能可以更改为服务器上任何未配置的功能。
access_log syslog:server=192.168.2.1,facility=local7,tag=nginx,severity=info combined;
默认值:
Syslog不是默认设置的。
1.7确保代理通过IP信息来源
描述:
x- forwarding -for和远程地址头帮助标识和分隔用户代理的原始客户端IP地址和代理IP地址。两种类型的地址是相同的,并且应该始终存在。
理由:
能够识别原始客户端IP地址可以帮助审计人员或事件响应人员识别相应用户来自何处。这可能在攻击事件中很有用,可以分析IP地址是否适合进行阻塞。这对关联攻击者的行为很有帮助。
审计:
打开nginx配置文件和该配置中相关的包含文件。检查所有位置块是否存在proxy_pass指令。proxy_pass指令之后应该执行以下两个指令之一,以确保客户端IP地址被传递到代理服务的端点。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
修复:
为了确保您的代理或负载均衡器将客户端和代理的信息转发给应用程序,您必须在您的location块中设置以下头信息。编辑您的location块,以便它显示客户端和代理的proxy_set_header指令,如下所示。报头是完全相同的,没有必要两者都出现。
server { ...
location / {
proxy_pass (Insert Application URL here);
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
默认值:
这不是默认设置。