资讯专栏INFORMATION COLUMN

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

hyuan / 2353人阅读

摘要:关于堡垒机三层架构可以参见前一篇堡垒跳板机实现整体架构登录入口先说第一层,这层的主要功能为检测用户是否有使用堡垒机的权限。

总述

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

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

登录入口

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

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

服务器定制

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

auth     required       pam_permit.so
account  required       pam_permit.so
password required       pam_permit.so
session  required       pam_permit.so

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

UsePAM yes

然后重启sshd:

/etc/ini.d/sshd restart

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

代码结构

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

├── gateway-shell
├── login-shell
├── mshell
└── 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界面,供用户选择操作。

调用顺序为:

login_shell(入口) -> sdshell(判断PIN+TOKEN) -> mshell -> gateway-shell(判断/获取 用户选项) 
代码解读 login_shell:

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

  1 #!/bin/bash
  2 
  3 WORKDIR=`dirname $0`
  4 source $WORKDIR/sentry.env
  5 BINDIR="$WORKDIR"
  6 #LOGDIR="/data0/logdir"
  7 
  8 #1, 验证token
  9 $BINDIR/sdshell
 10 sdstats=$?
 11 #sdstats=0
 12 
 13 # 当sdshell返回为0时,表示当前用户登录成功
 14 # 当sdshell返回为1时,表示当前用户验证失败
 15 # 当sdshell返回为2时,表示root登录成功
 16 if [[ $sdstats -eq 1 ]];then
 17     exit 1
 18 elif [[ $sdstats -eq 2 ]];then
 19     /bin/bash
 20     exit 0
 21 fi
 22 
 23 #2, gen_log_dir
 24 user=`/usr/bin/whoami`
 25 if [ ! -d $LOGDIR/$user ];then
 26     mkdir -p $LOGDIR/$user
 27     chown -R $user $LOGDIR/$user
 28     chmod a+w $LOGDIR/$user
 29 fi
 30 
 31 #3, param
 32 lip=`/usr/bin/env|grep SSH_CONNECTION|cut -f 2 -d =|cut -f 1 -d " "`
 33 now=`date "+%F-%k:%M:%S"|tr -d " "`
 34 user=`/usr/bin/whoami`
 35 sip=`/usr/bin/env|grep SSH_CONNECTION|cut -f 2 -d =|cut -f 3 -d " "`
 36 
 37 #4, begin script
 38 export TMOUT=10
 39 export SHELL=$BINDIR/mshell
 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 #!/bin/bash
  2 
  3 WORKDIR=`dirname $0`
  4 source $WORKDIR/sentry.env
  5 user=`/usr/bin/whoami`
  6 GWDIR=$WORKDIR
  7 privatekey=$RSAFILE
  8 mkdir /home/$user/.ssh 2>/dev/null
  9 cat $privatekey > /home/$user/.ssh/id_rsa
 10 chmod 600 /home/$user/.ssh/id_rsa
 11 
 12 while true
 13 do
 14     clear
 15     $GWDIR/gateway-shell
 16     gsstats=$?
 17 
 18     # 返回值说明:
 19     # 0 表示正常,要登录了;
 20     # 1 表示立即quit
 21     # 2 表示因为超时而quit
 22     # 3 表示登录本地服务器
 23     # 其他未异常
 24     case $gsstats in
 25         0)
 26             ssh -2 -i ~/.ssh/id_rsa -l $user `cat $ACTIONDIR/$user.action`
 27             ;;
 28         1)
 29             exit
 30             ;;
 31         2)
 32             echo "action timeout"
 33             exit
 34             ;;
 35         3)
 36         /bin/bash
 37             ;;
 38         *)
 39             echo "error"
 40             sleep 2
 41             ;;
 42     esac
 43 done

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

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

同样酷炫有木有!

一层架构总结

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

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

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结构:

[root@testldap openldap]# ldapsearch -x -LLL -D "cn=admin,dc=lianjia,dc=com" uid=test -W
Enter LDAP Password:
dn: uid=test,ou=people,dc=lianjia,dc=com
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: inetOrgPerson
objectClass: ldapPublicKey
cn: System
sn: li
givenName: test
displayName: test
uid: test
userPassword:: testpasswd
uidNumber: 1001
gidNumber: 1001
gecos: System Manager
homeDirectory: /home/test
shadowLastChange: 16020
shadowMin: 0
shadowMax: 999999
shadowWarning: 7
shadowExpire: -1
employeeNumber: 20248353
mobile: 18519199234
mail: 654306390@qq.com
postalAddress: beijing
initials: test
loginShell: /bin/bash
sshPublicKey: ssh-rsa Axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx32x9jF5cFDqktiTQIdD9
 PMq8b86v2p8Es4us7OTzo7XomcjEPpfP/Realy9BOuteohA4JzezrAyFQhJui6BdovkzhnVRyFERJ
 uTA/19biQkCZB91XrWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJXH+f0
 VOvx5FiF0bV3IfJt32cdmI8O7hNI+ttPCQ4V1R8vr0wIhCmUcKzD5vOx+0H9B1EY4d/imSxFHIebe
 4l//rthyAr3x0XmNvuFD9khqfDK7bmXnHu26s++O8A1SDJ5beuu4xXl/mN8mc5WPmoQQSjIzruWPa
 jLx8m6HF root@channel.lianjia.com

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9482.html

相关文章

  • 堡垒跳板实现——整体架构

    摘要:背景介绍最近,笔者接手公司的一项任务建造服务器的堡垒跳板机。关于跳板机的实现,其实简单版本网上一大堆,甚至更有开源堡垒机可供选择,方案很多。目标规模使用两台服务器做主从集群,所有实体服务器对接此集群,从而统一进行验证。 背景介绍 最近,笔者接手公司的一项任务:建造服务器的堡垒跳板机。 关于跳板机的实现,其实简单版本网上一大堆,甚至更有开源堡垒机Jumpserver可供选择,方案很多。接...

    JinB 评论0 收藏0
  • 堡垒跳板实现——ldap配置

    摘要:进程由软件包提供,根据配置信息,与后端的认证服务器进行交互。 这是关于堡垒跳板机的第三篇文章,之前介绍了实现堡垒跳板机的整体三层架构 和 设计实现:堡垒跳板机整体架构堡垒跳板机架构实现 本篇介绍整个体系中的一个补充,对第三层ldap架构的实现的具体操作进行下记录。 整体目标 后端服务器数量日益增加,账号的数量也在不断增加,账号的统一管理变得尤为重要。结合堡垒机,主要针对服务器账号体系接...

    Charles 评论0 收藏0
  • ssh登录自动填充密码

    摘要:问题要通过一个跳板机登录其他主机,每次使用再输入密码的方式太耗时,想要进行密码自动填充解决使用在脚本中封装的登录自动填充密码功能使用的自动填充密码功能交互功能将写入配置文本或者直接在脚本作为字典读取用户输入,匹配出,调用进行登录,相关操作 问题 要通过一个跳板机ssh登录其他主机,每次使用ssh hostIp -l username再输入密码的方式太耗时,想要进行密码自动填充 解决 使...

    姘搁『 评论0 收藏0
  • JumpServer开源堡垒帝都首次线下圆桌会议

    摘要:四会议流程会议流程入场老广发展史中场休息董帅下一代互联网堡垒机中场休息王鹏容器化部署环节五报名方式扫描二维码加入六活动联系电话老广电话追马电话王庸电话张尧七致谢感谢荣新科技提供场地感谢各位同仁的帮组 JumpServer开源堡垒机帝都首次线下圆桌会议 一、举办方: • JumpServer开发团队 • Vfast 荣新科技 二、时间地点 • 地点:北京市海淀区大钟寺...

    CocoaChina 评论0 收藏0
  • 安全防护建议

    摘要:系统架构优化建议减少数据外泄的通道,通过报告掌握整体的安全态势存放关键内容的,不开通公网在前面增加,多一层保护数据库服务器不开通外网远程管理采用堡垒机中转开通云安全中心云监控,并定期查看报告系统架构的优化建议架构举例系统架构的优化建议 系统架构优化建议 减少数据外泄的通道,通过报告掌握整体的...

    HackerShell 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<