当前位置: 首页 > 科技观察

堡垒机实现-架构实现

时间:2023-03-14 17:03:25 科技观察

概述这是堡垒机实现的第二篇文章,主要讲解如何实现三层架构,包括第一层&第二层的设计与实现,即用户登陆堡垒机&授权验证入口,第三层,如何通过ldap统一管理服务器账号权限。堡垒机的三层架构可以参考上一篇博客:堡垒机跳板机实现——整体架构登录入口先说***层。该层的主要功能是检测用户是否有使用堡垒机的权限。这很容易理解。永远不能允许匿名用户随意使用堡垒机。虽然在二层授权验证时可以有效抵制,但既然在顶层可以有效快速拦截无效用户,那为什么要放在后面呢?有很多方法可以验证。比如在***层架构中使用linux作为服务器,自然可以使用linux用户auth作为验证机制,简单的为那些有权限的用户在服务器上添加用户,并创建一个唯一的32位密码用一个键。服务器定制我们在这一层的做法是将用户认证和我们内部的动态Token服务(类似googleauthenticator)结合起来,同时提供一个友好的登录shell界面,这样简单的使用userauth是无法达到我们的目的的目的,这里,我们对一级服务器sshloginallpermit自定义,修改/etc/pam.d/sshd:authrequiredpam_permit.soaccountrequiredpam_permit.sopasswordrequiredpam_permit.sosessionrequiredpam_permit.so开启sshdpam认证,修改sshd_config:UsePAMyes并重启sshd:/etc/ini.d/sshdrestart同时把用户对应的默认登录shell改成我们自定义的。代码结构放上我们的代码结构,主要结构如下:├──gateway-shell├──login-shell├──mshell└──sdshell功能说明接下来对上面的文件做如下功能说明:login-shell:用户登录shell,调用sdshell验证用户登录密码,初始化用户监控日志路径,开启监控。sdshell:读取用户登录passwd并判断验证结果,用exitcode表示验证结果,0表示验证成功,1表示验证失败,2表示root用户登录验证成功.mshell:验证用户passwd成功函数,循环调用gateway-shell读取用户的action选择,并执行。gateway-shell:为用户提供cli界面,供用户选择操作。调用顺序为:login_shell(入口)->sdshell(判断PIN+TOKEN)->mshell->gateway-shell(判断/获取用户选项)代码解释login_shell:用户登录时,先在这里输入验证1#!/bin/bash23WORKDIR=`dirname$0`4source$WORKDIR/sentry.env5BINDIR="$WORKDIR"6#LOGDIR="/data0/logdir"78#1,验证token9$BINDIR/sdshell10sdstats=$?11#sdstats=01213#当sdshell返回0时,表示当前用户登录成功14#当sdshell返回1时,表示当前用户认证失败15#当sdshell返回2时,表示root登录成功16if[[$sdstats-eq1]];then17exit118elif[[$sdstats-eq2]];then19/bin/bash20exit021fi2223#2,gen_log_dir24user=`/usr/bin/whoami`25if[!-d$LOGDIR/$user];then26mkdir-p$LOGDIR/$user27chown-R$user$LOGDIR/$user28chmoda+w$LOGDIR/$user29fi3031#3,param32lip=`/usr/bin/env|grepSSH_CONNECTION|cut-f2-d=|cut-f1-d''`33now=`date'+%F-%k:%M:%S'|tr-d""`34user=`/usr/bin/whoami`35sip=`/usr/bin/env|grepSSH_CONNECTION|cut-f2-d=|cut-f3-d''`3637#4,beginscript38exportTMOUT=1039exportSHELL=$BINDIR/mshell40/usr/bin/script-q-t2>$LOGDIR/$user/$user-$lip-$sip-$now.time-f$LOGDIR/$user/$user-$lip-$sip-$now.txt中,第3-5行做基本的环境变量初始化,第9行调用sdshell验证用户输入的动态代码的验证结果,即用户此时进入sdshell进行验证,此时,你可以随意sdshell做了功能定制,我们实现的功能定制接口类是:Isitcool~~一切验证通过后,我们进入login_shell第24-35行初始化用户行为日志记录。这里我们使用linuxauto脚本命令来记录用户。简单有效,没有朋友!***39-40这两行将用户的shell指向mshell,同时开始记录用户的行为。mshell现在用户的行为已经进入到这里,说明这个用户已经通过了***层验证,现在需要进行相关的action操作。1#!/bin/bash23WORKDIR=`dirname$0`4source$WORKDIR/sentry.env5user=`/usr/bin/whoami`6GWDIR=$WORKDIR7privatekey=$RSAFILE8mkdir/home/$user/.ssh2>/dev/null9cat$privatekey>/home/$user/.ssh/id_rsa10chmod600/home/$user/.ssh/id_rsa1112whiletrue13do14clear15$GWDIR/gateway-shell16gsstats=$?1718#返回值说明:19#0表示正常,即将登录;20#1表示立即退出21#2表示退出22#3表示超时登录本地服务器23#其他没有异常24case$gsstatsin250)26ssh-2-i~/.ssh/id_rsa-l$user`cat$ACTIONDIR/$user.action`27;;281)29exit30;;312)32echo"actiontimeout"33exit34;;353)36/bin/bash37;;38*)39echo"error"40sleep241;;42esac43done3-10行环境初始化,以及然后打开循环监听用户输入的action,显示用户可用的action列表,判断用户是否有相应的操作权限,都是在第15行的mshell执行的,然后根据exit也执行相关的action代码。对于mshell,你也可以自己设计相关的功能。我们设计的shell操作界面如下:也爽爽爽!一层架构总结至此,一层架构中的流程实现基本完成,剩下的就是具体控制登录服务器的技术管理工作,即第三层的工作了稍后与您分享。再总结下一层架构中的调用关系:login_shell(入口)->sdshell(判断PIN+TOKEN)->mshell->gateway-shell(判断/获取用户选项)哎,好像缺了第二层的解释?其实第二层主要是做action行为的授权&验证。还记得gateway-shell的作用:“显示用户可用的动作列表,判断用户是否有相应的操作权限吗?”这里gateway-shell通过api与第一层进行交互,第二层对用户的行为和授权范围进行交互和操作。具体交互功能包括:搜索服务器信息;获取用户有权限的服务器列表;获取用户有权限的服务器组列表;获取服务器组下的服务器列表;如何获取当前所有授权的用户列表?相信1000个工程师就有1001种不同的做法,这里就不细说了~如何统一管理服务器的登录账号访问权限?我们有1000台服务器,100个人,需要统一管理哪些账号可以登录哪些服务器,哪些账号可以在哪些服务器上sudo哪些命令。问题弹出,这里是解决方法。对于直接的解决方案,我根据需要为每个服务器创建一个对应的人的帐户,并单独配置sudoer权限。不说缺点,就是改配置也累死人。....因此,我们可以有一个地方可以统一配置:创建一个人的账号后,这个人就可以登录所有的服务器;管理此人登录服务器的范围;给这个人分配统一的sudo权限,以及哪些目标服务器有sudo权限执行哪些命令;以上需求可以通过服务器通过ldap访问,通过ldap管理可以实现以上需求。具体过程这里不再繁琐。可以参考网上的博文。还有很多,比如:使用OpenLDAP来集中管理用户账户基于PAM的LDAP用户认证。这里我们只粘贴完成后类似的ldap结构:[root@testldapenldap]#ldapsearch-x-LLL-D"cn=admin,dc=lianjia,dc=com"uid=test-WEnterLDAPPPassword:dn:uid=test,ou=people,dc=连家,dc=comobjectClass:posixAccountobjectClass:shadowAccountobjectClass:personobjectClass:inetOrgPersonobjectClass:ldapPublicKeycn:Systemsn:ligivenName:testdisplayName:testuid:testuserPassword::testpasswduidNumber:1001gidNumber:1001gecos:SystemManagerhomeDirectory:/home/testshadowMashadmChange9:16029xshadowminshadow:16029xshadowMin:7shadowExpire:-1employeeNumber:20248353mobile:18519199234mail:654306390@qq.compostalAddress:beijinginitials:testloginShell:/bin/bashsshPublicKey:ssh-rsaAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx32x9jF5cFDqktiTQIdD9PMq8b86v2p8Es4us7OTzo7XomcjEPpfP/Realy9BOuteohA4JzezrAyFQhJui6BdovkzhnVRyFERJuTA/19biQkCZB91XrWxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxJXH+f0VOvx5FiF0bV3IfJt32cdmI8O7hNI+ttPCQ4V1R8vr0wIhCmUcKzD5vOx+0H9B1EY4d/imSxFHIebe4l//rthyAr3x0XmNvuFD9khqfDK7bmXnHu26s++O8A1SDJ5beuu4xXl/mN8mc5WPmoQQSjIzruWPajLx8m6HFroot@channel.lianjia.com这样,对于此用户,就可以通过password或者publickey的方式,登录服务器,同理,也可以对sudo进行类似的管理,还是reallystrong