devbox
Gausst松鼠会
这个屌丝很懒,什么也没留下!
热门文章
  • 1" href="/w/Gausst松鼠会/article/detail/235323" target="_blank">Scss 基本使用 ( @extend、 @mixin、@import、@if、@for、@while、@each )_
    当前位置:   article > 正文

    Linux日志巡检之日常操作及安全审计_linux审计日志包含哪些日志

    linux审计日志包含哪些日志

    一、背景

    本文专门针对Linux系统运维当中相关日志,总结概述经常要执行的操作,以备参考辅助。

    二、常见日志

    /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一,一般系统整体运行信息都会记录在该日志里,其中也包含系统启动期间的日志。此外,mail,cron,daemon,kern和auth等内容也会记录在var/log/messages日志中。

    /var/log/daemon.log:记录包含各种系统后台守护进程日志信息

    /var/log/maillog 与电子邮件服务器相关的日志信息

    /var/log/cron 与系统计划任务相关的日志,每当cron任务被执行的时候都会在这个文件里面记录;

    /var/log/spooler 与UUCP和news设备相关的日志信息

    /var/log/boot.log 一般包含系统启动时的日志,包括自启动的服务,守护进程启动和停止相关的日志消息,

    /var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件,

    /var/log/btmp 记录所有失败登录信息。它是非文本文件(二进制),可以使用last -f /var/log/btmp进行查看。

    /var/log/utmp 记录包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等

    /var/log/dmesg 记录内核缓冲信息(kernel ring buffer),系统启动相关日志。在系统启动时,会在屏幕上显示许多与硬件有关的信息。可以直接查看这个文件或者使用dmesg这个命令查看。

    /var/log/lastlog 记录所有用户的最近信息。非文本文件,可以使用lastlog进行查看。

    /var/log/secure 记录了用户登录访问等验证和授权方面信息。例如,sshd会将所有信息记录(其中包括失败登录)在这里

    /var/log/auth.log:记录包含系统授权信息,包括用户登录和使用的权限机制等。

    /var/log/yum.log 包含使用yum安装软件包的信息

    /var/log/anaconda/ 目录 或者 /var/log/anconda.log 记录CentOS/RHEL安装时候的日志,在安装Linux时,所有安装信息都储存在这个文件中。

    /var/log/audit目录: 包含audit daemon的审计日志。例如:selinux开启的时候,这里就会有关于selinux审计的日志。

    /var/log/sa/ 目录:包含每日由sysstat软件包收集的sar文件。

    /var/log/cups:涉及所有打印信息的日志,即cups打印服务运行的日志。

    /var/log/dpkg.log:记录包括安装或dpkg命令清除软件包的日志

    /var/log/prelink/:记录包含.so文件被prelink修改的信息。

    三、操作示例

    1))使用 grep 同时满足多个关键字和满足任意关键字

    grep -E “word1|word2|word3” file.txt ##满足任意条件(word1、word2和word3之一)将匹配,-E 选项表用正则表达式过滤

    grep word1 file.txt | grep word2 |grep word3 ##必须同时满足三个条件(word1、word2和word3)才匹配;多管道,多次筛选。

    grep -in ‘wo’ file.txt ##里面的-in里面的i表示忽略大小写查询,n表示显示行数,表示打印file.txt里含wo字符串所在的行并同步显示对于的行号

    grep -r date -d today +%Y-%m-%d catalina.out | grep -i -E ‘ERROR|WARN’ ##检索当前日期的ERROR及WARN级别的问题,-r参数,如果后跟遍历的路径参数有“符号链接”文件,则也会递归遍历符号链接指向的目录;-R不会,只会递归遍历当前指定目录下的所有文件,后不会跟【链接文件】作为路径参数。另grep -E 这个等同于egrep 。

    定位文件里查询内容所在行的上下几行,如打印ERROR级别的上下几行:

    cat xx.log | grep -C 5 ‘关键字’ //显示file文件里匹配“关键字”字串那行以及上下5行,大写C
    cat xx.log | grep -B 5 ‘关键字’ //显示“关键字”及前5行
    cat xx.log | grep -A 5 ‘关键字’ //显示“关键字”及后5行

    grep -n ‘t[ae]st’ pp ##[ae]只当一个字符处理 a 或者是 e ,该命令可捕获含ast 和 test的字符串
    grep ‘t[.]st’ pp ##.符号代表任意的字符
    grep -n ‘[^g]oo’ pp ##这里的^在【】内就是取反的意思 非goo得字符;[]匹配单个字符
    grep -n ‘[^a-zA-Z]oo’ pp ##取前面非字符的字符
    grep -n ‘[0-9]’ pp // 取前面有数字的字符;这个等同于 grep -n ‘[0-9[0-9]*’ pp * 代表0个或是多个重复的信息
    grep -n ‘go{2,5}p’ ##查看g和p之间存在两个连续o的字符串,这里利用限定符 {},表区间,至少2次重复,最多5次。
    grep -n ‘go{2,}p’ pp ##查找至少两个的字符创
    grep -n ‘go{2}p’ pp ##查找只有两个的字符串
    grep -v ‘^$’ pp | grep -v ‘^#’ 等效于egrep -v ‘^$|^’
    grep-A|B n"key" file ##A:表示在字符串之后 after context;B:表示在字符串之前 before context;n:要获取多少行文本 line number;key:为要查找的字符串;file:文件名
    grep -A 10 -B 10 -i “key” filename
    grep -10 -i “exception” filename ##获取异常日志的前10行和后10行,不用加-A和-B
    grep –w “被查找的字符串” 文件名 ##获取与整个搜索字符匹配的内容
    grep –r “被查找的字符串” 文件目录 ##递归搜索某个目录以及子目录下的所有文件
    grep -H –r “被查找的字符串” 文件目录 | cut -d: -f1 [| uniq] ##获取哪些文件包含搜索的内容,并列出文件名,比如确定数据文件
    eg:grep -H -r “v$temp_space_header” /u01/app/oracle/product/11.1.0/dbhome_1/rdbms/admin/ | cut -d: -f1 | uniq

    egrep -n ‘g(o|pp)d’ pp ##():找出群组的数据,等效egrep -n ‘g(o|pp)d’ pp 查看god 或是gppd。这个类似于 [] 但是比[]强大的是可以是多个字符进行乱换
    egrep -n ‘d(r|o)e’ pp ===== grep -n ‘d[ro]e’ pp

    2):按行号查看—过滤出关键字附近的日志

    cat -n test.log |grep “error” 得到关键日志的行号

    cat -n test.log |tail -n +92|head -n 20 选择关键字所在的中间一行. 然后查看这个关键字前10行和后10行的日志;其中,tail -n +92表示查询92行之后的日志;head -n 20 则表示在前面的查询结果里再查前20条记录

    awk ‘END{print NR}’ test.log //查看test.log文件里面总共有多少行,然后在用sed查看指定行;
    sed -n ‘1,3p’ test.log //把test.log文件里面的第一行到第三行里面的内容给输出来,特备适合大文件日志

    3)根据日期查询日志

    sed -n ‘/2020-12-17 16:17:20/,/2021-04-20 16:17:36/p’ catalina.log ##上面的两个日期必须是日志中打印出来的日志,否则无效;

    4)查看行区间内内容

    sed -n “92,112p” catalina.log ##sed -n “开始行,结束行p” 文件名 查看文件多少行到多少行内容

    more +/date -d today +%Y-%m-%d catalina.out|grep -i -En -A 10 ‘ERROR|WARN’ //显示ERROR或者warn日志后10行并显示行号

    netstat -tunlp|grep ps aux|grep java|grep /opt/tomcat-boing|grep -v grep|awk ‘{print $2}’ //通过服务的进程查看占用的端口

    tail -f 2019-11-01.log|perl -pe ‘s/(ERROR)/\e[1;31m$1\e[0m/g’ //实时显示标红错误日志

    tail -f r.log|grep -i -En -A 10 ‘ERROR|WARN’ //实时打印ERROR|WARN级别的日志并显示后10行

    tail -f /opt/ter.log|grep -i -En -A 10 ‘ERROR|WARN’>>/opt/error.txt //实时重定向错误日志到/opt/error.txt且往下写

    5)查询最后20行,并查找关键字“error”,文字标红,上下扩展两行

    tail -n 20 catalina.log | grep ‘error’ --color -a2

    6)head和tail查看指定行数日志内容

    tail -n 10 test.log 查询日志尾部最后10行的日志;

    tail -n +10 test.log 查询10行之后的所有日志;即从尾部到第10(正数)行。

    head -n 10 test.log 查询日志文件中的头10行日志;

    head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;从头部到倒数第(-10,倒数)行。

    cat test.log | tail -n +3000 | head -n 1000 ##从第3000(tail+3000)行开始,显示1000行(head 1000)。即显示3000~3999行

    7)日志清理之find按时间查找(find是从左向右处理的,所以表达式的前后顺序不同会造成不同的搜索性能差距。)

    find . -type f -name ‘test*’ -delete ##delete参数,另-iname不区分大小写

    find . -type f -name ‘test*’ | xargs rm -rf ##使用管道及xargs命令

    find . -type f -name ‘test*’ -exec rm -rf {} ; ##使用-exec参数,注意{}和\;之间的空格,同时两个{}之间没有空格

    a(last accessed) 最近一次访问时间,-atime +10表10天之前,-10表10天之内,10(没有加减号)表示第10天。

    c(last changed) 最近一次改变时间:包括文件的权限、文件名的更改

    m(last modified) 最近一次修改时间,文件的本身的内容更改

    注:-cmin表按分钟时间查找,ctime表按24h查找,-mtime更适合筛选以小时为单位(相对时间)的时间区间。对于以绝对时间(如自然日)为单位的时间区间,更适合使用find {path} (!) -newermt -type f

    find -mtime -1 ##-1是24小时之内操作过的;
    find -mtime 1 ##1是24小时之外,48小时之内操作过的;
    find -mtime +1 ##+1是48小时之外操作过的.

    如果有文件同时符合两个或三个,优先出现在第一个,不会出现在第二个或第三个。比如有文件从三天前到今天一直在append,那么只会出现在find -mtime -1里,不会有交集。

    另外还可以使用:find {path} -newermt {time} ##实际格式find -newerXY {variable},表查找一些X属性比variable的Y属性更早的文件。其中X指代find的目标文件属性,Y代表参照属性。X可选a,c,m;Y可选a,c,m,t。acm意义分别为atime(访问时间),ctime(改变时间),mtime(修改时间)。t代表客观绝对时间,只作为参照属性存在,格式为yyyy-MM-dd hh:mm:ss。

    find {path} -newermt date +%F -type f ##查找今天修改内容的文件
    find {path} ! -newermt `date +%F` -exec {order} {} ; ##查找除了今天修改的文件之外的文件
    find /vpm/vpm1/vidstor -name ‘.vm’ -newermt ‘2020-01-01 00:00’ ! -newermt ‘2020-01-20 07:00’ | wc -l ##查找修改时间比2020-01-01 00:00之后且2月20日之前的文件。
    find ./ -name '
    .txt’ -type f -newermt ‘2020-01-01 00:00:00’ ! -newermt ‘2020-12-01 00:00:00’
    find . -name ‘*.sql’ -exec grep -i ‘被检索内容’ {} ; -print

    8)日志清理之find特殊文件

    find . -type f ! -perm 777 ##查找没有777权限的文件
    find . -perm /u=r ##查找只读文件
    find . -type d -empty  ##.查找空目录
    find . -user blue ##查找某用户的文件

    排除文件使用-prune将被find命令忽略,-path pathname -prune: 避开指定子目录pathname查找。-path expression -prune: 避开表达中指定的一组pathname查找。

    -perm mode: 文件权限正好符合mode(mode为文件权限的八进制表示)。
    -perm +mode: 文件权限部分符合mode。如命令参数为644(-rw-r–r–),那么只要文件权限属性中有任何权限和644重叠,这样的文件均可以被选出。
    -perm -mode: 文件权限完全符合mode

    find -newer file1 ! file2: 查找文件的更改日期(ctime)比file1新,但是比file2老的文件。
    find . -newer users2 ! -newer test.tar.bz2 ##查找文件更改日期比users2新,但是不比test.tar.bz2新的文件

    9)systemd日志查看,用journalctl命令:

    journalctl //查看所有日志(默认情况下,只保存本次启动的日志)
      
    journalctl -k //查看内核日志(不显示应用日志)
      
    journalctl -b或journalctl -b -0 //查看系统本次启动的日志
        
    journalctl -b -1查看上一次启动的日志(需更改设置)
      
    journalctl --since=“2017-10-30 18:10:30” //查看指定时间的日志:
      journalctl --since “20 min ago”
      journalctl --since yesterday
      journalctl --since “2017-01-10” --until “2017-01-11 03:00”
      journalctl --since 09:00 --until “1 hour ago”
      
    journalctl -n //显示尾部的最新10行日志
      
    journalctl -n 20 //显示尾部指定行数的日志
      
    journalctl -f //实时滚动显示最新日志
      
    journalctl/usr/lib/systemd/systemd //查看指定服务的日志
      
    journalctl_PID=1 //查看指定进程的日志
      
    journalctl/usr/bin/bash //查看某个路径的脚本的日志
      
    journalctl_UID=33 --since today //查看指定用户的日志
      
    journalctl -u nginx.service //查看某个Unit 的日志
      journalctl -u nginx.service–since today
    journalctl -u nginx.service-f //实时滚动显示某个Unit 的最新日志
      
    journalctl -u nginx.service -u php-fpm.service–since today //合并显示多个Unit 的日志
      
    journalctl -p err -b //查看指定优先级(及其以上级别)的日志,共有8级
    0: emerg
    1: alert
    2: crit
    3: err
    4: warning
    5: notice
    6: info
    7: debug

    journalctl --no-pager //日志默认分页输出,–no-pager 改为正常的标准输出

    journalctl -b -u nginx.service-o json //以JSON 格式(单行)输出
      
    journalctl -b -u nginx.serviceqq-o json-pretty //以JSON 格式(多行)输出,可读性更好
      或journalctl -o json |jq . 需要安装jq(epel源)
    journalctl --disk-usage //显示日志占据的硬盘空间
      
    journalctl --vacuum-size=1G //指定日志文件占据的最大空间
      
    journalctl --vacuum-time=1years //指定日志文件保存多久

    四、安全审计相关

    1、记录用户操作行为的脚本

    1)创建用户命令行为记录脚本

    logdir=/opt/oplog	##定义记录用户行为写入的日志路径
    userdir=$logdir/${LOGNAME}
    DT=`date +"%Y%m%d"`
    
    export HISTFILE="/$userdir/history.$DT"  ##指定不同终端执行的命令都存储在同一个文件中
    export HISTTIMEFORMAT="%F %T :"			## 历史命令执行的时间,类似手动编辑用户变量vi /$HOME/.bashrc
    ##手动添加HISTTIMEFORMAT="%Y-%M-%D %H:%M:%S" \n export HISTTIMEFORMAT
    export HISTSIZE=128			###设置历史命令记录数,执行history命令时显示最近128条命令
    export HISTFILESIZE=9000  ###定义在 .bash_history 中保存命令的记录总数 ,.bash_history文件可以保存9000条命令
    export HISTCONTROL=ignoredups  ##忽略重复命令
    export PROMPT_COMMAND="history -a"  ##正常命令操作记录会在终端关闭结束工作后才会写入到history文件中,该处参数可实现实时写入
    
    if [ ! -d $logdir ];then
        mkdir -p $logdir
        chmod 777 $logdir
    fi
    
    if [ ! -d $userdir ];then
        mkdir -p $userdir
        chmod 300 $userdir
    fi
    
    shopt -s histappend   ##多个终端同时操作时,避免命令覆盖,采用追加方式
    
    readonly HISTFILE		##设置这些环境变量只读
    readonly HISTTIMEFORMAT
    readonly HISTSIZE
    readonly HISTFILESIZE
    readonly PROMPT_COMMAND
    readonly HISTCMD
    readonly HISTCONTROL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2)对上述日志加特权进行限制,防止故意删除:

    logdir=/opt/oplog
    userdir=$(ls $logdir)
    DT=`date +"%Y%m%d"`
    for user in $userdir;do
        hisfile="$logdir/$user/history.$DT"
        if [ ! -f $hisfile ];then
            touch $hisfile
            chown $user:$user $hisfile
            chmod 300 $hisfile
            chattr +a $hisfile
        else
            lsattr $hisfile | awk '{ print $1 }' | grep -v "a" &> /dev/null && chmod 300 $hisfile && chattr +a $hisfile
        fi
        find . -type f -size 0 -mtime +1 -exec chattr -a {} \;  ##清除一天前的空日志
        find . -type f -size 0 -mtime +1 -exec rm -f {} \;
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    注:完成后,可编辑计划任务rontab -e,添加:*/1 * * * * /opt/shells/oplogcron.sh &> /dev/null;配置每分钟执行一下。

    2、手动配置history记录实现

    手动配置用户命令日志审计功能步骤如下:

    1)创建用户审计文件存放目录和审计日志文件: mkdir -p /var/log/usermonitor/
    2)创建用户审计日志文件:echo usermonitor >/var/log/usermonitor/usermonitor.log
    3)将日志文件所有者赋予一个最低权限的用户:chown nobody:nobody /var/log/usermonitor/usermonitor.log
    4)给该日志文件赋予所有人的写权限:chmod 002 /var/log/usermonitor/usermonitor.log
    5)设置文件权限,使所有用户对该文件只有追加权限:chattr +a /var/log/usermonitor/usermonitor.log
    6)编辑/etc/profile文件,添加如下脚本命令:
    export HISTORY_FILE=/var/log/usermonitor/usermonitor.log
    export PROMPT_COMMAND=‘{ date “+%y-%m-%d %T ##### $(who am i |awk “{print $1” “$2” “$5}”) #### $(whoami) #### KaTeX parse error: Expected '}', got 'EOF' at end of input: …d x cmd; echo "cmd”; })"; } >>$HISTORY_FILE’
    7)使配置立即生效:source /etc/profile,完成之后,当审计时查看/var/log/usermonitor/usermonitor.log文件即可,它会记录登上服务器所有用户使用的命令。

    3、配置将 rm 命令删除的文件放在回收站

    以下将使用shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。

    1》简单实现:

    假设有一个大的分区/data/,每次删除文件或者目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.20170327/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R 把文件路径一同同步

    #!/bin/bash
    #name:
    fileName=$1
    now=`date +%Y%y%d`
    dir=$(/data/$now)
    read  -p "你确定删除这文件或者目录吗 $1 ? yes|no :" input
    if [ $input == "yes" ] || [ $input == "y" ]; then
         # 判断目录是否存在
         if [ ! -d $dir ]; then
            mkdir /data/$now
        fi
        # rsync同步要删除的文件和目录
         rsync -aR $1/ /data/$now/$1/
         rm -rf $1
        
    elif [ $input == "no" ] || [ $input == "n" ]; then
         # 选择no退出
         exit 0
    else
         # 如果选择别的输入符,提示
         echo "只能输入yes或者no"
         exit 0
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2》复杂的实现:

    不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户输入yes,则直接删除文件或者目录,如果输入no,则提示未删除,然后退出脚本。

    #!/bin/bash
    #name:南宫乘风,特此感谢
    now=$(date +%Y%m%d)
    #判断文件大写
    f_size=$(du -sk $dir | awk '{print $1}')
    #判断磁盘大小
    disk_szie=$(df -k| grep -vi filesystem | awk '{print $4}'|sort -n|tail -n1)
    #判断最大的目录在哪里
    big_filesystem=$(df -k|grep -vi filesystem | sort -n -k4 | tail -n1 | awk '{print $NF}')
    #判断文件大小和磁盘大小比较
    if [ $f_size -lt $disk_szie ]; then
         # 输入选项,准备开始删除工作
         read  -p "你确定删除这文件或者目录吗 $1 ? yes|no :" input
        if [ $input == "yes" ] || [ $input == "y" ]; then
             # 判断存放目录是否存在
             if [ ! -d $big_filesystem/data/$now ]; then
                 # 不存在新建目录
                mkdir -p $big_filesystem/data/$now
             fi
             rsync -aR $1 $big_filesystem/$now/
             rm -rf $1
        #判断输入no的情况
        elif [ $input == "no" ] || [ $input == "n"]; then
             exit 0
        else
           # 如果选择别的输入符,提示
            echo "只能输入yes或者no"  
        fi
        
    else
         # 判断磁盘空间不足的情况
         echo "这磁盘没有足够的空间备份: $1."
         read -p "你还想删除"$1"吗? yes|no :" input
         if [ $input == "yes" ] || [ $input == "n" ]; then
              # body
              echo "$1将会在3秒后删除,将不会有备份"
              for i in `seq 1 5`; do echo -ne "."; sleep 1; done
              rm -rf $1
    
         elif [ $input == "no" ] || [ $input == "n" ]; then
              echo "将不会删除 $1."
              exit 0
         else
              # 如果选择别的输入符,提示
               echo "只能输入yes或者no"  
         fi
         
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    3》手动配置实现rm删除到回收站

    编辑用户环境变量文件:vi ~/.bashrc;注释#alias rm=‘rm -i’;添加如下内容

    mkdir -p ~/.trash  #创立一个目录作为回收站,这里运用的是用户家目录下的.trash目录
    
    alias rm=trash   #命令别名 rm改动为trash,经过将rm命令别名值trash来完成把rm改形成删除文件至回收站
    
    alias r=trash
    
    alias rl='ls ~/.trash' #  rl 命令显现回收站中的文件
    
    alias ur=undelfile    # ur命令找回回收站中的文件
    
    undelfile()      #这个函数的作用是找回回收站下的文件
    
    {
    mv -i ~/.trash/$@ ./		##$@ 都表示传递给函数或脚本的所有参数,$@代表all
    
    }
    
    trash()  #这个函数是将指定的文件挪动到指定的目录下,经过将rm命令别名为trash来完成把rm改形成删除文件至回收站
    
    {
    mv $@ ~/.trash/
    
    }
    
    cleartrash() #这个函数的作用是清空回收站目录下的一切文件
    
    {
    read -p "clear sure?[n]" confirm
    
    [ $confirm == 'y' ] || [ $confirm == 'Y' ]  && /bin/rm -rf ~/.trash/*
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    4》手动配置实现rm -rf删除到回收站

    a、创建回收站:mkdir ~/.trash &&chmod 777 .trash //生产环境尽量放在空间较大的分区下
    b、重新定义rm命令:

    # rm transform
    function rm() {
        # 定期清理回收站,时间可调整
        now=$(date +%s)
        for s in $(ls --indicator-style=none $HOME/.trash/) ;do ##–indicator-style=方式 指定在每个项目名称后加上其指示符号<方式>:none (默认),classify (-F),file-type (-p),使用-p时在每个文件名后附上一个字符以说明改文件的类型。“*”:表示可执行的普通文件;“/”:表示目录;“@”:表示符号链接;“|”:表示FIFOs;“=”:表示套接字
            dir_name=${s//_/-}
            dir_time=$(date +%s -d $dir_name)
            # if big than one month then delete
            if [[ 0 -eq dir_time || $(($now - $dir_time)) -gt 2592000 ]] ;then  ##删除30天的文件
                echo "Trash " $dir_name " has Gone "
                /bin/rm $s -rf
            fi
        done
        # 重写rm命令,将文件mv到回收站下
        prefix=$(date +%Y_%m_%d)
        hour=$(date +%H)
        mkdir -p $HOME/.trash/$prefix/$hour
        if [[ -z $1 ]] ;then
                echo 'Missing Args'
            return
        fi
        echo "Attention " ${!#} "已删除移至回收站~"
        mv ${!#} $HOME/.trash/$prefix/$hour
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    执行source ~/.bashrc。使其立即生效。这样使用过rm -rf时,会提示,invalid option – ‘r’;上述请先在测试环境验证,禁止生产环境直接试用。

    清空回收站可使用真正的 rm 命令:/bin/rm -rf ~/.trash/*

    五、运维日志管理系统部署

    参考:https://blog.51cto.com/shantu/1440029,组件:GlusterFS + lagstash + elasticsearch + kibana 3 + redis

    六、linux日志审计工具audit

    Linux auditd 工具可以将审计记录写入日志文件。包括记录系统调用和文件访问。管理员可以检查这些日志,确定是否存在安全漏洞。对此,不得不介绍下Linux 用户空间审计系统。

    Linux用户空间审计系统:它是一种Linux自集成模块系统,由auditd、audispd、auditctl、autrace、ausearch和aureport等应用程序组成,借助Linux内核有用日志记录事件的能力,比如记录系统调用和文件访问。然后管理员可以评审这些日志,确定可能存在的安全漏洞,比如失败的登录尝试,或者用户对系统文件不成功的访问。这种功能统称为Linux用户空间审计系统,在Red Hat Enterprise Linux 5及其之后版本中已经直接可用。其中,审计后台auditd应用程序通过netlink机制从内核中接收审计消息,然后通过一个工作线程将审计消息写入到审计日志文件中,Linux的审核系统提供了一种记录系统安全信息的方法,为系统管理员在用户违反系统安全规则时提供及时的警告信息。内核其他线程通过内核审计API写入套接字缓冲区队列audit_skb_queue中,内核线程kauditd通过netlink机制将审计消息定向发送给用户控件的审计后台auditd的主线程,auditd主线程再通过事件队列将审计消息传给审计后台的写log文件线程,写入log文件。另一方面,审计后台还通过一个与套接字绑定的管道将审计消息发送给dispatcher应用程序。下图是Linux audit架构示意图 :

    在这里插入图片描述
    上图中实线代表数据流,虚线代表组件关之间的控制关系
    在这里插入图片描述
    上图中,左边框内是 Linux 内核中的几种系统调用(user, task, exit, exclude),右侧是相关的一系列应用程序(auditd、audispd、auditctl、autrace、ausearch 和 aureport 等)。Linux 内核中的几种系统调用有:

    User :记录用户空间中产生的事件;它的作用是过滤消息的,内核传递给审计后台进程之前先查询它。
    Task:跟踪应用程序的子进程(fork);当一个任务被创建时,也就是父进程通过 fork 和克隆创建子进程时记录该事件;
    Exit:当一个系统调用结束时判断是否记录该调用;
    Exclude:删除不合格事件;Exclude 是用来过滤消息的,也就是不想看到的消息可以在这里写规则进行过滤。

    上图中可以看到 audit 是内核中的一个模块,内核的运行情况都会在 audit 中记录,当然这个记录的规则是由超级用户来设置的。内核的 audit 模块是由应用层的一个应用程序 auditd 来控制的。audit 产生的数据都会传送到 auditd 中,然后再由 auditd 进行其它操作。auditd.conf 是 auditd 的配置文件,确定 auditd 是如何启动的,日志文件放在哪里等等。audit.rules 是 audit 的规则文件,确定 audit 的日志中记录哪些操作。它通过一个对 audit 进行控制的应用程序 auditctl 进行操作。root 用户也可以直接调用 auditctl 进行操作。auditd 收到的数据后会有两个去处。默认的是将日志保存在 audit.log 文件中,默认路径 /var/log/audit/audit.log。另一个通过 audispd 将日志进行分发。

    audit 和 syslog 日志系统的关系:

    audit 主要用来记录安全信息,用于对系统安全事件的追溯;而 syslog 日志系统用来记录系统中的各种信息,如硬件警报和软件日志等。但是 syslog 属于应用层,没办法记录太多信息。audit 来记录内核信息,包括文件的读写,权限的改变等。

    【组件说明】:

    auditd :audit 守护进程负负责把内核产生的信息写入到硬盘上,这些信息是由应用程序和系统活动所触发产生的。audit守护进程如何启动取决于它的配置文件,/etc /sysconfig/auditd.audit系统函数的启动受文件/etc/audit/auditd.conf的控制。在用户空间审计系统通过auditd后台进程接收内核审计系统传送来的审计信息,将信息写入到/var/log/audit/audit.log 中,audit.log的路径可在/etc/auditd.conf 中指定。当auditd没有运行时,内核将审计信息传送给 syslog,这些消息通常保存在/var/log/messages文件中,可以用dmesg命令查看。

    auditctl:auditctl功能用来控制audit系统,它控制着生成日志的各种变量,以及内核审计的各种接口,还有决定跟踪哪些事件的规则。

    audit.rules:在/etc/audit/audit.rules中包含了一连串auditctl命令,这些命令在audit系统被启用的时候被立即加载。

    aureport:aureport的功能是能够从审计日志里面提取并产生一个个性化的报告,这些日志报告很容易被脚本化,并能应用于各种应用程序之中,如去描述结果。

    ausearch : ausearch用于查询审计后台的日志,它能基于不同搜索规则的事件查询审计后台日志。每个系统调用进入内核空间运行时有个唯一的事件id,系统调用在进入内核后的运行过程的审计事件共享这个id.

    audispd:audispd是消息分发的后台进程,用于将auditd后台发过来的一些消息通过syslog写入日志系统。这是一个审计调度进程,它可以为将审计的信息转发给其它应用程序,而不是只能将审计日志写入硬盘上的审计日志文件之中。

    autrace这个功能更总类似于strace,跟踪某一个进程,并将跟踪的结果写入日志文件之中。

    要使用安全审计系统可采用下面的步骤:

    ● 安装软件包:#yum install audit*.* -y

    ● 了解配置文件:audit 安装后会生成 2 个配置文件: /etc/audit/auditd.conf 和/etc/audit/audit.rules 。
    /etc/audit/auditd.conf 是守护程序的默认配置文件。/etc/audit/audit.rules 是记录审计规则的文件。首次安装 audit 后, 审计规则文件是空的。而/etc/audit/auditd.conf 守护程序的默认配置文件是 Linux 安全审计系统最关键文件。/etc/audit/auditd.conf 文件包括如下几个部分:一般先设置 auditd 的日志文件,然后设置是否循环使用日志文件,配置日志文件大小和报警信息,设置审计规则信息和目录观察器。一下是centos7下的/etc/audit/auditd.conf示例:

    log_file = /var/log/audit/audit.log			## 设置日志文件的路径
    
    num_logs = 5			#设置日志文件轮询的数目,它是 0~99 之间的数。如果设置为小于 2,则不会循环日志。如果没有设置 num_logs 值,它就默认为 0,意味着从来不循环日志文件
    
    tcp_listen_port =60		##置监听端口为 60
            
    name_format = NONE		#设置日志文件是否使用主机名称,一般选 NONE
            
    max_log_file = 6		#设置日志文件大小,以兆字节表示的最大日志文件容量。当达到这个容量时,会执行 max_log_file _action 指定的动作
            
    max_log_file_action = ROTATE		#设置日志文件到达最大值后的动作,这里选择 ROTATE(轮询)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ● 了解配置命令,配置审计守护进程。

    命令格式:auditctl [选项] filter,action -S syscall -F condition -k label,其中:

    -S 表示系统调用号或名字

    -F 表示规则域。

    -k 表示设置审计规则上的过滤关键

    命令选项:
    在这里插入图片描述

    ● 添加审计规则和观察器来收集所需的数据

    1)audit 审计规则分成三个部分:

    控制规则:这些规则用于更改审计系统本身的配置和设置。在/etc/audit/audit.rules 中设置。主要包括:

    -D #删除所有当前装载的审核规则#

    -b 8192 #在内核中设定最大数量的已存在的审核缓冲区为 8Mb#

    -e 2 #锁定审核配置#

    文件系统规则:这些是文件或目录监视。 使用这些规则,我们可以审核对特定文件或目录的任何类型的访问。通过 auditctl 命令设置。监控文件系统行为(依靠文件、目录的权限属性来识别),规则格式:

    -w 路径

    -p 权限,其动作分为四种:rwxa,其中a表改变在文件或者目录中的属性。

    -k 关键字

    eg1:auditctl -w /etc/passwd -p wa //监控/etc/passwd 文件的修改行为,也可将命令加入到文件/etc/audit/rules.d/audit.rules 中来实现

    eg2:auditctl -w /etc/hosts -p wa -k hosts_change //记录了每次读取或者修改/etc/hosts 文件的尝试

    系统调用规则:这些规则用于监视由任何进程或特定用户进行的系统调用。监控系统调用可能会引起高负荷的日志活动,这会让内核承受更大的负荷。所以要慎重衡量哪些系统调用需要放到 audit.rules 中。如果审计的是目录的话,只能对该目录本身的属性进行审计。如果想审计下面的文件,需要一一列出。参数有:

    -a 添加一条系统调用监控规则

    -S 显示需要监测的系统调用的名称

    -D 删除所有规则

    -d 删除一条规则和-a 对应

    -w 写入文件或者目录。

    -W 删除一条规则和-w 对应

    -l 列出所有规则

    eg1:auditctl -a always,exit -F arch=b64 -F auid=10001 -S open -k userfile //记录有哪些文件呗特定用户(UID 为 10001)访问,userfile 假设就是用户自己设置的一个规则名字

    注:通过 auditctl 命令添加的规则不是永久有效的。 为了让他们在重新启动后有效的,可以将其添加到文件
    /etc/audit/rules.d/audit.rules 中。

    ● 启用了内核中的audit守护进程并开始进行日志记录

    1)启动:service auditd start &&systemctl enable auditd
    重启:service auditd restart
    重新加载:service auditd reload 或者 service auditd force-reload 命令用来重新加载 auditd 在/etc/audit/auditd.conf 文件中的配置。
    轮转日志:service auditd rotate 命令在/var/log/audit/目录中轮转日志文件。
    service auditd resume 命令在推迟审核事件日志之后重新开始,例如存在没有足够的磁盘分区空间来保存审核日志文件情况。service auditd status 命令显示运行状态。
    验证规则,应以root身份执行 auditctl -l 命令列出所有活动的规则和观察器。

    2)audit客户端安装
    yum -y install audispd-plugins
    vi /etc/audisp/plugins.d/au-remote.conf //编辑配置把审核日志发送到远程日志服务器

    ● 通过生成审计报表和搜索日志来周期性地分析数据

    更多参考:

    https://www.ibm.com/developerworks/cn/linux/l-lo-use-space-audit-tool/index.html

    http://www.voidcn.com/article/p-csbhmtzq-st.html

    Linux 审核系统项目页 :http://people.redhat.com/sgrubb/audit/。

    Linux Audit Quick Start SUSE Linux Enterprise 11 SP1 http://www.suse.com/documentation/sled11/pdfdoc/sled11_auditquickstart/sled11_auditquickstart.pdf

    红帽企业版 Linux 7 安全性指南 :https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/pdf/Security_Guide/Red_Hat_Enterprise_Linux-7-Security_Guide-zh-CN.pdf

    七、自动安全审计工具Lynis

    Lynis是一款轻量级的免费开源的服务器审计工具,它能在Unix/Linux等操作系统的完成安全审计,它不会破坏系统,也不会影响Linux系统上的任何应用程序或服务,可以发现基于Linux系统中的恶意软件和安全漏洞,它能够进行深层次的安全扫描,其目的是检测潜在的时间并对未来的系统加固提供建议。这款软件会扫描一般系统信息,脆弱软件包以及潜在的错误配置.。Lynis一旦审计完成,会生成一个报告,我们可以审查结果、警告和建议,然后我们可以根据它实现我们的安全策略。日志默认保存在/var/log/lynis.log;报告默认保存在/var/log/lynis-report.dat;

    在这里插入图片描述
    官网文档:更多单击查看;

    产品特征:

    漏洞扫描
    系统加固
    入侵检测
    中心管理
    自定义行为规划
    报告
    安全面板
    持续监测
    技术支持

    目标:

    自动安全审计
    符合性测试
    漏洞侦测

    有助于:

    配置管理
    软件补丁管理
    系统加固
    渗透测试
    恶意软件扫描
    入侵检测

    1)安装

    mkdir /usr/local/lynis
    cd /usr/local/lynis/
    wget https://downloads.cisofy.com/lynis/lynis-3.0.0.tar.gz
    tar xvf lynis-3.0.0.tar.gz
    curl https://cisofy.com/files/lynis-3.0.0.tar.gz -o lynis.tar.gz
    #或通过epel源yum安装
    yum install epel-release 
    yum update ca-certificates curl nss openssl
    yum --enablerepo=epel -y install lynis
    #或手动编辑repo源
    vi /etc/yum.repos.d/cisofy-lynis.repo
    [lynis]
    name=CISOfy Software - Lynis package
    baseurl=https://packages.cisofy.com/community/lynis/rpm/
    enabled=1
    gpgkey=https://packages.cisofy.com/keys/cisofy-software-rpms-public.key
    gpgcheck=1
    priority=2
    
    yum makecache fast
    yum install -y lynis
    #验证
    lynis  --version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2)软件使用

    lynis 输入后参数如下

    在这里插入图片描述

    #使用‘audit system’参数来扫描整个系统,对整个系统的审计
    ./lynis audit system  #需要输入回车才能往下执行,使用-c和-Q选项跳过用户输入
    ./lynis audit system --wait #等待用户按回车键显示下一节的报告
    #按类别审计,列出扫描组
    ./lynis show groups
    ./lynis show commands  #显示可用的Lynis命令
    ./lynis show profiles  #显示发现的配置文件
    ./lynis show settings  #列出配置文件中的所有活动设置
    ./lynis show version   #显示当前的Lynis版本
    #对"kernel"和"firewalls"进行简单的审计
    ./lynis --tests-from-group "kernel firewalls"
    
    lynis --check-all
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3)自动审计

    #每天晚上10:30会执行扫描automated,并把输出的信息保存到/var/log/lynis.log日志文件中
    30 22 * * * /usr/bin/lynis -c --auditor "automated" --cronjob > /var/log/lynis/report.txt
    
    
    • 1
    • 2
    • 3
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/204684
    推荐阅读
    相关标签