当前位置:   article > 正文

Linux中间件 配置文件 基线巡检 思路与实践

Linux中间件 配置文件 基线巡检 思路与实践

基线巡检

基线一般指配置和管理系统的详细描述,或者说是最低的安全要求,包括服务和应用程序设置、操作系统组件的配置、权限和权利分配、管理规则等。云安全中心的基线检查功能支持检测服务器的安全配置,例如服务器上的系统、账号、数据库、弱密码、合规性配置中存在的风险点,提供检测详情说明和基线加固建议。用户可以根据自己的需求,新增、编辑、删除基线检查策略,设置基线检查等级的范围以及自定义弱口令规则。

为规范公司中间件系统的稳定运行和加强公司中间件巡检作业管理工作标准进行,保证各中间件在规定的配置下运行,满足安全、审计等需求。方便看出每个中间件实例配置情况,编写巡检脚本,见此文。

实现原理:

1、读取基准基线文件

2、取各台服务器配置文件

3、格式化基准文件,以便于后续匹配使用

4、依次对获取的配置文件 与 格式化后的基准文件做匹配。

5、将不同配置的项目输出,以便查阅。

如不存在基线的配置,则发出警告

原理图:

代码详情:

1、读取基准基线文件

  1. filedir="/tmp/nbaseline_check"
  2. filepath="/tmp/baseline_check/nginx_baseline.txt"
  3. cmd="curl -o $filepath -u svnauth:this-is-a-token -O http://SVN-URL/artifactory/ops-generic-tools-local/middleware/nginx/baseline/nginx_baseline.txt"
  4. if [ ! -d "$filedir" ]; then
  5. mkdir $filedir
  6. fi
  7. echo command: $cmd
  8. $cmd
  9. cat $filepath
  10. if [ -f $filepath ]; then
  11. #ls -l |grep nginx_baseline.txt
  12. atime=`stat -c %Y $filepath`
  13. btime=$(date +%s)
  14. timediff=$(( atime - btime ))
  15. timedetla=$(( timediff/84600))
  16. if [ "$timedetla" -ge 1 ]; then
  17. echo "不是最新的文件"
  18. else
  19. echo "获取到当天文件" $filepath
  20. fi
  21. else
  22. echo "文件不存在"
  23. fi

 2、取各台服务器文件发送到本机,使用expect脚本输入各服务器的密码(亦可使用ssh_pass 或者 ssh免密登录解决此问题 )

  1. #collect-baseline.sh IP.txt
  2. File=`cat ip.txt` #192.168.1.1-192.168.1.2-192.168.1.3
  3. echo $File
  4. OLD_IFS="$IFS"
  5. IFS="-"
  6. array=(${File//-,/}) #按-分割ip
  7. IFS="$OLD_IFS"
  8. for ip in ${array[@]}
  9. do
  10. if [ ! -n "$ip" ] ; then
  11. echo ip is null
  12. break
  13. fi
  14. echo "$ip" >> /tmp/nginx_baseline_check/test.log
  15. download_nginxconf_all.sh $ip &
  16. done
  17. #echo "ip"
  18. wait
  19. WriteLog $1 0 "process succeed."

通过expect脚本,将服务器文件拷贝至本机tmp目录,并通过中转服务器将文件带IP传至中转机。脚本执行步骤将以日志形式保存在本机/tmp/nginx_baseline_check/download.log路径下 

  1. #!/usr/bin/expect -f
  2. #download_nginxconf_all.sh $IP
  3. log_file /tmp/nginx_baseline_check/download.log
  4. log_user 0
  5. set date [ exec date "+%Y_%m_%d:%H:%m:%s" ]
  6. set remote_host [lindex $argv 0]
  7. set remote_path [lindex $argv 1]
  8. set err_flag1 0
  9. #set err_flag2 0
  10. #set err_flag3 0
  11. #set err_flag4 0
  12. set timeout 5
  13. spawn ssh user$remote_host
  14. expect "continue connecting" { send "yes\r" ; exp_continue }
  15. expect "password"
  16. send "this_is_my_password/r"
  17. expect "*ermission denied" { send_user "密码错误\n" ; exit 1 }
  18. expect "Connection time out" { send_user "Connection time out@" ; send_user $remote_host ; send_user "\n" ; exit 2 ; }
  19. exec sleep 1
  20. send "sudo -i\r"
  21. send "cp /home/nginxweb/nginx-1.18.0/conf/nginx.conf /tmp/\r"
  22. expect "没有那个文件或目录" { send_user "Not found nginx1.18.0/.../nginx.conf @ $remote_host \n" ; set err_flag1 ; exp_continue }
  23. expect "*o such file or directory" { send_user "Not found nginx1.18.0/.../nginx.conf @ $remote_host \n" ; set err_flag1 ; exp_continue }
  24. expect "是否覆盖" { send "y\r"; expect_continue }
  25. expect "overwrite" { send "y\r"; expect_continue }
  26. send "chmod a+r /tmp/nginx.conf\r"
  27. send "exit\r"
  28. exec sleep 1
  29. send "exit\r"
  30. send_user $date ; send_user "\n"
  31. send_user $remote_host ; send_user "\n"
  32. send_user "err_flag1:" ; send_user err_flag1 ; send_user "\n"
  33. expect eof
  34. spawn scp iapopr@remote_host:/tmp/nginx.conf /tmp/nginx_baseline_check/nginx.conf_$remote_host
  35. expect "password" { send "this_is_my_password/r" }
  36. expect "*ermission denied" { send_user "密码错误\n" ; exit 4 }
  37. if { $err_flag1 * $err_flag2 == 0 }
  38. {
  39. send_user $remote_host ; send_user "download all succeed.\n"
  40. } else
  41. {
  42. send_user $remote_host ; send_user "download all failed.\n"
  43. }

日志模板如下:

not found nginx-1.10.0/../nginx.conf @ 192.168.1.3       --->err_flag2

not found nginx-1.10.2/../nginx.conf@ 192.168.1.3        --->err_flag3

not found tengine-2.1.0/../nginx.conf @ 192.168.1.3      --->err_flag4

2021_10_04:07:10:1633302002
192.168.1.3
err_flag1:0
err_flag2:1
err_flag3:1
err_flag4:1
10.134.14.73 download succeed.

3、比对配置文件与基线文件

默认nginx基线文件不规整,具有空行,注释行等内容,先对基线文件进行预处理,以备后续正则匹配使用。

注:如遇到不等数量空格和空白字符,且需要正则匹配的,将其转换为【\s\+】,以正则匹配。

  1. #!/bin/bash
  2. cd /tmp/nginx_baseline_check/
  3. baseline="/tmp/nginx_baseline_check/nginx_baseline.txt" #获取baseline文件不再赘述
  4. #baseline="/root/scripts/liuli/middleware/nginx/hx1/nginx_baseline";
  5. echo $baseline
  6. echo 0=======
  7. sed -i 's/^[ ]*$//g' $baseline #去除空行或空格行
  8. sed -i 's/^\s*$//g' $baseline #去除空行或空格行
  9. cat $baseline
  10. echo 1=======
  11. sed -i 's/[ ]*$//g' $baseline #去除行末空格
  12. cat $baseline
  13. echo 2=======
  14. sed -i 's/;*$//g' $baseline #去除行末分号
  15. cat $baseline
  16. echo 3=======
  17. sed -i 's/[ ]*$//g' $baseline #去除行末空格
  18. cat $baseline
  19. echo 4======
  20. sed -i 's/^ *#//g' $baseline #去除#开头的行
  21. cat $baseline
  22. echo 5======
  23. #sed -i 's/\\s\+/\\\\s+/g' nginx_baseline #空格替换为\s
  24. sed -i 's/\s\+/\\\\s\\\\+/g' $baseline
  25. cat $baseline
  26. echo 5=======
  27. sed -i '/^\s*$/d ' $baseline #去除空行或空格行
  28. cat $baseline
  29. echo 6=======
  30. sed -i 's/\\\\s\\\\+$//g' $baseline #去除行末空格
  31. cat $baseline

具体处理代码较多,直接查看最后输出结果即可 

/tmp/nginx_baseline_check/nginx_baseline.txt
0=======   #去除空行或空格行
error_log                       /data/logs/nginx/error.log   warn;
worker_rlimit_nofile            65535;
use                     epoll;
worker_connections      65535;
multi_accept            on;


include                 mime.types;
default_type            application/octet-stream;
access_log              /data/logs/nginx/access.log access;
keepalive_timeout       65;
underscores_in_headers  on;
server_tokens off;

1=======    #去除行末空格
error_log                       /data/logs/nginx/error.log   warn;
worker_rlimit_nofile            65535;
use                     epoll;
worker_connections      65535;
multi_accept            on;


include                 mime.types;
default_type            application/octet-stream;
access_log              /data/logs/nginx/access.log access;
keepalive_timeout       65;
underscores_in_headers  on;
server_tokens off;

2=======   #去除分号行
error_log                       /data/logs/nginx/error.log   warn;
worker_rlimit_nofile            65535;
use                     epoll;
worker_connections      65535;
multi_accept            on;


include                 mime.types;
default_type            application/octet-stream;
access_log              /data/logs/nginx/access.log access;
keepalive_timeout       65;
underscores_in_headers  on;
server_tokens off

3=======   #除去行末空格
error_log                       /data/logs/nginx/error.log   warn;
worker_rlimit_nofile            65535;
use                     epoll;
worker_connections      65535;
multi_accept            on;


include                 mime.types;
default_type            application/octet-stream;
access_log              /data/logs/nginx/access.log access;
keepalive_timeout       65;
underscores_in_headers  on;
server_tokens off

4======   #去除#开头的行
error_log                       /data/logs/nginx/error.log   warn;
worker_rlimit_nofile            65535;
use                     epoll;
worker_connections      65535;
multi_accept            on;


include                 mime.types;
default_type            application/octet-stream;
access_log              /data/logs/nginx/access.log access;
keepalive_timeout       65;
underscores_in_headers  on;
server_tokens off

5======    #空格替换为\s\+
error_log\\s\\+/data/logs/nginx/error.log\\s\\+warn;\\s\\+
worker_rlimit_nofile\\s\\+65535;\\s\\+
use\\s\\+epoll;\\s\\+
worker_connections\\s\\+65535;\\s\\+
multi_accept\\s\\+on;\\s\\+


include\\s\\+mime.types;\\s\\+
default_type\\s\\+application/octet-stream;\\s\\+
access_log\\s\\+/data/logs/nginx/access.log\\s\\+access;\\s\\+
keepalive_timeout\\s\\+65;\\s\\+
underscores_in_headers\\s\\+on;\\s\\+
server_tokens\\s\\+off

5=======  #去除空行或空格行
error_log\\s\\+/data/logs/nginx/error.log\\s\\+warn;\\s\\+
worker_rlimit_nofile\\s\\+65535;\\s\\+
use\\s\\+epoll;\\s\\+
worker_connections\\s\\+65535;\\s\\+
multi_accept\\s\\+on;\\s\\+
include\\s\\+mime.types;\\s\\+
default_type\\s\\+application/octet-stream;\\s\\+
access_log\\s\\+/data/logs/nginx/access.log\\s\\+access;\\s\\+
keepalive_timeout\\s\\+65;\\s\\+
underscores_in_headers\\s\\+on;\\s\\+
server_tokens\\s\\+off

6=======   去除行末空格
error_log\\s\\+/data/logs/nginx/error.log\\s\\+warn;
worker_rlimit_nofile\\s\\+65535;
use\\s\\+epoll;
worker_connections\\s\\+65535;
multi_accept\\s\\+on;
include\\s\\+mime.types;
default_type\\s\\+application/octet-stream;
access_log\\s\\+/data/logs/nginx/access.log\\s\\+access;
keepalive_timeout\\s\\+65;
underscores_in_headers\\s\\+on;
server_tokens\\s\\+off

4、检查正则匹配,使用grep正则匹配配置文件,使用grep的返回值判断是否匹配成功。

  1. #!/bin/bash
  2. #cd /tmp/nginx_baseline_check/
  3. svc_cfg="/tmp/nginx_baseline_check/nginx.conf_*"
  4. baseline_cfg="/tmp/nginx_baseline_check/nginx_baseline.txt"
  5. #echo $svc_cfg
  6. output_file="/tmp/nginx_baseline_check/output.html"
  7. OLD_IFS="$IFS"
  8. IFS="-"
  9. array=(${svc_cfg/ ,/})
  10. IFS="$OLD_IFS"
  11. echo "<html>" > $output_file
  12. echo "<style type='text/css'>
  13. body{
  14. margin: 6px;
  15. padding: 0;
  16. font-size: 12px;
  17. font-family: tahoma, arial;
  18. }
  19. table{
  20. border-collapse: collapse;
  21. }
  22. table th{
  23. text-align: left;
  24. background: #9cf;
  25. padding: 3px;
  26. border: 1px #333 solid;
  27. }
  28. table td{
  29. padding: 3px;
  30. border: none;
  31. border:1px #333 solid;
  32. }
  33. tr:hover,
  34. tr.hover{
  35. background: #9cf;
  36. }
  37. </style>" >> $output_file
  38. echo "<table border='1' cellspacing='0' bordercolor='#000000' style='BORDER-COLLAPSE: collapse'>" >> $output_file
  39. echo "<tr>
  40. <th>IP地址及结果</th>
  41. <th>巡检异常内容</th>
  42. </tr>" >> $output_file
  43. #Local err_flag=0
  44. #Local count=0
  45. for each_config_path in ${array[@]}
  46. do
  47. err_flag=0
  48. echo $each_config_path
  49. count=1
  50. err_info="基线第"
  51. while read LINE
  52. do
  53. echo line No. $count : $LINE
  54. cmd=`grep -n --color $LINE $each_config_path`
  55. # #echo cmd: $cmd
  56. #echo line: $LINE
  57. if [[ $cmd ]] ; then
  58. echo -e "匹配成功:基线行号:$count : 配置文件行号:$cmd\n "
  59. else
  60. echo -e "结果不正常,为空或报错"
  61. echo -e $each_config_path "配置内容与基线不一致,请检查"
  62. err_flag=$[$err_flag +1]
  63. echo err_flag: $err_flag
  64. err_info="$err_info$count 行: 无${LINE//\\s\\+/ }\n"
  65. echo -e err_info: $err_info
  66. fi
  67. count=$[$count+1]
  68. done < $baseline_cfg
  69. if [ $err_flag -ne 0 ] ; then
  70. echo -e "<tr> <td>" >> $output_file
  71. echo -e "${each_config_path:37} 巡检失败 </td>" >> $output_file
  72. echo -e "<td> $err_info </td> </tr> " >> $output_file
  73. else
  74. echo -e "<tr> <td>" >> $output_file
  75. echo -e "${each_config_path:37} 巡检成功 </td> </tr> " >> $output_file
  76. fi
  77. echo "==================================="
  78. done
  79. echo '</table> </html>' >> $output_file

最后生成网页文件,内容如下: 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/66483
推荐阅读
相关标签
  

闽ICP备14008679号