<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • 一種跳板機的實現思路

    vivo 互聯網運維團隊- Yang Lei

    本文介紹了一種跳板機實現思路,闡述了基本原理,并講解了特點和相對優勢。

    一、 跳板機思路簡介

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

    • Linux服務器
    • Windows服務器
    • 其他終端(MySQL終端、Redis終端、網絡設備終端 等等)

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

    二、背景知識

    2.1  Linux 的 PAM 機制

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

    圖片

    2.2 PAM 的核心能力

    2.3 PAM 模塊類型

    • auth

    用來對用戶的身份進行識別,如:提示用戶輸入密碼,或判斷用戶是否為root等。

    • account

    對帳號的各項屬性進行檢查,如:是否允許登錄,是否達到最大用戶數,或是root用戶是否允許在這個終端登錄等。

    • session

    這個模塊用來定義用戶登錄前的,及用戶退出后所要進行的操作,如:登錄連接信息、用戶數據的打開與關閉、掛載文件系統等。

    • password

    使用用戶信息來更新,如:修改用戶密碼。

    2.4 常見 PAM 模塊

    • pam_unix.so模塊

    【auth】提示用戶輸入密碼,并與/etc/shadow文件相比對,匹配返回0(PAM_SUCCESS)。【account】檢查用戶的賬號信息(包括是否過期等),帳號可用時,返回0。【password】修改用戶的密碼,將用戶輸入的密碼,作為用戶的新密碼更新shadow文件。

    • pam_cracklib.so模塊

    這個模塊可以插入到一個程序的密碼棧中,用于檢查密碼的強度。

    • pam_loginuid.so模塊

    用來設置已通過認證的進程的uid,以使程序通過正常的審核。

    • pam_securetty.so模塊

    如果用戶要以root登錄時,則登錄的tty必須在/etc/securetty中之前。

    • pam_rootok.so模塊

    pam_rootok模塊用來認證用戶id是否為0,為0返回PAM_SUCCESS。

    • pam_console.so模塊

    當用戶登錄到終端時,改變終端文件文件的權限.在用戶登出后,再將它們修改回來。

    • pam_permit.so模塊

    該模塊任何時候都返回成功。

    • pam_env.so模塊

    pam_env允許設置環境變量;默認下若沒有指定文件,將依據/etc/security/pam_env.conf進行環境變量的設置

    • pam_xauth.so模塊

    pam_xauth用來在用戶之間轉發xauth-key。

    • pam_stack.so模塊

    pam_stack可以調用另一個服務;即多個服務可以包含到一個設置中,當需要修改時只修改一個文件就可以了。

    • pam_warn.so模塊

    pam_warn用來記錄服務、終端用戶、遠程用戶和遠程主機的信息到系統日志,模塊總是返回PAM_IGNORE、指不希望影響到認證處理。

    三、跳板機系統架構

    3.1 微服務和高可用設計

    3.1.1 微服務設計

    整個跳板機系統可拆分為5個服務,和1個組件。

    ① jmp-api 服務

    • 監聽8080端口,提供http接口能力
    1. 認證某個賬號是否存在且正常

    2. 認證某個賬號對某臺服務器是否有登錄權限

    3. 認證某個賬號對某臺服務器是否有sudo權限

    4. 數據拉取:賬號、主機、危險命令庫等

    • 是jmp訪問數據庫的唯一入口

    ② jmp-ssh 服務

    • 監聽2200端口,提供ssh代理能力

    • 可直接訪問Linux服務器、其他終端

    ③ jmp-socket 服務

    • 監聽8080端口,提供websocket/socket.io連接能力

    • 通過ssh協議轉發socket.io的流量到jmp-ssh

    • 支持網頁終端的連接和訪問

    ④ jmp-rdp 服務

    • 監聽8080端口,提供socket.io連接能力

    • 實現rdp代理,以便于操作Windows服務器

    • 支持基于網頁的遠程桌面服務

    ⑤ jmp-sftp 服務

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

    • 訪問S3,以便存取文件

    ⑥ jmp-agent 組件

    • 部署在每臺Linux服務器中

    • jmp-agent常駐進程

    定時從jmp-api拉取服務和權限信息,緩存到本地文件

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

    • jmp專用pam模塊

    提供jmp.so動態庫,為pam模塊

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

    接管身份識別和權限認證,調用jmp-api接口以完成鑒權

    3.1.2 高可用設計

    jmp中任何一個服務都是無狀態的,因而支持異地多機房部署

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

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

    自動降級策略

    危險命令識別能力存在耗時久的可能性,因此當發現識別危險命令的接口超時,則自動忽略危險命令識別。

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

    jmp-agent組件的高可用

    由于jmp-agent部署在業務服務器上,所處環境可能隨時發生變化,因此必須具備較強的適應性(磁盤空間不足、inode滿、內存不足、網絡不穩定、域名解析異常等等)。

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

    針對網絡不穩定問題,jmp-agent選擇增加同jmp-api、jmp-ssh的通信超時,同時可降級鑒權,確保操作不受影響。

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

    3.2 跳板機各子服務交互圖

    圖片

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

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

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

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

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

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

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

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

    四、核心設計思路

    4.1 登錄跳板機

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

    圖片

    4.2 登錄目標服務器

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

    圖片

    4.3 命令交互

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

    圖片

    4.4 切換用戶 / 特權賬號

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

    圖片

    4.5 使用網頁交互

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

    圖片

    4.6 危險命令攔截

    • jmp-ssh在用戶已經登錄到目標服務器后,在該會話內,加載目標機器對應服務的危險命令規則,初始化正則匹配邏輯。
    • jmp-ssh在用戶輸入語句結束后,根據該機器的危險命令規則,匹配用戶輸入的語句。
    • jmp-ssh根據危險命令規則匹配后策略,決定對該輸入做如下處理:告警、攔截、通過。
    • 對于通過的,jmp-ssh傳遞命令到目標服務器。
    • 對于告警的,jmp-ssh傳遞命令到目標服務器,但是向用戶、用戶的直屬領導、jmp系統管理員發送危險命令告警。
    • 對于攔截的,jmp-ssh拒絕傳遞命令,同時向用戶、用戶的直屬領導、jmp系統管理員發送危險命令告警。

    圖片

    4.7 非Linux服務器的跳板機

    • Windows服務器

    對于Windows服務器,使用jmp-rdp服務,將rdp協議數據轉成由socket.io承載的應用數據(依賴Apache Guacamole),并通過web頁面的Canvas展示實時圖像并接受鍵盤鼠標事件。

    • MySQL終端和Redis終端

    僅支持部署在Linux服務器上的MySQL和Redis。

    在服務器上通過mysql.sock,使jmp-agent連接到本地MySQL服務,jmp-agent轉發標準輸入和標準輸出到jmp-ssh。

    在服務器上通過redis.sock,使jmp-agent連接到本地Redis服務,jmp-agent轉發標準輸入和標準輸出jmp-ssh。

    該方法理論上支持任意可通過unixsocket連接的服務。

    • 網絡設備管理終端

    對于網絡終端,則jmp-ssh讀取jmp-api接口,獲取對應網絡設備的連接信息(協議類型、賬號信息等),實現連接和操作。

    五、權限規則和審批鏈路設計

    5.1 默認擁有的權限

    無需申請,即可擁有的權限。

    5.2 權限申請的審批鏈路

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

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

    圖片

    六、這種實現思路的優點

    6.1 操作方便,體驗較好

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

    6.2 安全可靠,容易審計

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

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

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

    6.3 服務間職責明確

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

    七、總結與展望

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

    posted @ 2022-06-28 09:21  vivo互聯網技術  閱讀(269)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看