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

基线巡检

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

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

实现原理:

1、读取基准基线文件

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

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

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

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

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

原理图:

代码详情:

1、读取基准基线文件

filedir="/tmp/nbaseline_check"
filepath="/tmp/baseline_check/nginx_baseline.txt"
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"
if [ ! -d "$filedir" ]; then
    mkdir $filedir
fi

echo command: $cmd
$cmd

cat $filepath
if [ -f $filepath ]; then
    #ls -l |grep nginx_baseline.txt
    atime=`stat -c %Y $filepath`
    btime=$(date +%s)
    timediff=$(( atime - btime ))
    timedetla=$(( timediff/84600))
    if [ "$timedetla" -ge 1 ]; then
        echo "不是最新的文件"
	else
    	echo "获取到当天文件" $filepath
    fi
else
	echo "文件不存在"
fi

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

#collect-baseline.sh IP.txt
File=`cat ip.txt` #192.168.1.1-192.168.1.2-192.168.1.3
echo $File

OLD_IFS="$IFS"
IFS="-"
array=(${File//-,/})      #按-分割ip
IFS="$OLD_IFS"

for ip in ${array[@]}
do 
    if [ ! -n "$ip" ] ; then
        echo ip is null
        break
    fi
    echo "$ip" >> /tmp/nginx_baseline_check/test.log
    download_nginxconf_all.sh $ip &
done
#echo "ip" 
wait
WriteLog $1 0 "process succeed."

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

#!/usr/bin/expect -f
#download_nginxconf_all.sh $IP

log_file /tmp/nginx_baseline_check/download.log
log_user 0

set date [ exec date "+%Y_%m_%d:%H:%m:%s" ]

set remote_host [lindex $argv 0]
set remote_path [lindex $argv 1]

set err_flag1 0
#set err_flag2 0
#set err_flag3 0
#set err_flag4 0

set timeout 5

spawn ssh user$remote_host
expect "continue connecting" { send "yes\r" ; exp_continue }
expect "password"
send "this_is_my_password/r"
expect "*ermission denied" { send_user "密码错误\n" ; exit 1 }
expect "Connection time out" { send_user "Connection time out@" ; send_user $remote_host ; send_user "\n" ; exit 2 ; }

exec sleep 1

send "sudo -i\r"
send "cp /home/nginxweb/nginx-1.18.0/conf/nginx.conf /tmp/\r"
expect "没有那个文件或目录" { send_user "Not found nginx1.18.0/.../nginx.conf @ $remote_host \n" ; set err_flag1 ; exp_continue }
expect "*o such file or directory" { send_user "Not found nginx1.18.0/.../nginx.conf @ $remote_host \n" ; set err_flag1 ; exp_continue }
expect "是否覆盖" { send "y\r"; expect_continue }
expect "overwrite" { send "y\r"; expect_continue }

send "chmod a+r /tmp/nginx.conf\r"
send "exit\r"
exec sleep 1
send "exit\r"

send_user $date ; send_user "\n"
send_user $remote_host ; send_user "\n"
send_user "err_flag1:" ; send_user err_flag1 ; send_user "\n"

expect eof

spawn scp iapopr@remote_host:/tmp/nginx.conf /tmp/nginx_baseline_check/nginx.conf_$remote_host
expect "password" { send "this_is_my_password/r" }
expect "*ermission denied" { send_user "密码错误\n" ; exit 4 }

if { $err_flag1 * $err_flag2 == 0 }
{
send_user $remote_host ; send_user "download all succeed.\n"
} else
{
send_user $remote_host ; send_user "download all failed.\n"
} 

日志模板如下:

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\+】,以正则匹配。

#!/bin/bash
cd /tmp/nginx_baseline_check/
baseline="/tmp/nginx_baseline_check/nginx_baseline.txt"  #获取baseline文件不再赘述
#baseline="/root/scripts/liuli/middleware/nginx/hx1/nginx_baseline";

echo $baseline

echo 0=======
sed -i 's/^[ ]*$//g' $baseline #去除空行或空格行
sed -i 's/^\s*$//g' $baseline #去除空行或空格行
cat $baseline

echo 1=======
sed -i 's/[ ]*$//g' $baseline   #去除行末空格
cat  $baseline

echo 2=======
sed -i 's/;*$//g' $baseline   #去除行末分号
cat  $baseline

echo 3=======
sed -i 's/[ ]*$//g' $baseline   #去除行末空格
cat  $baseline

echo 4======
sed -i 's/^ *#//g' $baseline  #去除#开头的行
cat $baseline

echo 5======
#sed -i 's/\\s\+/\\\\s+/g' nginx_baseline  #空格替换为\s
sed -i 's/\s\+/\\\\s\\\\+/g' $baseline
cat $baseline

echo 5=======
sed -i '/^\s*$/d ' $baseline   #去除空行或空格行
cat $baseline

echo 6=======
sed -i 's/\\\\s\\\\+$//g' $baseline   #去除行末空格
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的返回值判断是否匹配成功。

#!/bin/bash
#cd /tmp/nginx_baseline_check/
svc_cfg="/tmp/nginx_baseline_check/nginx.conf_*"
baseline_cfg="/tmp/nginx_baseline_check/nginx_baseline.txt"
#echo $svc_cfg
output_file="/tmp/nginx_baseline_check/output.html"

OLD_IFS="$IFS"
IFS="-"
array=(${svc_cfg/ ,/})
IFS="$OLD_IFS"

echo "<html>" > $output_file
echo "<style type='text/css'>
body{
        margin: 6px;
        padding: 0;
        font-size: 12px;
        font-family: tahoma, arial;
}       
table{
        border-collapse: collapse;
}
table th{
        text-align: left;
        background: #9cf;
        padding: 3px;
        border: 1px #333 solid;
}
table td{
        padding: 3px;
        border: none;
        border:1px #333 solid;
}
tr:hover,
tr.hover{
        background: #9cf;
}
</style>"  >> $output_file


echo "<table border='1' cellspacing='0' bordercolor='#000000' style='BORDER-COLLAPSE: collapse'>" >> $output_file
echo "<tr>
<th>IP地址及结果</th>
<th>巡检异常内容</th>
</tr>" >> $output_file
#Local err_flag=0
#Local count=0

for each_config_path in ${array[@]}
do
    err_flag=0
    echo $each_config_path
    count=1
    err_info="基线第"

while read LINE
do
    echo line No. $count : $LINE
    cmd=`grep -n --color $LINE  $each_config_path`
#   #echo cmd: $cmd
    #echo line: $LINE

    if [[ $cmd  ]] ; then

       echo -e "匹配成功:基线行号:$count  : 配置文件行号:$cmd\n	"
    else
       echo -e "结果不正常,为空或报错"
       echo -e $each_config_path "配置内容与基线不一致,请检查"
       err_flag=$[$err_flag +1]
       echo err_flag: $err_flag
       err_info="$err_info$count 行: 无${LINE//\\s\\+/  }\n"
       echo -e err_info: $err_info
    fi
 
       
    count=$[$count+1]
done  < $baseline_cfg
    if [ $err_flag -ne 0 ] ; then
       echo -e "<tr> <td>" >> $output_file
       echo -e "${each_config_path:37} 巡检失败 </td>" >> $output_file
       echo -e "<td> $err_info </td> </tr> " >> $output_file
    else
       echo -e "<tr> <td>" >> $output_file
       echo -e "${each_config_path:37}	巡检成功 </td> </tr> " >> $output_file
    fi  

    echo "==================================="
done

echo '</table> </html>' >> $output_file

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Linux系统中,中间件基线核查是一项重要的安全措施。中间件是指在操作系统与应用程序之间提供支持服务和功能的软件组件,包括数据库、应用服务器、Web服务器等。中间件基线核查旨在确保中间件组件的配置、权限、补丁等是否符合安全标准,以减少系统中间件的漏洞和潜在威胁。 首先,中间件基线核查会中间件软件是否按照最佳实践配置。这包括审查配置文件、监听端口和服务信息是否合理,是否存在默认用户名和密码等安全隐患。对于应用服务器、数据库等常见中间件,还需要查是否启用了安全功能,如SSL加密传输、访问控制等。 其次,中间件基线核查还会验证中间件软件是否安装了最新的安全补丁。通过查系统补丁和更新的情况,可以保证中间件软件没有已知漏洞。同时,对于自定义的中间件组件,还需要进行代码审查或使用安全扫描工具来测潜在的安全问题。 此外,中间件基线核查还重点关注访问控制和权限配置。确保只有授权用户或系统可以访问中间件组件,避免未经授权的访问。同时,还要评估中间件服务账户的权限设置,避免过高的权限导致的潜在风险。 最后,中间件基线核查需要进行定期查和更新。由于中间件软件和系统环境都在不断更新,安全威胁也在不断演进,定期的基线核查可以及时发现和解决存在的安全问题,保障系统的安全稳定运行。 总之,中间件基线核查是确保Linux系统中间件安全的一项重要措施,通过配置查、补丁验证、访问控制和权限配置等手段,可以有效减少中间件组件的安全风险。定期的基线核查是保障系统安全性的必要环节。 ### 回答2: Linux 中间件基线核查是一种对Linux操作系统中安装的中间件进行查和评估的过程。中间件是指在操作系统和应用程序之间提供服务的软件组件。通过对中间件基线的核查,可以确保中间件的准确性、完整性和安全性,以保护系统免受潜在的漏洞和攻击。 中间件基线核查的过程包括以下几个方面: 1. 验证中间件的版本和配置。核查中间件的版本是否是最新的,并确保其配置符合最佳实践。 2. 中间件的补丁和更新。核查中间件是否已经安装了最新的安全补丁和更新程序,以修复已知的漏洞。 3. 中间件的安全设置。核查中间件的安全设置,包括访问控制、密码策略、日志设置等,以确保系统的安全性能。 4. 中间件的运行状态。核查中间件是否在正常运行,并查其日志和错误信息,以便及时测和解决潜在问题。 5. 中间件的权限和访问控制。核查中间件文件和目录访问权限是否正确设置,并确保只有授权的用户可以访问和修改中间件配置文件和数据文件。 通过进行中间件基线核查,可以识别和解决潜在的风险和问题,提高系统的安全性和稳定性。同时,定期进行中间件基线核查也是一种良好的安全实践,以保持系统的可靠性和可用性。 ### 回答3: Linux 中间件基线核查是指对Linux操作系统上安装的各类中间件软件进行一系列查和验证,以确保其安全性和合规性的过程。 首先,对于中间件软件的安装,需要确认软件来源是否可靠、是否为最新版本,并验证其完整性。通过比对所安装中间件软件的文件哈希值、数字签名等方式,可以确保软件未被篡改或感染恶意代码。 接着,针对中间件软件的配置,需要查是否存在缺省密码、未禁用的服务和端口等潜在的安全隐患。例如,禁用或删除中间件软件中不必要的插件和组件,以减少系统攻击面。 此外,还需要对中间件软件的访问权限进行限制和控制。通过设置合理的访问权限,包括文件权限、网络通信权限等,可以防止未授权人员对中间件软件进行非法访问和操作。 在中间件软件的更新和升级方面,需要确保及时应用厂商发布的安全补丁和更新,以修复已知漏洞和提升系统的安全性。同时,对于自行开发或定制的中间件软件,也需要加强源代码的安全评估和审计工作。 最后,应建立健全的日志记录和监控机制,对中间件软件的运行状态和安全事件进行实时监测和分析。及时发现异常行为和安全漏洞,可以采取相应的应对措施,避免可能的安全事故和数据泄露。 总之,Linux 中间件基线核查是一个全面审查和验证中间件软件安全性和合规性的过程,通过严密的查、配置和监控,提高系统的抵御能力,保障应用系统的稳定运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只晨兴夜不得寐的运维人

你的打赏,是我今晚餐桌上的鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值