堡垒跳板机实现——架构实现

总述

这是关于堡垒机实现的第二篇文章,主要阐述三层架构分别如何实现,包括第一层&第二层的设计与实现,即用户登录堡垒机的入口 & 授权验证, 第三层,如何通过ldap来统一管理服务器账号权限。

关于堡垒机三层架构可以参见前一篇blog:堡垒跳板机实现——整体架构

登录入口

先说第一层,这层的主要功能为检测用户是否有使用堡垒机的权限。这个很好理解,总不能来个匿名用户就可以让他随意使用堡垒机,虽说在二层授权验证这里可以有效的抵挡,但是,既然可以在第一层有效的对无效用户做快捷的拦截,为什么要放后呢?

验证的方式可以有很多种,比如,如果用linux用作第一层架构中的服务器,那么可以天然的使用linux的user auth作为检验机制,单纯为有使用权限的用户在服务器上adduser,单独创建一个唯一的32位的密码。

服务器定制

我们在这层的做法是 将用户验证与我们内部的动态Token服务相结合(类似google
authenticator),同时还要提供友好的登录shell界面,这样的话单纯的使用user
auth就不太能够达到我们的目的,这里,我们对一层服务器做了ssh登录all permit定制,修改/etc/pam.d/sshd:


  1. auth     required       pam_permit.so 
  2. account  required       pam_permit.so 
  3. password required       pam_permit.so 
  4. session  required       pam_permit.so  

开启sshd的pam认证,修改sshd_config:


  1. UsePAM yes 

然后重启sshd:


  1. /etc/ini.d/sshd restart 

同时将用户对应的默认login shell改为我们自定义的。

代码结构

放上我们的代码结构,主要结构如下:


  1. ├── gateway-shell 
  2. ├── login-shell 
  3. ├── mshell 
  4. └── sdshell  

功能描述

接下来对上述文件做下功能描述:

  • login-shell: 用户的login shell,调用sdshell验证用户的login passwd,初始化用户的监控日志路径,并开启监控。
  • sdshell:读取用户的login passwd并判断验证结果,以exit code来对表示验证结果,0表示验证成功,1表示验证失败,2表示root用户登录并且验证成功。
  • mshell:验证用户passwd成功能,循环调用gateway-shell来读取用户的action操作选择,并执行。
  • gateway-shell:提供给用户操作cli界面,供用户选择操作。

调用顺序为:


  1. login_shell(入口) -> sdshell(判断PIN+TOKEN) -> mshell -> gateway-shell(判断/获取 用户选项) 

代码解读

login_shell:

当用户登录时首先进入到这里进行验证


  1. 1 #!/bin/bash 
  2.  2  
  3.  3 WORKDIR=`dirname $0` 
  4.  4 source $WORKDIR/sentry.env 
  5.  5 BINDIR="$WORKDIR" 
  6.  6 #LOGDIR="/data0/logdir" 
  7.  7  
  8.  8 #1, 验证token 
  9.  9 $BINDIR/sdshell 
  10. 10 sdstats=$? 
  11. 11 #sdstats=0 
  12. 12  
  13. 13 # 当sdshell返回为0时,表示当前用户登录成功 
  14. 14 # 当sdshell返回为1时,表示当前用户验证失败 
  15. 15 # 当sdshell返回为2时,表示root登录成功 
  16. 16 if [[ $sdstats -eq 1 ]];then 
  17. 17     exit 1 
  18. 18 elif [[ $sdstats -eq 2 ]];then 
  19. 19     /bin/bash 
  20. 20     exit 0 
  21. 21 fi 
  22. 22  
  23. 23 #2, gen_log_dir 
  24. 24 user=`/usr/bin/whoami` 
  25. 25 if [ ! -d $LOGDIR/$user ];then 
  26. 26     mkdir -p $LOGDIR/$user 
  27. 27     chown -R $user $LOGDIR/$user 
  28. 28     chmod a+w $LOGDIR/$user 
  29. 29 fi 
  30. 30  
  31. 31 #3, param 
  32. 32 lip=`/usr/bin/env|grep SSH_CONNECTION|cut -f 2 -d =|cut -f 1 -d ' '` 
  33. 33 now=`date '+%F-%k:%M:%S'|tr -d " "` 
  34. 34 user=`/usr/bin/whoami` 
  35. 35 sip=`/usr/bin/env|grep SSH_CONNECTION|cut -f 2 -d =|cut -f 3 -d ' '` 
  36. 36  
  37. 37 #4, begin script 
  38. 38 export TMOUT=10 
  39. 39 export SHELL=$BINDIR/mshell 
  40. 40 /usr/bin/script -q -t 2>$LOGDIR/$user/$user-$lip-$sip-$now.time -f $LOGDIR/$user/$user-$lip-$sip-$now.txt  

其中,3-5行做基本的环境变量初始化,第9行调用 sdshell 验证用户输入的动态码的验证结果,即,用户在这时进入到 sdshell 做验证,此时,就可以随意对 sdshell 做功能定制了,我们实现的功能定制界面类如:

是不是比较酷炫~~

当一切都验证完毕,我们进入到login_shell第24-35行,初始化用户行为日志记录的初始化。

我们这里使用linux自带的script命令做用户的记录操作,简单有效到没有朋友啊有木有!!

最后39-40两行,将用户的shell指向 mshell ,同时,开始记录用户行为。

mshell

现在用户的行为已经进入到这里,说明这个用户通过了第一层校验,现在需要他进行相关action操作。


  1. 1 #!/bin/bash 
  2.   2  
  3.   3 WORKDIR=`dirname $0` 
  4.   4 source $WORKDIR/sentry.env 
  5.   5 user=`/usr/bin/whoami` 
  6.   6 GWDIR=$WORKDIR 
  7.   7 privatekey=$RSAFILE 
  8.   8 mkdir /home/$user/.ssh 2>/dev/null 
  9.   9 cat $privatekey > /home/$user/.ssh/id_rsa 
  10.  10 chmod 600 /home/$user/.ssh/id_rsa 
  11.  11  
  12.  12 while true 
  13.  13 do 
  14.  14     clear 
  15.  15     $GWDIR/gateway-shell 
  16.  16     gsstats=$? 
  17.  17  
  18.  18     # 返回值说明: 
  19.  19     # 0 表示正常,要登录了; 
  20.  20     # 1 表示立即quit 
  21.  21     # 2 表示因为超时而quit 
  22.  22     # 3 表示登录本地服务器 
  23.  23     # 其他未异常 
  24.  24     case $gsstats in 
  25.  25         0) 
  26.  26             ssh -2 -i ~/.ssh/id_rsa -l $user `cat $ACTIONDIR/$user.action` 
  27.  27             ;; 
  28.  28         1) 
  29.  29             exit 
  30.  30             ;; 
  31.  31         2) 
  32.  32             echo "action timeout" 
  33.  33             exit 
  34.  34             ;; 
  35.  35         3) 
  36.  36         /bin/bash 
  37.  37             ;; 
  38.  38         *) 
  39.  39             echo "error" 
  40.  40             sleep 2 
  41.  41             ;; 
  42.  42     esac 
  43.  43 done  

3-10行环境初始化,然后开启循环监听用户输入的action,为用户展示可使用的action list以及判断用户是否有对应操作的权限则都是第15行的 mshell 来进行操作,之后同样根据exit code来执行相关的动作。

对于 mshell ,同样可以自行设计相关的功能,我们设计的shell操作界面如下:

同样酷炫有木有!

一层架构总结

此时,一层架构中的流程实现基本完成,剩下的就是具体控制登录服务器的技术管理工作,即第三层的工作了,稍后为大家分享。

再次总结下一层架构中的调用关系:


  1. login_shell(入口) -> sdshell(判断PIN+TOKEN) -> mshell -> gateway-shell(判断/获取 用户选项) 

咦,好像缺少第二层的说明?

其实第二层主要做action行为授权&校验工作,还记得 gateway-shell 的作用吗:

“为用户展示可使用的action list以及判断用户是否有对应操作的权限 ”

在这里 gateway-shell 通过api与第二层做交互,对用户的行为及授权范围作了操作,具体交互的功能包括:

  • 搜索服务器信息;
  • 获取用户有权限的服务器list;
  • 获取用户有权限的服务器Group list;
  • 获取服务器Group下的server list;
  • 获取当前所有有权限的user list

具体怎么实现? 相信1000个工程师有1001中不同的做法,这里就不在阐述~

如何统一管理服务器的登录账号

接入我们有1000台服务器,有100个人,需要统一管理 哪些账号 可以登录 哪些服务器,哪些账号 在 哪些服务器 上可以 sudo哪些命令 。

问题抛出来了,下面就是如何解决它。

单刀直入的方案,我为每个服务器根据需要创建对应的人的账号,在分别配置sudoer的权限。缺点就不说了,改个配置能累死人。。。。。

所以,我们最好能有个地方能够统一来配置:

  • 创建一个人的账号后,那么这个人就能登录所有的服务器;
  • 管理这个人的登录服务器的范围;
  • 为这个人分配统一的sudo权限,及在哪些目标服务器上有执行哪些命令的sudo权限;

上述的需求可以通过服务器接入ldap,通过ldap管理在实现上述的需求。

具体的过程这里不再累赘,可以参见网上的博文,还是挺多的,比如:

使用 OpenLDAP 集中管理用户帐号

基于 PAM 的 LDAP 用户身份验证

这里只贴上完成后类似的ldap结构:


  1. [root@testldap openldap]# ldapsearch -x -LLL -D "cn=admin,dc=lianjia,dc=com" uid=test -W 
  2. Enter LDAP Password: 
  3. dn: uid=test,ou=people,dc=lianjia,dc=com 
  4. objectClass: posixAccount 
  5. objectClass: shadowAccount 
  6. objectClass: person 
  7. objectClass: inetOrgPerson 
  8. objectClass: ldapPublicKey 
  9. cn: System 
  10. sn: li 
  11. givenName: test 
  12. displayName: test 
  13. uid: test 
  14. userPassword:: testpasswd 
  15. uidNumber: 1001 
  16. gidNumber: 1001 
  17. gecos: System Manager 
  18. homeDirectory: /home/test 
  19. shadowLastChange: 16020 
  20. shadowMin: 0 
  21. shadowMax: 999999 
  22. shadowWarning: 7 
  23. shadowExpire: -1 
  24. employeeNumber: 20248353 
  25. mobile: 18519199234 
  26. mail: 654306390@qq.com 
  27. postalAddress: beijing 
  28. initials: test 
  29. loginShell: /bin/bash 
  30. sshPublicKey: ssh-rsa Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx32x9jF5cFDqktiTQIdD9 
  31.  PMq8b86v2p8Es4us7OTzo7XomcjEPpfP/Realy9BOuteohA4JzezrAyFQhJui6BdovkzhnVRyFERJ 
  32.  uTA/19biQkCZB91XrWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJXH+f0 
  33.  VOvx5FiF0bV3IfJt32cdmI8O7hNI+ttPCQ4V1R8vr0wIhCmUcKzD5vOx+0H9B1EY4d/imSxFHIebe 
  34.  4l//rthyAr3x0XmNvuFD9khqfDK7bmXnHu26s++O8A1SDJ5beuu4xXl/mN8mc5WPmoQQSjIzruWPa 
  35.  jLx8m6HF root@channel.lianjia.com  

这样,对于此用户,就可以通过password 或者 publickey的方式,登录服务器,同理,也可以对sudo进行类似的管理,还是真心强大的。

作者:刘阳龙Herman

来源:51CTO

时间: 2024-09-04 15:44:48

堡垒跳板机实现——架构实现的相关文章

python实现运维堡垒机(跳板机)系统

python实现运维堡垒机(跳板机)系统 相信各位对堡垒机(跳板机)不陌生,为了保证服务器安全,前面加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有身份认证,授权,访问控制,审计等功能,笔者用Python基本实现了上述功能. 架构: 后端主要技术是LDAP,配置了LDAP集中认证服务器, 所有服务器的认证都是由ldap完成的,我的做法是每个用户一个密码,把密码加密放到了数据库中,当用户输入ip从跳板机登陆服务器的时候,跳板机系统取 出密码,并解密,通过pexpect模块将密码发送过去

shell加LDAP实现跳板机

使用跳板机的目的:我们的服务器都是云主机,使用的都是aws比较多,而且aws是以私钥去连接公钥,连接的方式都是以root权限连接,这样子的话,开发人员要连接上服务器的话,不可能给root权限直接连吧,否则会对服务器造成很大的威胁. 跳板机实现的思路:使用shell去编写,账户这块使用LDAP做集中式管理+认证,权限这块使用sudo集中式控制管理. LDAP:部署可以使用yum,安装简单,不过安装的目录和结构都不同于一个位置. 也可以使用编译安装,编译安装的话,需要一定的时间,期间也会遇到很多错误

数据中心新变革 光速迈向未来机柜式架构

当今的数据中心每天处理的数据量日益剧增,为了获得更高的带宽,亟需将数据中心内部IT硬件如服务器.存储和网络单元重新组合,实现其相互间的高速互联.而此时铜线传输技术却因传输距离有限而爱莫能助. 如何打破传统传输的瓶颈?让我们一同看看"硅光子(Silicon http://www.aliyun.com/zixun/aggregation/16874.html">Photonics)"技术怎样利用光通信来实现这一突破. 近日,英特尔联合康宁(Corning)和US Conec

堡垒机 简介

堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.记录.分析.处理的一种技术手段.   其从功能上讲,它综合了核心系统运维和安全审计管控两大主干功能,从技术实现上讲,通过切断终端计算机对网络和服务器资源的直接访问,而采用协议代理的方式,接管了终端计算机对网络和服务器的访问.形象地说,终端计算机对目标的访问,均需要经过运维安全审计的翻译.打一个比方,运维安全审

jumpserver 堡垒机环境搭建(图文详解)

Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 特点: 完全开源,GPL授权 Python编写,容易再次开发 实现了跳板机基本功能,认证.授权.审计 集成了Ansible,批量命令等 支持WebTerminal Bootstrap编写,界面美观 自动收集硬件信息 录像回放 命令搜索 实时监控 批量上传下载 jumpserver 3.0 安装 相对于 jumpserver 2.0 版本,在新的版本

什么是堡垒机?看完这篇你就懂了

刚明白云主机是什么,又接到个需求采购"云堡垒机".这年头,做采购不懂点技术都不行! 云堡垒机是什么?能吃么? 那么,什么是云堡垒机? 一般说来,运维堡垒主机是种具备强大防御功能和安全审计功能的服务器.基于跳板机理念,作为内外网络的个安全审计监测点,以达到把所有网站安全问题集中到某台服务器上解决,从而省时省力.同时运维堡垒主机还具备了,对运维人员的远程登录进行集中管理的功能作用. 为什么企业需要云堡垒机? 近年来数据安全事故频发,包括斯诺登事件.希拉里邮件丑闻以及携程宕机事件等,数据安全

CrazyEye,一款国人开源的堡垒机软件

嘉宾介绍 Alex,多年运维+自动化开发经验,曾任职公安部.飞信.Nokia中国.中金公司.Advent软件.汽车之家等公司,目前任老男孩教育Python教学总监,热爱技术.电影.音乐.旅游.妹子! 主题简介 CrazyEye碉堡机诞生记及主要功能介绍,文末会有本软件的开源地址,谢谢关注! 正文 假期姑娘们都不在身边,又不想到处去看人海,所以呆在家里开发了个堡垒机,现已开源,欢迎大家试用,在使用前,容我先跟大家介绍下堡垒机的重要性! 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到

mysql基于RHCS、Gtid主从复制的高性能、LB、HA集群架构

mysql基于RHCS.Gtid主从复制的高性能.LB.HA集群架构 本文基于2个角度进行 1:mysql主从复制,读写分离部分 2:RHCS实现mysql-proxy.mysql-master.lvs高可用 架构图 可能会用到的yum源 http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.r

企业架构规划及服务器优化参数

第1ç«  企业架构规划 1.1 架构图 1.1.1 用户访问网站组成 类型 作用 实现方式 顾客-用户 访问网站的人员 @ 保安-防火墙 安全策略控制:正确的流量通过,攻击者的流量组织 硬件- 华为 思科 juniper厂商 软件-iptables 迎宾-负载均衡服务器 提供访问者请求调度作用 nginx反向代理负载均衡服务器 LVS haproxy 服务员-web服务器 根据http原理,回复给访问者相应的页面信息 nginx网站服务技术  apache tomcat 厨师-数据