用于检查Linux中登录历史记录的Shell脚本
系统和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"命令报告该登录尝试。
最后,临时文件被删除。