Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~
本篇是 建構安全軟體開發 系列文的 EP27。
近期相當流行透過 Container (容器) 來進行應用部屬,在開發部屬上有其應用的便利性、可攜性與快速重用性。
Application container technologies, also known as containers, are a form of operating system
virtualization combined with application software packaging. Containers provide a portable,
reusable, and automatable way to package and run applications. This publication explains the
potential security concerns associated with the use of containers and provides recommendations
for addressing these concerns.
上文擷取自 NIST: SP800-190 ii 摘要。
但也因如此也帶來了以下兩點的風險:
進而產生三種類型的威脅情境的存在:
若有興趣進一步了解,可以閱讀 NIST: SP800-190:
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-190.pdf
但請注意 Virtual Machine 跟 Container 是不同的觀念:
上圖取自 NIST: SP800-190 第 5 頁 Figure 2
上圖最左邊是 Virtual Machines 的架構概念示意;右邊兩者則是 Container 的架構概念示意(又可細分 Container 是否架構在 VMs 之上)。
Trust Computing Base (TCB) 指的是從硬體、韌體到重要的基礎軟體元件是否有其安全保證。也就是說若無 TCB 的電腦設備是無法保證能通過其安全政策,在設備當中構成運算的每個元件都必須要受到安全的信任。
相較之下 TPM/T1&T2 等安全性加密晶片被可信任的 TCG(Trust Computing Group) 製造商製造出來後且運用在電腦設備當中,強化了平台加密演算的保證性,並且提供了軟體系統透過此些加密晶片取得更好的安全環境。
一個好的加密演算相關的技術考量三要素:
Database (資料庫)很常被視作應用層攻擊的目標,尤其是可以透過應用的程式碼漏洞(非法)存取資料。而且通常攻擊者也不會輕易洩漏其問題,以便能更隱晦、更長遠的竊取資料。
以下提供幾種在資料庫當中可控的安全性作為:
Encryption:
將所有的應用資料皆加解密在實務上並不切實際,但可以選取特定的機敏性資料當中在應用存取過程中額外進行加解密的處理。
當然,若使用資料庫系統支援 TDE (Transparent Data Encryption) 功能時,可以啟用相關的 TDE 功能來保護整個資料庫的資料與日誌紀錄,讓應用程式的開發人員不需要進行額外處理。而在絕大多數的資料庫系統在交易執行上,啟用 TDE 後並不會造成太多額外的效能耗損。
Triggers:
在資料庫中的這類觸發式的預存程序(store procedure),在某種程度上透過一般使用權的帳號,就可以透過這些 Trigger 執行某些超乎預期的工作。例如: CAPEC-108: Command Line Execution through SQL Injection。
Views:
在資料庫很多查詢運用的認知中,常把 View 當作動態的資料表使用,但其實透過 View 的運用可以有效的避免資料表的儲存結構(schema)外洩,而且 View 也可以提供適切的資料給需要的使用者,以避免不該讓該使用者知道的資料外洩。但雖然 View 的使用妥當可以帶來存取資料庫的安全性,但可能會造成反應速度較慢與佔據資料庫服務的記憶體資源,其優缺點比較可參考下列連結介紹:
https://ecomputernotes.com/fundamental/what-is-a-database/what-is-a-database-view
Privilege management:
給予使用者適切的權限,並妥善管理其權限的控制。
在電腦程式語言當中最常見的就是分 "Unmanaged code" and "Managed code" 這兩大類,各別的代表為:
其 Managed code 就是透過 "Automatic Memory Management and Destruction of Unneeded Object" 的觀點來管理運作時的記憶體,其實作代表有 "CLR (for .NET)" 與 "JVM (for Java)"。
並且透過 Managed code 撰寫的應用程式,較無法繞過其運作的管理環境(CLR or JVM),去直接存取作業系統的服務與核心,因此無法任意的濫用系統服務。
作業系統控制與系統服務。
一套典型的作業系統會提供 Bootloader、Kernel、Utilities、Services、Shell/Command 操控 與 Graphical/Command 介面...等功能。
當代的作業系統都會將 Kernel (核心) 程式獨立切割出來設計執行,通常 Kernel (核心) 程式指的是控制 CPU、Memory、硬體裝置(通稱系統資源)。
避免系統執行過程遭到應用程式的執行影響而被破壞。而最基本的設計概念就是透過權限管控,以避免使用者誤用或被惡意濫用。
而除了上述的作業系統還會透過額外的 Driver(驅動程式) 去認識與操作各種硬體裝置,所以 Driver(驅動程式) 的安全性設計,對於作業系統的運作是很重要的,請回顧 EP05。