Nginx访问日志及巡检统计

一、前言

Nginx访问日志及巡检统计_第1张图片

二、词汇解释

Nginx访问日志及巡检统计_第2张图片

2.1、pv和uv的区别

PV(Page View访问量/也卖弄浏览数):指在一定统计周期内,用户每次刷新网页一次即计算一次。PV高不一定代表来访者多:PV与来访者的数量成正比,但是PV并不直接决定页面的真实来访者数量。比如一个网站就即使一个人进来,但通过不断的刷新页面,也可以制造出非常高的PV。

UV(Unique Visitor独立访客数):指访问您网站的一个客户端(非出口ip)即为一个访客。UV是指不同的、通过互联网访问、浏览一个网页的自然人。00:00-24:00内相同的客户端只被计算一次。在同一天内,UV只记录第一次进入网站的访问者,在同一天内再次访问该网站则不计数;UV的计算是和浏览器的Cookie密切相关的。如果cookie没变,即使ip变了,但客户端没变,UV还是之前的记录,不会重复统计;

2.2、tcp状态解释

CLOSED 无连接是活动的或正在进行
LISTEN 服务器在等待进入呼叫
SYN_RECV 一个连接请求已经到达,等待确认
SYN_SENT 应用已经开始,打开一个连接
ESTABLISHED 正常数据传输状态/当前并发连接数
FIN_WAIT1 应用说它已经完成
FIN_WAIT2 另一边已同意释放
ITMED_WAIT 等待所有分组死掉
CLOSING 两边同时尝试关闭
TIME_WAIT 另一边已初始化一个释放
LAST_ACK 等待所有分组死掉

三、日志及网络连接巡检

1)查看TCP连接状态

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n | awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

命令示例说明:

netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'

这个命令是用于显示当前系统的网络连接状态和统计信息。目的就是显示当前系统中各个TCP连接状态的统计信息。例如,ESTABLISHED表示已建立连接,TIME_WAIT表示等待关闭连接等。输出结果将以连接状态和对应的出现次数的形式呈现。下面来逐步解释这个命令的含义:

netstat -n:这是netstat命令的一个选项,用于显示网络连接信息。"-n"选项指定不要解析IP地址和端口号为主机名和服务名,而是直接显示IP地址和端口号。

|:这个符号是管道操作符,用于将一个命令的输出作为另一个命令的输入。

awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}':这部分是利用awk工具对netstat命令的输出进行处理和统计。

'/^tcp/ {++arr[$NF]}':这个部分使用正则表达式匹配以"tcp"开头的行,并使用数组arr记录每个状态出现的次数。$NF表示当前行的最后一个字段,即表示连接状态。NF 每行字段总数(Number of Font)。

END {for(k in arr) print k,"\t",arr[k]}:在处理完所有行后,使用for循环遍历数组arr中的键(连接状态)并打印出键和对应的值(状态出现次数)。

2)查找请求数请20个IP(多用于查找攻来源):

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20
#其他
//获得访问前10位的ip地址
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -n 10
cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url],url}'
//查看访问次数最多的文件或页面,取前20
cat access.log|awk '{print $11}'|sort|uniq -c|sort -nr|head -n 20
//列出传输最大的几个rar文件
cat access.log |awk '($7~/\.rar/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -n 20

//列出输出大于200000byte(约200kb)的rar文件以及对应文件发生次数
cat access.log |awk '($10 > 200000 && $7~/\.rar/){print $7}'|sort -n|uniq -c|sort -nr|head -n 100
//如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面
cat access.log |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -n 100
//.列出最最耗时的页面(超过60秒的)的以及对应页面发生次数
cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -n 100
//列出传输时间超过 30 秒的文件
cat access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -n 20

#统计网站流量(GB/s)

cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}'
#统计404的连接数

awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

#统计http status
cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}'
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

#查看是哪些爬虫在抓取内容

tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'

#按域统计流量

zcat access.log.tar.gz| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'

cat access.log| awk '{print $10,$7}' |awk 'BEGIN{FS="[ /]"}{trfc[$4]+=$1}END{for(domain in trfc){printf "%s\t%d\n",domain,trfc[domain]}}'

#


3)用tcpdump嗅探80端口的访问最高的IP

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

4)查找较多time_wait连接

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

5)找查较多的SYN连接

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

6)根据端口查找进程ID

netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1
netstat -b //显示在创建每个连接或侦听端口时涉及到的可执行文件
netstat -o //显示拥有的与每个连接关联的进程ID

7)数据库:查看数据库执行的sql

/usr/sbin/tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'

8)进程跟踪

系统Debug分析:strace -p pid
跟踪指定进程的PID:gdb -p pid

9)日志分析

//查看安全日志/var/log/audit中成功登陆服务器的IP和用户,并统计次数
cat /var/log/audit/audit.log |grep failed -v|awk '{print $10,$13}' |grep '/' -v |grep old -v |grep acct |awk -F "=" '{print $2,$3}' |awk -F "(" '{print $1,$2}'|awk -F "," '{print $1}'|uniq -c |grep ? -v|sort -d

//查看最近20条登陆服务器用户的持续时间、IP、用户
last |awk '{print $1,$3,$4,$5,$6,$7.$8.$9,$10}'|head -n20

#/var/log/secure 日志分析.查看哪些IP扫描过本机
grep "Failed password" /var/log/secure|grep invalid|awk '{print $13}'| sort |uniq

//查看成功登陆本机的记录
cat /var/log/secure |awk '{print $5,$9,$11,$12,$13}'|grep su -v|grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|awk -F ":" '{print $1,$2}'|uniq -c
cat /var/log/secure |awk '{print $1,$2,$3,$5,$9,$11,$12,$13}'|grep su -v|grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|less

10)检查系统

dmesg 检查硬盘是否运行在DMA模式
dmesg |grep DMA dmesg 检查网卡是否运行正常
dmesg |grep eth0 dmesg探测系统内核模块的加载情况
dmesg |grep acpi
systemctl list-units --type=service:列出当前系统上所有已启动的服务
chkrootkit:检查系统是否被rootkit攻击。
rkhunter:检查系统的安全性和完整性。rkhunter(Rootkit Hunter)是一款用于检测和报告系统上潜在的Rootkit、后门和可疑文件的工具。安装执行:sudo yum install rkhunter
udo rkhunter --update
//运行系统检查:
sudo rkhunter --check
#查看检查结果:检查结果会被保存在一个日志文件中,通常是/var/log/rkhunter.log。
使用以下命令查看日志文件内容:sudo cat /var/log/rkhunter.log

sudo rkhunter --propupd:更新rkhunter的文件属性数据库,以减少误报。
sudo rkhunter --list propfiles:列出rkhunter监控的文件和目录。

#查询特权用户特权用户(uid 为0)
awk -F: '$3==0 {print $1}' /etc/passwd
#查询可以远程登录的帐号信息
awk '/\$1|\$6/{print $1}' /etc/shadow
#查看sudo权限
more /etc/sudoers|grep -v "^#\|^$" |grep "ALL=(ALL)"
usermod -L user	禁用帐号,帐号无法登录,/etc/shadow第二栏为!开头
userdel user	删除user用户
userdel -r user	将删除user用户,并且将/home目录下的user目录一并删除

#修改histroy记录
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile   //保存1万条命令

#为历史的命令增加登录的IP地址、执行命令时间等信息
vim /etc/profile
######history #########
USER_IP=`who -uam 2>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'`
if [ $USER_IP="" ]; then
 USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami`"
shopt -s histappend
export PROMPT_COMMAND="history -a"

#########history########## 
#将此用户的密码最长使用天数设为30,最短使用天数设为0,密码2000年1月1日过期,过期前七天警告用户。
chage -m0 -M30 -E2000-01-01 -W7 <用户名>
设置连续输错三次密码,账号锁定五分钟。使用命令
vi/etc/pam.d/common-auth  //修改配置文件,添加
auth required pam tally.so onerr=fail deny=3 unlock time=300

more /etc/rc.local /etc/rc.d/rc[0~6] .dls-l /etc/rc.d/rc3.d/

//定位有多少IP在爆破主机的root帐号:

grep "Failedpasswordforroot"/var/log/secure|awk'{print$11}'|sort|uniq-c|sort- nr |more

11)MAC欺骗

arp -an  //查看所有连接本地主机的ip和mac地址

12)windows

 netsh wlan show profiles  //查看连接过的wifi点
 netsh wlan show profile name='sdc-qwimq' key=clear //查看wifi key
 net view hostname/ip   //查看对应IP地址共享的资源
 net share //显示本地共享资源
 net share ipc$ /del //删除ipc$共享 
net share c$ /del //删除C:共享 
 net user  //查看用户
 net user 帐户名 //查看帐户的属性 
 net use 
 net start //查看开启了哪些服务
 net time \\目标ip /set #设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
 net config 显示系统网络设置
 finger username @host  //查看最近有哪些用户登陆
 attrib 文件名(目录名) //查看某文件(目录)的属性 
 attrib 文件名 -A -R -S -H 或 +A +R +S +H //去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性
 date /t 、 time /t //将只显示当前日期和时间
 set //显示当前所有的环境变量
 ver //在cmd窗口下显示版本信息
 winver //弹出一个窗口显示版本信息
 type 文件名 显示文本文件的内容 
 more 文件名 逐屏显示输出文件
 msinfo32 //软件环境→正在运行任务”就可以查看到进程的详细信息
 systeminfo  //查看系统信息
 cacls 文件名 /参数  #显示或修改文件访问控制列表(ACL)--针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名erm 替换指定用户的访问权限;/G 用户名erm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;
 icacls 文件名
 at  //查看计划任务
 eventvwr.msc  //查看日志
 运行,输入%UserProfile%\Recent  //分析最近打开分析可疑文件
 #好玩的
 color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿 、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白 
 

13)工具

1、使用WWWGrep来检查你的网站元素安全

WWWGrep是一款针对HTML安全的工具,该工具基于快速搜索“grepping”机制实现其功能,并且可以按照类型检查HTML元素,并允许执行单个、多个或递归搜索。Header名称和值同样也可以通过这种方式实现递归搜索。

2、

四、日志配置

五、脚本示例

5.1 Nginx 脚本

#!/bin/bash

# Nginx日志路径
LOG_PATH="/var/log/nginx/access.log"

# 检查IP访问频率/次数
check_ip_frequency() {
    echo "IP访问频率检查结果:"
    awk '{print $1}' $LOG_PATH | sort | uniq -c sort -nr
}

# 检查访问状态码
check_response_codes() {
    echo "访问状态码检查结果:"
    awk '{print $9}' $LOG_PATH | sort | uniq -c | sort -nr
}

# 检查请求来源URL
check_referers() {
    echo "请求来源URL检查结果:"
    awk '{print $11}' $LOG_PATH | sort | uniq -c | sort -nr
}

# 检查异常User-Agent
check_user_agents() {
    echo "异常User-Agent检查结果:"
    awk -F\" '{print $6}' $LOG_PATH | sort | uniq -c | sort -nr
}

# 检查潜在的SQL注入攻击
check_sql_injections() {
    echo "潜在的SQL注入攻击检查结果:"
    grep -iE "(union|select|from|where|insert|update|delete|drop)" $LOG_PATH
}

# 执行巡检
echo "开始巡检Nginx日志安全性..."
echo ""
check_ip_frequency
echo ""
check_response_codes
echo ""
check_referers
echo ""
check_user_agents
echo ""
check_sql_injections
echo ""
echo "巡检完成!"

你可能感兴趣的:(安全相关,nginx,运维,web安全,nginx巡检,pv)