当前位置: 首页 > 科技观察

一个跳板机的实现思路_0

时间:2023-03-19 00:52:43 科技观察

作者|vivo互联网运营团队-杨磊本文介绍了跳板机的实现思路,阐述了基本原理,并说明了特点和相对优势。1.跳线机的思路介绍本文介绍的跳线机(以下简称“jmp”)支持:Linux服务器、Windows服务器、其他终端(MySQL终端、Redis终端、网络设备终端、等)不同于市面上常见的跳板机方案,使用本文搭建的跳板机不会存储任何Linux服务器账号、密码、密钥等信息,杜绝了信息泄露的可能。本文最大的特点是借助Linux的PAM机制,通过修改Linux服务器系统层的配置,部分接管了Linux系统的身份认证能力。这将在下面详细描述。2.背景知识2.1Linux的PAM机制PAM(PluggableAuthenticationModules)机制是当代Unix和Linux发行版中广泛使用的系统级认证框架。通过提供一系列动态链接库和两套编程接口(ServiceProgrammingInterface和ApplicationProgrammingInterface),将系统提供的服务与服务的认证方式分离,从而可以针对不同的用户灵活配置不同的认证方式按需服务方式,无需改变服务程序。2.2PAM的核心能力功能应用程序API服务模块SPI认证管理pam_authenticatepam_sm_authenticatepam_setcredpam_sm_setcred账号管理pam_acc_mgmtpam_sm_acc_mgmt会话管理pam_open_sessionpam_sm_open_sessionpam_close_sessionpam_sm_close_session口令管理pam_chauthokpam_sm_chauthok2.3PAM模块类型auth用来对用户的身份进行识别,如:提示用户输入密码,或判断用户是否forrootetc.account检查账户的各种属性,比如:是否允许登录,是否达到最大用户数,是否允许root用户在本终端登录等。使用session模块定义用户登录前和用户注销后要执行的操作,如:登录连接信息、打开和关闭用户数据、挂载文件系统等。password使用用户信息进行更新,如:修改用户密码。2.4普通PAM模块pam_unix.so模块[auth]提示用户输入密码,并与/etc/shadow文件进行比较,匹配返回0(PAM_SUCCESS)。[account]查询用户的账号信息(包括是否过期等),当账号可用时返回0。【密码】修改用户密码,使用用户输入的密码作为用户更新影子文件的新密码。pam_cracklib.so模块该模块可以插入到程序的密码堆栈中以检查密码的强度。pam_loginuid.so模块用于设置认证进程的uid,使程序能够通过正常的审计。对于pam_securetty.so模块,如果用户想以root身份登录,登录的tty必须在/etc/securetty之前。pam_rootok.so模块pam_rootok模块用于验证用户id是否为0,为0则返回PAM_SUCCESS。pam_console.so模块在用户登录终端时改变终端文件的权限。用户注销后,它将更改回来。pam_permit.so模块该模块随时返回成功。pam_env.so模块pam_env允许设置环境变量;如果默认没有指定文件,环境变量将根据/etc/security/pam_env.confpam_xauth.so模块pam_xauth用于在用户之间转发xauth-key。pam_stack.so模块pam_stack可以调用另一个服务;即一个设置中可以包含多个服务,需要修改的时候只需要修改一个文件即可。pam_warn.so模块pam_warn用于将服务、最终用户、远程用户和远程主机的信息记录到系统日志中。该模块总是返回PAM_IGNORE,这意味着它不想影响身份验证过程。3.跳板系统架构3.1微服务和高可用设计3.1.1微服务设计整个跳板系统可以拆分为5个服务和1个组件。①jmp-api服务监听8080端口,提供http接口能力,验证账号是否存在,正常验证账号是否有登录某台服务器的权限,验证某账号是否有某台服务器的sudo权限数据拉取:account,主机,危险命令库等是jmp访问数据库的唯一入口②jmp-ssh服务监听2200端口,提供ssh代理能力直接访问linux服务器和其他终端③jmp-socket服务监听8080端口,提供websocket/socket.io连接能力通过ssh协议将socket.io流量转发给jmp-ssh,支持web端连接访问④jmp-rdp服务监听8080端口,提供socket.io连接能力,实现rdp代理,所以为了方便Windows服务器的运行,支持基于web的远程桌面服务⑤jmp-sftp服务提供文件上传下载功能,支持jmp中ortssftp命令,支持任意sftp客户端连接S3访问文件⑥jmp-agent组件部署在每台Linux服务器上,jmp-agent常驻进程定期从jmp-api拉取服务和权限信息,将它们缓存在本地文件中,并根据需要检测文件更改,以确保配置文件不被恶意修改。jmp专用的pam模块提供了jmp.so动态库来发布pam模块安装脚本的配置文件。修改/etc/pam.d/xxx文件,jmp的pam模块接管身份和权限认证,调用jmp-api接口完成认证3.1.2高可用设计jmp中的任何服务都是无状态的,所以支持在异地多个机房部署http协议服务(jmp-api、jmp-socket、jmp-rdp),通过Nginx配置路由,配置自动负载均衡策略。非http服务(jmp-ssh、jmp-sftp)通过4层负载均衡(lvs、vgw)实现高可用。在自动降级策略中识别危险命令的能力可能需要很长时间。因此,当发现识别危险命令的接口超时时,会自动忽略危险命令的识别。当身份认证接口超时时,使用jmp-agent本地缓存中的身份信息。如果获取不到本地缓存,则使用配置项的默认策略(passallorrejectall)。jmp-agent组件高可用由于jmp-agent部署在业务服务器上,环境随时可能发生变化,因此必须具备很强的适应性(磁盘空间不足、inode满、内存不足、网络不稳定、域名解析异常、ETC。)。对于磁盘空间或inode不足,jmp-agent可能无法使用本地文件缓存,此时选择降级忽略缓存。针对网络不稳定的问题,jmp-agent选择增加与jmp-api和jmp-ssh的通信超时时间,同时可以降级认证,保证运行不受影响。对于解析异常,jmp-agent无法通过域名与服务进行交互。此时,它使用内置的固定ip与服务进行交互。3.2跳板机各子服务交互图从图中可以看出,jmp-ssh作为核心服务,承载了ssh流量的代理转发,转发来自用户sshclient和jmp-socket服务发送给目标服务器,并将目标服务器的返回结果发回给ssh客户端和jmp-socket服务。因此,可以在jmp-ssh服务上识别用户的危险指令,在到达目标服务器前进行报警或直接拦截,避免恶意操作或误操作对业务造成影响。图中的jmp-api是直接与数据库和缓存交互的服务。它在整个系统中承担着数据接口和管理端的角色,在整个服务器中接受来自jmp-agent组件的用户身份认证和权限验证请求。在控制中心。jmp-api还提供权限设置功能。通过与流程系统对接,方便为个人/部门申请机器/服务/项目的登录权限或root权限。此外,jmp-api还支持登录权限和root权限。申请人可以针对不同的项目/服务,对权限的生效时间进行限制,严格控制权限的粒度。由于同一个项目/服务往往由同一组人维护,jmp-api内置默认权限策略,允许项目/服务的负责人直接拥有该项目/服务的登录权限,无需申请;只有相应的项目/服务运维负责人默认有root权限。其他人若想获得root权限,必须申请相应服务的运维负责人批准。图中的jmp-agent部署在各个linux服务器上,通过修改linux文件上的/etc/pam.d/sshd、/etc/pam.d/remote、/etc/pam.d/sudo等,让jmp.so(jmp-agent.rpm或jmp-agent.deb的一部分)接管ssh服务、sudo程序等关键系统程序的身份识别和权限认证。因此,在不添加/etc/passwd和/etc/shadow内容的情况下,实现了识别任何服务器上所有人员身份的能力。图中的jmp-rdp只是作为Windows服务器的rdp代理服务,提供基于web的远程桌面能力。图中的jmp-socket提供了一个基于web的Linux服务器操作终端,使得用户可以在不使用ssh客户端的情况下轻松登录服务器。4.核心设计思路4.1登录跳板用户使用ssh客户端登录jmp-ssh服务,与jmp-ssh服务进行交互。jmp-ssh服务在ssh会话建立过程中获取帐号、加密密码和二次认证信息。jmp-ssh服务访问jmp-api服务,提交帐号、加密密码、二次认证信息,从而获知用户是否有权限登录jmp。4.2登录目标服务器用户登录jmp-ssh或者通过jmp-socket前端身份认证后,才能登录目标服务器。用户在jmp-ssh提供的伪终端下输入sshxxxx(xxxx为目标服务器的主机名或IP地址)。jmp-ssh通过ssh连接目标服务器,自动携带用户名信息,尝试建立会话。由于目标服务器上的jmp-agent接管了sshd的识别和认证,jmp.so在ssh会话建立过程中获取用户名,加密用户名和本机IP地址信息,调用jmp-api接口进行认证.jmp-api根据内置策略,查询授权表,判断用户是否有登录本机的权限。jmp-agent获取认证结果,如果授权则ssh会话建立成功,否则会话建立失败。jmp-ssh获取会话建立结果和原因,返回给用户的ssh终端。4.3命令交互只有当用户登录到某台机器上,命令交互才有可能。当用户在ssh客户端输入字符时,传递给jmp-ssh,jmp-ssh判断语句是否结束。当语句结束时,jmp-ssh根据本机的危险命令规则匹配用户输入的语句,决定警告、拦截、通过。jmp-ssh将传递过来的语句或需要提醒的语句传送给目标服务器,目标服务器执行并返回结果。4.4切换用户/特权账号只有当用户已经登录到某台机器上时,才会触发切换用户的行为。当用户在ssh客户端执行sudoxxxx、su、id等命令时,jmp-ssh会将这些命令透传给目标服务器。目标服务器上的sshd进程执行sudoxxxx、su、id等命令,由于jmp-agent已经接管了目标服务器上的身份失败和授权认证,jmp.so获取登录用户名,当前用户名,本地地址信息,目标用户名信息,调用jmp-api接口进行sudo权限认证。jmp-api判断用户是否有权限将机器切换到xx账号(比如用户是否有root权限)。sudo、su、id等进程通过jmp.so获取认证结果,决定是否切换用户。4.5使用网页交互仅适用于用户已经通过网页完成登录(如sso)的情况。用户通过网页访问jmp-socket服务。jmp-socket服务获取用户名信息和网页登录sso信息,提交给jmp-api,生成临时登录凭证。jmp-socket访问jmp-ssh并提交临时登录凭据。jmp-ssh发起登录二次认证,等待用户完成二次认证。用户完成二次认证后,jmp-socket承担ssh客户端角色,与jmp-ssh进行交互。4.6危险命令拦截用户登录目标服务器后,jmp-ssh在session中加载目标机器对应服务的危险命令规则,并初始化正则匹配逻辑。jmp-ssh在用户输入的语句结束后,根据机器的危险命令规则匹配用户输入的语句。jmp-ssh匹配危险命令规则后,决定按照策略对输入进行如下处理:报警、拦截、通过。对于pass,jmp-ssh将命令传递给目标服务器。对于警告,jmp-ssh向目标服务器传输命令,但向用户、用户的直属领导和jmp系统管理员发送危险的命令警告。对于拦截,jmp-ssh拒绝传递命令,同时向用户、用户直属领导、jmp系统管理员发出危险命令警告。4.7SpringboardWindowsserverfornon-Linuxservers对于Windowsservers,使用jmp-rdp服务将rdp协议数据转换为socket.io(依赖ApacheGuacamole)携带的应用程序数据,通过Canvas显示实时图像在网页并接受键盘和鼠标事件。MySQL终端和Redis终端只支持部署在Linux服务器上的MySQL和Redis。通过服务器上的mysql.sock将jmp-agent连接到本地MySQL服务,jmp-agent将标准输入和标准输出转发给jmp-ssh。通过服务器上的redis.sock将jmp-agent连接到本地Redis服务,jmp-agent将标准输入和标准输出转发给jmp-ssh。该方法理论上支持任何可以通过unixsocket连接的服务。网络设备管理端对于网络端,jmp-ssh通过读取jmp-api接口获取对应网络设备的连接信息(协议类型、账户信息等),实现连接和操作。五、权限规则及审批环节设计5.1默认拥有的权限,无需申请即可拥有。授权主体权限目标权限类型服务负责人在线主机登录权限离线主机登录权限+服务ROOT权限项目负责人在线主机登录权限项目离线主机登录权限+ROOT权限服务运维服务在线主机登录权限+ROOT权限服务运维项目在线主机登录权限+ROOT权限项目离线主机5.2如果没有默认审批权限权限申请链接,但是如果需要登录本机,或者需要使用ROOT权限,则需要申请。如果你为一个组织申请权限,那么这个组织(部门)的所有成员都有申请锁的权限。这里明确一下申请流程的审批环节:6、这种实现思路的优势6.1操作简单,体验好同时提供网页操作入口,体验更好。同时,由于采用了微服务架构,服务之间的耦合度小,相对容易实现高可用,很少出现卡顿、延迟等现象,整体稳定性较好靠谱,体验有保障。6.2安全可靠,便于审计本文最大的特点是在目标服务器上使用pam机制,通过jmp.so接管多个服务的标识和权限认证,实现统一接管权限无需修改标准命令,统一管控。并且登录目标机器后,可以进一步ssh到其他服务器,所有的交互过程全程记录,所有的操作命令都会被记录下来。由于本思路实现的跳板机直接使用用户名作为目标服务器ssh会话的登录名,所以系统中记录的日志也是直接用户名,而不是jumpserver等方案的统一账号。接下来,更容易一目了然地定位到操作轨迹的真正执行者。危险指令拦截功能,可很大程度上避免恶意操作或破坏性误操作,为业务稳定增加一层保障。6.3明确服务之间的职责由于采用了微服务架构,每个服务都可以进行水平扩展,通过服务的扩展可以管理和控制更多的机器。服务之间职责明确,jmp-rdp、jmp-socket、jmp-sftp可以根据需要裁剪,也可以根据需要增加新的服务,适应性好。七。总结与展望随着服务器规模的扩大,如何对这些服务器进行管理成为一个越来越重要的问题。针对服务器登录接入,本文介绍了一种跳板机的实现思路,并描述了这种思路的优势和独特之处。通过这种思路,一定程度上可以搭建一个简单易用、高可用的跳板机,从而解决服务器登录问题。如果读者对这个实现思路感兴趣,或者有任何疑问,欢迎与我们交流。我们也非常愿意和您一起学习和研究技术。