本文介绍了一种跳板机实现思路,探讨了基本原理,并讲解了特征和相对优势。
一、跳板机思路简介
本文所描述的跳板机(下文称为“jmp”)支持:
有别于市面上常见的jumpserver方案,使用本文所搭建的跳板机将不会储存任何Linux服务器的帐号、密码、密钥等信息,避免了信息泄漏的可能。本文最大的特征是利用Linux的PAM机制,通过更改Linux服务器层配置,部份接管了Linux系统的身分能力,关于这一点,下文将详尽描述。
二、背景知识
2.1Linux的PAM机制
PAM(PluggableAuthenticationModules)机制linux跳板机,是一种广泛应用于当代Unix、Linux发行版的系统层身分认证框架。通过提供一系列动态链接库和两套编程插口(ServiceProgrammingInterface和ApplicationProgrammingInterface),将系统提供的服务与该服务的认证方法分离,进而促使可以按照须要灵活地给不同的服务配置不同的认证形式而无需修改服务程序。
2.2PAM的核心能力
功能
应用程序API
服务模块SPI
认证管理
pam_authenticate
pam_sm_authenticate
pam_setcred
pam_sm_setcred
帐号管理
pam_acc_mgmt
pam_sm_acc_mgmt
会话管理
pam_open_session
pam_sm_open_session
pam_close_session
pam_sm_close_session
口令管理
pam_chauthok
pam_sm_chauthok
2.3PAM模块类型
2.4常见PAM模块
三、跳板机系统构架
3.1微服务和高可用设计
3.1.1微服务设计
整个跳板机系统可分拆为5个服务,和1个组件。
①jmp-api服务认证某个帐号是否存在且正常认证某个帐号对某台服务器是否有登陆权限认证某个帐号对某台服务器是否有sudo权限数据拉取:帐号、主机、危险库等②jmp-ssh服务③jmp-socket服务④jmp-rdp服务⑤jmp-sftp服务⑥jmp-agent组件
定时从jmp-api拉取服务和权限信息,缓存到本地文件
按照须要检查文件改动,确保配置文件不被恶意更改
提供jmp.so动态库,为pam模块
安装释放配置文件linux跳板机,更改/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本地缓存的身分信息,如获取不到本地缓存,则使用配置项的默认策略(全部通过或则全部拒绝)。
jmp-agent组件的高可用
因为jmp-agent布署在业务服务器上,所处环境可能随时发生变化,因而必须具备较强的适应性(c盘空间不足、inode满、内存不足、网络不稳定、域名解析异常等等)。
针对c盘空间或inode不足,jmp-agent可能难以使用本地文件缓存,因而此时选择降级,忽视缓存。
针对网路不稳定问题,jmp-agent选择降低同jmp-api、jmp-ssh的通讯超时,同时可降级信令,确保操作不受影响。
针对解析异常问题,jmp-agent未能通过域名同服务交互,此时使用外置的固定ip同服务交互。
3.2跳板机各子服务交互图
从图中可见,作为核心服务的jmp-ssh承载了ssh流量的代理转发,将来自用户ssh顾客端、jmp-socket服务的ssh流量转发到目标服务器上,并将来自目标服务器的返回结果送达回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.1登陆跳板机
4.2登陆目标服务器
4.3命令交互
4.4切换用户/特权帐号
4.5使用网页交互
4.6危险命令拦截
4.7非Linux服务器的跳板机
五、权限规则和审批链路设计
5.1默认拥有的权限
无需申请,即可拥有的权限。
授权的主体
权限的目标
权限的类型
服务负责人
服务的线上主机
登陆权限
服务的线下主机
登陆权限+ROOT权限
项目负责人
项目的线上主机
登陆权限
项目的线下主机
登陆权限+ROOT权限
服务的运维
服务的线上主机
登陆权限+ROOT权限
服务的线下主机
项目的运维
项目的线上主机
登陆权限+ROOT权限
项目的线下主机
5.2权限申请的审批链路
这儿明晰了申请流程的审批链路:
六、这种实现思路的优点
6.1操作便捷,体验较好
通过该思路所建设的跳板机系统,操作上比较便捷,即支持了ssh、又兼容了rdp,同时提供了网页端操作入口,体验较好。同时,因为采用微服务构架,服务间耦合较小linux查看端口占用,比较容易做到高可用,因而极少出现卡顿、延时等现象,整体稳定性可靠,体验上有保证。
6.2安全可靠,容易审计
本文的最大特征就是在目标服务器上使用了pam机制,通过jmp.so接管多个服务的身分辨识和权限认证,进而做到了在不更改标准命令的基础上,统一接管权限红旗linux操作系统,统一管控。而且做到了在登陆到目标机器上后,可以进一步ssh到其他服务器,所有的交互过程全程记录,所有的操作命令就会被记录出来。
因为通过该思路所实现的跳板机直接将用户名作为目标服务器ssh会话的登陆名,所以在系统内部所记录的日志里也是直接的用户名,而不是如jumpserver等方案的统一帐号,这些方法下,更容易定位到操作轨迹的真实执行人,一目了然。
危险命令拦截功能,更是可以很大程度上防止恶意操作或则破坏性强的误操作,为业务稳定性降低一层保障。
6.3服务间职责明晰
因为采用了微服务构架,可以做到每位服务的纵向扩充,进而做到了通过扩容服务的形式管控更多的机器。服务间职责明晰,可依照须要裁减jmp-rdp、jmp-socket、jmp-sftp,也可以按照须要降低新的服务,适配性较好。
七、总结与展望
随着服务器规模的扩大,怎样管理这种服务器成为一个越来越重要的问题。针对服务器的登陆访问,本文介绍了跳板机的一种实现思路,并描述了该思路的优点和奇特之处。通过该思路可以一定程度上建立简单、易用且高可用的跳板机,进而解决服务器登入问题。假如读者对这个实现思路感兴趣,或则有任何疑惑,欢迎与我们沟通。我们也十分乐意与诸位一起学习,研究技术。
本文原创地址://gulass.cn/tbjdjbylhxdy.html编辑:刘遄,审核员:暂无