安全方案的四個原則
安全方案的四個原則
一、Secure by Default 原則(預設安全)
這是安全方案中的最基本的原則。該原則可以歸納為白名單、黑名單思想。
1.黑名單、白名單
白名單:除了名單上的,其他都不被信任;黑名單:除了不信任名單上的,其他都預設信任。
更多地使用白名單,會讓系統變得更加安全。
但是白名單本身也不一定安全,問題就在於白名單上那些被信任的是不安全的時候,白名單就變得不安全了。比如說白名單裡某一項是萬用字元*,那麼白名單的安全性就很難保證了。
2.最小權原則
最小全原則:只給主體能夠完成當前任務的最小許可權,避免主體擁有過高許可權。
該原則同時也是安全設計的基本原則之一。
比如在linux系統中,儘可能只用普通賬戶登陸,需要的時候才用sudo命令獲得更高許可權。
二、縱深防禦原則
縱深防禦原則有兩層的含義:一層是,要在系統的不同層面,不同方面實施安全方案,避免出現疏漏,不同的方案之間需要相互的配合從而構成一個整體。另一層是,要在正確的地方做正確的事,要在能夠解決根本問題的地方實施針對性的方案。
對於第一層的理解,類似自來水廠過濾髒水,其中要經過多道過濾,每一道的目標和過濾物件並不完全相同,多道過濾層層遞進能夠保證最終的水是乾淨的。在安全中,應該把他分為多層面考慮,如web安全,os安全資料庫安全等,每層安全應該彼此配合形成體系。
對於第二層,關鍵在於在解決根本問題的地方實施針對性的方案 ,也就是說需要深入的理解威脅的本質,做出正確有效的應對方案。
一個反面例子是早期對於xss的防禦,早期xss防禦策略是過濾一些特殊字元,以此來避免惡意程式碼攻擊,但是這樣往往會改變使用者輸入的意思。比如說:1 < 2 變成 12 ,特殊字元<被過濾導致使用者輸入意圖被改變。
其問題原因是該策略 “沒有在正確的地方做正確的事”,xss攻擊發生的位置實際上是在使用者的瀏覽器上,或者說是 伺服器輸出給使用者瀏覽器的html頁面中被注入了惡意程式碼。 對系統取得的使用者輸入做過濾其實是不合適的。
三、資料與程式碼分離原則
該原則特別適合各種 “注入” 攻擊的場合。另外快取區溢位也可以看作違背這一原則的後果,程式在棧或堆疊中,錯吧資料當作程式碼執行。
一個例子是這樣的
<html> <body> <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <input type="text" name="fname"> <input type="submit"> </form> <?php $name = $_REQUEST['fname']; echo $name; ?> </body> </html>
上面的php程式碼,能夠把使用者輸入的資料輸出到螢幕上。例如
這段程式碼存在漏洞,那就是沒有做到資料和程式碼的分離,資料會直接輸出到傳送給使用者的thml程式碼中
這也就會導致,假如使用者輸入額是一段惡意程式碼,比如一段xss攻擊程式碼:,就會導致:
造成xss攻擊。
四、不可預測性原則
在此前的三個原則,secure default是最基本的原則;縱深防禦,是要更加全面的、正確的看待問題;資料與程式碼分離是從漏洞成因上看問題;而不可預測性是從克服攻擊方法的角度看問題。
簡單來說,讓系統內的東西對於攻擊者而言 “不可預測” 讓攻擊者無法有效的攻擊。
一個例子是微軟的ASLD技術,她能夠讓程式在每次啟動時,程序基地址都不同,從而具有一定的隨機性,讓攻擊者無法有效的猜測記憶體地址,提高攻擊門檻,這樣即使不能消除威脅,但也能是攻擊方法無效也算成功防禦。
另外一個例子是B站,B站的視訊編號從最早的av號變成了BV號,av號是順序的使得爬蟲軟體能夠輕鬆的爬取視訊內容,相對來說隨機的BV號能夠一定程度防禦爬蟲。