You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

SSH登录通知脚本相关技术咨询:获取登录信息、脚本故障影响及失败登录通知实现

SSH登录通知脚本相关技术咨询:获取登录信息、脚本故障影响及失败登录通知实现

一、获取SSH登录用户与来源IP

你的脚本里已经用到了SSH_CLIENT环境变量,这个变量的格式是来源IP 远程端口 本地端口,我们可以从中提取IP;而当前登录的用户名可以直接用$USER环境变量获取。修改你的脚本部分内容如下:

if [ -n "$SSH_CLIENT" ]; then
    # 获取当前登录的用户名
    LOGIN_USER=$USER
    # 从SSH_CLIENT中提取来源IP(取第一个字段)
    SOURCE_IP=$(echo "$SSH_CLIENT" | awk '{print $1}')
    # 拼接通知文本
    TEXT="检测到新的SSH登录:
用户:$LOGIN_USER
来源IP:$SOURCE_IP"

    # 发送邮件,注意text参数要加双引号让变量展开
    curl -s --user 'api:key-xxxxxxd3e1bd13c13cbxxxxxx' \
        https://api.eu.mailgun.net/v3/mydomain.com/messages \
        -F from='Server Notification <postmaster@mydomain.com>' \
        -F to='myadminmail@gmail.com' \
        -F subject="New SSH login detected" \
        -F text="$TEXT"
fi

这样就能在邮件里看到具体的登录用户和来源IP了。

二、脚本故障是否会影响SSH登录

默认情况下,不会影响正常登录。因为/etc/profile是登录shell初始化阶段执行的脚本,shell默认不会因为单个命令执行失败就终止整个登录流程(除非你在脚本里手动设置了set -e,强制命令失败时退出)。

不过为了避免网络问题导致curl命令卡住、拖慢登录速度,建议把发送邮件的命令放到后台执行,同时丢弃无关输出,修改后的curl命令如下:

curl -s --user 'api:key-xxxxxxd3e1bd13c13cbxxxxxx' \
    https://api.eu.mailgun.net/v3/mydomain.com/messages \
    -F from='Server Notification <postmaster@mydomain.com>' \
    -F to='myadminmail@gmail.com' \
    -F subject="New SSH login detected" \
    -F text="$TEXT" &>/dev/null &

这里的&>/dev/null会把标准输出和错误输出都丢弃,&会把命令放到后台运行,完全不影响登录过程。

三、实现失败登录的邮件通知

成功登录才会触发/etc/profile,失败登录不会执行这个脚本,所以我们需要通过监控系统认证日志来实现失败登录通知,具体步骤如下:

1. 编写监控脚本

创建一个脚本文件(比如/usr/local/bin/ssh-fail-monitor.sh),内容如下:

#!/bin/bash
# 根据你的系统调整日志路径:Debian/Ubuntu用/var/log/auth.log,RHEL/CentOS用/var/log/secure
LOG_FILE="/var/log/auth.log"
MAILGUN_KEY="key-xxxxxxd3e1bd13c13cbxxxxxx"
DOMAIN="mydomain.com"
TO_EMAIL="myadminmail@gmail.com"

# 实时跟踪日志文件,匹配失败登录相关条目
tail -fn0 "$LOG_FILE" | while read LINE; do
    # 匹配常见的失败登录关键词,可根据需要调整
    if echo "$LINE" | grep -E "(Failed password|Invalid user|Connection closed by authenticating user)"; then
        # 提取尝试登录的用户和IP(不同系统日志格式可能略有差异,可根据实际调整awk字段)
        FAILED_USER=$(echo "$LINE" | awk '/Failed password|Invalid user/ {print $9}')
        FAILED_IP=$(echo "$LINE" | awk '/Failed password|Invalid user/ {print $11}')
        # 拼接通知文本
        TEXT="检测到SSH登录失败:
发生时间:$(date "+%Y-%m-%d %H:%M:%S")
日志详情:$LINE
尝试登录用户:$FAILED_USER
来源IP:$FAILED_IP"
        # 发送警告邮件
        curl -s --user "api:$MAILGUN_KEY" \
            https://api.eu.mailgun.net/v3/$DOMAIN/messages \
            -F from='Server Notification <postmaster@mydomain.com>' \
            -F to="$TO_EMAIL" \
            -F subject="SSH登录失败警告" \
            -F text="$TEXT" &>/dev/null
    fi
done

2. 设置开机自启

创建systemd服务文件/etc/systemd/system/ssh-fail-monitor.service,内容如下:

[Unit]
Description=SSH Failed Login Monitor
After=network.target

[Service]
ExecStart=/usr/local/bin/ssh-fail-monitor.sh
Restart=always
User=root

[Install]
WantedBy=multi-user.target

然后执行以下命令启用并启动服务:

chmod +x /usr/local/bin/ssh-fail-monitor.sh
systemctl daemon-reload
systemctl enable --now ssh-fail-monitor.service

这样系统就会实时监控SSH失败登录事件,并自动发送警告邮件了。

备注:内容来源于stack exchange,提问作者gabogabans

火山引擎 最新活动