前言
了解堡垒机,以Jumpserver开源堡垒机软件来熟悉堡垒机操作。
环境
系统环境
Distributor ID: Kernel
Description: Kernel 18.04.4 LTS
Release: 18.04
Codename: bionic
Linux version : 5.3.0-46-generic ( buildd@lcy01-amd64-013 )
Gcc version: 7.5.0 ( Ubuntu 7.5.0-3ubuntu1~18.04 )
软件信息
version :
LDAP
正文
基本概念
什么是堡垒机
堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审计定责。
用一句话来说,堡垒机就是用来后控制哪些人可以登录哪些资产(事先防范和事中控制),以及录像记录登录资产后做了什么事情(事溯源)
堡垒机很多时候也叫运维审计系统,它的核心是可控及审计。可控是指权限可控、行为可控。权限可控,比如某个工程师要离职或要转岗了。如果没有一个统一的权限管理入口,是一场梦魇。行为可控,比如我们需要集中禁用某个危险命令,如果没有一个统一入口,操作的难度可想而知。
堡垒机的设计理念
堡垒机主要是有4A理念,即认证(Authen)、授权(Authorize)、账号(Account)、审计(Audit)。
堡垒机的目标
堡垒机的建设目标可以概括为5W,主要是为了减低运维风险。具体如下:
1、审计:你做了什么?(what)
2、授权:你能做哪些?(Which)
3、账号:你要去哪?(Where)
4、认证: 你是谁? (Who)
5、来源:访问时间(When)
堡垒机的价值
- 集中管理
- 集中权限分配
- 统一认证
- 集中审计
- 数据安全
- 运维高效
- 运维合规
- 风险管控
堡垒机原理
目前常见堡垒机的主要功能架构
目前常见的堡垒机主要功能分为以下几个模块
- 运维平台
- RDP/VNC运维
- SSH/Telnet运维
- SFTP/FTP运维
- 数据库运维
- Web系统运维
- 远程应用运维
- 管理平台
- 三权分立
- 身份鉴别
- 主机管理
- 密码托管
- 运维监控
- 电子工单
- 自动化平台
- 自动改密
- 自动运维
- 自动收集
- 自动授权
- 自动备份
- 自动告警
- 控制平台
- IP防火墙
- 命令防火墙
- 访问控制
- 传输控制
- 会话阻断
- 运维审批
- 审计平台
- 命令记录
- 文字记录
- SQL记录
- 文件保存
- 全文检索
- 审计报表
说明:三权分立
三权理解:配置,授权,审计
三员理解:系统管理员,安全保密管理员,安全审计员
三员之三权:废除超级管理员;三员是三角色并非三人;安全保密管理员与审计员必须非同一个人。
堡垒机的身份认证
堡垒机主要就是为了统一运维入口,所以登录堡垒机必须支持灵活的身份认证方式,比如:
-
本机认证
本地账号密码认证,一般支持强密码策略
-
远程认证
一般支持第三方AD/LDAP/Radius认证
-
双因子认证
UsbKey、动态令牌、短信网关、手机APP令牌等
-
第三方认证系统
OAuth2.0、CAS等
堡垒机的部署方式
1、单机部署
堡垒机主要都是旁路部署,旁挂在交换机旁边,只要能访问所有设备即可。
部署特定:
- 旁路部署,逻辑串联。
- 不影响现有网络结构。
2、HA高可靠部署
旁路部署两台堡垒机,中间有心跳线连接,同步数据。对外提供一个虚拟IP。
部署特点:
- 两台硬件堡垒机,一主一备/提供VIP。
- 当主机出现故障时,备机自动接管服务。
3、异地同步部署
通过在多个数据中心部署多台堡垒机。堡垒机之间进行配置信息自动同步。
部署特点:
- 多地部署,异地配置自动同步
- 运维人员访问当地的堡垒机进行管理
- 不受网络/带宽影响,同时祈祷灾备目的
4、集群部署(分布式部署)
当需要管理的设备数量很多时,可以将n多台堡垒机进行集群部署。其中两台堡垒机一主一备,其他n-2台堡垒机作为集群节点,给主机上传同步数据,整个集群对外提供一个虚拟IP地址。
部署特点:
- 两台硬件堡垒机,一主一备、提供VIP
- 当主机出现故障时,备机自动接管服务。
开源产品
目前,常用的堡垒机有收费和开源两类。收费的有行云管家、纽盾堡垒机,开源的有jumpserver
Jumpserver介绍
认识Jumpserver
JumpServer 是全球首款开源的堡垒机,是符合 4A 的专业运维安全审计系统。
Jumpserver 是用Python+Django开发的跳板机及堡垒机于一体的开源项目,并通过于OpenLDAP的结合可对服务器实现Web端账号管理、密码管理、权限管理、主机管理、并实现Web端监控和审计,提高上传文件的功能。其主要功能有以下几个。
- 用户管理:主要负责用户的管理
- 当管理员在Web上填写表单信息后,服务端需要完成如下操作
- 在服务端上添加用户,供用户ssh登录使用
- 在数据库添加用户,登录web验证和其他授权使用
- 在LDAP服务端(slapd)中添加用户,供LDAP客户端来认证,其中数据库中添加用户密码和在LDAP服务端中添加的用户密码是一致的。
- 当管理员在Web上填写表单信息后,服务端需要完成如下操作
- 资产管理:添加资产,删除资产,生成主机组用于授权。
- 授权管理:将主机/组授权给用户/组,同样授权sudo权限,处理用户权限申请。
- 监控审计:监控用户输入、输出操作,统计用户执行命令历史。
- 文件上传:在web端将文件分发到各个主机。
Jumpserver原理详解
Jumpsever重要组件
Jumpserver重要组件包括以下几个
- Django:web管理核心组件,负责用户管理、资产管理、授权管理等
- Node.js:监控用户操作记录的组件,负责将用户登录日志通过websocket发给web
- Log_handler:日志处理组件,处理用户登录日志,形成统计日志。
- Connect.py:用户登录跳板机中转组件,负责将用户摆渡到后端机器,需要用户登录自启动,结束自动退出。
- sladp:Openldap服务进程,负责统一管理用户信息,有后端服务器来认证。
- MySQL:数据库组件,存储各组件需要信息。
原理详解
Jumpserver入口有Web端和登录端,Web端是管理端,登录端是服务器跳转端。
web端
web端入口时Django运行的Web服务器
登录端
登录端的入口是Jumpserver的sshd,用户登录服务器后自动运行Connect.py
进阶
- Jumpserver官网
- Demo
- 项目地址
- 一篇大神搭建Jumpserver的配置说明:Jumpserver简介,部署及使用
Jumpserve与Openldap集成案列
安装
再使用docker-compose 安装jumpserver
配置ldif文件
构建ldap server的基础结构
$ cat ldap_server_base_arch.ldif
dn: ou=users,dc=MyCompany, dc=com
ou: users
objectClass: top
objectClass: organizationalUnit
dn: ou=groups, dc=MyCompany, dc=com
ou: groups
objectClass: top
objectClass: organizationalUnit
dn: ou=People, dc=MyCompany, dc=com
dc: MyCompany
objectClass: dcObject
objectClass: organizationalUnit
基本的DN是(dc=MyCompany, dc=com),所以基础结构中的域也需要设置成(dc=MyCompany, dc=com),ou为该域中的组,这里配置了三个组。
向LDAP目录导入
使用ldapadd命令
$ ldapadd -x -H ldaps://ldap_master -D "cn=admin,dc=MyCompany,dc=com" -w ldap123 -f /container/service/slapd/assets/test/ldap_server_base_arch.ldif
adding new entry "ou=users,dc=MyCompany, dc=com"
adding new entry "ou=groups, dc=MyCompany, dc=com"
adding new entry "ou=People, dc=MyCompany, dc=com"
验证基础结构是否成功导入
$ ldapsearch -x -H ldap://ldap_master:389 -b dc=MyCompany,dc=com -D "cn=admin,dc=MyCompany,dc=com" -w ldap123
# extended LDIF
#
# LDAPv3
# base <dc=MyCompany,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# MyCompany.com
dn: dc=MyCompany,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: MyCompany
o: LDAP Account Manager Demo Slave
# readonly, MyCompany.com
dn: cn=readonly,dc=MyCompany,dc=com
cn: readonly
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP read only user
userPassword:: e1NTSEF9alZMSmhzU2gwVllIWmQ0KzJlSGxwRTVpczhPWHBmY3g=
######## ------------------------------------------------
# users, MyCompany.com
dn: ou=users,dc=MyCompany,dc=com
ou: users
objectClass: organizationalUnit
objectClass: top
# groups, MyCompany.com
dn: ou=groups,dc=MyCompany,dc=com
ou: groups
objectClass: top
objectClass: organizationalUnit
# People, MyCompany.com
dn: ou=People,dc=MyCompany,dc=com
dc: MyCompany
objectClass: dcObject
objectClass: organizationalUnit
ou: People
######## ------------------------------------------------
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5
向ldap结构中添加users和groups
-
users
使用slappasswd命令获取需要的密码
$ slappasswd -s test {SSHA}hub2OWA6L8zlcLiuaEMwH3BhYjroIQ6+ $ slappasswd -s test {SSHA}aLiDYct80IBh0AghTGln1WtZ2YUi+Lhe
看来同样的test密码生成SSHA的密钥都是不一样的
使用ldif文件和上面的hashed密码创建users.ldif
$ cat users.ldif dn: uid=testuser,ou=users,dc=MyCompany,dc=com uid: testuser cn: testuser objectClass: shadowAccount objectClass: top objectClass: person objectClass: inetOrgPerson objectClass: posixAccount userPassword: {SSHA}hub2OWA6L8zlcLiuaEMwH3BhYjroIQ6+ shadowLastChange: 17016 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/testuser sn: testuser mail: testuser@MyCompany.com dn: uid=testuser1,ou=users,dc=MyCompany,dc=com uid: testuser1 cn: testuser1 objectClass: shadowAccount objectClass: top objectClass: person objectClass: inetOrgPerson objectClass: posixAccount userPassword: {SSHA}aLiDYct80IBh0AghTGln1WtZ2YUi+Lhe shadowLastChange: 17016 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1001 gidNumber: 1001 homeDirectory: /home/testuser1 sn: testuser1 mail: testuser1@MyCompany.com
-
groups
创建groups.ldif
$ cat groups.ldif dn: cn=testuser,ou=groups,dc=MyCompany,dc=com objectClass: posixGroup objectClass: top cn: testuser gidNumber: 1000 dn: cn=testuser1,ou=groups,dc=MyCompany,dc=com objectClass: posixGroup objectClass: top cn: testuser1 gidNumber: 1001
添加users和groups
$ ldapadd -x -H ldaps://ldap_master -D "cn=admin,dc=MyCompany,dc=com" -w ldap123 -f /container/service/slapd/assets/test/users.ldif
adding new entry "uid=testuser,ou=users,dc=MyCompany,dc=com"
adding new entry "uid=testuser1,ou=users,dc=MyCompany,dc=com"
$ ldapadd -x -H ldaps://ldap_master -D "cn=admin,dc=MyCompany,dc=com" -w ldap123 -f /container/service/slapd/assets/test/groups.ldif
adding new entry "cn=testuser,ou=groups,dc=MyCompany,dc=com"
adding new entry "cn=testuser1,ou=groups,dc=MyCompany,dc=com"
验证users和groups创建是否成功
$ ldapsearch -x -H ldap://ldap_master:389 -b dc=MyCompany,dc=com
-D "cn=admin,dc=MyCompany,dc=com" -w ldap123
# extended LDIF
#
# LDAPv3
# base <dc=MyCompany,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# MyCompany.com
dn: dc=MyCompany,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: MyCompany
o: LDAP Account Manager Demo Slave
# readonly, MyCompany.com
dn: cn=readonly,dc=MyCompany,dc=com
cn: readonly
objectClass: simpleSecurityObject
objectClass: organizationalRole
description: LDAP read only user
userPassword:: e1NTSEF9alZMSmhzU2gwVllIWmQ0KzJlSGxwRTVpczhPWHBmY3g=
# users, MyCompany.com
dn: ou=users,dc=MyCompany,dc=com
ou: users
objectClass: organizationalUnit
objectClass: top
# groups, MyCompany.com
dn: ou=groups,dc=MyCompany,dc=com
ou: groups
objectClass: top
objectClass: organizationalUnit
# People, MyCompany.com
dn: ou=People,dc=MyCompany,dc=com
dc: MyCompany
objectClass: dcObject
objectClass: organizationalUnit
ou: People
############# ------------------------------------------
# testuser, users, MyCompany.com
dn: uid=testuser,ou=users,dc=MyCompany,dc=com
uid: testuser
cn: testuser
objectClass: shadowAccount
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
userPassword:: e1NTSEF9NjF6UmZGcjhzWWZOZ0pSRkZLcWZLRzdTWmlRQnI3cWs=
shadowLastChange: 17016
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/testuser
sn: testuser
mail: testuser@MyCompany.com
# testuser1, users, MyCompany.com
dn: uid=testuser1,ou=users,dc=MyCompany,dc=com
uid: testuser1
cn: testuser1
objectClass: shadowAccount
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: posixAccount
userPassword:: e1NTSEF9a0p6blRZdko2bzBaY2FkSzN2STRnUFNqUkdkbzh5aDQ=
shadowLastChange: 17016
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/testuser1
sn: testuser1
mail: testuser1@MyCompany.com
# testuser, groups, MyCompany.com
dn: cn=testuser,ou=groups,dc=MyCompany,dc=com
objectClass: posixGroup
objectClass: top
cn: testuser
gidNumber: 1000
# testuser1, groups, MyCompany.com
dn: cn=testuser1,ou=groups,dc=MyCompany,dc=com
objectClass: posixGroup
objectClass: top
cn: testuser1
gidNumber: 1001
############# ------------------------------------------
# search result
search: 2
result: 0 Success
# numResponses: 10
# numEntries: 9
数据导出
# 方法一:用查询导出
$ ldapsearch -x -H ldap://ldap_master:389 -b dc=MyCompany,dc=com
-D "cn=admin,dc=MyCompany,dc=com" -w ldap123 > export.ldif
# 方法二:导出命令
$ slapcat -l export.ldif
jumpserver连接ldap
查看ou为users的组下面两个用户是否能够匹配上
系统设置-> LDAP设置
键 | 值 | 备注 |
---|---|---|
LDAP地址 | ldaps://ldap_master | LDAP服务器地址 |
绑定DN | cn=admin,dc=MyCompany,dc=com | 管理员DN |
密码 | …………. | admin的密码 |
用户OU | ou=users,dc=MyCompany,dc=com | 区域组 |
用户过滤器 | (cn=%(user)s) | 用户过滤器 |
LDAP属性映射 | {“username”:”cn”, “name”:”sn”,”email”:”mail”} | 将LDAP中的用户属性映射到jumpserver用户上,username, name,email是jumpserver的属性。 |
后记
None