配置sshd_使用CA簽名證書登錄_更新sshd服務端的通訊密鑰

来源:https://www.cnblogs.com/osnosn/archive/2022/11/08/16870594.html
-Advertisement-
Play Games

一、Installing RabbitMQ-3.10.2 on CentOS 7.9 1 地址 https://www.rabbitmq.com https://github.com/rabbitmq/rabbitmq-server https://github.com/rabbitmq/rabbi ...


配置sshd_使用CA簽名證書登錄_更新sshd服務端的通訊密鑰

轉載註明來源: 本文鏈接 來自osnosn的博客,寫於 2022-11-06.

用CA簽名證書登錄

ssh登錄過程中,基於簽名(證書)的用戶認證

  • 基於 openSSH-8.0p1 , 測試成功。

  • 創建 用於簽發用戶證書的密鑰(用戶CA)。管理員創建,私鑰不傳遞。
    ssh-keygen -t ed25519 -C user_ca@myCA -f user_ca
    得到兩個文件,user_ca , user_ca.pub
    只是密鑰對,不是證書。因為沒做自簽名證書。

  • 讓sshd服務端信任"用戶CA"的公鑰。(方法一,用戶級)
    建議限制 principals。如果多個伺服器信任同一個CA,只要每個伺服器上的 principals 都不同。
    就能做到,用同一個CA簽發的用戶證書,能登錄其中一個伺服器,而不能登錄別的伺服器。
    在sshd伺服器上,用戶的 ~/.ssh/authorized_keys 中加入一行(用戶CA的公鑰)。此文件許可權mode要求是0600。
    cert-authority,principals="host02,allhost" ssh-ed25519 AAAAC.....xx user_ca@myCA
    內容為 user_ca.pub 文件的內容。
    如果用戶證書包含 host02 或 allhost 才能登錄(此種情況不判斷用戶名)。
    每個想用證書登錄的用戶的 ~/.ssh/authorized_keys 都要加一行。

    • 不做限制,在sshd伺服器上,用戶的 ~/.ssh/authorized_keys 中加入一行(用戶CA的公鑰)。
      cert-authority ssh-ed25519 AAAAC.....xx user_ca@myCA
      如果用戶證書沒有principals,可以登錄
      如果用戶證書有principals,必須包含用戶名 才能登錄。
  • 讓sshd服務端信任"用戶CA"的公鑰。(方法二,全局系統級)
    在sshd伺服器上,在 /etc/ssh/sshd_config 中加入一行:
    TrustedUserCAKeys /etc/ssh/user_ca_list.pub ,
    重啟 sshd 服務生效, service sshd restart
    這種配置,用戶證書必須有principals,且包含用戶名才能登錄。
    user_ca_list.pub 可以多行,CA公鑰文件user_ca.pub的內容占其中一行。文件許可權mode可以是0600或0644。
    例如: ssh-ed25519 AAAAC.....xx Comment

    • 靜態限制 principals
      在sshd伺服器上,創建 principals 目錄 mkdir /etc/ssh/principals。此目錄許可權mode要求是0755。
      然後在 /etc/ssh/sshd_config 中再加入一行,重啟 sshd 服務。
      AuthorizedPrincipalsFile /etc/ssh/principals/%u
      之後再次修改 user_ca_list.pub/etc/ssh/principals/ 中的文件,無需重啟sshd即生效。

      • AuthorizedPrincipalsFile,只能配置一個路徑,不支持多個路徑。
      • 根據不同的用戶名, 限制 principals, 比如 /etc/ssh/principals/root 文件:
        一行一個 principal。文件許可權mode必須是0644。
        ## 註釋:/etc/ssh/principals/root文件內容
        principl_01
        principl_02
        
      • 用戶證書包含任意一個 principal 才能登錄。這種情況不匹配用戶名,用戶證書的principals包含"用戶名"無用。
      • 如果對應用戶的文件不存在或為空,用戶證書無論包含什麼princpals,或者無principal,都不能登錄。
    • 動態限制 principals
      在sshd伺服器上, /etc/ssh/sshd_config 中再加入兩行:
      AuthorizedPrincipalsCommand /etc/ssh/princ.sh %u %U %s %i ,
      AuthorizedPrincipalsCommandUser root , (或指定一個別的用戶身份)
      重啟 sshd 服務生效, service sshd restart

      #!/bin/sh
      # 例子 /etc/ssh/princ.sh 文件, 許可權mode是 0755,owner,group 都是 root
      # 傳入四個參數 $1=username,$2=user ID, $3=證書的serial num, $4=證書的key ID
      # 例子中, $3 $4 沒有使用
      # 因 OpenSSH 許可權提升漏洞 (CVE-2021-41617), 此程式只能由管理員編寫,不應該開放給用戶修改。
      
      host=myhost02
      
      buf="$host-$1"
      buf2=$(echo "$buf" |/bin/shasum -)
      buf2=${buf2%% *-}
      echo "$buf2"
      if [ "$2" -eq 0 ]; then
         echo "$host-root"
         echo "allhost-root"
      else
         echo "$buf"
         echo "allhost-user"
      fi
      
    • AuthorizedPrincipalsCommandUser abc 指定程式以 abc 用戶身份執行。
      可以接受 "%u" 表示以登錄的身份執行, 但不建議。

    • 另一個例子,也可以通過webserver查詢principals。
      AuthorizedPrincipalsCommand /bin/curl -s http://localhost/sshprincipals?user=%u&serial=%s&id=%i

    • 任何用戶登錄,使用的用戶證書,簽名的CATrustedUserCAKeys列表中,
      sshd 都會先檢查 AuthorizedPrincipalsFile 中的 principals,
      如果找不到,才會執行 AuthorizedPrincipalsCommand 程式。
      如果程式的輸出中,也沒有找到匹配的 principals,則認證失敗。

    • 任何用戶登錄,使用的用戶證書,簽名的CA不在TrustedUserCAKeys列表中,
      sshd不使用AuthorizedPrincipalsFile,AuthorizedPrincipalsCommand中的principals。

    • 用戶證書的簽名CA通過TrustedUserCAKeys認證的,都必須有principals。
      無principals的用戶證書,不能登錄。即使sshd服務端的principals為空,也不能登錄。

    • AuthorizedPrincipalsFileAuthorizedPrincipalsCommand配置時,
      這種情況不匹配用戶名,用戶證書的principals包含"用戶名"無用。

  • 只要是用這個密鑰(用戶CA)簽名過的用戶公鑰,滿足 principals 要求,就能登錄此sshd伺服器的相應用戶。

  • 創建用戶密鑰。用戶自己創建,私鑰不傳遞。
    ssh-keygen -t ed25519 -C user@myhost -f users_key
    得到兩個文件,users_key , users_key.pub

  • 用 user_ca (私鑰)對用戶密鑰的公鑰簽名,得到一個用戶證書。
    只把用戶公鑰發給管理員簽名即可。只須要有"users_key.pub"公鑰文件,無需用戶的私鑰文件。
    ssh-keygen -s user_ca -I ident -n user1,principal_02 -V -10m:+90d users_key.pub
    得到一個文件 users_key-cert.pub,發回給用戶。
    -n user1,principal_02 限制證書的用戶名 或principals。不限制就去掉這個參數。
    -V -1m:+10d 限制證書的時效。不限制就去掉這個參數。
    -O source-address=192.168.123.0/24,10.1.2.3 限制來源IP。
    -O force-command="date" 強制只執行某個命令。

  • 查看已經簽名的用戶證書的內容。
    ssh-keygen -L -f users_key-cert.pub

  • 在ssh客戶端上,
    把兩個文件放在一起 users_key , users_key-cert.pub。這個文件沒用 users_key.pub
    用命令 ssh user1@sshd伺服器 -i users_key 就能夠登錄了。

  • 創建或更新 KRL 文件。然後把 KRL 文件傳到sshd伺服器上。或者直接在sshd伺服器上創建或更新。
    創建 revoke 文件,並把證書加入: ssh-keygen -k -f KRL_file key-cert.pub
    更新 revoke 文件,並把公鑰加入: ssh-keygen -ku -f KRL_file key.pub
    更新 revoke 文件,並把CA公鑰加入: ssh-keygen -ku -f KRL_file user_ca.pub
    不僅能吊銷ca簽名證書,也可以吊銷普通密鑰的公鑰。

  • 列出 KRL 文件內容: ssh-keygen -Ql -f KRL_file
    測試 key-cert.pub 是否被 revoked : ssh-keygen -Q -f KRL_file key-cert.pub

  • KRL 文件也可以是純文本的,不用 ssh-keygen 生成,格式同/etc/ssh/user_ca_list.pub,一行一個公鑰。
    例如: ssh-ed25519 AAAAC.....xx Comment
    可以是CA公鑰 user_ca.pub,也可以是普通密鑰的公鑰,也可以是用戶證書users_key-cert.pub的內容。

  • 讓sshd伺服器檢查 KRL 文件。(KRL文件,純文本或者二進位格式,都支持)
    在sshd伺服器上, /etc/ssh/sshd_config 中加入一行 RevokedKeys /path_to/KRL_file ,
    重啟 sshd 服務生效, service sshd restart
    /path_to/KRL_file 文件的許可權mode可以是 0600 或 0644。
    之後再次修改 KRL 文件,無需重啟sshd。

  • sshd伺服器會最先檢查 KRL 文件。
    即,會吊銷在 TrustedUserCAKeys,AuthorizedKeysFile,AuthorizedKeysCommand中的公鑰。

  • 區別:

    • 用戶證書認證, 可以限制登錄用戶名 或principals, 可以設置有效期, 可以限制來源IP。
    • 密鑰認證, 無這些功能。

公鑰的動態認證

  • 在sshd伺服器上, /etc/ssh/sshd_config 中加入兩行:
    AuthorizedKeysCommandUser /etc/ssh/keys.sh %u %U
    AuthorizedKeysCommandUser root , (或指定一個別的用戶身份)
    重啟 sshd 服務生效, service sshd restart
    #!/bin/sh
    # 例子 /etc/ssh/keys.sh 文件, 許可權mode是 0755,owner,group 都是 root
    # 傳入兩個參數 $1=username,$2=user ID
    # 例子中, $1 $2 沒有使用
    # 因 OpenSSH 許可權提升漏洞 (CVE-2021-41617), 此程式只能由管理員編寫,不應該開放給用戶修改。
    echo "ssh-ed25519 AAAAC.....xx Comment"   # 普通密鑰的公鑰
    echo "cert-authority ssh-ed25519 AAAAC.....xx Comment"   # CA的公鑰,無principals限制
    # CA的公鑰, 有principals限制
    echo 'cert-authority,principals="host02,allhost" ssh-ed25519 AAAAC.....xx Comment'
    
  • AuthorizedKeysCommandUser abc 指定程式以 abc 用戶身份執行。
    可以接受 "%u" 表示以登錄的身份執行, 但不建議。
  • 任何用戶登錄,sshd 都會先檢查 AuthorizedKeysFile 中的公鑰,
    如果找不到,才會執行 AuthorizedKeysCommand 程式。
    如果程式的輸出中,也沒有找到匹配的公鑰,則繼續其他認證,如TrustedUserCAKeys
  • 任何用戶登錄,使用的用戶證書,簽名的CAAuthorizedKeysFileAuthorizedKeysCommand中找到,
    是否有principals限制看匹配行的principals=""
    AuthorizedPrincipalsFile,AuthorizedPrincipalsCommandcert-authority...匹配行中,
    • 如果無principals= 則用戶證書無principals可以登錄,或者用戶證書有principals,且包含用戶名 才能登錄。
    • 如果有principals="xx02,xx03" 則用戶證書有principals,且包含任意一個principal 才能登錄。

ssh登錄過程中,基於簽名(證書)的伺服器認證

  • 基於 openSSH-8.0p1 , 測試成功。
  • 創建 用於簽發伺服器證書的密鑰(伺服器CA)。管理員創建,私鑰不傳遞。
    ssh-keygen -t ed25519 -C server_ca@myCA -f server_ca
    得到兩個文件,server_ca , server_ca.pub
    只是密鑰對,不是證書。因為沒做自簽名證書。
  • 讓ssh客戶端信任"伺服器CA"的公鑰。(用戶級)
    在ssh客戶端上, 用戶的 ~/.ssh/known_hosts 中加入一行(伺服器CA的公鑰)。此文件許可權mode通常是0644。
    @cert-authority * ssh-ed25519 AAAAC.....xx server_ca@myCA
    內容為 server_ca.pub 文件的內容。
  • 讓ssh客戶端信任"伺服器CA"的公鑰。(全局)
    在ssh客戶端上,/etc/ssh/ssh_known_hosts 中加入一行(伺服器CA的公鑰)。此文件許可權mode是0644。
    @cert-authority * ssh-ed25519 AAAAC.....xx server_ca@myCA
    內容為 server_ca.pub 文件的內容。
  • 只要是這個密鑰(伺服器CA)簽名過的伺服器公鑰,配置到sshd伺服器之後。ssh連接伺服器時,就不會有連接警告。
  • 用 server_ca (私鑰)對伺服器的公鑰簽名,得到伺服器證書。
    直接在sshd伺服器上簽名,或者把伺服器的三個公鑰發給管理員簽名。
    對於openSSH-8,是這三個ssh_host_ecdsa_key.pub,ssh_host_ed25519_key.pub,ssh_host_rsa_key.pub
    比如,簽其中一個: ssh-keygen -s server_ca -I ident -h /etc/ssh/ssh_host_ed25519_key.pub
    得到一個文件 ssh_host_ed25519_key-cert.pub
    別忘了 -h 參數,漏了就無效了。
    可以帶上 -V -1m:forever -n "*.myhost.cn,*.xxx.com"
    -n abc.mydomain.com 限制證書的功能變數名稱,IP。不限制就去掉這個參數。
    -V -1m:+3d 限制證書的時效。不限制就去掉這個參數。
    可以對多個不同類型的公鑰簽名,得到不同類型的伺服器證書。
    sshd伺服器原本使用的密鑰,不滿意,可以在sshd伺服器上重新生成一遍。保證伺服器私鑰不傳遞。見下麵【更新sshd服務端的通訊密鑰/證書】部分。
  • 查看已經簽名的伺服器證書的內容。
    ssh-keygen -L -f ssh_host_ed25519_key-cert.pub
  • 在sshd伺服器上,修改 /etc/ssh/sshd_config 加三行,
    HostCertificate /etc/ssh/ssh_host_ecdsa_key-cert.pub
    HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
    HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
    如果只簽一個類型的伺服器證書,HostCertificate /etc/ssh/.... 就只寫一行吧。
    重啟 sshd,執行 /sbin/service sshd reload
  • 在ssh客戶端上,用命令 ssh user1@sshd伺服器 就沒有連接警告了。
  • 讓ssh客戶端 revoked 伺服器的公鑰。(用戶級)
    在ssh客戶端上,用戶的 ~/.ssh/known_hosts 中加入一行的公鑰。
    @revoked * ssh-ed25519 AAAAC.....xx server_ca@myCA
    內容可以是CA公鑰 server_ca.pub,也可以是普通伺服器的公鑰,也可以是伺服器證書ssh_host_ed25519_key-cert.pub的內容。
  • 讓ssh客戶端 revoked 伺服器的公鑰。(全局)
    在ssh客戶端上,/etc/ssh/ssh_config 中加入 RevokedHostKeys /path_to/KRL_file
    /path_to/KRL_file文件許可權mode是0644。
    KRL文件格式,可以是純文本,一行一個公鑰。也可以是由ssh-keygen生成的二進位格式。
    ssh-keygen 創建 KRL 文件,見前面【基於簽名(證書)的用戶認證】部分。
  • 讓ssh客戶端 revoked 伺服器的公鑰。(全局)
    在ssh客戶端上,/etc/ssh/ssh_known_hosts 中加入一行,也可以。此文件許可權mode是0644。
    @revoked * ssh-ed25519 AAAAC.....xx server_ca@myCA

更新 sshd 服務端的通訊密鑰/證書,保證伺服器安全

  • 目前的 OpenSSH-8 需要三套密鑰,一共六個文件。
    cd /etc/ssh/
    ssh-keygen -l -f ssh_host_rsa_key  #看一下,原來密鑰的註釋是什麼。然後決定下麵的 -C 參數寫什麼
    
    ssh-keygen -t ecdsa -b 384 -C root@你的機器名 -f ssh_host_ecdsa_key
    ssh-keygen -t ed25519 -C root@你的機器名 -f ssh_host_ed25519_key
    ssh-keygen -t rsa -b 4096 -C root@你的機器名 -f ssh_host_rsa_key
    service sshd restart   #重啟sshd服務
    
  • 其中,
    ecdsa預設是256bit,可以用 -b 指定,
    ed25519固定是256bit,不能改,
    rsa預設已經從2048改為3072bit了,可以用 -b 指定。
  • 還有個簡單的辦法。
    刪除所有的伺服器密鑰 rm /etc/ssh/ssh_host_* , 重新用預設值生成一遍 ssh-keygen -A
    重啟sshd服務 service sshd restart
  • 參考【更換ssh通信證書,ssh更改公鑰和密鑰,以保證伺服器安全
    更換ssh通信證書,ssh更改公鑰和密鑰,以保證伺服器安全

---end---


轉載註明來源: 本文鏈接 https://www.cnblogs.com/osnosn/p/16870594.html 來自osnosn的博客.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Go 程式運行時,有些場景下會導致進程進入某個“高點”,然後就再也下不來了。 比如,多年前曹大寫過的一篇文章講過,在做活動時線上涌入的大流量把 goroutine 數抬升了不少,流量恢復之後 goroutine 數也沒降下來,導致 GC 的壓力升高,總體的 CPU 消耗也較平時上升了 2 個點左右。 ...
  • 先看示例代碼 點擊查看代碼 #include <iostream> #include<cstring> using namespace std; class Student{ public: Student(int _age , const char * _name) { this->age=_ag ...
  • 買賣股票的最好時機(一) 描述 假設你有一個數組prices,長度為n,其中prices[i]是股票在第i天的價格,請根據這個價格數組,返回買賣股票能獲得的最大收益 1.你可以買入一次股票和賣出一次股票,並非每天都可以買入或賣出一次,總共只能買入和賣出一次,且買入必須在賣出的前面的某一天 2.如果不 ...
  • 摘要 C/S端軟體,左側導航菜單+右側頁面切換的佈局很常見。 這篇文章介紹下使用ContentControl控制項和TabControl控制項如何實現基礎的頁面切換。 一、使用ContentControl實現頁面切換 頁面使用UserControl來實現。 基於MVVM框架的思想,利用數據綁定機制,將控 ...
  • 一、基本概念 線程安全(thread safe):指的是被任意多的線程同時執行,都可以保證正確性。 除基本類型外,很少有類型是線程安全的,線程安全的責任基本落在開發者身上,System.Collections.Concurrent命名空間下的類型的除外。 線程安全最常見的手段一般是使用【排它鎖】,將 ...
  • 一、概念 《Threading in C# 》(Joseph Albahari):https://www.albahari.com/threading/ 《Threading in C# 》中文翻譯(GKarch ):https://blog.gkarch.com/topic/threading.h ...
  • 核心思路是使用Region的求交集和並集的結果與原始Region對比 Winform項目自帶這個類庫,如果使用控制台,需要先在nuget安裝System.Drawing.Common /// <summary> /// 計算兩個形狀的關係 /// </summary> /// <param name ...
  • 前言 字元設備是Linux驅動中三大設備之一,字元(char)設備是個能夠像位元組流(類似文件)一樣被訪問的設備,由字元設備驅動程式來實現這種特性。字元設備驅動程式通常至少要實現open、close、read和write的系統調用。字元終端(/dev/console)和串口(/dev/ttyS0以及類 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...