随着网络和信息安全保护等级的普及以及网络安全法的实施,很多企业安全这一块还很缺失,例如服务器远程登陆这一块,大多数企业和维护人员由于成本昂贵和可管理性差也就很多没有使用双因子验证。今天笔者就带大家来了解一下简单简易的方法实现服务器远程登陆发送短信提示(仅供参考,因为是简易,所以可能不是那么的专业,但一定是实用的方法)
通常情况运维开发会从几方面下周进行改造远程登陆提醒:
1、服务器自带的审核消息策略和服务器远程桌面管理策略(其实有条件的可以实现堡垒机)
2、自己写程序或者脚本,然后加入启动/计划任务项目,当有条件出发,就发出告警
3、通过开源或者免费收费的第三方软件进行安装部署和实施管理,这个看企业的成本预算
那么笔者结合Windows和Linux服务器的特征
分别来介绍服务器远程登陆之后发送短信提示的实施方案方法↓↓↓
一、Linux服务器ssh远程登陆实现发送短信的方法
1、shell脚本+短信API的方法实现发送短信
今天下午在找监控资料的时候发现很多用短信报警之类的手法。发现中国移动提供了一个接口
飞信免费发短信API接口调用方式(通过HTTP访问以下网址、支持GET和POST): http://sms.api.bz/fetion.php?username =您的移动飞信登录手机号&password=您的移动飞信登录密码&sendto=接收短信的飞信好友手机号(也可以是你自己的手机号)&message=短信内容
注:需要互为移动飞信好友.短信内容最大长度为180个汉字,超过180个汉字不发送。返回的信息为UTF-8编码的中文文本信息。
在linux下可以使用curl post这一操作 curl "http://sms.api.bz/fetion.php?username=15802179011&password=123456& amp;sendto=15802179012&message=短信内容"
----------------------------------------------------------------------------------------------------------------------------------------
为了服务器安全,防止被入侵,除了加强密码之外,还可以监控服务器的登陆情况
把登陆日志记下来,当然系统也会有记录,但不排除被人删掉,所以把数据发送到另外一台服务器比较保险,避免被删除
在linux下面很简单,只需要在/etc/ssh/目录下面创建一个sshrc的文件,然后给它执行权限,那么在有人通过ssh远程登录这台服务器的时候,这段脚本就会被执行
代码如下:
#!/bin/bash
#获取登录者的用户名
user=$USER
#获取登录者的IP地址
ip=${SSH_CLIENT%% *}
#获取登录的时间
time=$(date +%F%t%k:%M)
#服务器的IP地址
server=`ifconfig eth1|sed -n '2p'|awk -F ":" '{print $2}'|awk '{print $1}'`
#这里可以判断如果登录者的IP地址不是指定的IP,则发邮件报警,我这里直接就发送,当然你也可以不发送,直接记录下日志即可
curl "http://www.test.com/api/notify_login?content=$time,$user,$ip,$server" > /etc/ssh/log 2>/dev/null
这段脚本会在用户连上终端之前被执行,也就是说这段脚本如果没有被执行完,用户是链接不上终端的,那就可以保证报警信息肯定能收到,如果不是被人登陆赶紧登陆服务器,修改密码,断开所有ssh连接。
-----------------------------------------------------------------------------------------------------------------------------
2、First Python-Linux SSH登录短信通知
脚本语言目前发展很快,python流行度也越来越大,对我而言,脚本语言主要作为系统的粘合剂,一般不做主体业务逻辑的开发,但作为系统管理,整合程序还是不错的。因为有个小需求:linux下SSH远程登录后,发送短信通知管理员。原来一般使用shell直接完成,今天直接上python,纯粹就当做技术练练手
#!/usr/bin/python
import time
import base64
import urllib
import httplib
import os
import sys
mobileNos=138xxxxxxxx
def sendSms(mobileNo,content):
url = "/api/......"
queryString=urllib.urlencode({"mobileNo": mobileNo, "content": content, "username":"aaaaa", "password":"xxxxxx"})
conn = httplib.HTTPConnection("192.168.xxx,xxx")
conn.request("GET",url+"?"+queryString)
response = conn.getresponse()
conn.close()
def logger(log):
f=open('lm.log','a+')
print >> f, log
f.close()
def loginNotify():
client = os.getenv("SSH_CLIENT")
if client is None:
return
clientInfo = client.split(' ')
ip = clientInfo[0]
now = time.strftime('%Y-%m-%d %H:%M:%S')
user = os.getenv("USER")
hostname = os.getenv("HOSTNAME")
log = now + " - " + user + " login " + hostname + " from " + ip
logger(log)
sendSms(mobileNos,log)
if __name__ == "__main__":
loginNotify()
3、Linux用户登录就发微信提醒
有时候可能怕密码共享了之后有人乱登陆随意登陆或者客户端中毒之后恶意登陆,查看last时可能有点晚,以前做了个zabbix微信报警,想着就写个登录的微信提醒
用户登录用加载/etc/profile
所以命令写这里面,顺便写个微信报警的脚本,主要模仿zabbix的原理.
#!/bin/bash
###SCRIPT_NAME:weixin.sh###
###send message from weixin for login monitor###
###cuiss###
###V1-2016-02-23###
CropID='xxxxxxxxx'
Secret='xxxxxxxxxxxxxxxxxxxx'
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=$(/usr/bin/curl $GURL -H "DNT: 1" -H "Accept-Encoding: gzip, deflate" -H "Accept-Language: zh-CN,zh;q=0.8" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 BIDUBrowser/8.1 Safari/537.36" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "X-DevTools-Emulate-Network-Conditions-Client-Id: B546FC80-414C-403F-95F0-EB0F70E58EF7" -H "Connection: keep-alive" -H "Cache-Control: max-age=0" --compressed | awk -F \" '{print $4}')
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int appId=1
local userId=$1
local partyId=2
local msg='有用户上线请注意:\n主机名:'`hostname`'\n主机ip:'`curl ipecho.net/plain`'\n登录用户:'`whoami`'\n登录时间:'`date`
printf '{\n'
printf '\t"touser":"'"$userId"\"",\n"
printf '\t"toparty":"'"$partyId"\"",\n"
printf '\t"msgtype": "text",'"\n"
printf '\t"agentid":"'"$appId"\"",\n"
printf '\t"text":{\n'
printf '\t\t"content":"'"$msg"\"
printf '\n\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1)" $PURL
这里为了方便 就让脚本后面跟用户了,
<#root> bash weixin.sh monitor (注意执行脚本权限哈 chmod a+x)
为了方便识别,这里主要获取了主机名,因为部署环境通常以主机名区别功能
主机ip和用户名和登录的时间
其他通过shell脚本和企业微信实现实时报警功能 - 请参考资料→ https://blog.csdn.net/qqHJQS/article/details/79521630
二、Windows server服务器远程桌面实现发送短信的方法
1、第三方软件方法实现远程桌面短信/二次登陆提示
拦截宝是一款服务器安全防护软件,主要针对服务器被入侵、网站入侵被挂马、服务器被提权的防护作用。这款软件能帮助用户有效的拦截各种服务器的攻击,避免服务被恶意的入侵与挂马,有效的保护服务器上数据不被窃取。
码字辛苦插播一条广告牌AD:AnyTopOne 是一个开源软件(Free and Open-Source Software)手机端ssh的最佳利器!!
2、使用短信猫实现服务器远程短信告警
在本地远程登陆服务器,然后在服务器上运行程序用短信猫发送短信。
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
RXTX Warning: Removing stale lock file. /var/lock/LCK..ttyS0
Jun 24, 2011 10:42:51 AM SendMsg IntSIM
INFO: 2011-6-24 10:42:51åˆ
Jun 24, 2011 10:42:51 AM SendMsg IntSIM
INFO: 2011-6-24 10:42:51ATZ
Jun 24, 2011 10:42:51 AM SendMsg IntSIM
INFO: 2011-6-24 10:42:51ATZ
Jun 24, 2011 10:42:51 AM SendMsg IntSIM
INFO: 2011-6-24 10:42:51åˆ
Jun 24, 2011 10:42:51 AM SendMsg sendMessage
INFO: 2011-6-24 10:42:51çŸä¿¡å†…容为:血压过高ï¼ï¼ï¼
Jun 24, 2011 10:42:51 AM SendMsg sendMessage
INFO: 2011-6-24 10:42:51目的手机å·ç 为: 138********
Jun 24, 2011 10:42:51 AM TestSendMsg get_ex
INFO: 2011-6-24 10:42:51 java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1931)
at java.lang.String.substring(String.java:1904)
at SendMsg.ConvertPhoneNumber(SendMsg.java:362)
at SendMsg.Sending(SendMsg.java:211)
at SendMsg.sendMessage(SendMsg.java:42)
at TestSendMsg.main(TestSendMsg.java:19)
3、脚本+设置实现免费实现服务器登录手机短信通知
如何让配置服务器有人登录时,立即给你发送一个手机短信提醒你有人登录服务器呢?
方法如下:
该方法支持支持联通,移动,电信手机,且是免费短信。【干货】另外易信、139邮箱和飞信等都可以实现免费的短信和邮箱发送,无需接入其他api/sdk即可实现登陆即可发送短信(鉴于现在智能手机都有短信拦截,注意使用时加白名单即可)
实现步骤:
1.联通、移动、电信,手机免费开通手机邮箱,同时开通邮件短息提醒。
移动手机访问以下网址开通手机邮箱:http://mail.10086.cn/
联通手机访问以下网址开通手机邮箱:http://mail.wo.com.cn/mail/login.action
电信手机访问以下网址开通手机邮箱:http://webmail21.189.cn/webmail/
2.以下为发送邮件的VBS脚本,修改为你的手机号和邮箱密码,将以下内容复制到记事本,保存为扩展名为vbs的文件。
NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
Set Email = CreateObject("CDO.Message")
Email.From = "发送邮箱"
Email.To = "接收邮箱"
Email.Subject = "有人登陆Web服务器"
Email.Textbody = "注意检查登陆者是否合法!"
With Email.Configuration.Fields
.Item(NameSpace&"sendusing") = 2
.Item(NameSpace&"smtpserver") = "smtp.139.com"
.Item(NameSpace&"smtpserverport") = 25
.Item(NameSpace&"smtpauthenticate") = 1
.Item(NameSpace&"sendusername") = "邮箱账户名"
.Item(NameSpace&"sendpassword") = "密码"
.Update
End With
Email.Send
3.在服务器上运行
到目前为止,你已经设置好了,服务器登录脚本,只要有人登陆你的服务器,你的服务器就会给你的手机邮箱发送邮件,你的手机邮箱,就会给你的手机发短信通知。
4、使用Blat等插件软件+批处理的形式进行发送邮件短信实现登陆告警
5、Windows Server查看和记录远程登录信息的方法
一、利用系统日志查看登录信息
打开控制面板——系统和安全——查看事件日志,就进入了事件查看器
打开左侧事件查看器(本地)——Windows日志——安全,就能查看所有安全日志
点击右侧筛选,筛选事件ID为4776的所有事件,即为所有远程登录日志
可以看到我的日志中有他人登录,而且他还创建了登录账户User1
二、记录登录信息
上述查看方法并不能查看到对方的ip,为了查看到ip需要进行一些设置
假设在C盘RDP文件夹下进行操作:
1、创建空文件RDPlog.txt。创建批处理文件RDPlog.bat,写入代码
1 2 3 |
date /t >>RDPlog.txt time /t >>RDPlog.txt netstat -n -p tcp | find ":3389" >>RDPlog.txt |
2、在管理工具中打开计划任务,新建计划任务,在触发器选项中新建“当连接到用户会话时”,在操作选项中新建操作,设置程序为C:\RDP\RDPlog.bat,起始于C:\RDP\
这样在远程登录后就会将登录的时间和ip记录在RDPlog.txt文件中。
但是有一个问题,会在登陆后跳出一个一闪而过的cmd窗口,要消除这个窗口,就再新建一个脚本RDPlog.vbs,写入代码
1 2 |
Set shell = Wscript.Createobject("wscript.shell") Call shell.run("C:\RDP\RDPLog.bat", 0) |
将计划任务程序设置为C:\RDP\RDPlog.vbs即可,如下
试着登录两次后结果如下图
6、SecID锦佰安科技 | 身份识别综合解决方案提供商 https://www.secid.cn/
行云管家【官网】-领先的云计算管理平台-云安全,堡垒机,自动化运维 https://www.cloudbility.com/
总结:
无论采用哪种方法,科学的管理+软件程序的写法+平时的人工检查才是王道。道高一尺魔高一丈,任何技术都不是万能的,尤其是信息安全没有绝对而是相对,三份靠技术,七分靠管理。且行且珍惜!希望以上方法对大家有所帮助。欢迎分享和转发。