Linux日志巡检之日常操作及安全审计 您所在的位置:网站首页 linux开启审计服务 Linux日志巡检之日常操作及安全审计

Linux日志巡检之日常操作及安全审计

2024-02-14 04:53| 来源: 网络整理| 查看: 265

一、背景

本文专门针对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

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

注:完成后,可编辑计划任务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

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

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/* }

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 }

执行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(轮询)

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

命令格式: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

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

3)自动审计

#每天晚上10:30会执行扫描automated,并把输出的信息保存到/var/log/lynis.log日志文件中 30 22 * * * /usr/bin/lynis -c --auditor "automated" --cronjob > /var/log/lynis/report.txt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有