Google双向认证
Google双向认证
Google Authenticator介绍
通常我们直接通过ssh输入密码连接服务器,但是这样很容易出现暴力破解的情况,所以我们可以结合google的动态认证+ssh密码,这样能够大幅度提升登录的安全,简单来说就是当用户通过ssh登录系统时,先输入google的随机验证码,然后再输入ssh密码
Google Authenticator安装部署
# 1.安装依赖
[root@web01 ~]# yum -y install pam-devel libpng-devel autoconf automake libtool
# 2.安装google apm插件
# 官方下载地址
[root@web01 ~]# wget https://github.com/google/google-authenticator-libpam/archive/1.04.t
ar.gz
# 个人下载地址
[root@web01 ~]# wget http://test.driverzeng.com/other/1.04.tar.gz
# 3.解压插件
[root@web01 ~]# tar xf 1.04.tar.gz
# 4.进入解压开的目录
[root@web01 ~]# cd google-authenticator-libpam-1.04/
# 5.执行bootstrap构建
[root@web01 google-authenticator-libpam-1.04]# ./bootstrap.sh
# 5.生成
[root@web01 google-authenticator-libpam-1.04]# ./configure
# 6.编译 && 安装
[root@web01 google-authenticator-libpam-1.04]# make && make install
# 7.检查插件是否安装
[root@web01 google-authenticator-libpam-1.04]# ll /usr/local/lib/security/
total 136
-rwxr-xr-x 1 root root 1021 May 25 15:13 pam_google_authenticator.la
-rwxr-xr-x 1 root root 133552 May 25 15:13 pam_google_authenticator.so
# 8.将安装好的插件拷贝到系统库文件目录中
[root@web01 google-authenticator-libpam-1.04]# cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/
# 9.生成初始Google认证识别码
[root@web01 ~]# google-authenticator
NJZ4E6D7JHMIYLK5MFJLSWYDSE
扫描二维码
生成动态认证令牌
删除
改名
将Google 2FA 接入ssh
# 1.修改ssh认证配置
[root@web01 ~]# vim /etc/pam.d/sshd
auth required pam_google_authenticator.so
# 2.修改SSH配置文件,关联谷歌认证
[root@web01 ~]# vim /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
# 3.重启sshd服务
[root@web01 ~]# systemctl restart sshd
使用python脚本登录CRT
# $language = "python"
# $interface = "1.0"
import hmac, base64, struct, hashlib, time,re
#获取当前脚本所在的tab对象
objTab = crt.GetScriptTab()
#objTab = crt.GetActiveTab()
objTab.Screen.Synchronous = True
objTab.Screen.IgnoreEscape = True
#获取终端名字
tabName=objTab.Caption
reIp=r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
hostIp=re.findall(reIp,tabName)[0]
secretKey="NJZ4E6D7JHMIYLK5MFJLSWYDSE"
def calGoogleCode(secretKey):
#secreKey 需要是8的倍数
t = int(time.time())//30
lens = len(secretKey)
lenx = 8 - (lens % 4 if lens % 4 else 4)
secretKey += lenx * '='
key = base64.b32decode(secretKey)
msg = struct.pack(">Q", t)
googleCode = hmac.new(key, msg, hashlib.sha1).digest()
o = ord(str(googleCode[19])) & 15
googleCode = str((struct.unpack(">I", googleCode[o:o+4])[0] & 0x7fffffff) % 1000000)
return googleCode.zfill(6)
def get_string(objTab,szStart,szPrompt):
objTab.Screen.WaitForStrings(szStart)
return objTab.Screen.ReadString(szPrompt)
def send_string(objTab,waitString,strings,selfSleepTime=20):
objTab.Screen.WaitForStrings(waitString)
time.sleep(0.0001)
for i in strings:
crt.Sleep(5)
objTab.Screen.Send(i)
# time.sleep(0.0001)
objTab.Screen.WaitForStrings(strings)
if strings[-1] != '\r':
objTab.Screen.Send('\r')
#msg(objTab.Screen.ReadString('[ q ]'))
# time.sleep(0.0001)
def send_pass(objTab,waitString,strings):
objTab.Screen.WaitForStrings(waitString)
for i in strings:
crt.Sleep(5)
objTab.Screen.Send(i)
if strings[-1] != '\r':
objTab.Screen.Send('\r')
time.sleep(0.01)
#发送2fa
send_pass(objTab,'Verification code:',calGoogleCode(secretKey))
## 发送密码
send_pass(objTab,'Password: ','1') # '1' 是服务器的密码
#发送登录ip
send_string(objTab,'Opt> ',hostIp)
#objTab.Screen.WaitForStrings("[MFA auth]: ","")
#if objTab.Screen.WaitForStrings("Opt> ",1):
# #发送登录ip 克隆会话,不需要二次验证码
# send_string(objTab,'Opt> ',hostIp)
#else:
# #发送2fa
# send_pass(objTab,'[MFA auth]: ',calGoogleCode(secretKey))
# #发送登录ip
# send_string(objTab,'Opt> ',hostIp)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探