公司动态
JumpServer堡垒机:从零构建统一运维安全审计平台
1. 为什么我们需要一个统一的“堡垒机”如果你在运维团队待过或者管理过超过三台服务器大概率会遇到这样的场景开发同事A需要登录测试服务器查看日志你给了他一个账号密码实习生B临时需要部署一个前端服务你又得开一个账号没过多久服务器上出现了不明操作你想查是谁干的却发现登录日志里只有IP地址根本对不上人。更头疼的是当有同事离职你得挨个服务器去清理他的账号和密钥生怕有遗漏成为安全隐患。这种分散、粗放的服务器访问管理方式在团队规模小的时候还能勉强应付一旦服务器数量、团队成员、业务复杂度上来就会变成一场运维灾难。JumpServer就是为了解决这些问题而生的。简单来说它是一个开源的“堡垒机”Bastion Host或者更时髦的叫法——“运维安全审计系统”。它的核心价值就是为企业的IT资产服务器、网络设备、数据库等建立一个统一、安全、可审计的访问入口和操作管控平台。所有人员对服务器的访问都必须通过JumpServer这个“关卡”它负责身份认证、权限控制、操作记录和会话审计。这样一来上面提到的账号混乱、权限不清、操作无痕、离职风险等问题都能得到系统性的解决。我第一次接触JumpServer是在一个中型互联网公司当时我们运维部三个人要管理上百台云主机每次新人入职、权限变更都是一场手工劳动而且出现过一次误删生产数据库的“惊魂事件”由于缺乏录像复盘极其困难。自研一套审计系统成本太高而商业堡垒机动辄几十上百万。在对比了多个开源方案后我们最终选择了JumpServer它几乎凭一己之力将我们的运维安全水平从“裸奔”提升到了“合规”级别。接下来我就结合这几年的使用和部署经验带你深入了解一下这个强大的工具。2. JumpServer的核心架构与组件拆解理解JumpServer不能把它看成一个黑盒子。它采用微服务架构由多个核心组件协同工作每个组件都有明确的职责。搞清楚这些无论是部署、排错还是二次开发都会清晰很多。2.1 核心组件全景图JumpServer 的组件可以大致分为三层接入层、核心服务层和持久化层。接入层主要是Nginx或其他的负载均衡器/Web服务器。它负责接收所有用户的HTTP/HTTPS请求并将请求反向代理到后端的Core核心Web服务。同时它也处理WebSocket连接用于实现Web终端Web SSH和文件传输的实时通信。在部署时通常会把Nginx放在最前面配置SSL证书实现HTTPS访问。核心服务层是JumpServer的大脑包含以下几个关键服务Core核心Web服务这是用户直接交互的Web界面。基于Django开发提供了资产管理、用户管理、权限管理、会话审计、系统设置等所有管理功能。我们通过浏览器访问的就是这个服务。Koko字符协议连接代理这是JumpServer的“瑞士军刀”。它负责处理所有字符型协议的连接比如SSH、Telnet、MySQL、PostgreSQL等。当你在Web界面上点击“连接”一台Linux服务器时实际上是Koko服务在后台与目标服务器建立了SSH连接并将终端数据通过WebSocket转发到你的浏览器。Koko本身是一个Go语言编写的高性能代理。Guacamole图形协议连接代理与Koko对应Guacamole专门处理图形化协议如RDPWindows远程桌面、VNC。它是一个独立的开源项目JumpServer集成了它使得通过浏览器远程访问Windows服务器成为可能。其原理是将RDP/VNC协议转换成HTML5在浏览器中渲染。Lion数据库代理这是较新版本中为数据库审计而独立出来的组件。它专门用于代理如MySQL、Redis等数据库协议提供更精细的数据库操作审计和控制。Celery异步任务队列负责处理异步任务例如批量测试资产的可连接性、执行批量命令、生成报表等。这些耗时操作不会阻塞Web请求提升了用户体验。Redis作为缓存和消息队列Message Broker使用。用于缓存会话信息、存储临时数据以及作为Celery的后端消息队列协调各个组件间的通信。持久化层主要是MySQL/MariaDB数据库。它存储了JumpServer所有的配置数据、资产信息、用户信息、权限策略、操作日志和会话录像。这是整个系统的“记忆”所在必须保证其高可用和数据安全。2.2 数据流与访问流程一次SSH连接是如何发生的理解了组件我们来看一个最典型的Web SSH连接流程这能帮你串联起所有组件用户发起请求你在浏览器登录JumpServer Web界面找到一台Linux服务器点击“连接”。Web服务处理Core服务接收到连接请求它会进行一系列校验当前用户是否有权限连接该资产该资产是否在线等等。创建会话与令牌校验通过后Core服务会在数据库中创建一条会话记录并生成一个一次性的、有时效性的连接令牌Token。建立WebSocket你的浏览器根据Core返回的信息与Koko服务建立WebSocket长连接。代理连接资产Koko服务拿到令牌后向Core服务验证其有效性。验证通过后Koko会使用事先配置好的“系统用户”账号和密钥或密码与目标Linux服务器建立真正的SSH连接。数据转发从此你在Web终端里输入的每一个字符都会通过浏览器WebSocket - Koko - 目标服务器SSH的路径发送出去服务器返回的每一个字符则通过反向路径目标服务器SSH - Koko - 浏览器WebSocket传回并在你的浏览器中渲染出来。全程审计与此同时Core服务会通知审计组件将本次会话的所有操作包括你输入的指令、服务器的回显进行录像对于字符会话或记录关键操作对于数据库会话。录像文件通常存储在指定的目录或对象存储中。这个流程清晰地展示了JumpServer的“代理”和“审计”两大核心功能所有流量都经过它并且被完整记录。3. 从零到一生产环境部署实战与关键配置网上有很多一键安装脚本对于快速体验是好事但对于生产环境我强烈建议你理解每一步在做什么。这里我以最经典的“离线部署”方式为例因为生产环境往往无法直接访问外网。3.1 环境准备与规划在开始安装前需要做好以下规划服务器规格对于500台资产、50人以下并发的场景建议至少4核8G内存100GB磁盘空间。录像会占用大量磁盘需要单独规划存储或使用对象存储。网络规划JumpServer服务器需要能访问所有需要被管理的资产服务器、网络设备、数据库。资产防火墙需要放行JumpServer服务器IP的访问如SSH的22端口RDP的3389端口。用户通过浏览器访问JumpServer的端口默认80/443需要开放。依赖软件确保目标服务器已安装docker和docker-compose。生产环境建议使用固定版本避免兼容性问题。目录规划创建清晰的持久化目录方便备份和迁移。mkdir -p /opt/jumpserver/{core, koko, guacamole, lion, mysql, redis, config} mkdir -p /opt/jumpserver/data/{media, logs, audit, certs}core, koko...: 用于挂载各组件配置文件。data/media: 存放用户上传的文件如密钥文件。data/logs: 组件日志。data/audit:会话录像文件最重要务必确保此目录容量充足或挂载至大容量存储。data/certs: 放置SSL证书。3.2 配置文件详解与关键参数调优JumpServer通过环境变量文件.env和各个组件的config.yml文件进行配置。安装包解压后核心是修改config-example.txt并重命名为.env。以下是一些必须修改和建议调优的关键参数# .env 文件关键配置示例 # 基础配置 VOLUME_DIR/opt/jumpserver/data # 持久化数据目录按上面规划修改 DOCKER_DIR/opt/jumpserver # 配置目录按上面规划修改 # 数据库配置生产环境务必修改强密码 DB_PASSWORDStrongDBPassword123! DB_ENGINEmysql DB_HOSTmysql DB_PORT3306 # Redis配置生产环境可考虑外接Redis集群 REDIS_PASSWORDStrongRedisPassword123! # 核心密钥首次启动自动生成但备份后恢复需固定 SECRET_KEYyour-generated-secret-key-keep-safe # 用于加密务必备份 BOOTSTRAP_TOKENyour-bootstrap-token-keep-safe # 组件间通信令牌务必备份 # 对外访问地址最重要必须改成你的实际域名或IP DOMAINSyour.jumpserver.domain.com # 多个用逗号隔开第一个为主域名 HTTP_PORT80 HTTPS_PORT443 # 邮件服务器用于发送重置密码等通知 EMAIL_HOSTsmtp.office365.com EMAIL_PORT587 EMAIL_HOST_USERnotifyyourcompany.com EMAIL_HOST_PASSWORDyour-email-password EMAIL_FROMnotifyyourcompany.com EMAIL_USE_SSLFalse EMAIL_USE_TLSTrue注意SECRET_KEY和BOOTSTRAP_TOKEN在第一次启动后会自动生成并写入.env。务必备份好这个文件如果丢失所有加密存储的密码如资产密码将无法解密且组件间通信会失败。除了.env各组件还有更细粒度的config.yml。例如Koko的配置中可以调整SSH超时时间、会话保持时间等。对于生产环境我强烈建议调整以下两点会话录像存储默认录像存在本地audit目录。对于海量操作可以考虑修改配置将会话录像存储到阿里云OSS、腾讯云COS或自建的MinIO对象存储中避免撑爆本地磁盘。JumpServer支持配置S3兼容的对象存储。日志级别与轮转生产环境将日志级别调整为INFO或WARNING减少不必要的DEBUG日志。并配置好Docker的日志驱动和轮转策略防止日志文件无限增大。3.3 启动、初始化与故障排查配置完成后使用docker-compose up -d启动所有服务。第一次启动会初始化数据库耗时稍长。可以通过docker-compose logs -f core等命令观察各组件日志。常见启动问题排查端口冲突检查80、443、2222Koko SSH网关端口等是否被占用。数据库连接失败检查.env中的DB_PASSWORD是否正确MySQL容器是否健康启动 (docker-compose ps)。可以尝试进入MySQL容器手动连接验证。Web界面无法访问检查Nginx容器日志确认域名配置是否正确防火墙是否放行。资产连接测试失败这是部署后最常见的问题。在JumpServer上“测试资产可连接性”失败。请按以下顺序排查网络连通性在JumpServer服务器上用telnet 资产IP 22测试端口通不通。系统用户凭据确保在JumpServer上创建“系统用户”时填写的用户名、密码或私钥完全正确。对于密钥登录建议先在JumpServer服务器上手动用该密钥SSH登录一次目标资产确保可行。目标服务器限制检查目标服务器的/etc/ssh/sshd_config确保PasswordAuthentication或PubkeyAuthentication是yes。检查AllowUsers或AllowGroups是否限制了登录用户。JumpServer代理问题检查Koko服务日志看是否有更详细的错误信息 (docker-compose logs -f koko)。启动成功后用管理员账号默认admin/admin登录系统会强制要求修改密码。至此一个基础的JumpServer生产环境就搭建完成了。4. 核心功能实战如何构建企业级运维安全体系平台搭好了怎么用起来JumpServer的功能模块很多但核心是围绕“资产-用户-权限”这三个核心对象来构建安全体系的。4.1 资产管理不只是录入IP资产管理是第一步。很多人只是简单添加IP和主机名但这远远不够。资产树利用“节点”功能可以按照业务线、机房、环境生产/测试来组织资产树。例如北京机房/电商业务/生产环境/Web服务器组。这样授权和查看都非常清晰。系统用户这是JumpServer连接资产的凭据。一个资产上可以绑定多个“系统用户”。例如为所有Linux服务器创建一个“系统用户”叫jump_admin使用密钥登录权限是sudo。再创建一个jump_audit用户仅用于普通权限的审计。最佳实践是为JumpServer创建专属的运维账号而不是直接使用root或个人账号。协议与端口除了默认的SSH 22端口如果资产使用了非标端口一定要在这里修改。对于网络设备交换机、路由器协议可能是Telnet。一个关键的实操技巧批量导入。当你有成百上千台服务器时手动添加是噩梦。JumpServer支持Excel/CSV模板批量导入。你需要准备包含主机名、IP、协议、系统用户名等信息的CSV文件。在导入前务必确保这些“系统用户”已经在JumpServer中创建好并且能成功连接目标资产。4.2 用户与权限管理实现最小权限原则JumpServer的用户分为系统用户连接资产的机器账号和普通用户登录JumpServer的操作人员。这里我们讨论后者。用户来源除了本地创建JumpServer支持对接LDAP/AD微软活动目录或OpenLDAP。这是企业级部署的标配。配置好后公司员工可以直接用域账号登录JumpServer无需单独管理一套密码离职时在AD中禁用账号即可同步失效。用户组将职能相同的用户归类如“运维组”、“DBA组”、“开发组”方便批量授权。权限管理核心JumpServer的权限通过“授权规则”和“资产授权”来体现。这是实现“最小权限原则”的关键。资产授权直接将某个“节点”一批资产授权给某个“用户”或“用户组”。可以指定该授权下使用的“系统用户”。例如将“测试环境节点”授权给“开发组”并指定使用jump_audit这个只读系统用户。授权规则更灵活可以创建复杂的规则例如“允许用户在每周一至周五的9点到18点连接标签为‘项目A’的资产并且不允许传输文件”。规则可以关联用户、用户组、资产、系统用户并施加时间、动作限制。经验之谈初期建议从“资产授权”开始简单直接。当权限需求变复杂后再使用“授权规则”。一定要避免图省事给一个用户授予所有资产的root权限。4.3 会话管理与审计安全事件的“黑匣子”这是堡垒机价值的直接体现。所有通过JumpServer建立的连接都会被记录。在线会话监控管理员可以实时查看当前有哪些人在连接哪些资产甚至可以实时监控某个会话的操作并在必要时中断危险会话。历史会话审计这是事后追溯的利器。可以按时间、用户、资产等条件搜索历史会话。对于字符协议SSH/Telnet可以像看录像一样回放整个操作过程包括每一条命令、每一个输出、甚至每一次敲击键盘的间隔。对于图形协议RDP/VNC也会记录登录、登出时间并可以截图。命令过滤与危险指令阻断JumpServer可以配置命令过滤器。例如定义一个规则禁止执行rm -rf /、dd、halt等危险命令。当用户尝试执行时命令会被阻断并生成告警。这个功能需要谨慎配置避免影响正常运维。审计中的痛点与解决会话录像文件非常大。我们曾遇到一个DBA执行一个长时间查询产生了几个GB的录像。解决方案除了使用对象存储还可以在JumpServer的“系统设置”中配置录像保留策略例如自动删除90天前的录像。5. 高阶应用与踩坑实录当JumpServer平稳运行后可以探索一些高阶功能来进一步提升效率和安全性。5.1 多云与混合云资产纳管现在的公司往往资产不在一个地方。JumpServer可以很好地统一纳管。公有云资产对于AWS EC2、阿里云ECS等可以利用云平台的“标签”功能。在JumpServer中配置“云同步”功能企业版功能更强大开源版可通过API脚本实现定期根据标签自动同步资产信息到指定资产节点下。这样在云上新建一台打了env:prod标签的服务器它能自动出现在JumpServer的“生产资产”节点中。私有云/物理机通过JumpServer提供的API可以与你内部的CMDB配置管理数据库对接实现资产信息的自动同步保证资产信息的一致性。5.2 通过API实现自动化JumpServer提供了完善的RESTful API几乎所有在Web界面上能做的操作都可以通过API完成。这为自动化运维打开了大门。场景一自动化创建资产授权。当有一个新项目上线自动调用JumpServer API创建资产节点并将项目相关的服务器添加进去然后授权给对应的项目组。场景二定期权限审计报告。编写脚本定期调用API获取所有授权规则和用户列表生成一份权限审计报告检查是否存在过度授权或僵尸账号。场景三与工单系统集成。员工在工单系统申请临时服务器权限工单审批通过后自动调用JumpServer API创建一个24小时过期的临时授权规则。使用API需要先在Web界面创建“应用程序”获取App ID和App Secret作为认证凭据。5.3 我们踩过的那些“坑”“系统用户”密码过期问题我们为JumpServer创建了一个专用账号jump并设置了90天密码过期策略。结果在第91天所有资产连接突然全部失败。原因是JumpServer里存储的jump用户密码已过期但它不会自动感知。教训用于JumpServer连接资产的系统账号要么禁用密码过期策略要么建立流程定期在JumpServer上更新密码。私钥格式问题从某云平台下载的PEM格式私钥直接导入JumpServer失败。原因是格式或权限问题。解决方法使用ssh-keygen -p -m PEM -f your_key命令转换或检查密钥格式。确保私钥文件权限为600。会话录像丢失早期使用默认配置录像存在本地。一次磁盘写满导致新的会话无法录像。解决方案如前所述配置录像存储到对象存储并设置监控告警关注存储空间使用率。性能瓶颈当并发会话数很高如超过100时Web终端可能会感到卡顿。排查首先检查JumpServer服务器的CPU、内存和网络IO。其次检查Redis和MySQL的性能。对于超大规模部署需要考虑将Koko、Guacamole等组件水平扩展并部署高可用的MySQL和Redis集群。JumpServer不是一个“安装即忘”的工具它像一座桥梁连接着人和机器。搭建好它只是第一步更重要的是根据你组织的实际运维流程和安全规范去设计和落地它的使用规则。从混乱的SSH密钥分发到所有操作可追溯、权限可管控这个转变带来的安全提升和运维效率的提升是实实在在的。它可能不会让你立刻感受到“生产力”的飞跃但它默默构建的那道安全防线会在某个关键时刻让你庆幸当初做了这个决定。