总述

成都创新互联专注于企业成都全网营销、网站重做改版、泸州网站定制设计、自适应品牌网站建设、H5页面制作、成都商城网站开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为泸州等各大城市提供网站开发制作服务。
这是关于堡垒机实现的第二篇文章,主要阐述三层架构分别如何实现,包括***层&第二层的设计与实现,即用户登录堡垒机的入口 & 授权验证, 第三层,如何通过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(入口) -> 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与第二层做交互,对用户的行为及授权范围作了操作,具体交互的功能包括:
具体怎么实现? 相信1000个工程师有1001中不同的做法,这里就不在阐述~
如何统一管理服务器的登录账号
接入我们有1000台服务器,有100个人,需要统一管理 哪些账号 可以登录 哪些服务器,哪些账号 在 哪些服务器 上可以 sudo哪些命令 。
问题抛出来了,下面就是如何解决它。
单刀直入的方案,我为每个服务器根据需要创建对应的人的账号,在分别配置sudoer的权限。缺点就不说了,改个配置能累死人。。。。。
所以,我们***能有个地方能够统一来配置:
上述的需求可以通过服务器接入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进行类似的管理,还是真心强大的。
                网站题目:堡垒跳板机实现——架构实现
                
                分享链接:http://www.csdahua.cn/qtweb/news25/257675.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网