作者 | vivo 互联网运维团队- Yang Lei 本文介绍了一种跳板机实现思路,种跳阐述了基本原理,板机并讲解了特点和相对优势
。现思 本文所描述的板机跳板机(下文称为“jmp”)支持
: 有别于市面上常见的种跳jumpserver方案,使用本文所搭建的板机跳板机将不会存储任何Linux服务器的账号
、密码 、现思密钥等信息
,种跳杜绝了信息泄露的板机可能
。本文最大的服务器租用现思特点是借助Linux的PAM机制,通过修改Linux服务器系统层配置,种跳部分接管了Linux系统的板机身份认证能力 ,关于这一点,现思下文将详细描述。 PAM(Pluggable Authentication Modules)机制,是一种广泛应用于当代Unix 、Linux发行版的系统层身份认证框架。通过提供一系列动态链接库和两套编程接口(Service Programming Interface 和 Application Programming Interface),香港云服务器将系统提供的服务与该服务的认证方式分离,从而使得可以根据需要灵活地给不同的服务配置不同的认证方式而无需更改服务程序。 功能 应用程序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 auth account session password pam_unix.so模块 【auth】提示用户输入密码 ,模板下载并与/etc/shadow文件相比对
,匹配返回0(PAM_SUCCESS)。 【account】检查用户的账号信息(包括是否过期等)
,帐号可用时,返回0 。 【password】修改用户的密码,将用户输入的密码
,作为用户的新密码更新shadow文件。 pam_cracklib.so模块 pam_loginuid.so模块 pam_securetty.so模块 pam_rootok.so模块 pam_console.so模块当 pam_permit.so模块 pam_env.so模块 pam_xauth.so模块 pam_stack.so模块 pam_warn.so模块 整个跳板机系统可拆分为5个服务
,和1个组件 。 ① jmp-api 服务 ② jmp-ssh 服务 ③ jmp-socket 服务 ④ jmp-rdp 服务 ⑤ jmp-sftp 服务 ⑥ jmp-agent 组件 定时从jmp-api拉取服务和权限信息,缓存到本地文件 根据需要检测文件改动,确保配置文件不被恶意修改 jmp专用pam模块 提供jmp.so动态库,为pam模块 安装脚本释放配置文件,修改/etc/pam.d/xxx文件 ,生效jmp的pam模块 接管身份识别和权限认证,调用jmp-api接口以完成鉴权 jmp中任何一个服务都是无状态的,因而支持异地多机房部署 自动降级策略 jmp-agent组件的高可用 从图中可见 ,作为核心服务的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客户端也能够方便地登录服务器。 Windows服务器对于 MySQL终端和Redis终端 网络设备管理终端 无需申请 ,即可拥有的权限。 授权的主体 权限的目标 权限的类型 服务负责人 服务的线上主机 登录权限 服务的线下主机 登录权限+ROOT权限 项目负责人 项目的线上主机 登录权限 项目的线下主机 登录权限+ROOT权限 服务的运维 服务的线上主机 登录权限+ROOT权限 服务的线下主机 项目的运维 项目的线上主机 登录权限+ROOT权限 项目的线下主机 这里明确了申请流程的审批链路 : 通过该思路所建设的跳板机系统,操作上比较方便,即支持了ssh 、又兼容了rdp
,同时提供了网页端操作入口,体验较好
。同时,由于采用微服务架构,服务间耦合较小 ,比较容易做到高可用,从而很少出现卡顿 、延时等现象
,整体稳定性可靠,体验上有保证。 本文的最大特点就是在目标服务器上使用了pam机制,通过jmp.so接管多个服务的身份识别和权限认证
,从而做到了在不修改标准命令的基础上,统一接管权限,统一管控
。并且做到了在登录到目标机器上后
,可以进一步ssh到其他服务器,所有的交互过程全程记录,所有的操作命令都会被记录下来 。 由于通过该思路所实现的跳板机直接将用户名作为目标服务器ssh会话的登录名 ,所以在系统内部所记录的日志里也是直接的用户名,而不是如jumpserver等方案的统一账号,这种方式下 ,更容易定位到操作轨迹的真实执行人
,一目了然。 危险命令拦截功能,更是可以很大程度上避免恶意操作或者破坏性强的误操作
,为业务稳定性增加一层保障。 由于采用了微服务架构,可以做到每个服务的横向扩展,从而做到了通过扩容服务的方式管控更多的机器。服务间职责明确,可根据需要裁减jmp-rdp、jmp-socket、jmp-sftp
,也可以根据需要增加新的服务,适配性较好。 随着服务器规模的扩大,如何管理这些服务器成为一个越来越重要的问题
。针对服务器的登录访问,本文介绍了跳板机的一种实现思路,并描述了该思路的优点和独特之处。通过该思路可以一定程度上构建简单、易用且高可用的跳板机,从而解决服务器登录问题
。如果读者对这个实现思路感兴趣
,或者有任何疑问,欢迎与我们沟通。我们也非常愿意与各位一起学习 ,研究技术。一、种跳 跳板机思路简介
二、背景知识
2.1 Linux 的 PAM 机制
三、跳板机系统架构
3.1 微服务和高可用设计3.1.1 微服务设计
四 、核心设计思路
4.1 登录跳板机用户使用ssh客户端登录到jmp-ssh服务
,与jmp-ssh服务交互
。jmp-ssh服务获得ssh会话建立过程中的账号、加密后密码、二次认证信息。jmp-ssh服务访问jmp-api服务,提交账号、加密后密码
、二次认证信息,以便知晓该用户是否有登录jmp的权限 。





五、权限规则和审批链路设计
5.1 默认拥有的权限
六、这种实现思路的优点
6.1 操作方便,体验较好七、总结与展望