一種跳板機的實現(xiàn)思路

本文介紹了一種跳板機實現(xiàn)思路,闡述了基本原理,并講解了特點和相對優(yōu)勢。

一、 跳板機思路簡介

本文所描述的跳板機(下文稱為“jmp”)支持:

  • Linux服務(wù)器
  • Windows服務(wù)器
  • 其他終端(MySQL終端、Redis終端、網(wǎng)絡(luò)設(shè)備終端 等等)

有別于市面上常見的jumpserver方案,使用本文所搭建的跳板機將不會存儲任何Linux服務(wù)器的賬號、密碼、密鑰等信息,杜絕了信息泄露的可能。本文最大的特點是 借助Linux的PAM機制,通過修改Linux服務(wù)器系統(tǒng)層配置,部分接管了Linux系統(tǒng)的身份認(rèn)證能力 ,關(guān)于這一點,下文將詳細(xì)描述。

二、背景知識

2.1 Linux 的 PAM 機制

PAM(Pluggable Authentication Modules)機制,是一種廣泛應(yīng)用于當(dāng)代Unix、Linux發(fā)行版的系統(tǒng)層身份認(rèn)證框架。通過提供一系列動態(tài)鏈接庫和兩套編程接口(Service Programming Interface 和 Application Programming Interface),將系統(tǒng)提供的服務(wù)與該服務(wù)的認(rèn)證方式分離,從而使得可以根據(jù)需要靈活地給不同的服務(wù)配置不同的認(rèn)證方式而無需更改服務(wù)程序。

2.2 PAM 的核心能力

功能

應(yīng)用程序API

服務(wù)模塊SPI

認(rèn)證管理

pam_authenticate

pam_sm_authenticate

pam_setcred

pam_sm_setcred

賬號管理

pam_acc_mgmt

pam_sm_acc_mgmt

會話管理

pam_open_session

pam_sm_open_session

pam_close_session

pam_sm_close_session

口令管理

pam_chauthok

pam_sm_chauthok

2.3 PAM 模塊類型

  • auth
  • 用來對用戶的身份進(jìn)行識別,如:提示用戶輸入密碼,或判斷用戶是否為root等。
  • account
  • 對帳號的各項屬性進(jìn)行檢查,如:是否允許登錄,是否達(dá)到最大用戶數(shù),或是root用戶是否允許在這個終端登錄等。
  • session
  • 這個模塊用來定義用戶登錄前的,及用戶退出后所要進(jìn)行的操作,如:登錄連接信息、用戶數(shù)據(jù)的打開與關(guān)閉、掛載文件系統(tǒng)等。
  • password
  • 使用用戶信息來更新,如:修改用戶密碼。

2.4 常見 PAM 模塊

  • pam_unix.so模塊
  • 【auth】提示用戶輸入密碼,并與/etc/shadow文件相比對,匹配返回0(PAM_SUCCESS)。
  • 【account】檢查用戶的賬號信息(包括是否過期等),帳號可用時,返回0。
  • 【password】修改用戶的密碼,將用戶輸入的密碼,作為用戶的新密碼更新shadow文件。
  • pam_cracklib.so模塊
  • 這個模塊可以插入到一個程序的密碼棧中,用于檢查密碼的強度。
  • pam_loginuid.so模塊
  • 用來設(shè)置已通過認(rèn)證的進(jìn)程的uid,以使程序通過正常的審核。
  • pam_securetty.so模塊
  • 如果用戶要以root登錄時,則登錄的tty必須在/etc/securetty中之前。
  • pam_rootok.so模塊
  • pam_ROOTok模塊用來認(rèn)證用戶id是否為0,為0返回PAM_SUCCESS。
  • pam_console.so模塊
  • 當(dāng)用戶登錄到終端時,改變終端文件文件的權(quán)限.在用戶登出后,再將它們修改回來。
  • pam_permit.so模塊
  • 該模塊任何時候都返回成功。
  • pam_env.so模塊
  • pam_env允許設(shè)置環(huán)境變量;默認(rèn)下若沒有指定文件,將依據(jù)/etc/security/pam_env.conf進(jìn)行環(huán)境變量的設(shè)置
  • pam_xauth.so模塊
  • pam_xauth用來在用戶之間轉(zhuǎn)發(fā)xauth-key。
  • pam_stack.so模塊
  • pam_stack可以調(diào)用另一個服務(wù);即多個服務(wù)可以包含到一個設(shè)置中,當(dāng)需要修改時只修改一個文件就可以了。
  • pam_warn.so模塊
  • pam_warn用來記錄服務(wù)、終端用戶、遠(yuǎn)程用戶和遠(yuǎn)程主機的信息到系統(tǒng)日志,模塊總是返回PAM_IGNORE、指不希望影響到認(rèn)證處理。

三、跳板機系統(tǒng)架構(gòu)

3.1 微服務(wù)和高可用設(shè)計

3.1.1 微服務(wù)設(shè)計

整個跳板機系統(tǒng)可拆分為5個服務(wù),和1個組件。

① jmp-api 服務(wù)

  • 監(jiān)聽8080端口,提供http接口能力
  1. 認(rèn)證某個賬號是否存在且正常
  2. 認(rèn)證某個賬號對某臺服務(wù)器是否有登錄權(quán)限
  3. 認(rèn)證某個賬號對某臺服務(wù)器是否有sudo權(quán)限
  4. 數(shù)據(jù)拉?。嘿~號、主機、危險命令庫等
  • 是jmp訪問數(shù)據(jù)庫的唯一入口

② jmp-ssh 服務(wù)

  • 監(jiān)聽2200端口,提供ssh代理能力
  • 可直接訪問Linux服務(wù)器、其他終端

③ jmp-socket 服務(wù)

  • 監(jiān)聽8080端口,提供websocket/socket.io連接能力
  • 通過ssh協(xié)議轉(zhuǎn)發(fā)socket.io的流量到j(luò)mp-ssh
  • 支持網(wǎng)頁終端的連接和訪問

④ jmp-rdp 服務(wù)

  • 監(jiān)聽8080端口,提供socket.io連接能力
  • 實現(xiàn)rdp代理,以便于操作Windows服務(wù)器
  • 支持基于網(wǎng)頁的遠(yuǎn)程桌面服務(wù)

⑤ jmp-sftp 服務(wù)

  • 提供文件上傳下載能力,支持在jmp中通過sftp命令,支持任意sftp客戶端連接
  • 訪問S3,以便存取文件

⑥ jmp-agent 組件

  • 部署在每臺Linux服務(wù)器中
  • jmp-agent常駐進(jìn)程

定時從jmp-api拉取服務(wù)和權(quán)限信息,緩存到本地文件

根據(jù)需要檢測文件改動,確保配置文件不被惡意修改

  • jmp專用pam模塊

提供jmp.so動態(tài)庫,為pam模塊

安裝腳本釋放配置文件,修改/etc/pam.d/xxx文件,生效jmp的pam模塊

接管身份識別和權(quán)限認(rèn)證,調(diào)用jmp-api接口以完成鑒權(quán)

3.1.2 高可用設(shè)計

jmp中任何一個服務(wù)都是無狀態(tài)的,因而支持異地多機房部署

http協(xié)議的服務(wù)(jmp-api、jmp-socket、jmp-rdp),通過Nginx配置路由,且配置自動負(fù)載均衡策略。

非http的服務(wù)(jmp-ssh、jmp-sftp),通過4層負(fù)載均衡(lvs、vgw)實現(xiàn)高可用。

自動降級策略

危險命令識別能力存在耗時久的可能性,因此當(dāng)發(fā)現(xiàn)識別危險命令的接口超時,則自動忽略危險命令識別。

身份認(rèn)證接口超時的情況下,則使用jmp-agent本地緩存的身份信息,如獲取不到本地緩存,則使用配置項的默認(rèn)策略(全部通過或者全部拒絕)。

jmp-agent組件的高可用

由于jmp-agent部署在業(yè)務(wù)服務(wù)器上,所處環(huán)境可能隨時發(fā)生變化,因此必須具備較強的適應(yīng)性(磁盤空間不足、inode滿、內(nèi)存不足、網(wǎng)絡(luò)不穩(wěn)定、域名解析異常等等)。

針對磁盤空間或inode不足,jmp-agent可能無法使用本地文件緩存,因此此時選擇降級,忽略緩存。

針對網(wǎng)絡(luò)不穩(wěn)定問題,jmp-agent選擇增加同jmp-api、jmp-ssh的通信超時,同時可降級鑒權(quán),確保操作不受影響。

針對解析異常問題,jmp-agent無法通過域名同服務(wù)交互,此時使用內(nèi)置的固定ip同服務(wù)交互。

3.2 跳板機各子服務(wù)交互圖

從圖中可見,作為核心服務(wù)的jmp-ssh承載了ssh流量的代理轉(zhuǎn)發(fā),將來自用戶ssh客戶端、jmp-socket服務(wù)的ssh流量轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器上,并將來自目標(biāo)服務(wù)器的返回結(jié)果送達(dá)回ssh客戶端、jmp-socket服務(wù)。因此,可在jmp-ssh服務(wù)上識別來自用戶的危險命令,在送達(dá)目標(biāo)服務(wù)器之前就給出告警或者直接攔截,避免惡意操作或者誤操作給業(yè)務(wù)造成影響。

圖中的jmp-api作為同數(shù)據(jù)庫和緩存直接交互的服務(wù),在整個系統(tǒng)中承擔(dān)數(shù)據(jù)接口和管理端的角色,接受來自全量服務(wù)器中jmp-agent組件的用戶身份鑒別和權(quán)限校驗請求,是整個系統(tǒng)中的控制中樞。

jmp-api也同時提供的權(quán)限設(shè)置能力,通過與流程系統(tǒng)對接,可方便的為人員/部門申請機器/服務(wù)/項目的登錄權(quán)限或root權(quán)限,此外,jmp-api也對登錄權(quán)限和root權(quán)限的可申請人做出限制,針對不同項目/服務(wù),對權(quán)限有效時間做出限制,嚴(yán)格控制權(quán)限粒度。

由于同一個項目/服務(wù)往往由同一個組的人維護(hù),因此jmp-api內(nèi)置了默認(rèn)的權(quán)限策略,可允許項目/服務(wù)的負(fù)責(zé)人對項目/服務(wù)直接擁有登錄權(quán)限,而無需申請;僅支持對應(yīng)項目/服務(wù)的運維負(fù)責(zé)人默認(rèn)擁有root權(quán)限,其他所有人如果希望獲取root權(quán)限,則必須經(jīng)過申請,由對應(yīng)服務(wù)的運維負(fù)責(zé)人審批。

圖中的jmp-agent是部署在每一臺Linux服務(wù)器上的,通過在Linux上修改/etc/pam.d/sshd、/etc/

pam.d/remote、/etc/pam.d/sudo等等文件,讓 jmp.so (屬于jmp-agent.rpm或jmp-agent.deb的一部分)接管ssh服務(wù)、sudo程序等關(guān)鍵系統(tǒng)程序的身份識別、權(quán)限認(rèn)證。從而使得在不增加/etc/passwd、/etc/shadow內(nèi)容的前提下實現(xiàn)了在任意一臺服務(wù)器上識別出所有人員身份的能力。

圖中的jmp-rdp僅作為Windows服務(wù)器的rdp代理服務(wù),并提供基于web的遠(yuǎn)程桌面能力。

圖中的jmp-socket則提供基于web的Linux服務(wù)器操作終端,從而讓用戶不使用ssh客戶端也能夠方便地登錄服務(wù)器。

四、核心設(shè)計思路

4.1 登錄跳板機

  • 用戶使用ssh客戶端登錄到j(luò)mp-ssh服務(wù),與jmp-ssh服務(wù)交互。
  • jmp-ssh服務(wù)獲得ssh會話建立過程中的賬號、加密后密碼、二次認(rèn)證信息。
  • jmp-ssh服務(wù)訪問jmp-api服務(wù),提交賬號、加密后密碼、二次認(rèn)證信息,以便知曉該用戶是否有登錄jmp的權(quán)限。

4.2 登錄目標(biāo)服務(wù)器

  • 僅當(dāng)用戶已經(jīng)登錄到j(luò)mp-ssh或者已經(jīng)通過了jmp-socket的前端身份認(rèn)證時方可登錄目標(biāo)服務(wù)器。
  • 用戶在jmp-ssh提供的偽終端下輸入ssh xxxx(xxxx為目標(biāo)服務(wù)器的主機名或者IP地址)。
  • jmp-ssh通過ssh連接到目標(biāo)服務(wù)器,自動攜帶用戶名信息,嘗試建立會話。
  • 由于目標(biāo)服務(wù)器上的jmp-agent接管了sshd的身份識別和權(quán)限認(rèn)證,因此jmp.so獲取ssh會話建立過程中的用戶名,將用戶名和本機IP地址信息加密,調(diào)用jmp-api接口進(jìn)行權(quán)限認(rèn)證。
  • jmp-api根據(jù)內(nèi)置的策略,以及查詢授權(quán)表,斷定該用戶對該機器是否有登錄權(quán)限。
  • jmp-agent得到鑒權(quán)結(jié)果,對有權(quán)限的,則ssh會話建立成功,否則會話建立失敗。
  • jmp-ssh獲得會話建立結(jié)果和原因,返回給用戶ssh終端。

4.3 命令交互

  • 僅當(dāng)用戶已經(jīng)登錄到某臺機器時,才可命令交互。
  • 當(dāng)用戶在ssh客戶端上敲入字符,傳遞到j(luò)mp-ssh,jmp-ssh判斷語句是否結(jié)束。
  • 當(dāng)語句結(jié)束,則jmp-ssh根據(jù)該機器的危險命令規(guī)則,匹配用戶輸入的語句,決定告警、攔截、通過。
  • jmp-ssh將通過的語句或需要告警的語句傳遞到目標(biāo)服務(wù)器,目標(biāo)服務(wù)器執(zhí)行并返回結(jié)果。

4.4 切換用戶 / 特權(quán)賬號

  • 僅當(dāng)用戶已經(jīng)登錄到某臺機器時,才可能觸發(fā)切換用戶的行為。
  • 當(dāng)用戶在ssh客戶端執(zhí)行sudo xxxx、su、id等等命令時,jmp-ssh透傳命令到目標(biāo)服務(wù)器上。
  • 目標(biāo)服務(wù)器上的sshd進(jìn)程執(zhí)行sudo xxxx、su、id等等命令,由于目標(biāo)服務(wù)器上已經(jīng)被jmp-agent接管了身份失敗和權(quán)限認(rèn)證,因此由jmp.so獲取登錄用戶名、當(dāng)前用戶名、本機地址信息、目標(biāo)用戶名信息,調(diào)jmp-api的接口進(jìn)行sudo權(quán)限認(rèn)證。
  • jmp-api判斷該用戶是否擁有對該機器切換到xx賬號的權(quán)限(如是否有root權(quán)限)。
  • sudo、su、id等進(jìn)程通過jmp.so獲得了鑒權(quán)結(jié)果,決定是否切換用戶。

4.5 使用網(wǎng)頁交互

  • 僅針對用戶已經(jīng)通過網(wǎng)頁完成了登錄(如sso)的情況。
  • 用戶通過網(wǎng)頁訪問jmp-socket服務(wù)。
  • jmp-socket服務(wù)獲取用戶名信息、網(wǎng)頁登錄sso信息,提交給jmp-api,生成一個臨時登錄憑證。
  • jmp-socket訪問jmp-ssh,提交臨時登錄憑證。
  • jmp-ssh發(fā)起登錄的二次認(rèn)證,等待用戶完成二次認(rèn)證。
  • jmp-socket在用戶完成二次認(rèn)證后,承擔(dān)了ssh客戶端的角色,與jmp-ssh交互。

4.6 危險命令攔截

  • jmp-ssh在用戶已經(jīng)登錄到目標(biāo)服務(wù)器后,在該會話內(nèi),加載目標(biāo)機器對應(yīng)服務(wù)的危險命令規(guī)則,初始化正則匹配邏輯。
  • jmp-ssh在用戶輸入語句結(jié)束后,根據(jù)該機器的危險命令規(guī)則,匹配用戶輸入的語句。
  • jmp-ssh根據(jù)危險命令規(guī)則匹配后策略,決定對該輸入做如下處理:告警、攔截、通過。
  • 對于通過的,jmp-ssh傳遞命令到目標(biāo)服務(wù)器。
  • 對于告警的,jmp-ssh傳遞命令到目標(biāo)服務(wù)器,但是向用戶、用戶的直屬領(lǐng)導(dǎo)、jmp系統(tǒng)管理員發(fā)送危險命令告警。
  • 對于攔截的,jmp-ssh拒絕傳遞命令,同時向用戶、用戶的直屬領(lǐng)導(dǎo)、jmp系統(tǒng)管理員發(fā)送危險命令告警。

4.7 非Linux服務(wù)器的跳板機

  • Windows服務(wù)器
  • 對于Windows服務(wù)器,使用jmp-rdp服務(wù),將rdp協(xié)議數(shù)據(jù)轉(zhuǎn)成由socket.io承載的應(yīng)用數(shù)據(jù)(依賴Apache Guacamole),并通過web頁面的Canvas展示實時圖像并接受鍵盤鼠標(biāo)事件。
  • MySQL終端和Redis終端
  • 僅支持部署在Linux服務(wù)器上的MySQL和Redis。
  • 在服務(wù)器上通過mysql.sock,使jmp-agent連接到本地MySQL服務(wù),jmp-agent轉(zhuǎn)發(fā)標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出到j(luò)mp-ssh。
  • 在服務(wù)器上通過redis.sock,使jmp-agent連接到本地Redis服務(wù),jmp-agent轉(zhuǎn)發(fā)標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出jmp-ssh。
  • 該方法理論上支持任意可通過unixsocket連接的服務(wù)。
  • 網(wǎng)絡(luò)設(shè)備管理終端
  • 對于網(wǎng)絡(luò)終端,則jmp-ssh讀取jmp-api接口,獲取對應(yīng)網(wǎng)絡(luò)設(shè)備的連接信息(協(xié)議類型、賬號信息等),實現(xiàn)連接和操作。

五、權(quán)限規(guī)則和審批鏈路設(shè)計

5.1 默認(rèn)擁有的權(quán)限

無需申請,即可擁有的權(quán)限。

授權(quán)的主體

權(quán)限的目標(biāo)

權(quán)限的類型

服務(wù)負(fù)責(zé)人

服務(wù)的線上主機

登錄權(quán)限

服務(wù)的線下主機

登錄權(quán)限+ROOT權(quán)限

項目負(fù)責(zé)人

項目的線上主機

登錄權(quán)限

項目的線下主機

登錄權(quán)限+ROOT權(quán)限

服務(wù)的運維

服務(wù)的線上主機

登錄權(quán)限+ROOT權(quán)限

服務(wù)的線下主機

項目的運維

項目的線上主機

登錄權(quán)限+ROOT權(quán)限

項目的線下主機

5.2 權(quán)限申請的審批鏈路

  • 如果沒有默認(rèn)權(quán)限,但是需要登錄機器,或者需要使用ROOT權(quán)限,則需要申請。
  • 如果為組織申請權(quán)限,則該組織(部門)下所有成員均有鎖申請的權(quán)限。

這里明確了申請流程的審批鏈路:

六、這種實現(xiàn)思路的優(yōu)點

6.1 操作方便,體驗較好

通過該思路所建設(shè)的跳板機系統(tǒng),操作上比較方便,即支持了ssh、又兼容了rdp,同時提供了網(wǎng)頁端操作入口,體驗較好。同時,由于采用微服務(wù)架構(gòu),服務(wù)間耦合較小,比較容易做到高可用,從而很少出現(xiàn)卡頓、延時等現(xiàn)象,整體穩(wěn)定性可靠,體驗上有保證。

6.2 安全可靠,容易審計

本文的最大特點就是在目標(biāo)服務(wù)器上使用了pam機制,通過jmp.so接管多個服務(wù)的身份識別和權(quán)限認(rèn)證,從而做到了 在不修改標(biāo)準(zhǔn)命令的基礎(chǔ)上,統(tǒng)一接管權(quán)限,統(tǒng)一管控。 并且做到了在登錄到目標(biāo)機器上后,可以進(jìn)一步ssh到其他服務(wù)器,所有的交互過程全程記錄,所有的操作命令都會被記錄下來。

由于通過該思路所實現(xiàn)的跳板機 直接將用戶名作為目標(biāo)服務(wù)器ssh會話的登錄名 ,所以在系統(tǒng)內(nèi)部所記錄的日志里也是直接的用戶名,而不是如jumpserver等方案的統(tǒng)一賬號,這種方式下,更容易定位到操作軌跡的真實執(zhí)行人,一目了然。

危險命令攔截功能,更是可以很大程度上避免惡意操作或者破壞性強的誤操作,為業(yè)務(wù)穩(wěn)定性增加一層保障。

6.3 服務(wù)間職責(zé)明確

由于采用了微服務(wù)架構(gòu),可以做到每個服務(wù)的橫向擴展,從而做到了通過擴容服務(wù)的方式管控更多的機器。服務(wù)間職責(zé)明確,可根據(jù)需要裁減jmp-rdp、jmp-socket、jmp-sftp,也可以根據(jù)需要增加新的服務(wù),適配性較好。

七、總結(jié)與展望

隨著服務(wù)器規(guī)模的擴大,如何管理這些服務(wù)器成為一個越來越重要的問題。針對服務(wù)器的登錄訪問,本文介紹了跳板機的一種實現(xiàn)思路,并描述了該思路的優(yōu)點和獨特之處。通過該思路可以一定程度上構(gòu)建簡單、易用且高可用的跳板機,從而解決服務(wù)器登錄問題。如果讀者對這個實現(xiàn)思路感興趣,或者有任何疑問,歡迎與我們溝通。我們也非常愿意與各位一起學(xué)習(xí),研究技術(shù)。

作者:Yang Lei

來源:微信公眾號:vivo互聯(lián)網(wǎng)技術(shù)

出處:https://mp.weixin.qq.com/s?__biz=MzI4NjY4MTU5Nw==&mid=2247493879&idx=2&sn=7af0fb33d5efb3768b0ab168e19bd4df

好了,這篇文章的內(nèi)容發(fā)貨聯(lián)盟就和大家分享到這里,如果大家網(wǎng)絡(luò)推廣引流創(chuàng)業(yè)感興趣,可以添加微信:80709525  備注:發(fā)貨聯(lián)盟引流學(xué)習(xí); 我拉你進(jìn)直播課程學(xué)習(xí)群,每周135晚上都是有實戰(zhàn)干貨的推廣引流技術(shù)課程免費分享!


版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 sumchina520@foxmail.com 舉報,一經(jīng)查實,本站將立刻刪除。

您可能還會喜歡:

發(fā)表評論

◎歡迎參與討論,請在這里發(fā)表您的看法、交流您的觀點。