日志分析及溯源

日志分析

1.Linux日志分析

由系统进程rsyslogd统一管理系统日志

  • rsyslogd服务配置文件解析
    • 主配置文件为/etc/rsyslog.conf分为以下三个单元
      1. #### MODULES ####是/sbin/rsyslogd要加载的模块

      格式:$ModLoad module-name(在/lib64/rsyslog中模块注意不用添加.so),在开启日志服务器时需要加载UDP或TCP、imuxsock,imjounal、imklog、immark以及手动添加以下模块连接数据库

      $Modload ommysql
      *.* :ommysql:localhost,Syslog,rsyslog,123456
      
      1. #### GLOBAL DIRECTIVES ####全局日志配置目录
      • $IncludeConfig /etc/rsyslog.d/*conf 包含所有的配置文件,可在主目录下设置额外的配置文件
      1. #### RULES ####配置日志规则

      格式: facility.priority target

      • facility:表示产生日志的设备
        • auth -pam即认证和授权相关的命令
        • authpriv: —ssh,ftp等登录信息的验证信息非授权信息
        • cron 事件计划类相关的日志
        • kern 内核日志
        • lpr 打印
        • mail 邮件日志
        • user 用户程序产生的相关日志
      • prority:表示日志级别
        • 0 EMEKG(紧急):会导致主机系统不可用情况。
        • 1 ALEKKT(警告):必须马上采取措施解决的问题。
        • 2 CRIT(严重):比较严重的情况。
        • 3 ERR(错误):运行出现错误。
        • 4 WARNING(提醒):可能会影响系统功能的事件。
        • 5 NOTICE(注意):不会影响系统但值得注意。
        • 6 INFO(信息):一般信息。
        • 7 DEBUG(调试):程序或系统调试信息等。

        日志消息级别:(级别数字越小,事件越严重)

      • 连接符号

        • .XXX :大于等于xxx级别的信息
        • .=xxx等于xxx级别的信息
        • .!xxx 表示在 xxx之外的等级的信息
      • target:表示日志存放的地方

      实列:cron.* /var/log/cron :将所有级别的定时任务日志都保存在/var/log/cron目录下

  • 内核及系统日志

    1. 连接日志(登录日志) /var/log/wtmp , /var/log/utmp
    2. 内核及公共消息日志: /var/log/messagess
    3. 计划任务日志:/var/log/cron
    4. 系统引导日志:/var/log/dmesg
    5. 邮件系统日志:/var/log/maillog
    6. 用户登录日志:(wtmp和utmp日志无法直接打开,可通过相应命令打开)
      • /var/log/lastlog:最后登录的日志
      • /var/log/secure:管理用户的操作日志
      • /var/log/wtmp:登录和退出用户的信息记录(last,ac来调用)
      • /var/log/utmp:当前登录的用户的信息记录(who,w(可以看到用户正在做什么),users,finger调用此文件)
      • /var/log/btmp:记录用户错误登录尝试 last -f btmp查看
      • /var/log/auth.log:需要身份确认的操作
  • 程序日志
    • web服务: /var/log/httpd
    • 代理服务: /var/log/squid
    • ftp服务: /var/log/xferlog
    • 分析工具:webalizer,awstats
  • 日志管理策略
    • 及时做好备份和归档
    • 延长日志保存期限
    • 控制日志访问权限
    • ⭐集中管理日志
      • 配置日志服务器数据库: cd/usr/share/doc/rsyslog-7.4.7
      1. mysql -u root -p <mysql-createDB.sql>
      2. grant all on Syslog.* to rsyslog@localhost identified by ‘123456’;
      3. flush privileges;
      4. 编辑配置文件 vim /etc/rsyslog.conf将需要的上述配置文件中服务器配置打开
      5. systemctl restart rsyslog.service
      6. setenforce 0
      • 配置客户端
      1. vim /etc/rsyslog.conf:添加: *.* @172,16,8,100:514
      2. 重启日志服务器:systemctl restart rsyslog.service
      3. 编辑/etc/bashrc将客户端执行的所有命令写入到系统日志/var/log/messages中,在文档末尾添加

      export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger”[euid=$(whoami)]”:$(who am i):[pwd]”$msg”; }’

      1. source /etc/bashrc

      2. 安装loganalyzer

2.windows日志分析

  • windows系统日志
    • system.evtx:包含系统进程,设备磁盘活动等,记录设备驱动,硬件,重复ip等行为 `%systemroot%/system32/config/SecEvent.EVT“
    • security.evtx:包含安全性相关的时间,如用户注销,登录登时间
    • application.evtx:程序相关的事件 %systemroot%/system32/config/AppEvent.EVT
  • 应用程序及服务日志

    • Microsoft :记录包含200多个微软内置的事件日志分类,只有部分开启记录功能,如远程桌面客户端,无线网络,有线网络,设置安装等
    • office :OAerts,evtx
    • windows powershell :windows powershell,evtx
    • internet explorer :ie浏览器的日志信息:internet Exploer.evtx
    • FTP日志默认位置:%systemroot%/system32/logfiles/msftpsvc1/
    • www默认日志位置:%systemroot%/system32/logfiles/w3svc1/
    • scheduler:%systemroot%/schedlgu.txt

    windows 日志分析工具:logparse,logparseLizard

  • 常见windows日志事件ID说明

    在这里插入图片描述

3.web/os日志及日志工具

  • Appache日志分析
    • 查看apache的进程数:ps -aux |grep httpd
    • 分析当天的ip连接数:cat access_log | grep “10/sep/2017″|awk ‘{print $1}’ |sort | uniq -c |sort -nr
    • 分析指定ip在当然访问了什么url:cat access.log | grep “目标ip” |awk ‘{print $7}’ |sort | uniq -c
    • 分析访问前十的url: cat access_log | grep “10/Dec/2017” | awk ‘{print $7}’ | sort | uniq -c | sort -nr | head -n 10
    • 看到指定的ip究竟干了什么:cat access_log | grep 1.1.1.1 | awk ‘{print $1″\t”$8}’ | sort | uniq -c | sort -nr | less
    • 查看访问次数最多的几个分钟(找到热点):awk ‘{print $4}’ default-access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
    • 分析TCP连接状态:netstat -ant |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
    • 查找请求数请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
    • 用tcpdump嗅探80端口的访问看看谁最高:tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F”.” ‘{print $1″.”$2″.”$3″.”$4}’ | sort | uniq -c | sort -nr|head -20
    • 查找较多time_wait连接:netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20
    • 找查较多的SYN连接:netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more
    • 根据端口列进程:netstat -ntlp | grep 80 | awk ‘{print $7}’ | cut -d/ -f1
    • 获得访问前10位的ip地址
      • cat access.log|awk ‘{print $1}’|sort|uniq -c|sort -nr|head -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 -20
    • 列出传输最大的几个exe文件(分析下载站的时候常用) cat access.log |awk ‘($7~/.exe/){print $10 ” ” $1 ” ” $4 ” ” $7}’|sort -nr|head -20
    • 列出输出大于200000byte(约200kb)的exe文件以及对应文件发生次数 cat access.log |awk ‘($10 > 200000 && $7~/.exe/){print $7}’|sort -n|uniq -c|sort -nr|head -100
    • 如果日志最后一列记录的是页面文件传输时间,则有列出到客户端最耗时的页面 cat access.log |awk ‘($7~/.php/){print $NF ” ” $1 ” ” $4 ” ” $7}’|sort -nr|head -100
    • 列出最最耗时的页面(超过60秒的)的以及对应页面发生次数 cat access_log |awk ‘($NF > 60 && $7~/.php/){print $7}’|sort -n|uniq -c|sort -nr|head -100
    • 列出传输时间超过 30 秒的文件 cat access_log |awk ‘($NF > 30){print $7}’|sort -n|uniq -c|sort -nr|head -20
    • 统计网站流量( G) 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

4.Mariadb日志分析

除了二进制日志外,其他日志都是文本文件,日志文件通过存储在MariaDB数据库的数据目录下,默认情况下,只启动了错误日志功能,其他 3类日志都需要数据库管理员进行设置

  • 二进制日志
    • 二进制日志主要记录数据库的变化情况,通过二进制日志可以查询MariaDB数据库中进行了哪些改变,一般大小体积上限为1G,默认情况下,二进制功能时关闭的
    • 开启

      vim /etc/my.cnf
      [mysqld]
      log-bin=dir/file_name
      其中dir是存放目录,file_name是二进制日志存放的名字,格式为file_name.number,number格式是000001,000002等,每次MariaDB重新启动后,都会生成一个新的文件,二进
      制日志与数据库的数据文件最好不要在同一块硬盘,这样,即使数据库文件所在的磁盘损坏,也可以使用另一个硬盘上的二进制日志来恢复数据库文件

    • 查询是否开启:进入数据库后进行查询

      show global variables like “%log_bin%”

    • 查看二进制日志:mysqlbinlog file_name

    • 删除二进制日志:二进制日志会记录大量的信息,如果长时间不清理二进制日志,将会浪费磁盘空间,删除二进制的方式如下
      • 删除所有二进制日志:登录MariaDB数据库后使用reset master命令
      • 根据日志标号删除日志:登录MariaDB数据库后使用purge master logs to’file_name.number’;命令删除number以前的日志
      • 根据时间删除日志:登录MariaDB数据库后使用 purge master logs to ‘yyyy-mm-ddhh:MM:ss’;删除设定时间之前生成的日志
    • 二进制日志其他设置:(配置文件中)
      • binlog_cache_size =32768 #Cache是MariaDB 用来提高binlog的记录效率而设计的一个用于短时间内临时缓存binlog数据的内存区域
      • binlog_stmt_cache_size= 32768 #当非事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句
      • sync_binlog =10 #设定多久同步一次二进制日志至磁盘文件中, 0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次
      • expire_log_days ={0..99} #设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能
      • 查看二进制日志:
      • MariaDB [(none)]> show binary logs; #显示当前服务器使用的二进制文件及大小
      • MariaDB [(none)]> show master logs; #显示主服务器使用的二进制文件及大小
      • MariaDB [(none)]> show master status; #当前使用的二进制文件及所处位置
      • MariaDB [(none)]> flush logs; #滚动日志,注意: flush logs一般只会滚动中继日志和二进制日志。
      • MariaDB [(none)]> show binlog events\G #查看所有的二进制信息
  • 错误日志

    • 错误日志:记录了mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息,默认为开启的
    • 定义错误日志,在配置文件中添加:

      Log_error=DIR/[filename]

    • 删除错误日志:只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的日志方式如下

      mv [old_file] [new_file]
      mysqladmin flush-logs

  • 通用日志查询

    默认情况下查询日志是关闭的.由于查询日志会记录用户的所有操作,其
    中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不
    必要的磁盘IO,会影响mysql的性能的.如若不是为了调试数据库的目的建议不要

    • 开启查询日志.查看查询日志是否开启:(注意输出文件目录MySQL是否有权限读写)

      MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE ‘%log%’; 显示结果:
      general_log | OFF #定义查询日志是否开启
      general_log_file | /mydata/data/stu18.log #定义查询日志的文件地址名称
      log | OFF #是否开启日志 (若开启则表示开启所有的日志功能)
      log_output | FILE #日志的输出的位置

    • 开启:

      vim /etc/my.cnf
      general_log=ON
      general_log_file=dir/file_name

  • 慢查询日志

    用来记录执行时间超过指定时间的查询语句.通过慢查询日志,可以查找出哪些查询语句的执行效率很
    低,以便进行优化.一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的
    查询语句.可以帮助我们定位性能问题的。

    • 查询:

      MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE ‘%log%’; 显示结果:
      slow_query_log | OFF #定义慢查询日志的
      slow_query_log_file |www-slow.log #输出方式为file(文件)时定义慢查询日志的位置

    • 开启:

      通过配置文件my.cnf中的log-slow-queries选项可以开启慢查询日志;形式如下
      [mysqld]
      slow_query_log=1
      log-slow-queries [= DIR/[filename] ]
      或通过登录mysql服务器直接定义
      MariaDB [(none)]>set global slow_query_log=1;
      MariaDB [(none)]> set session long_query_time=0.001; #更改时间(当前session中,退出则重置)
      MariaDB [(none)]> set global long_query_time=0.001; #更改时间(全局中,重启服务则重置)
      MariaDB [(none)]> SHOW VARIABLES LIKE ‘long%’; #查询定义时间
      MariaDB [(none)]> show global variables like “%slow%”; #查看慢查询日志开启状态

  • 事务日志

    事务日志(InnoDB特有的日志)可以帮助提高事务的效率.使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘.事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多.事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘.目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘.如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据.具有的恢复方式则视存储引擎而定

5.tomcat 日志分析

  • 对应日志的配置文件:/conf/logging.proterties
  • 日志等级:sever(最高等级)—warning—info—config—fine—finer—finest
  • 五种分类

    • catalina
      • 输出级别catalina.org.apache.juli.FileHandler.level = FINE
      • 输出位置catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
      • 输出前缀catalina.org.apache.juli.FileHandler.prefix = catalina.
      • catalina.out 标准输出和标准出错,所有输出到者两个位置的都会进入catalina.out,这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的,我们需要借助其他工具进行切割(注意: catalina.out文件如果过大会影响)
      • catalina.{yyyy-MM-dd}.log是tomcat自动生成的日志,主要是应用出书画未处理的异常,最终被tomcat捕获的日志,它和catalina.out是里面的内容是不一样的
    • localhost
      • 输出级别:localhost.org.apache.juli.FileHandler.level = FINE
      • 输出位置:localhost.org.apache.juli.FileHandler.directory =${catalina.base}/logs
      • 输出前缀:localhost.org.apache.juli.FileHandler.prefix = localhost.
      • localhost.{yyyy-MM-dd}.log主要是应用初始化(listener, filter,servlet)未处理的异常最后被tomcat捕获而输出的日志,它也是包含tomcat的启动和暂停时的运行日志,但它没有catalina.2018-09-19.log 日志全。它只是记录了部分日志
      • localhost_access_log.2018-09-19.txt: 这个是访问tomcat的日志,请求时间和资源,状态码都有记录。
    • manager

    • admin

    • host-manager
  • tomcat日志切割

    • logrotate切割
      • 编辑tomcat目录bin下的catalina.sh文件

        org.apache.catalina.startup.Bootstrap “$@” start \ >> “$CATALINA_OUT” 2>&1 &
        第一处: tomcat是带“-security”参数的启动,
        第二处:默认tomcat启动方式,也就是else下面的那部分,我们只修改这里。
        另外还要把touch “$CATALINA_OUT”这行注释掉。

    • log4j切割

      • 根目录下建立:common/class/log4j.properties

        log4j.rootLogger=INFO, R
        log4j.appender.R=org.apache.log4j.RollingFileAppender
        log4j.appender.R.File=${catalina.home}/logs/tomcat.newlog #设定日志文件名
        log4j.appender.R.MaxFileSize=100KB #设定文件到100kb即分割
        log4j.appender.R.MaxBackupIndex=10 #设定日志文件保留的序号数
        log4j.appender.R.layout=org.apache.log4j.PatternLayout
        log4j.appender.R.layout.ConversionPattern=%p %t %c – %m%n

      • 在tomcat根目录下的common/lib下加入log4j.jar和commons-logging.jar即可

      • 重启tomcat即可
    • 使用cronolog分割tomcat的catalina.out文件

      • 编辑.sh文件,并放到tomcat下的bin目录,在cron中自动执行

        !bin/bash

        cd dirmap $0
        d=date +%Y%m%d
        d7=date -d'7 day ago' + %Y%m%d
        cd ../logs/
        cp catalina.out catalina.out.${d}
        echo “” > catalina.out
        rm -rf catalina.out.${d7}

6.nginx 日志分析

  • 访问日志:access.log

    配置文件:/etc/nginx/nginx.conf,可修改日志显示
    
    log_format main '$server_name $remote_addr
    $remote_user [$time_local] "$request" '
    '$status $uptream_status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" '
    '$ssl_protocol $ssl_cipher $upstream_addr $request_time
    $upstream_response_time';
    
    • 字段说明:
      1. $server_name:虚拟主机名称。
      2. $remote_addr:远程客户端的IP地址。
      3. $remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白
      4. [$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01+0800,时间信息最后的”+0800″表示服务器所处时区位于UTC之后的8小时
      5. $request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
      6. $status:记录请求返回的http状态码,比如成功是200。
      7. $uptream_status: upstream状态,比如成功是200
      8. $upstream_addr:后端服务器的IP地址
      9. $upstream_status:后端服务器返回的HTTP状态码
      10. $body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
      11. $http_referer:记录从哪个页面链接访问过来的。
      12. $http_user_agent:客户端浏览器信息
      13. $http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
      14. $ssl_protocol: SSL协议版本,比如TLSv1。
      15. $ssl_cipher:交换数据中的算法,比如RC4-SHA。
      16. $upstream_addr: upstream的地址,即真正提供服务的主机地址。
      17. $request_time:整个请求的总时间。
      18. $upstream_response_time:请求过程中, upstream的响应时间。
  • 错误日志:error.log
    • 错误日志主要记录客户端访问Nginx出错时的日志,格式不支持自定义。通过错误日志,你可以得到系统某个服务或server的性能瓶颈等。因此,将日志好好利用,你可以得到很多有价值的信息。错误日志由指令error_log来指定
    • error_log path(存放路径) level(日志等级)path含义同access_log, level表示日志等级,具体如下:[ debug | info | notice | warn | error | crit ]从左至右,日志详细程度逐级递减,即debug最详细, crit最少。
    • error_log logs/error.log info; 需要注意的是: error_log off并不能关闭错误日志,而是会将错误日志记录到一个文件名为off的文件中。 正确的关闭错误日志记录功能的方法如下:
    • error_log /dev/null;表示将存储日志的路径设置为“垃圾桶”。

发表评论

电子邮件地址不会被公开。