LDAP Jumpserver

"LDAP Jumpserver"

Posted by Stephen on January 20, 2021

前言

了解堡垒机,以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)

堡垒机的价值

  1. 集中管理
  2. 集中权限分配
  3. 统一认证
  4. 集中审计
  5. 数据安全
  6. 运维高效
  7. 运维合规
  8. 风险管控

堡垒机原理

目前常见堡垒机的主要功能架构

目前常见的堡垒机主要功能分为以下几个模块

  1. 运维平台
    1. RDP/VNC运维
    2. SSH/Telnet运维
    3. SFTP/FTP运维
    4. 数据库运维
    5. Web系统运维
    6. 远程应用运维
  2. 管理平台
    1. 三权分立
    2. 身份鉴别
    3. 主机管理
    4. 密码托管
    5. 运维监控
    6. 电子工单
  3. 自动化平台
    1. 自动改密
    2. 自动运维
    3. 自动收集
    4. 自动授权
    5. 自动备份
    6. 自动告警
  4. 控制平台
    1. IP防火墙
    2. 命令防火墙
    3. 访问控制
    4. 传输控制
    5. 会话阻断
    6. 运维审批
  5. 审计平台
    1. 命令记录
    2. 文字记录
    3. SQL记录
    4. 文件保存
    5. 全文检索
    6. 审计报表

说明:三权分立

三权理解:配置,授权,审计

三员理解:系统管理员,安全保密管理员,安全审计员

三员之三权:废除超级管理员;三员是三角色并非三人;安全保密管理员与审计员必须非同一个人。

堡垒机的身份认证

堡垒机主要就是为了统一运维入口,所以登录堡垒机必须支持灵活的身份认证方式,比如:

  • 本机认证

    本地账号密码认证,一般支持强密码策略

  • 远程认证

    一般支持第三方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端监控和审计,提高上传文件的功能。其主要功能有以下几个。

  1. 用户管理:主要负责用户的管理
    1. 当管理员在Web上填写表单信息后,服务端需要完成如下操作
      1. 在服务端上添加用户,供用户ssh登录使用
      2. 在数据库添加用户,登录web验证和其他授权使用
      3. 在LDAP服务端(slapd)中添加用户,供LDAP客户端来认证,其中数据库中添加用户密码和在LDAP服务端中添加的用户密码是一致的。
  2. 资产管理:添加资产,删除资产,生成主机组用于授权。
  3. 授权管理:将主机/组授权给用户/组,同样授权sudo权限,处理用户权限申请。
  4. 监控审计:监控用户输入、输出操作,统计用户执行命令历史。
  5. 文件上传:在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

登录端

登录端的入口是Jumpserver的sshd,用户登录服务器后自动运行Connect.py

进阶

  1. Jumpserver官网
  2. Demo
  3. 项目地址
  4. Jumpserver官方文档

  5. 一篇大神搭建Jumpserver的配置说明:Jumpserver简介,部署及使用

Jumpserve与Openldap集成案列

安装

先使用docker-compose 安装 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