一种跳板机的实现思路

news2024/11/26 11:57:32

一、 跳板机思路简介

本文所描述的跳板机(下文称为“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 的核心能力

功能

应用程序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.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接口能力

  1. 认证某个账号是否存在且正常

  2. 认证某个账号对某台服务器是否有登录权限

  3. 认证某个账号对某台服务器是否有sudo权限

  4. 数据拉取:账号、主机、危险命令库等

  • 是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 默认拥有的权限

无需申请,即可拥有的权限。

授权的主体

权限的目标

权限的类型

服务负责人

服务的线上主机

登录权限

服务的线下主机

登录权限+ROOT权限

项目负责人

项目的线上主机

登录权限

项目的线下主机

登录权限+ROOT权限

服务的运维

服务的线上主机

登录权限+ROOT权限

服务的线下主机

项目的运维

项目的线上主机

登录权限+ROOT权限

项目的线下主机

5.2 权限申请的审批链路

  • 如果没有默认权限,但是需要登录机器,或者需要使用ROOT权限,则需要申请。

  • 如果为组织申请权限,则该组织(部门)下所有成员均有锁申请的权限。

这里明确了申请流程的审批链路:

六、这种实现思路的优点

6.1 操作方便,体验较好

通过该思路所建设的跳板机系统,操作上比较方便,即支持了ssh、又兼容了rdp,同时提供了网页端操作入口,体验较好。同时,由于采用微服务架构,服务间耦合较小,比较容易做到高可用,从而很少出现卡顿、延时等现象,整体稳定性可靠,体验上有保证。

6.2 安全可靠,容易审计

本文的大特点就是在目标服务器上使用了pam机制,通过jmp.so接管多个服务的身份识别和权限认证,从而做到了在不修改标准命令的基础上,统一接管权限,统一管控。并且做到了在登录到目标机器上后,可以进一步ssh到其他服务器,所有的交互过程全程记录,所有的操作命令都会被记录下来。

由于通过该思路所实现的跳板机直接将用户名作为目标服务器ssh会话的登录名,所以在系统内部所记录的日志里也是直接的用户名,而不是如jumpserver等方案的统一账号,这种方式下,更容易定位到操作轨迹的真实执行人,一目了然。

危险命令拦截功能,更是可以很大程度上避免恶意操作或者破坏性强的误操作,为业务稳定性增加一层保障。

6.3 服务间职责明确

由于采用了微服务架构,可以做到每个服务的横向扩展,从而做到了通过扩容服务的方式管控更多的机器。服务间职责明确,可根据需要裁减jmp-rdp、jmp-socket、jmp-sftp,也可以根据需要增加新的服务,适配性较好。

七、总结与展望

随着服务器规模的扩大,如何管理这些服务器成为一个越来越重要的问题。针对服务器的登录访问,本文介绍了跳板机的一种实现思路,并描述了该思路的优点和独特之处。通过该思路可以一定程度上构建简单、易用且高可用的跳板机,从而解决服务器登录问题。如果读者对这个实现思路感兴趣,或者有任何疑问,欢迎与我们沟通。我们也非常愿意与各位一起学习,研究技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1590992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS实现卡片在鼠标悬停时突出效果

在CSS中,实现卡片在鼠标悬停时突出,通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时,该元素的状态变化。通过:hover选择器,你可以定义鼠标悬停在元素上时元素的样式,比如改变颜色、…

最新PDD批发Anti-Content参数逆向分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 分析与扣代码 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Py…

Java(今天偷懒一丢丢

今天学了一点点io流 基本概念 输入流(InputStream):用于从数据源读取数据。输出流(OutputStream):用于向目标写入数据。 分类 按功能分类 字节流:处理字节数据,如 InputStream 和…

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

韩顺平 | 零基础快速学Python(12) OOP基础

面向对象编程-基础 类与对象 类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型&#xff0c;从而能够创建该类型的新实例/对象。 类时抽象的概念&#xff0c;作为数据类型代表一类事物&#xff1b;对象时具体实际的&#xff0c;作为实例代表具体事物&…

【c语言】atoi函数---使用和模拟实现(详解)

atoi函数---使用和模拟实现 atoi函数在Cplusplus中的定义 atoi函数的使用 #include <stdio.h> #include <stdlib.h>int main() {char arr[20] "4831213";int ret 0;ret atoi(arr);printf("arr:%s\n", arr);printf("ret:%d\n", re…

JWT重放漏洞如何攻防?你的系统安全吗?

大家好&#xff0c;我是石头~ 在数字化浪潮席卷全球的今天&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为身份验证的利器&#xff0c;已成为众多Web应用的首选方案。 然而&#xff0c;正如硬币有两面&#xff0c;JWT的强大功能背后也隐藏着潜在的安全风险&#xf…

手把手教你如何下载学浪上的视频课程

学浪直播课程下载技术尚未攻克&#xff0c;但视频课程下载却易如反掌。 1.首先解压好我给大家准备好的压缩包 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V10的分享 2.首先解压我…

OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建&#xff0c;经过前面的实践&#xff0c;再来看编译构建。 编译构建概述 在官网中提到了&#xff0c;OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…

数据采集仪:自动化监测系统的核心组件

在当代的工业自动化领域&#xff0c;数据采集仪成为了一个关键的技术工具&#xff0c;它不仅仅是简单地将电信号转化为数据信号&#xff0c;而是能够实时、有效地处理和显示各种信号&#xff0c;确保整个监测系统的稳定、高效运行。 点击输入图片描述&#xff08;最多30字&…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

JWT详解及实战教程

目录 1.什么是JWT 2.JWT能做什么 3.为什么是JWT 基于传统的Session认证 基于JWT认证 4.JWT的结构是什么? 5.使用JWT 6.封装工具类 7.整合springboot 1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

介绍一个方便的python包和环境管理软件Anaconda,如何快速安装

为什么要安装Ananconda&#xff1f; Anaconda是一个方便的python包管理和环境管理软件&#xff0c;一般用来配置不同的项目环境。它通过管理工具包、开发环境、Python版本&#xff0c;大大简化了工作流程。不仅可以方便地安装、更新、卸载工具包&#xff0c;而且安装时能自动安…

SpringBoot 微服务token 传递实现

1、前言 随着微服务的流行&#xff0c;微服务之间的安全以及业务需要&#xff0c;都需要穿递token &#xff0c;而token的传递一般通过header 头来传递。从架构的角度来讲 &#xff0c;一般的企业应用都由nginx、业务网关和各个微服务组成。这个nginx 传递header 我就不讲述。下…

伪装目标检测论文阅读之:《Confidence-Aware Learning for Camouflaged Object Detection》

论文地址&#xff1a;link code:link 摘要&#xff1a;   任意不确定性捕获了观测结果中的噪声。对于伪装目标检测&#xff0c;由于伪装前景和背景的外观相似&#xff0c;很难获得高精度的注释&#xff0c;特别是目标边界周围的注释。我们认为直接使用“嘈杂”的伪装图进行训…

分布式系统接口限流方案

Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 方案一、 Guava工具包 实现单机版限流 具体代码见git 方案二、Redis lua脚本 实现分布式系统的接口限流 具体代码见git

计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要 在夜间雾霾场景中&#xff0c;可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件&#xff0c;导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…

Fiddle配置代理,保手机模拟器访问外部网络

前言&#xff1a; 嘿&#xff01;大家好&#xff01;我来带你们玩转Fiddler和Mumu模拟器的组合技了&#xff01;此组合技能帮助你实现在模拟器上畅游外部网络。相信我&#xff0c;它会让你的开发和测试过程更加轻松愉快&#xff01;废话不多说&#xff0c;赶紧展开我们的冒险吧…