用于检查Linux中登录历史记录的Shell脚本

时间:2020-01-09 10:41:46  来源:igfitidea点击:

系统和Linux管理员的角色之一是监视用户登录历史记录,以便他们了解系统活动。
从安全角度来看,这些对于跟踪连接到任何Linux服务器的用户数量非常重要。
我们可以使用此脚本中的命令来手动跟踪成功和失败的登录,也可以使用本教程中的脚本,该脚本将为我们提供所有Linux登录历史记录的摘要和详细输出。

监视用户登录以查找入侵者

日志文件可用于收集有关系统状态和对系统的攻击的详细信息。

假设我们有一个启用了SSH的系统连接到Internet。
许多攻击者正在尝试登录系统。
我们需要设计一个入侵检测系统,以识别登录尝试失败的用户。
此类尝试可能是黑客利用字典攻击进行的。
该脚本应生成包含以下详细信息的报告:

尝试成功且登录失败的用户

  • 尝试次数

  • 攻击者的IP地址

  • IP地址的主机映射

  • 尝试登录的时间

日志文件以检查登录尝试

根据分配,用于检查登录历史记录的日志文件将有所不同。
在我的RHEL/CentOS 7/8 Linux节点上,这些信息被捕获在/var/log/secure中。
但是在某些发行版中,这是在/var/log/auth.log中捕获的

另请阅读:

如何在Linux 6中使用fail2ban保护SSH和root登录安全6 ssh身份验证方法在Linux中使用sshd_config来保护连接

用于检查Linux登录历史记录的Shell脚本

以下是一个示例shell脚本,它将使用/var/log/secure检查Linux节点上的成功和失败登录尝试。

#!/bin/bash
#Filename: intruder_detect.sh
#Description: Check Linux Login History
AUTHLOG=/var/log/secure
if [[ -n  ]];
then
  AUTHLOG=
  echo Using Log file : $AUTHLOG
fi
# Collect the failed login attempts
FAILED_LOG=/tmp/failed.$$.log
egrep "Failed pass" $AUTHLOG > $FAILED_LOG 
# Collect the successful login attempts
SUCCESS_LOG=/tmp/success.$$.log
egrep "Accepted password|Accepted publickey|keyboard-interactive" $AUTHLOG > $SUCCESS_LOG
# extract the users who failed
failed_users=$(cat $FAILED_LOG | awk '{ print $(NF-5) }' | sort | uniq)
# extract the users who successfully logged in
success_users=$(cat $SUCCESS_LOG | awk '{ print $(NF-5) }' | sort | uniq)
# extract the IP Addresses of successful and failed login attempts
failed_ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $FAILED_LOG | sort | uniq)"
success_ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $SUCCESS_LOG | sort | uniq)"
# Print the heading
printf "%-10s|%-10s|%-10s|%-15s|%-15s|%s\n" "Status" "User" "Attempts" "IP address" "Host" "Time range"
# Loop through IPs and Users who failed.
for ip in $failed_ip_list;
do
  for user in $failed_users;
    do
    # Count failed login attempts by this user from this IP
    attempts=`grep $ip $FAILED_LOG | grep " $user " | wc -l`
    if [ $attempts -ne 0 ]
    then
      first_time=`grep $ip $FAILED_LOG | grep " $user " | head -1 | cut -c-16`
      time="$first_time"
      if [ $attempts -gt 1 ]
      then
        last_time=`grep $ip $FAILED_LOG | grep " $user " | tail -1 | cut -c-16`
        time="$first_time -> $last_time"
      fi
      HOST=$(host $ip 8.8.8.8 | tail -1 | awk '{ print $NF }' )
      printf "%-10s|%-10s|%-10s|%-15s|%-15s|%-s\n" "Failed" "$user" "$attempts" "$ip"  "$HOST" "$time";
    fi
  done
done
for ip in $success_ip_list;
do
  for user in $success_users;
    do
    # Count successful login attempts by this user from this IP
    attempts=`grep $ip $SUCCESS_LOG | grep " $user " | wc -l`
    if [ $attempts -ne 0 ]
    then
      first_time=`grep $ip $SUCCESS_LOG | grep " $user " | head -1 | cut -c-16`
      time="$first_time"
      if [ $attempts -gt 1 ]
      then
        last_time=`grep $ip $SUCCESS_LOG | grep " $user " | tail -1 | cut -c-16`
        time="$first_time -> $last_time"
      fi
      HOST=$(host $ip 8.8.8.8 | tail -1 | awk '{ print $NF }' )
      printf "%-10s|%-10s|%-10s|%-15s|%-15s|%-s\n" "Success" "$user" "$attempts" "$ip"  "$HOST" "$time";
    fi
  done
done
rm -f $FAILED_LOG
rm -f $SUCCESS_LOG

授予脚本可执行权限

# chmod u+x /tmp/intruder_detect.sh

执行脚本

# /tmp/intruder_detect.sh
Status    |User      |Attempts  |IP address     |Host           |Time range
Failed    |root      |5         |192.168.0.102  |3(NXDOMAIN)    |Jan 11 20:44:04  -> Jan 11 20:50:17
Failed    |root      |2         |192.168.0.106  |3(NXDOMAIN)    |Jan 11 20:51:54  -> Jan 11 20:51:59
Success   |root      |1         |192.168.0.102  |3(NXDOMAIN)    |Jan 11 20:50:26
Success   |root      |2         |192.168.0.106  |3(NXDOMAIN)    |Jan 11 21:50:24  -> Jan 11 21:50:42

根据这些日志,我们可以发现从" 192.168.0.102"有5次失败的登录尝试,从" 192.168.0.106"有2次失败的登录尝试类似地,从" 192.168.0.102"和" 192.168.0.106 "有两次成功的登录尝试

脚本如何工作?

  • intruder_detect.sh脚本默认使用/var/log/secure作为输入。
    或者,我们可以提供一个带有命令行参数的日志文件。

  • 成功和失败的登录信息收集在一个临时文件中,以减少处理。

  • 当登录尝试失败时,SSH日志行类似于以下内容:

sshd[3217]: Failed password for root from 192.168.0.102 port 53720 ssh2
  • 登录成功后,SSH日志行与此类似
sshd[4881]: Accepted password for root from 192.168.0.106 port 49920 ssh2
  • 该脚本会搜索Failed passw字符串以获取失败的登录尝试详细信息,并将这些行放在/tmp/failed.$$.log中。

  • 该脚本会搜索"接受密码" |"接受公钥" |键盘交互字符串,以获取成功的登录尝试,并将这些行放在/tmp/success.$$.log中。

  • 临时文件名中的$$将自动替换为脚本的PID

  • 下一步是提取成功登录和登录失败的用户。

" awk"命令从末尾提取第五个字段(用户名),并用管道将要排序的内容和" uniq"管道创建用户列表。

  • 接下来,使用正则表达式和" egrep"命令提取唯一的IP地址。

嵌套的for循环遍历IP地址,用户提取具有每个IP地址和用户组合的行。
如果此IP /用户组合的尝试次数大于0,则使用grep,head和cut提取首次出现的时间。
如果尝试次数> 1,则使用尾部而不是头部来提取上次时间。

  • 然后使用格式化的" printf"命令报告该登录尝试。

  • 最后,临时文件被删除。