共用方式為


什麼是 SSH 狀態控制?

SSH 狀態控制可讓您在支援的 Linux 散發版本上稽核及設定 SSH 伺服器安全性狀態,包括 Ubuntu、Red Hat、Azure Linux 等等。 SSH 狀態控制可順暢地與 Azure 治理服務整合(原則、計算機設定),以便您可以:

  • 確保符合業界或組織中 sshd 標準的合規性
  • 減少 sshd 型遠端管理的受攻擊面
  • 確保整個車隊的 sshd 設定一致,以確保安全性和生產力

顯示符合規範 SSH 檢查清單的螢幕快照

為了協助您示範稽核員的合規性(並協助您視需要採取動作),每個合規性檢查都包含透過 原因 字段提供證據,指出合規性或不符合規範的判斷方式。

您可以自定義 sshd 參數(埠號碼、允許的群組等),或使用原則預設值,這些預設值會與適用於 Linux 的 Azure 安全性基準一致。

用戶入門檔

選取僅限稽核與稽核和設定行為

指派 SSH 狀態控制原則時,您可以選擇 僅限稽核(也稱為「稽核」)行為,或 稽核與設定(也稱為「設定」)行為。

原則定義 Azure 原則效果 預期事項的注意事項
僅限稽核的行為 **Audit** SSH Posture Control on Linux machines auditIfNotExists 相較於許多熱門的系統映像,此原則包含更嚴格的設定。 例如,拒絕根 SSH 存取。 因此,預計會看到 不符合規範的 州報告。
稽核和設定行為 **Configure** SSH Posture Control on Linux machines deployIfNotExists 如上所述,您預期會看到 一開始回報不符合規範 狀態。 之後,計算機會重新設定為符合原則,最終 符合規範 狀態。

對於現有的計算機,系統管理員通常會從僅限稽核的行為開始,以判斷現有的狀態,並探索相依性,例如系統自動化允許的帳戶。 比較現有的機隊與 SSH 狀態控制項預設值之後,您將決定要自定義的 SSH 狀態控制參數。 在此分析和規劃之後,您接著會轉換至稽核和設定行為(如通道等安全部署做法)。

針對綠地案例或可處置的測試機器,您可以選擇略過該分析,並直接移至稽核和設定行為,從強式 SSH 狀態控制預設值開始全新。

謹慎

在設定任何機器之前,請非常小心地驗證您的新設定。 您可能會不小心失去機器的存取權。

不小心把自己鎖定的範例包括:

  • 套用的淨授權設定(allowUsersdenyGroupspermitRootLogin等的組合)不允許您需要的登入
  • 您為 sshd 設定的 port 會遭到環境中其他控制件封鎖(SELinux 原則、主機防火牆規則、網路防火牆規則等)
    • 請注意,許多 Red Hat 系列散發版本預設都有 SELinux 原則,預設會封鎖 sshd 使用 22 以外的埠。
    • 為了避免超越企業小組界限,SSH 狀態控制只會設定 sshd。 它目前不會嘗試修改機器上的 SELinux 原則、防火牆規則等,以容納已設定的 sshd 埠。 如果您想要與我們討論這些案例,請與我們連絡(請參閱下方 其他資源)。

SSH 狀態控制範圍:規則、預設值和自定義

下表列出可使用 SSH 狀態控制件稽核或設定的專案。 每個規則稱為 規則

每個規則都有預設組態值,符合適用於Linux的Azure安全性基準。

大部分的規則都可以透過原則指派 參數來指定自定義值, 來針對或設定和稽核進行稽核。 例如,如果組織中的標準是針對 sshd 使用埠 1111 (而不是 22),您會在原則指派中設定對應的參數。 這些參數具有下表中包含的標識碼。 一般而言,簡短參數名稱會以程序設計方式使用(例如搭配 az policy assignment create --params ...),而較長的參數顯示名稱則用於 Azure 入口網站工作流程中。

自定義值時,請小心提供與 sshd 相容的值。 例如,allowGroups 採用以空格分隔的組名模式清單。 如需參考,請參閱 sshd_config man 頁面。 sshd_config參考也有助於瞭解其他 sshd 行為,例如 如何允許拒絕 清單交集。

注意

若要保留表格配置,某些儲存格值已移至表格下方的腳註。

規則名稱 預設值 參數名稱 參數顯示名稱
確定已設定 /etc/ssh/sshd_config 的許可權 600 <腳注 1> sshd_config的訪問許可權
確定已設定 IgnoreRhosts 是的 ignoreHosts 忽略羅得和搖晃
確定已設定LogLevel 資訊 logLevel 記錄詳細資訊層級
確定已設定 MaxAuthTries 6 maxAuthTries 驗證嘗試次數上限
確定已設定允許的 SSH 存取使用者 @ <請參閱腳注 5> allowUsers 允許的 SSH 使用者
確定已設定拒絕的 SSH 存取使用者 denyUsers SSH 的拒絕使用者
確定已設定允許的 SSH 存取群組 * allowGroups SSH 允許的群組
確定已設定 SSH 存取的拒絕群組 denyGroups SSH 的拒絕群組
確定已設定 HostbasedAuthentication hostBasedAuthentication 主機型驗證
確定已設定 PermitRootLogin permitRootLogin root 是否可以使用 ssh 登入
確定已設定 PermitEmptyPasswords permitEmptyPasswords 伺服器是否允許登入具有空密碼字串的帳戶
確定已設定 ClientAliveCountMax 0 clientAliveCountMax 客戶端運作中訊息的數目,這些訊息可能會在未透過 SSHD 從用戶端接收任何訊息的情況下傳送
確定已設定 ClientAliveInterval 3600 clientAliveInterval 逾時間隔,以秒為單位,如果尚未從用戶端接收任何數據,sshd 會傳送訊息以要求回應
確定已設定 MAC <腳注 2> <腳注 3> 可用的訊息驗證碼 (MAC) 演算法清單
確定已設定橫幅 <腳注 4> banner 允許驗證之前傳送給遠端使用者的橫幅檔案內容
確定已設定 PermitUserEnvironment permitUserEnvironment ~/.ssh/environment 和 environment= 中 ~/.ssh/authorized_keys 中的選項是否由 sshd 處理
確定已設定加密 aes128-ctr,aes192-ctr,aes256-ctr ciphers 允許的加密清單
確定已設定 SSH 埠 22 port SSH 埠
確定已使用最佳做法通訊協定 2 <沒有參數> <沒有參數>

表格腳註:

  1. accessPermissionsForSshdConfig

  2. messageAuthenticationCodeAlgorithms

  3. hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-512-etm@openssh.com

  4. #######################################################################\n\nAuthorized access only!\n\nIf you are not authorized to access or use this system, disconnect now!\n\n#######################################################################\n

    1. 注意:這會向用戶顯示如下:
    #######################################################################
    
    Authorized access only!
    
    If you are not authorized to access or use this system, disconnect now!
    
    #######################################################################
    
  5. allowUsers 預設值 “@” 代表計算機上的所有帳戶

其他 (非 sshd) 原則參數

這些額外的原則參數可在原則指派期間使用。 這些會影響 Azure 原則指派行為,而不是機器上的 sshd 設定。

名字 描述 違約
包含 Arc 連線的伺服器 選取此選項,即表示您同意依每個Arc連線的電腦每月收費。
影響 啟用或停用此原則的執行 <取決於 選取僅限稽核與設定行為>

原則定義? 原則指派? 來賓指派? 計算機設定? 這一切如何配合在一起?

若要開始使用 SSH 狀態控制,您的核心動作是建立 原則指派。 您的原則指派會將 原則定義 連結至 範圍(例如「my_factory_3_resource_group」)。

當您使用系統時,您將會遇到其他資源類型和術語,如下所述。

圖表,顯示原則指派如何透過客體指派將機器連結至計算機設定服務

描述
原則定義 在原則服務中,摘要數據,其描述可用稽核和/或組態行為的叢集。 例如,「稽核 Linux 機器上的 SSH 狀態控制」。
原則指派 將抽象原則定義連結至具體範圍,例如資源群組。 原則指派可以包含參數和其他該指派特有的屬性。
電腦設定 處理作業系統層級稽核和設定設定的 Azure 服務和代理程式。
來賓指派 做為原則指派、計算機和計算機組態服務之間的三向鏈接的資源。 原則會視需要建立及監視來賓指派資源。
如需有關「來賓」與「計算機」術語的詳細資訊,請參閱 為什麼我在位置看到「來賓設定」和「自動管理」詞彙?
電腦 已啟用 Arc 的電腦或 Azure VM。

關於相容性 (散發版本、SSH 伺服器實作等)

SSH 狀態控制是針對 單一長時間執行 SSH Server 實例的主要一般用途 Linux 案例所設計:

  • 其生命週期由 init 系統 sush 管理為 systemd
  • 其行為是由 sshd_config 檔案所探索,與OpenSSH sshd行為一致
  • 其有效組態/狀態會由 sshd -T 輸出顯示,與OpenSSH sshd行為一致

針對所有支援的散發版本(請參閱下方),這是預設的 SSH 伺服器使用案例。

原則上,計算機可能會有任意數目的 SSH 伺服器實例,其存留期會根據任意數目的程式碼基底執行,並從任意數目的位置取得組態(組態檔、命令行自變數、編譯時間參數等等)。 這種情況目前沒有 SSH 狀態控制的範圍。 如果您對未來這類情況感興趣,請 與我們連絡, 討論。

SSH 狀態控制適用於 Azure 原則和計算機組態所支援的 Linux 散發版本,但不包括開發時處於擴充支援狀態的散發版本。 具體來說,下列專案在 2024-06-05 的範圍內:

  • AlmaLinux 9
  • Amazon Linux 2
  • Ubuntu Server 20.04
  • Ubuntu Server 22.04
  • Debian 10
  • Debian 11
  • Debian 12
  • Azure Linux (CBL Mariner) 2
  • Oracle Linux 7
  • Oracle Linux 8
  • CentOS 7.3
  • CentOS 8
  • RHEL 7.4
  • RHEL 8
  • RHEL 9
  • Rocky Linux 9
  • SLES 15

在可行的情況下,SSH 狀態控制件會使用上述發行版的特定廣泛使用系統組合進行測試。 例如,散發版本維護人員在 Azure 資源庫中發佈的 OS 映射組合。 在運行時間與任何特定計算機的相容性無法保證,因為系統管理員和映射產生器可以自由地從 OS 移除元件、讓檔案系統成為唯讀、封鎖代理程式動作與 SELinux 等。

與 sshd_config Include 指示詞的相容性

SSH 狀態控制件會嘗試在 sshd_config 中容納及使用 Include 指示詞,如下所示:

  • 針對稽核/讀取動作:依賴 sshd -T 來反映 sshd 觀點中的 net 組態,並考慮任何 Include。
  • 針對設定/寫入動作:
    • 如果電腦上的 sshd 實作支援 Include,請將新的 SSH 狀態控制特定檔案連結至sshd_config(以 Include 的形式)。 接著,將所有寫入放入連結的 SSH 狀態控制檔案中。 這可增強系統變更的系統衛生和可追蹤性。
    • 如果電腦上的 sshd 實作不支援 Include 指示詞,請直接將任何設定變更寫入sshd_config。

與sshd_config Match 指示詞的相容性

SSH 狀態控制是設計來稽核和設定核心 sshd 行為。 它不會嘗試與條件式 Match 區塊互動(如果有的話),這些區塊可以將不同的 sshd 組態套用至特定母體。

如何以程式設計方式查詢結果?

使用 Azure Resource Graph (ARG) 查詢,您可以將指派和狀態數據整合到您自己的工作流程中。 這些範例會使用PowerShell中的 Search-AzGraph 來執行ARG查詢,但不需要PowerShell。 您可以從許多進入點使用ARG,包括 Azure 入口網站、Azure CLI、REST 呼叫等等。

  1. 在摘要的最高高度,您可以取得每個合規性狀態貯體的計算機計數。 例如:

    $machineCountsQuery = @'
    // SSH machine counts by compliance status
    guestconfigurationresources
    | where name contains "LinuxSshServerSecurityBaseline"
    | extend complianceStatus = tostring(properties.complianceStatus)
    | summarize machineCount = count() by complianceStatus
    '@
    
    Search-AzGraph -Query $machineCountsQuery
    
    <#
    Sample output from an environment with two machines:
    
    complianceStatus machineCount
    ---------------- ------------
    Pending                     1
    Compliant                   1
    #>
    
  2. 若要深入鑽研,以便依計算機查看整體合規性狀態,您可以使用下列專案:

    $machinePerRowQuery = @'
    // SSH machine level compliance
    guestconfigurationresources
    | where name contains "LinuxSshServerSecurityBaseline"
    | project 
     machine = split(properties.targetResourceId,'/')[-1],
     complianceStatus = properties.complianceStatus,
     lastComplianceStatusChecked = properties.lastComplianceStatusChecked
    '@
    
    Search-AzGraph -Query $machinePerRowQuery
    
    <#
    Sample output:
    
    machine     complianceStatus lastComplianceStatusChecked
    -------     ---------------- ---------------------------
    sshdemovm01 Compliant        2/15/2024 11:07:21 PM
    sshdemovm02 Pending          1/1/0001 12:00:00 AM
    #>
    
  3. 若要向下切入至設定詳細數據,您可以使用下列專案:

    $settingPerRowQuery = @'
    // SSH rule level detail
    GuestConfigurationResources
    | where name contains "LinuxSshServerSecurityBaseline"
    | project report = properties.latestAssignmentReport,
     machine = split(properties.targetResourceId,'/')[-1],
     lastComplianceStatusChecked=properties.lastComplianceStatusChecked
    | mv-expand report.resources
    | project machine,
     rule = report_resources.resourceId,
     ruleComplianceStatus = report_resources.complianceStatus,
     ruleComplianceReason = report_resources.reasons[0].phrase,
     lastComplianceStatusChecked
    '@
    
    Search-AzGraph $settingPerRowQuery
    
    <#
    Sample output:
    
    machine     rule                                                  ruleComplianceStatus     ruleComplianceReason
    -------     ---------------                                                  ------               ------
    sshdemovm01 Ensure permissions on /etc/ssh/sshd_config are configured        true            Access to '/etc/ssh/sshd_config' matches required ...
    sshdemovm01 Ensure SSH is configured to meet best practices (protocol 2)     true            'Protocol 2' is found uncommented in /etc/ssh/sshd_config
    sshdemovm01 Ensure SSH is configured to ignore rhosts                        true            The sshd service reports that 'ignorerhosts' is set to 'yes'
    sshdemovm01 Ensure SSH LogLevel is set to INFO                               true            The sshd service reports that 'loglevel' is set to 'INFO'
    sshdemovm01 Ensure SSH MaxAuthTries is configured                            true            The sshd service reports that 'maxauthtries' is set to '6'
    sshdemovm01 Ensure allowed users for SSH access are configured               true            The sshd service reports that 'allowusers' is set to '*@*'
    sshdemovm01 Ensure denied users for SSH are configured                       true            The sshd service reports that 'denyusers' is set to 'root'
    sshdemovm01 Ensure allowed groups for SSH are configured                     true            The sshd service reports that 'allowgroups' is set to '*'
    sshdemovm01 Ensure denied groups for SSH are configured                      true            The sshd service reports that 'denygroups' is set to 'root'
    sshdemovm01 Ensure SSH host-based authenticationis disabled                  true            The sshd service reports that 'hostbasedauthentication' is ...
    #>
    

為什麼我在位置中看到「來賓設定」和「自動管理」詞彙?

電腦組態服務也稱為 客體設定Automanage Machine Configuration。 當您與服務和文件互動時,可能會遇到這些名稱。 例如:

  • 在本文中的 Azure Resource Graph 查詢範例中,數據表稱為 guestconfigurationresources
  • 在 Azure 入口網站中,觀察結果的實用檢視稱為「來賓指派」。
  • 在 Azure 入口網站中,套用相關的 VM 擴充功能以啟用電腦設定時,擴充功能標題為「自動管理計算機設定」。

針對 SSH 狀態控制的目的,「來賓」與「計算機」之間沒有有意義的區別。 已啟用Arc的機器和 Azure VM 符合資格。

內建原則定義的標識元為何?

在某些情況下,例如使用 Azure CLI 建立原則指派,可能很有用或有必要依標識符參照原則定義,而不是顯示名稱。

displayName id
稽核 Linux 機器上的 SSH 狀態控制 /providers/Microsoft.Authorization/policyDefinitions/a8f3e6a6-dcd2-434c-b0f7-6f309ce913b4
在 Linux 電腦上設定 SSH 狀態控制 /providers/Microsoft.Authorization/policyDefinitions/e22a2f03-0534-4d10-8ea0-aa25a6113233