快捷搜索:  网络  CVE  渗透  后门  扫描  木马  黑客  as

开源SSH双身分上岸认证体系JXOTP了解一下

1、媒介

这就是个新的轮子,WEB黑客,手艺上没有大的创新,只是更好用一些。SSH双身分认证的开源方案有挺多的,然则实践应用中发现有三个问题,让推行的情形不是很好。

以google otp为例:

一、需要装置APP

2、需要修改客户端ssh的上岸方式

三、没法集中治理

第三点先不谈,因为跟用户没啥关系。前面两点对于运维人员还好说,然则对于其他的人来说就不是那么友爱,特别是第二个步骤引起的问题就比较多,譬如不同软件不同的设置方式等。

所以优化的思路就是绝量透明化,越方便越好。

JXOTP计划有两个版本,一个是单机版本,一个是企业版本,针对的是不同的需求,目前开源的是单机版本,企业版本还在内测中,后续会放出。

单机版本比较适合服务器少的情形,区别程度可以简单划为治理的服务器是否多于10台,10台以内,特别是只有几台服务器的情形下,用单机版本是个不错的选择。

写这个JXOTP的违景是,云上的服务器被没完没了的怼,每一时每一刻都被进行SSH暴力破解,虽然说暗码本身不弱,然则哪天若是被撞库了也没地方说理去,所以保险起见照样上个双身分认证体系好。

二、部署

目前在centos6/7上测试通过,其他体系自测。

装置以下:

一、# git clone https://github.com/jx-sec/jxotp.git

2、# cd jxotp

三、# sh install_otp.sh

效果以下:

clipboard.png

拿出你发财的小手,关上微信小程序,搜索 “运维暗码” ,关上后 点击 “添加场景” 扫描二维码即可实现OTP的设置。

最后是在服务器上启用OTP功能:

# vi /etc/pam.d/sshd 

在最上一行添加:

auth optional pam_python.so auth.py

clipboard.png

保存文件即可见效,无需重启sshd服务。

装置设置过程到此结束,下面校验结果:

# tail -F /var/log/messages

新开个窗口上岸服务器,随意输入个暗码,如123456:

clipboard.png

日记为”sshd: otp auth log: login user is root,login fail,code is 123456,must 054040″。

code is 123456,是取当前输入暗码的后六位,即123456。

must is 054040, 054040是当前OTP生成的code,需要对比运维暗码中的code与服务器的code是否一致,正常服务器时间没问题的话,是一致的。

当确定服务器以及运维暗码的code一致后,装置就此结束。

假设暗码为abcdfgww,code为951753,那么当上岸的时辰,输入的暗码为abcdfgww951753。

3、代码阐发

# -*- coding: utf-8 -*-
import syslog
import pyotp

OTP_SECRET = "YOU OTP SECRET KEY"  
# 可以手动修改SECRET KEY,必须为16位base32格式字符串
WHITE_IP = ["YOU BYPASS IP"]
#配置白名单IP,白名单IP将无需进步履态口令认证,适合有堡垒机的场景,或者固定IP的情形
GLOBAL_USER_CHECK = False
#开启所有体系用户双身分认证,默认为否,即只针对特定用户开启双身分认证
CHECK_USER = ['root']
#当GLOBAL_USER_CHECK = False时见效,设置需要进行双身分认证的用户,可添加多个用户,默认只对root用户开启双身分认证
def  otp_auth(code):
        totp = pyotp.TOTP(OTP_SECRET)
        if totp.now() == code:
                return True
        else:
                return False
#进行OTP校验
def otp_log(msg):
    syslog.openlog(facility=syslog.LOG_AUTH)
    syslog.syslog("otp auth log: "+msg)
    syslog.closelog()
#记录日记
def otp_code():
	totp = pyotp.TOTP(OTP_SECRET)
	return totp.now()
#获取当前时间的code
def pam_sm_authenticate(pamh, flags, argv):
	for white in WHITE_IP:
		if pamh.rhost == white:
			otp_log("white ip login,ip is "+pamh.rhost)
			return pamh.PAM_SUCCESS
#判定是否有白名单IP,有的话直接返归验证成功,无需进行双身分认证
        if GLOBAL_USER_CHECK:
#判定是否开启双身分认证
                resp = pamh.conversation(pamh.Message(pamh.PAM_PROMPT_ECHO_OFF,'Password:'))
#获取输入的暗码
                code = resp.resp[-6:]
#取暗码后六位
                if otp_auth(code):
                        pamh.authtok = resp.resp[:-6]
			otp_log("login user is "+pamh.user+",login success,code is "+resp.resp[-6:])
                else:
                        pamh.authtok = ""
			otp_log("login user is "+pamh.user+",login fail,code is "+ resp.resp[-6:]+",must  "+otp_code())
                return pamh.PAM_SUCCESS
#判定暗码后六位与服务器code是否一致,要是是将暗码后六位删除,重写暗码参数,要是否是将全部暗码参数配置为空
        else:
                for user in CHECK_USER:

                        if pamh.user == user:
                                resp = pamh.conversation(pamh.Message(pamh.PAM_PROMPT_ECHO_OFF,'Password:'))
                                code = resp.resp[-6:]
                                if otp_auth(code):
                                        pamh.authtok = resp.resp[:-6]
					otp_log("login user is "+pamh.user+",login success,code is "+resp.resp[-6:])
                                else:
                                        pamh.authtok = ""
					otp_log("login user is "+pamh.user+",login fail,code is "+ resp.resp[-6:]+",must  "+otp_code())
                        else:
				otp_log("user login otp check bypass,user is  "+ pamh.user)
                                return pamh.PAM_SUCCESS
#判定用户是否为配置开启校验的用户,不是直接返归成功,是的话进行检测,流程同上

def pam_sm_setcred(pamh, flags, argv):

       return pamh.PAM_SUCCESS

4、总结

新轮子更好用之处首要体现在,不需要像传统的要领去改sshd的设置文件开启ChallengeResponseAuthentication选项,也即对于使用的用户来说,部署完后是透明的,无需修改windows下上岸客户端的设置,降低使用的成本,其次支持用户以及IP配置,提高了天真性,然则相对于企业版来说,单机版存在不好珍爱的问题,所以适合少许服务器使用。

*chenjc,

您可能还会对下面的文章感兴趣: