vivo 互联网运维团队- Yang Lei
本文介绍了一种跳板机实现思路,论述了基本原理,并解说了特点和绝对劣势。
一、 跳板机思路简介
本文所形容的跳板机(下文称为“jmp”)反对:
- Linux服务器
- Windows服务器
- 其余终端(MySQL终端、Redis终端、网络设备终端 等等)
有别于市面上常见的jumpserver计划,应用本文所搭建的跳板机将不会存储任何Linux服务器的账号、明码、密钥等信息,杜绝了信息泄露的可能。本文最大的特点是借助Linux的PAM机制,通过批改Linux服务器零碎层配置,局部接管了Linux零碎的身份认证能力,对于这一点,下文将详细描述。
二、背景常识
2.1 Linux 的 PAM 机制
PAM(Pluggable Authentication Modules)机制,是一种广泛应用于当代Unix、Linux发行版的零碎层身份认证框架。通过提供一系列动态链接库和两套编程接口(Service Programming Interface 和 Application Programming Interface),将零碎提供的服务与该服务的认证形式拆散,从而使得能够依据须要灵便地给不同的服务配置不同的认证形式而无需更改服务程序。
2.2 PAM 的外围能力
2.3 PAM 模块类型
- auth
用来对用户的身份进行辨认,如:提醒用户输出明码,或判断用户是否为root等。
- account
对帐号的各项属性进行查看,如:是否容许登录,是否达到最大用户数,或是root用户是否容许在这个终端登录等。
- session
这个模块用来定义用户登录前的,及用户退出后所要进行的操作,如:登录连贯信息、用户数据的关上与敞开、挂载文件系统等。
- password
应用用户信息来更新,如:批改用户明码。
2.4 常见 PAM 模块
- pam_unix.so模块
【auth】提醒用户输出明码,并与/etc/shadow文件相比对,匹配返回0(PAM_SUCCESS)。【account】检查用户的账号信息(包含是否过期等),帐号可用时,返回0。【password】批改用户的明码,将用户输出的明码,作为用户的新密码更新shadow文件。
- 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.conf进行环境变量的设置
- pam_xauth.so模块
pam_xauth用来在用户之间转发xauth-key。
- pam_stack.so模块
pam_stack能够调用另一个服务;即多个服务能够蕴含到一个设置中,当须要批改时只批改一个文件就能够了。
- pam_warn.so模块
pam\_warn用来记录服务、终端用户、近程用户和近程主机的信息到系统日志,模块总是返回PAM\_IGNORE、指不心愿影响到认证解决。
三、跳板机系统架构
3.1 微服务和高可用设计
3.1.1 微服务设计
整个跳板机系统可拆分为5个服务,和1个组件。
① jmp-api 服务
- 监听8080端口,提供http接口能力
- 认证某个账号是否存在且失常
- 认证某个账号对某台服务器是否有登录权限
- 认证某个账号对某台服务器是否有sudo权限
- 数据拉取:账号、主机、危险命令库等
- 是jmp拜访数据库的惟一入口
② jmp-ssh 服务
- 监听2200端口,提供ssh代理能力
- 可间接拜访Linux服务器、其余终端
③ jmp-socket 服务
- 监听8080端口,提供websocket/socket.io连贯能力
- 通过ssh协定转发socket.io的流量到jmp-ssh
- 反对网页终端的连贯和拜访
④ jmp-rdp 服务
- 监听8080端口,提供socket.io连贯能力
- 实现rdp代理,以便于操作Windows服务器
- 反对基于网页的远程桌面服务
⑤ jmp-sftp 服务
- 提供文件上传下载能力,反对在jmp中通过sftp命令,反对任意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本地缓存的身份信息,如获取不到本地缓存,则应用配置项的默认策略(全副通过或者全副回绝)。
jmp-agent组件的高可用
因为jmp-agent部署在业务服务器上,所处环境可能随时发生变化,因而必须具备较强的适应性(磁盘空间有余、inode满、内存不足、网络不稳固、域名解析异样等等)。
针对磁盘空间或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 登录跳板机
- 用户应用ssh客户端登录到jmp-ssh服务,与jmp-ssh服务交互。
- jmp-ssh服务取得ssh会话建设过程中的账号、加密后明码、二次认证信息。
- jmp-ssh服务拜访jmp-api服务,提交账号、加密后明码、二次认证信息,以便通晓该用户是否有登录jmp的权限。
4.2 登录指标服务器
- 仅当用户曾经登录到jmp-ssh或者曾经通过了jmp-socket的前端身份认证时方可登录指标服务器。
- 用户在jmp-ssh提供的伪终端下输出ssh xxxx(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客户端执行sudo xxxx、su、id等等命令时,jmp-ssh透传命令到指标服务器上。
- 指标服务器上的sshd过程执行sudo xxxx、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在用户曾经登录到指标服务器后,在该会话内,加载指标机器对应服务的危险命令规定,初始化正则匹配逻辑。
- jmp-ssh在用户输出语句完结后,依据该机器的危险命令规定,匹配用户输出的语句。
- jmp-ssh依据危险命令规定匹配后策略,决定对该输出做如下解决:告警、拦挡、通过。
- 对于通过的,jmp-ssh传递命令到指标服务器。
- 对于告警的,jmp-ssh传递命令到指标服务器,然而向用户、用户的直属领导、jmp系统管理员发送危险命令告警。
- 对于拦挡的,jmp-ssh回绝传递命令,同时向用户、用户的直属领导、jmp系统管理员发送危险命令告警。
4.7 非Linux服务器的跳板机
- Windows服务器
对于Windows服务器,应用jmp-rdp服务,将rdp协定数据转成由socket.io承载的利用数据(依赖Apache Guacamole),并通过web页面的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 默认领有的权限
无需申请,即可领有的权限。
5.2 权限申请的审批链路
- 如果没有默认权限,然而须要登录机器,或者须要应用ROOT权限,则须要申请。
- 如果为组织申请权限,则该组织(部门)下所有成员均有锁申请的权限。
这里明确了申请流程的审批链路:
六、这种实现思路的长处
6.1 操作不便,体验较好
通过该思路所建设的跳板机系统,操作上比拟不便,即反对了ssh、又兼容了rdp,同时提供了网页端操作入口,体验较好。同时,因为采纳微服务架构,服务间耦合较小,比拟容易做到高可用,从而很少呈现卡顿、延时等景象,整体稳定性牢靠,体验上有保障。
6.2 安全可靠,容易审计
本文的最大特点就是在指标服务器上应用了pam机制,通过jmp.so接管多个服务的身份辨认和权限认证,从而做到了在不批改规范命令的根底上,对立接管权限,对立管控。并且做到了在登录到指标机器上后,能够进一步ssh到其余服务器,所有的交互过程全程记录,所有的操作命令都会被记录下来。
因为通过该思路所实现的跳板机间接将用户名作为指标服务器ssh会话的登录名,所以在零碎外部所记录的日志里也是间接的用户名,而不是如jumpserver等计划的对立账号,这种形式下,更容易定位到操作轨迹的实在执行人,高深莫测。
危险命令拦挡性能,更是能够很大水平上防止歹意操作或者破坏性强的误操作,为业务稳定性减少一层保障。
6.3 服务间职责明确
因为采纳了微服务架构,能够做到每个服务的横向扩大,从而做到了通过扩容服务的形式管控更多的机器。服务间职责明确,可依据须要裁减jmp-rdp、jmp-socket、jmp-sftp,也能够依据须要减少新的服务,适配性较好。
七、总结与瞻望
随着服务器规模的扩充,如何治理这些服务器成为一个越来越重要的问题。针对服务器的登录拜访,本文介绍了跳板机的一种实现思路,并形容了该思路的长处和独特之处。通过该思路能够肯定水平上构建简略、易用且高可用的跳板机,从而解决服务器登录问题。如果读者对这个实现思路感兴趣,或者有任何疑难,欢送与咱们沟通。咱们也十分违心与各位一起学习,钻研技术。