1. 程式人生 > >Consul Security Model

Consul Security Model

Security Model(安全模型)

Consul依靠輕量級gossip機制和RPC系統來提供各種功能。 這兩個系統都有不同的安全機制,這些機制源於他們的設計。 但是,Consul的安全機制有一個共同的目標:提供機密性,完整性和身份驗證。

八卦協議由Serf提供支援,Serf使用對稱金鑰或共享金鑰密碼系統。 這裡有關於Serf安全性的更多細節。 有關如何在Consul中啟用Serf的gossip加密的詳細資訊,請參閱此處的加密文件。

RPC系統支援使用端到端TLS和可選的客戶端身份驗證。 TLS是一種廣泛部署的非對稱密碼系統,是Web安全的基礎。

這意味著Consul通訊可以防止竊聽,篡改和欺騙。 這使得可以通過不受信任的網路(例如EC2和其他共享主機提供商)執行Consul。

 

»Secure Configuration(安全配置)

Consul威脅模型僅適用於Consul以安全配置執行的情況。 Consul不以預設安全配置執行。如果未啟用以下任何設定,則此威脅模型的某些部分將無效。如下面部分所述,還必須對Consul威脅模型之外的專案採取額外的安全預防措施。

  • 啟用ACL預設拒絕訪問。必須將Consul配置為使用具有白名單(預設拒絕)方法的ACL。這會強制所有請求具有顯式匿名訪問許可權或提供ACL令牌。
  • 加密已啟用。必須啟用並配置TCP和UDP加密,以防止Consul代理之間的明文通訊。至少應啟用verify_outgoing以驗證每臺具有唯一TLS證書的伺服器的伺服器真實性。還需要verify_server_hostname來防止受損代理作為伺服器重新啟動並被授予對所有機密的訪問許可權。

verify_incoming通過相互身份驗證提供額外的代理驗證,但並不是強制執行威脅模型所必需的,因為請求還必須包含有效的ACL令牌。細微之處在於,當前verify_incoming = false將允許伺服器仍然接受來自客戶端的未加密連線(以允許逐步推出TLS)。僅此一項並未違反威脅模型,但任何選擇不使用TLS的配置錯誤的客戶端都將違反該模型。我們建議將此設定為true。如果留下,則必須採取謹慎措施,以確保所有Consul客戶端如上所述使用verify_outgoing = true,但所有外部API / UI訪問必須通過HTTPS禁用HTTP監聽器。

 

»Known Insecure Configurations(已知的不安全配置)

除了配置上述非預設設定外,Consul還有幾個非預設選項,可能會帶來額外的安全風險。

  • 使用網路公開API啟用指令碼檢查。如果Consul代理(客戶端或伺服器)將其HTTP API暴露給localhost之外的網路,則enable_script_checks必須為false,否則即使配置了ACL,指令碼檢查也會出現遠端程式碼執行威脅。如果必須公開HTTP API並且可以從1.3.0開始提供,則enable_local_script_checks提供安全的替代方案。此功能也已反向移植到此處所述的修補程式版本0.9.4,1.1.1和1.2.4。
  • 遠端執行啟用。 Consul包含一個consul exec功能,允許跨群集執行任意命令。預設情況下禁用此功能,從0.8.0版本開始。我們建議將其禁用。如果啟用,則必須特別注意確保正確的ACL限制訪問,例如,任何管理令牌都授予訪問權以在群集上執行任意程式碼。
  • 驗證伺服器主機名是否單獨使用。從版本0.5.1到1.4.0,我們記錄了verify_server_hostname是真的隱含的verify_outgoing但是由於一個錯誤,情況並非如此,因此只設置verify_server_hostname會導致客戶端和伺服器之間的明文通訊。有關詳細資訊,請參閱CVE-2018-19653。這在1.4.1中得到修復。

»Threat Model(威脅模型)

以下是Consul威脅模型的部分內容:

領事代理與代理之間的溝通。 Consul代理之間的通訊應該是安全的,不會被竊聽。這需要在群集上啟用傳輸加密,並涵蓋TCP和UDP流量。

Consul agent-to-CA通訊。 Consul伺服器與Connect的已配置證書頒發機構提供程式之間的通訊始終是加密的。

篡改傳輸中的資料。任何篡改都應該是可檢測的,並導致Consul避免處理請求。

無需身份驗證或授權即可訪問資料。所有請求必須經過身份驗證和授權。這要求在群集上使用預設拒絕模式啟用ACL。

狀態修改或惡意訊息導致的損壞。丟失格式錯誤的訊息,格式良好的訊息需要身份驗證和授權。

訪問原始資料的非伺服器成員。所有伺服器必須加入群集(具有適當的身份驗證和授權)才能開始參與Raft。Raft資料通過TLS傳輸。

針對節點的拒絕服務。對節點的DoS攻擊不應該損害軟體的安全立場。

基於連線的服務到服務通訊。兩個啟用Connect的服務(本機或通過代理)之間的通訊應該是安全的,不會被竊聽並提供身份驗證。這是通過相互TLS實現的。

以下不是Consul伺服器代理的Consul威脅模型的一部分:

  • 訪問(讀取或寫入)Consul資料目錄。所有Consul伺服器(包括非領導者)都會將整個Consul狀態保留在此目錄中。資料包括所有KV,服務註冊,ACL令牌,Connect CA配置等。對此目錄的任何讀取或寫入都允許攻擊者訪問和篡改該資料。
  • 訪問(讀取或寫入)Consul配置目錄。 Consul配置可以啟用或禁用ACL系統,修改資料目錄路徑等。任何對此目錄的讀取或寫入都允許攻擊者重新配置Consul的許多方面。通過禁用ACL系統,這可能使攻擊者可以訪問所有Consul資料。
  • 對正在執行的Consul伺服器代理的記憶體訪問。如果攻擊者能夠檢查正在執行的Consul伺服器代理的記憶體狀態,則幾乎所有Consul資料的機密性都可能會受到影響。如果您使用的是外部Connect CA,則根私鑰材料永遠不會對Consul流程可用,並且可以被認為是安全的。 Service Connect TLS證書應被視為已洩露;它們永遠不會被伺服器代理持久化,但至少在簽名請求期間確實存在於記憶體中。

 

以下不是Consul伺服器代理的Consul威脅模型的一部分:

  • 訪問(讀取或寫入)Consul資料目錄。所有Consul伺服器(包括非領導者)都會將整個Consul狀態保留在此目錄中。資料包括所有KV,服務註冊,ACL令牌,Connect CA配置等。對此目錄的任何讀取或寫入都允許攻擊者訪問和篡改該資料。
  • 訪問(讀取或寫入)Consul配置目錄。 Consul配置可以啟用或禁用ACL系統,修改資料目錄路徑等。任何對此目錄的讀取或寫入都允許攻擊者重新配置Consul的許多方面。通過禁用ACL系統,這可能使攻擊者可以訪問所有Consul資料。
  • 對正在執行的Consul伺服器代理的記憶體訪問。如果攻擊者能夠檢查正在執行的Consul伺服器代理的記憶體狀態,則幾乎所有Consul資料的機密性都可能會受到影響。如果您使用的是外部Connect CA,則根私鑰材料永遠不會對Consul流程可用,並且可以被認為是安全的。 Service Connect TLS證書應被視為已洩露;它們永遠不會被伺服器代理持久化,但至少在簽名請求期間確實存在於記憶體中。

 

以下不是Consul客戶端代理的Consul威脅模型的一部分:

  • 訪問(讀取或寫入)Consul資料目錄。 Consul客戶端將使用資料目錄來快取本地狀態。這包括本地服務,關聯的ACL令牌,Connect TLS證書等。對此目錄的讀或寫訪問許可權允許攻擊者訪問此資料。該資料通常是群集的完整資料的較小子集。
  • 訪問(讀取或寫入)Consul配置目錄。 Consul客戶端配置檔案包含服務的地址和埠資訊,代理的預設ACL令牌等。訪問Consul配置可以使攻擊者能夠將服務埠更改為惡意埠,註冊新服務等。此外,某些服務定義具有附加的ACL令牌,可以在群集範圍內用於模擬該服務。攻擊者無法更改群集範圍的配置,例如禁用ACL系統。
  • 對正在執行的Consul客戶端代理的記憶體訪問。其爆炸半徑遠小於伺服器代理,但資料子集的機密性仍然可能受到損害。特別是,針對代理的API請求的任何資料(包括服務,KV和連線資訊)可能會受到損害。如果代理從未請求伺服器上的特定資料集,則它永遠不會進入代理的記憶體,因為複製僅存在於伺服器之間。攻擊者還可能提取用於此代理上的服務註冊的ACL令牌,因為令牌必須與註冊的服務一起儲存在記憶體中。
  • 對本地Connect代理或服務的網路訪問。服務和連線感知代理之間的通訊通常是未加密的,必須通過可信網路進行。這通常是一個環回裝置。這要求同一臺機器上的其他程序受信任,或者使用更復雜的隔離機制,例如網路名稱空間。這還要求外部程序無法與Connect服務或代理進行通訊(入站埠除外)。因此,非本機Connect應用程式應僅繫結到非公共地址。
  • 實施不當連線代理或服務。 Connect代理或本機整合服務必須相互關聯

 

» External Threat Overview(外部威脅概述)

有四個元件會影響Consul威脅模型:伺服器代理,客戶端代理,Connect CA和Consul API客戶端(包括Connect的代理)。

伺服器代理通過Raft參與領導者選舉和資料複製。與其他代理的所有通訊都是加密的。資料以未加密的形式儲存在已配置的資料目錄中。儲存的資料包括ACL令牌和TLS證書。如果內建CA與Connect一起使用,則根證書私鑰也儲存在磁碟上。外部CA提供程式不會將資料儲存在此目錄中。必須小心保護此資料目錄,以防止攻擊者冒充伺服器或特定ACL使用者。我們計劃隨著時間的推移將更多緩解措施(包括至少部分資料加密)引入資料目錄,但資料目錄應始終被視為機密。

要使客戶端代理加入群集,它必須提供具有node:write功能的有效ACL令牌。連線請求和客戶端與伺服器代理之間的所有其他API請求都通過TLS進行通訊。客戶端為Consul API提供服務,並通過共享TLS連線將所有請求轉發給伺服器。每個請求都包含一個ACL令牌,用於身份驗證和授權。不提供ACL令牌的請求將繼承代理可配置的預設ACL令牌。

Connect CA提供程式負責儲存用於簽名和驗證通過Connect建立的連線的根(或中間)證書的私鑰。 Consul伺服器代理通過加密方法與CA提供程式進行通訊。此方法取決於正在使用的CA提供程式。 Consul提供了一個內建CA,可在伺服器代理上本地執行所有操作。除內建CA外,Consul本身不儲存任何私鑰材料。

Consul API客戶端(代理本身,內建UI,外部軟體)必須通過TLS與Consul代理進行通訊,並且必須為每個請求提供ACL令牌以進行身份​​驗證和授權。

 

»Network Ports(網路埠)

有關配置網路規則以支援Consul的資訊,請參閱Ports Used Consul使用的網路埠列表以及它們用於哪些功能的詳細資訊。

ports This is a nested object that allows setting the bind ports for the following keys:

  • dns - The DNS server, -1 to disable. Default 8600.
  • http - The HTTP API, -1 to disable. Default 8500.
  • https - The HTTPS API, -1 to disable. Default -1 (disabled). We recommend using 8501 for https by convention as some tooling will work automatically with this.
  • grpc - The gRPC API, -1 to disable. Default -1 (disabled). We recommend using 8502 for grpc by convention as some tooling will work automatically with this. This is set to 8502 by default when the agent runs in -devmode. Currently gRPC is only used to expose Envoy xDS API to Envoy proxies.
  • serf_lan - The Serf LAN port. Default 8301.
  • serf_wan - The Serf WAN port. Default 8302. Set to -1 to disable. Note: this will disable WAN federation which is not recommended. Various catalog and WAN related endpoints will return errors or empty results.
  • server - Server RPC address. Default 8300.
  • proxy_min_port Deprecated - Minimum port number to use for automatically assigned managed proxies. Default 20000.
  • proxy_max_port Deprecated - Maximum port number to use for automatically assigned managed proxies. Default 20255.
  • sidecar_min_port - Inclusive minimum port number to use for automatically assigned sidecar service registrations. Default 21000. Set to 0 to disable automatic port assignment.
  • sidecar_max_port - Inclusive maximum port number to use for automatically assigned sidecar service registrations. Default 21255. Set to 0 to disable automatic port assignment.