堡垒跳板机实现——架构实现
总述
这是关于堡垒机实现的第二篇文章,主要阐述三层架构分别如何实现,包括第一层&第二层的设计与实现,即用户登录堡垒机的入口 & 授权验证, 第三层,如何通过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管理在实现上述的需求。
具体的过程这里不再累赘,可以参见网上的博文,还是挺多的,比如:
这里只贴上完成后类似的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进行类似的管理,还是真心强大的。
作者:刘阳龙Herman
来源:51CTO

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
学界 | 超少量数据训练神经网络:IEEE论文提出径向变换实现图像增强
近日,一篇题为《Training Neural Networks with Very Little Data-A Draft》IEEE 论文提出了一种使用少量数据训练神经网络的新方法,即通过极坐标空间中的径向变换(radial transform) 实现图像增强。它并未改变数据的信息内容,而是改进了数据的多样性,并最终提升了神经网络的泛化表现。 论文地址:https://arxiv.org/pdf/1708.04347.pdf 摘要:深度神经网络是由许多节点层组成的复杂架构,结果导致大量需要在训练中评估的参数,包括权重、偏差等。相比于简单的架构,更大、更复杂的神经网络需要更多的训练数据满足适当的收敛。然而,可用于训练网络的数据要么有限、要么不均衡。我们提出在极坐标空间中的径向变换(radial transform) 进行图像增强,从而帮助数据较少的神经网络进行训练。每像素的坐标变换提供了原始图像与增强后的数据在极坐标系统中的表征,且又能增加表征较弱的图像类别的多样性。使用我们提出的方法,在 MNIST 上,以及使用 AlxNet、GoogLeNet 神经网络模型的一系列多模型医疗图像上...
- 下一篇
堡垒跳板机实现——整体架构
背景介绍 最近,笔者接手公司的一项任务:建造服务器的堡垒跳板机。 关于跳板机的实现,其实简单版本网上一大堆,甚至更有开源堡垒机Jumpserver可供选择,方案很多。接下来会就我的实现方案,整理出几篇文章来做概要描述。 覆盖功能 正所谓兵马未动,粮草先行,在设计之前,先整理出我们一期中堡垒机要覆盖的基本功能点: 服务器统一账号权限管理,包括哪些用户可以对哪些服务器进行login,哪些用户有sudo权限; 用户行为记录,可在必要时回看审查; 用户登录校验审查; 现在初期的目标是将所有的linux服务器通过堡垒机进行管理把控,将来扩展下,同样可以通过ssh协议对 交换机、路由器、甚至是Windows进行管理(目前windows已经可以实现通过ssh登录,不过这种方式就没有图形界面了且只能通过powershell来进行管理)。 架构设计 基于以上几点功能点,设计架构如下: 下面对这个架构图做下说明: 整体分为三层,总体来说, 第一层 校验用户是否有登录堡垒机的权限; 第二层真正为用户分配权限,同时判断经过第一层的用户是否有对目标机器操作的权限; 第三层则是真正登录/操作服务器的方式,在这里我...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题