本文以 Debian 系统为例,介绍如何通过 钉钉、飞书及 邮件通知 实现服务器登录的实时提醒。原理上适用于其他 Linux 系统,需根据实际情况调整和测试。
1.钉钉创建群聊 → 群设置 → 机器人管理 → 添加自定义机器人
参考文档:https://open.dingtalk.com/document/orgapp/webhook-bot-offline-notice
2.打开/etc/profile.d 文件夹
cd /etc/profile.d
3.编写脚本
使用前需要安装 jq
sudo apt-get install jq
将以下脚本保存为 /etc/profile.d/sent_login_hook.sh:
if [[ -z "${SENT_LOGIN_HOOK}" ]]; then
# 发送钉钉消息
webhook="替换成钉钉webhook地址"
ip=$(curl https://ddnsip.cn)
time=$(date +"%Y-%m-%d %H:%M:%S")
user=$(whoami)
loginIP=$(echo $SSH_CONNECTION | awk '{print $1}')
msgContent="服务器登录提醒:${ip} 于 ${time} 通过 IP ${loginIP} 登录。登录用户为 ${user}。"
post_data="{\"msgtype\": \"text\",\"text\": {\"content\": \"${msgContent}\"}}"
wget --quiet --header "Content-Type: application/json" --post-data "${post_data}" -O - "${webhook}"
export SENT_LOGIN_HOOK=1
fi
优化版(显示ip属地)
代码中接口有限额,求轻用
自行部署ip归属地可参考我的另一篇文章https://cloud.tencent.com/developer/article/2469522
if [[ -z "${SENT_LOGIN_HOOK}" ]]; then
# 发送钉钉消息
webhook="替换为钉钉webhook"
ip=$(curl https://ddnsip.cn)
time=$(date +"%Y-%m-%d %H:%M:%S")
user=$(whoami)
loginIP=$(echo $SSH_CONNECTION | awk '{print $1}')
# 获取登录IP的地理位置信息
location_data=$(curl "https://ip.wxory.com/?ip=${loginIP}")
nation=$(echo "$location_data" | jq -r '.result.ad_info.nation')
province=$(echo "$location_data" | jq -r '.result.ad_info.province')
city=$(echo "$location_data" | jq -r '.result.ad_info.city')
# 拼接消息内容
msgContent="服务器登录提醒:${ip}于${time} 通过 IP ${loginIP} 登录。登录用户为${user}。地理位置信息:国家 ${nation},省份${province},城市 ${city}。"
post_data="{\"msgtype\": \"text\",\"text\": {\"content\": \"${msgContent}\"}}"
# 发送钉钉消息
wget --quiet --header "Content-Type: application/json" --post-data "${post_data}" -O - "${webhook}"
export SENT_LOGIN_HOOK=1
fi
1.创建机器人
参考文档:https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot
在飞书界面点击加号-创建群组-设置-群机器人-保存webhook地址
2.打开/etc/profile.d 文件夹
cd /etc/profile.d
3.编写脚本
使用前需要安装 jq
sudo apt-get install jq
将以下脚本保存为 /etc/profile.d/sent_login_hook.sh:
if [[ -z "${SENT_LOGIN_HOOK}" ]]; then
# 发送飞书消息
webhook="https://open.feishu.cn/open-apis/bot/v2/hook/****"
ip=$(curl https://ddnsip.cn)
time=$(date +"%Y-%m-%d %H:%M:%S")
user=$(whoami)
loginIP=$(echo $SSH_CONNECTION | awk '{print $1}')
echo "${loginIP}"
# 获取登录IP的地理位置信息
location_data=$(curl "https://ip.wxory.com/?ip=${loginIP}")
nation=$(echo "$location_data" | jq -r '.result.ad_info.nation')
province=$(echo "$location_data" | jq -r '.result.ad_info.province')
city=$(echo "$location_data" | jq -r '.result.ad_info.city')
# 拼接消息内容
msgContent="服务器登录提醒:${ip}于${time} 通过 IP ${loginIP} 登录。登录用户为${user}。地理位置信息:国家 ${nation},省份${province},城市 ${city}。"
post_data="{\"msg_type\": \"text\",\"content\": {\"text\": \"${msgContent}\"}}"
# 发送飞书消息
curl -X POST -H "Content-Type: application/json" \
-d "${post_data}" \
"${webhook}"
export SENT_LOGIN_HOOK=1
fi
安装 fail2ban
sudo apt-get install curl fail2ban -y
编辑/etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600 # 封禁时间,单位为秒,默认为600秒即10分钟
# 自定义action来发送邮件提醒管理员,如果不需要可以注释掉或删除此段配置。
action = %(action_mwl)s
# 发送邮件的配置信息,根据自己的情况修改。
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = curl -X POST https://api.sendcloud.net/apiv2/mail/send \
--data-urlencode "apiUser=your_api_user" \
--data-urlencode "apiKey=your_api_key" \
--data-urlencode "from=admin@yourdomain.com" \
--data-urlencode "to=admin@yourdomain.com" \
--data-urlencode "subject=Fail2Ban Notice: <ip> banned on <hostname>" \
--data-urlencode "html=<p>Hi Admin,</p ><p>The IP address <ip> has just been banned on <hostname> by Fail2Ban because of too many authentication failures.</p ><br/><br/><p>This message is automatically generated by Fail2Ban.</p >"
actionunban =
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。