Coding the Architecture創(chuàng)始人Simon Brown
以下是精彩演講:
隨著互聯(lián)網(wǎng)安全形勢的日益嚴(yán)峻,對于架構(gòu)師們來講,為什么需要一個安全的架構(gòu)以及怎么建設(shè)安全架構(gòu)成為了迫在眉睫的重要任務(wù)。為什么來這里講安全,很多人沒聽過澤西島,在英國的南部,是一個離岸的轄區(qū),金融機構(gòu)在島上非常盛行,對安全很重要,要安全維護(hù),要有系統(tǒng)享受低稅,很多做JAVA的項目,大部分澤西的工作,離岸的銀行小公司對安全特別關(guān)注的。
糾正系統(tǒng)架構(gòu)的安全認(rèn)識
肯定是重要的。特別澤西島有自己交易的信息、銀行的信息、養(yǎng)老金的信息,所有的資料在澤西島里面安全保護(hù)起來。離開澤西島也要保障安全,如果不把安全做好,肯定要有糟糕的事情發(fā)生。
我講一些最近大家都知道的一些安全的漏洞,比如說Linkedln,有一些密碼泄露了。也是最近轟動的事情。
安全適用于方方面面,我們講軟件架構(gòu)的時候,并不只是看一個地方來求安全,安全應(yīng)該在整個完整的軟件系統(tǒng)當(dāng)中,都能滲透在安全中,包括所有的級別層所有的元件都需要做到安全。很多人認(rèn)為安全是人份認(rèn)證、授權(quán),很多人認(rèn)為安全是兩個問題,但是安全還有其他的問題,比如說防黑客、防攻擊、加密等。
安全這個問題很難對現(xiàn)有的代碼進(jìn)行安全的加裝或改裝。如果安全出現(xiàn)問題,要解決安全問題,從架構(gòu)的基礎(chǔ)上來解決的。如果架構(gòu)的問題一開始沒做好,事后補相當(dāng)困難。跟性能、擴(kuò)展性都是很重要的,一開始沒有照顧好的話,未來提升就很難了。
安全在整個軟件架構(gòu)的角色當(dāng)中是怎樣的位置
我們需要在整個軟件開發(fā)過程中都要進(jìn)行考慮的問題。我曾經(jīng)講過一個故事,一個面向公眾的互聯(lián)網(wǎng)網(wǎng)站。這個網(wǎng)站是一個針對當(dāng)?shù)貪晌鲘u的一個聽眾,澤西島10萬人,是很小的用戶群,是一個全新的互聯(lián)網(wǎng)系統(tǒng)軟件服務(wù)。這個互聯(lián)網(wǎng)服務(wù),可以去登陸獲得一個用戶名,之后獲得這些權(quán)限。他們請我去看軟件系統(tǒng),我去看軟件系統(tǒng)的時候,假裝用戶去體驗一番。
我很快發(fā)現(xiàn)我可以做跨站的腳本攻擊。比如說創(chuàng)造賬戶,有名字、地址、電郵、電子卡信息。而在地址這一欄,可以寫Java腳本,可以注入Java腳本。這個例子是很小的例子,可以對網(wǎng)站做的攻擊遠(yuǎn)遠(yuǎn)不止這一點,有很多東西可以做。
我只用了五分鐘、十分鐘就發(fā)現(xiàn)了這些漏洞。當(dāng)然,這個網(wǎng)站還沒有完全上線,只是進(jìn)行前期的測試,在這個時候發(fā)現(xiàn)問題算是萬幸。其實在登陸面可以創(chuàng)建自己的密碼,很多網(wǎng)站可以是1位到20位需要多少的標(biāo)點。有些網(wǎng)站需要密碼的強度。這個網(wǎng)站也是一樣,列出網(wǎng)站應(yīng)該這樣。登陸賬戶的時候,我說密碼太煩了。前臺認(rèn)證并沒有很復(fù)雜,隨便一個詞就可以接受了,有些比較弱,有攻擊密碼。
我在做銀行互聯(lián)網(wǎng)的時候,有做一個雙重認(rèn)證。在頁面看十分鐘,HTTP的對話就超時了,為什么超時?這是安全的功能。比如說共享一個電腦,在網(wǎng)吧、咖啡店上網(wǎng)的話,有超時的保護(hù)。有不同的安全要求。回到我剛才講的網(wǎng)站,這個網(wǎng)站肯定不是登陸之后一直在線的,對話的時段是非常短的,因為里面有一些非常機密的個人信息。但是,你登陸了網(wǎng)站之后,登陸永遠(yuǎn)不超時。把游覽器關(guān)掉再打開,永遠(yuǎn)不會中斷,就算點登出,不會登出,管理有問題的。我們要做安全的策略性平臺,如果有這么多的漏洞,是非常危險的。
這個項目正在進(jìn)行用戶的接受度檢測的過程,還沒有上線,他們請我去做了檢查。經(jīng)過了各方面的檢查,他們說我們只有四個星期就上線了,找了很多問題,項目四個月之后才能上線,很多顧客對這個問題根本就不敏感。
架構(gòu)師是“T”型人才 是一個建筑師
要有知識的深度,同時也有不同方案的廣度,我們面臨的軟件架構(gòu)師是一個建筑師,這種解決方案必須要知道不同的解決方案不同的軟件開發(fā)都需要通才的能 力。我們從安全的角度來說,軟件架構(gòu)師的工作非常復(fù)雜的,特別是windows的環(huán)境有很多學(xué)習(xí)的地方。廣度也很重要,有各種各樣的安全問題,在整個架 構(gòu)、編碼的過程中,不同地方都會出現(xiàn)漏洞。如果沒有足夠的經(jīng)驗,甚至不知道哪個地方有可能出問題。比如說我們項目的架構(gòu)師可能是一個通才,有一定的深度, 有技術(shù)的專長,必須要知道在哪些地方有可能出現(xiàn)問題。
我們面臨的風(fēng)險是什么呢?
我們面臨的風(fēng)險是什么呢?
攻擊、黑客、宕機、拒絕服務(wù)、密碼泄露、機密信息外泄、安全受損等很多問題都可能來自于安全的問題。這顯然是我們從架構(gòu)角度認(rèn)真對待不同的風(fēng)險。這 就提出一個很有意思的問題,我們是不是可以樣樣精通呢?我問過“T”型的人才,我們有知識的深度,如果是Java的架構(gòu)師,必須要真的理解 Java,我們要做高性能的系統(tǒng),這方面的知識,怎么做可擴(kuò)展性,還有高可靠性。
必須要保持這種意識
所有不同的領(lǐng)域我們都有一定的寬度和廣度,安全是其中一點。我們之前看到編碼是整個所有活動當(dāng)中的中心,是不是所有的知識都可以做編碼呢?如果是一 個小小的項目可以做自己的編碼,同時也應(yīng)該知道可用性、安全性以及擴(kuò)展性的種種知識。這是不是意味著樣樣都精通呢?我給大家講安全課,但是我不是安全專 家。但是安全是我們作為架構(gòu)師必須有意識、必須有概念,而且要知道安全環(huán)境不斷的改變,有新的不同攻擊、不同黑客,必須要保持這種意識。所以我們必須有安 全的意識,而意識是一個關(guān)鍵詞。
剛才講了“T”型人才,是一個通才型的專才。做軟件團(tuán)隊的時候,可能有一個人來做這個工作,可能有一個專門軟件架構(gòu)師來做技術(shù)主管的角色。這個人就 是我們的通才化的全才。但是你能找到這樣一個人嗎?我們可能要面試很多人、招聘很多人,是不是能找到通才化的人才呢?不一定的。最近我建立一個系統(tǒng),是一 個混合項目,我們可以有多個人進(jìn)行架構(gòu)的支撐,共同協(xié)同工作,聯(lián)合起來形成了足夠?qū)挾群蜕疃?,一方面有通才型的專才,另一方面專家提供深度的支持?/p>
一般我做的項目里面可能會請一個專家,專家有相關(guān)的經(jīng)驗,有些是沒有的。給大家看一個很有意思的博客,在英國看到的。如果系統(tǒng)里面有SQL的出入, 就有流程或者基礎(chǔ)設(shè)施的問題。如果你的問題有安全隱患的話,系統(tǒng)安全隱患,就是說明現(xiàn)在做錯了,要看哪些地方做錯了,如果沒有這方面的專家怎么辦?或者根 本沒有意識到潛在的安全問題或者已有的安全問題。
安全怎么融入到系統(tǒng)當(dāng)中
從最根本的角度來看安全有什么要求。就像十年之前搞架構(gòu)的時候,有哪些具體要求,哪些東西要做哪些不要做的。必須要清楚地知道,在建造架構(gòu)的時候哪 些東西需要做,怎么才能高效。我覺得安全也是一樣,很多人都是從用戶的角度來獲取用戶的需求。用戶的角度確實不錯,希望能夠找一些好的、簡單適用的。他們 不是技術(shù)性的人才,視角不是特別獨特。在編寫用戶表述的要求時,有不同的模板。所做的一切要清楚在你的系統(tǒng)里面,用系統(tǒng)的人分成哪些類的。
去年我做了一個項目的架構(gòu)分析,大概里面有兩到三百個使用者所提供的一些要求,用戶扮演著不同的角色。到底這些用戶分成哪些?比如說超級用戶還是管理員,還是一般性的用戶。但是分不出來類。我覺得挺有意思的。
如果我設(shè)計軟件的話,必須要知道軟件針對的受眾是誰,誰會用。今天早上給大家看圖,第一個就是上下文背景,中間是系統(tǒng),下面還有與之溝通的系統(tǒng),最 上面是我們講的用戶。我們知道到底哪些類型的用戶在使用我們的系統(tǒng)。為什么這點很重要?從安全角度講很重要。問這個團(tuán)隊到底懂不懂安全,誰在用我們的系 統(tǒng)?這些人用我們的系統(tǒng),有什么樣的功能?我們這些使用者所提供的一些,也從相關(guān)來講比較高端的視角來分析一下類別。
對于這方面的信息不是已經(jīng)過時了,非常適用的。在英國一些咨詢管理公司,要求做成文件發(fā)給我們,尤其是技術(shù)方面的要求。技術(shù)要求包括擴(kuò)展性、安全、 性能等。這些從特點來講比較技術(shù)性的,而且非常詳實。寫這些要求的人,不是技術(shù)出身的,是商界出身的,他也不清楚產(chǎn)品規(guī)格里面細(xì)節(jié)多細(xì)合適,所以來一句系 統(tǒng)是非常安全,對于系統(tǒng)的安全來一句就夠了。作為架構(gòu)師這句話牛頭不對馬嘴,確實要做到安全。
用戶或者SQL的攻擊注入時,怎么樣做到安全?
很多英國的公司從安全的角度講,做得很爛,因為團(tuán)隊不知道安全到底意味著什么??赡茉诰W(wǎng)上隨便問一些人到底該怎樣做。
作為架構(gòu)師要分析需求的話,并不是說做大型的前端設(shè)計,而是做一些簡單的,獲取、捕獲使用者的要求,做高級的架構(gòu)設(shè)計,比較要考慮到擴(kuò)展性、安全, 如果沒有考慮到這些,在打造架構(gòu)的時候,可能會丟失非常寶貴的元素??梢蚤_一些研討會、交換文件,這種工作坊和小型研討會的形式非常好,知道使用系統(tǒng)的是 這部分用戶。
客戶給的要求是系統(tǒng)非常安全,就要問他非常安全是有多安全,工作坊可以面對面的交流,誰在用我們系統(tǒng),哪些方面的內(nèi)容影響了他們對系統(tǒng)的使用,為什 么會這樣?這樣會有非常具體的用戶對系統(tǒng)的要求。除了捕獲信息之外,還要置疑他們。我們團(tuán)隊必須要不斷的置疑挑戰(zhàn)我們一開始所制定出來的具體要求。到底我 們開發(fā)的時候優(yōu)先級別會怎樣。覺得要求根本沒必要,換一種方式行不行,我覺得就已經(jīng)夠了,要挑戰(zhàn)不同的要求,不僅是功能性的,還有非功能性的,比如說安 全,也要跟客戶談一談。每次在系統(tǒng)里面引入安全的時候,要做一些權(quán)衡、妥協(xié)、讓步。
一般來講,典型的讓步、取舍是可用性、易用性和復(fù)雜性。也就是說,安全的話更復(fù)雜了。比如說我去銀行要做,ID非常長,記不下來,輸入密碼登陸,到 了第二頁,要輸入安全代碼,有一個小鍵盤,類似于口令牌,隨即生成輸入進(jìn)去。等我通過這么多安全檢查進(jìn)這個網(wǎng)站的時候,對話已經(jīng)超時了,我輸入這么多的密 碼,已經(jīng)查不到我賬戶信息了,這是非常長、非常復(fù)雜的過程,用電子安全指令等。確實很安全,但是影響了便捷程度。這時要做取舍,是易用還是復(fù)雜安全性。
怎么能寫出安全的代碼?
網(wǎng)上有很多信息,主要有兩個主流:第一,要避免數(shù)字被修改。第二,限制接入。
當(dāng)然免疫性很好的,如果免疫的話就不能修改。這是一個很好的屬性。如果這個數(shù)據(jù)有一定的對象,而這個對象數(shù)據(jù)是不能修改的,免疫了就不能修改了,所以從根本上來說是安全的。如果有功能性的語言,用這個數(shù)值改變,因為免疫不能改變了。你想象一下,有一定的人、把這個人加入到列表當(dāng)中。怎么樣讓他把所有的人列出來呢?也許在下面給一條getPeople的指令。
給一些簡單的建議,比如說用一些接入的修訂詞,特別是對外API的時候,要有各種的假定,比如說接入的修飾詞和修飾條件。如果所有的東西都是對外公開,沒有安全的問題才怪!
scott/tiger,有人在笑,很多人拿到密碼都沒有改,用戶和密碼缺省或者原始的數(shù)據(jù)密碼都不改,這必須要改,改成一個比較有利的密碼。
講到數(shù)據(jù)的時候,真的希望能夠限制消費者對數(shù)據(jù)的接入,限制消費者對數(shù)據(jù)的使用,這可以幫我們收載他們的訪問范圍。不管我們的網(wǎng)站在什么地方,我們用SQL的數(shù)據(jù)庫怎么做呢,我們用特別的一些代碼通過SQL進(jìn)行數(shù)據(jù)庫的接入,有些時候不喜歡這種方法,覺得過程非常復(fù)雜。雖然復(fù)雜,但是有一個精簡、簡單、安全的API,很多人用SQL,就是為了安全性。
2000年的時候,我在一個小的電商公司做網(wǎng)站,他們首次在搞商務(wù)網(wǎng)站。他們有一個電商網(wǎng)站,而且是一個盒子,只需要拿一個光盤裝到系統(tǒng)上就是一個電商網(wǎng)站了。想存儲他們的信用卡號碼??蛻艋氐诫娚虝r,不需要把信用卡再輸一遍,這是盒子提供的,總要有一個地方來放信用卡信息吧!他們看一看數(shù)據(jù)庫里面有沒有欄目沒有用到,他們發(fā)現(xiàn)中間名沒人用,就把中間名放信用卡了,只用輸入(英文),沒有經(jīng)過加密,對信用卡進(jìn)行外鍵的字符串。我們也知道對這樣的外鍵的字符串可以破解的。這種安全只不過是把字符串進(jìn)行排列,并沒有進(jìn)行任何的安全加密,只不過支付串操作兩次就已經(jīng)萬無一失了。
我們講過數(shù)據(jù)代碼,也應(yīng)該談一下配置、部署,所以有數(shù)據(jù)庫。網(wǎng)絡(luò)服務(wù)器要跟數(shù)據(jù)庫進(jìn)行溝通的話,必須要用戶名和密碼。數(shù)據(jù)庫的用戶名和密碼什么地方?往往是在網(wǎng)頁服務(wù)上,往往都是明文。如果有人攻擊網(wǎng)頁服務(wù)器,必須提取文件系統(tǒng),提取之后可以看到明文的文件,這個發(fā)生了很多。
怎么樣解決這些問題呢?
要確保這個信息加密。用Java系統(tǒng)也有加密的配置辦法,這都有辦法,只是有沒有這個意識。我們可以用一些CQL服務(wù)器受信任的連接就可以避免了。
之前我在澤西島做的項目是離岸銀行,他們很重視,我們做自己的虛擬機、手提電腦來寫代碼,但是要部署到銀行系統(tǒng),我們要用一些連續(xù)的工具放入U 盤上,把U盤交給銀行的人,接入另外一個網(wǎng)絡(luò),裝入軟件當(dāng)中。這里我們的開發(fā)團(tuán)隊和部署團(tuán)隊是物理隔離的,避免了開發(fā)團(tuán)隊能夠染指生產(chǎn)的系統(tǒng)。
問題在做部署的人根本不太理解做開發(fā)的原意,不是一個技術(shù)人員。所以我們在自己廢寢忘食的寫了這么多代碼,交給他之后,不懂怎么部署,物理隔離不能保障安全,這個過程或者流程肯定有漏洞的。不是說一定能解決這樣的問題。
生產(chǎn)的資質(zhì)、資格也是一個問題。比如說有一個經(jīng)過測試的環(huán)境,這個環(huán)境把它放入生產(chǎn)的系統(tǒng)當(dāng)中,當(dāng)中有這個隔離。把生產(chǎn)的用戶名和密碼放在什么地方呢?也許你可以放在配置服務(wù)器的一個地點,但這個要看多么看重安全性,如果連續(xù)交付很有意思了,連續(xù)交付有關(guān)的資質(zhì)就要考慮怎么存放。
運行時間方面和安全有什么關(guān)系呢?
這里說到重要的原則“最小特權(quán)原則”,我們看一看這個模型。在Java應(yīng)用里面可以用Java2的安全模型,允許你做一部分的工作,比如說只能進(jìn)入到這方面的網(wǎng)絡(luò)或者只能用這部分的接口,這就是Java的安全模型。如果網(wǎng)站被黑的話,肯定會直接攻擊里面用戶。一般不會這么做,會密碼也不改,不限制賬戶的使用,導(dǎo)致黑客很輕易獲取信息。
之前我在電商工作過,就有一些信息方面的問題,找到他們的日志文件,發(fā)現(xiàn)有很多的錯誤信息,成千上萬的錯誤信息。人們要輸入信用卡信息,信用卡信息也都在日志文件里面。在日志文件里面,地址、名字、信用卡信息以及信用卡盜竊事件都有。
我們還要有效監(jiān)控管理界面方面的安全,不能把東西放在云端上就覺得什么事都搞定了,還要看監(jiān)控確保運行合理合適。我在做顧問的時候,曾經(jīng)幫一個電商的網(wǎng)站做很短的項目。如果我打開我的瀏覽器連上網(wǎng),完全可以看想看的頁面,沒有最基本的二進(jìn)制密碼保護(hù)。
架構(gòu)師要知道基礎(chǔ)結(jié)構(gòu)
我是項目上的軟件架構(gòu)師,不做基礎(chǔ)設(shè)施的設(shè)計,但是不必須要了解到防火墻的設(shè)置等。因為確保基礎(chǔ)的設(shè)施才能支持我們軟件的架構(gòu)。另外,從軟件的角度來講,也非常的重要。最早不是我做的,我做的很多系統(tǒng)都是在澤西島,因為很多的數(shù)據(jù)都有地域限制,必須要用本地的服務(wù)器,要把服務(wù)器信息拿出去的話,第一件事情是把原來的安全保護(hù)、防火墻沒有用的東西都拿走,這樣可以減少空間內(nèi)容。要和基礎(chǔ)設(shè)施團(tuán)隊DMZ來談一談防火墻等。從軟件架構(gòu)師角度來講,要使用web服務(wù)或者RMI等不同服務(wù),軟件架構(gòu)團(tuán)隊和基礎(chǔ)設(shè)施團(tuán)隊必須要有溝通才行。
攻擊者、黑客以及我們的漏洞
我在倫敦工作的時候,很多是做公司內(nèi)部的,回到澤西島的時候,做了很多互聯(lián)網(wǎng)的界面,影響到數(shù)據(jù)安全性。如果大家覺得講得這些內(nèi)容比較陌生的話,希望大家能夠好好地看一看開源的應(yīng)用安全項目。
列出了10個最主要的,注入、跨站腳本攻擊、驗證、對話管理等。從安全角度講是值得一看的東西。有一次看了CQL的注入,我不是一個安全專家,但是我看了CQL注入知道成為安全隱患,因為電擊鏈接可以看到很多信息。
現(xiàn)在看到的是中文版,叫做OWASP,中文版的,喜歡網(wǎng)站是因為告訴我們最主要的攻擊方式,給一些例子,該怎樣修復(fù)這些漏洞,避免這些攻擊再次發(fā)生。
最近經(jīng)歷一件事是很多系統(tǒng)都要做深度測試。找一些外部第三方的團(tuán)隊或者公司來看不看能不能黑你的系統(tǒng),看系統(tǒng)到底多牢固。我們會發(fā)現(xiàn)他們攻擊的時候,很多之前沒有注意到的漏洞浮出水面。這些團(tuán)隊給一些例子,既然找到漏洞,告訴我們該怎樣把漏洞一個個補好。非常建議第三方來做測試。
最后總結(jié)
安全非常重要,但是安全也非常復(fù)雜。作為一個軟件的開發(fā)員、程序員,要做到敏捷、持續(xù)的交付、關(guān)注模式,非常流行的詞匯。但是安全不是熱門詞匯,要注意安全的重要性。比如說做網(wǎng)銀、網(wǎng)絡(luò)界面不能忽視安全。今天上午講了文本介入,搞文本輕一點就行了,不能太復(fù)雜,做一個軟件的架構(gòu),給別人用,不給文件不知道安全怎么做,不知道安全怎么做,可能會加一些編碼,這些編碼反而讓你的安全系統(tǒng)安全用不上了,可能一兩年之后安全徹底失明了。因此我們提供不太厚的文件,里面有關(guān)鍵信息。
剛才講了怎么樣收集用戶的一些要求,把它進(jìn)行排序。當(dāng)然不能完全依賴他的想法,但是要讓他知道安全方面哪些最重要的。安全很重要,而且適用于整個軟件架構(gòu)的所有環(huán)節(jié)。從外部端到數(shù)據(jù)庫端,從跨件的腳本到注入等,都要確保里面內(nèi)容是安全的。上下文非常關(guān)鍵,這里有一些安全方面的最佳實踐。如果之是照搬別人的非常復(fù)雜,所以要知道哪些是需要取舍的,做這些風(fēng)險會帶來什么影響,會泄露什么數(shù)據(jù)?這些數(shù)據(jù)有價值還是沒價值的?用這些為什么而用,提高應(yīng)用性和復(fù)雜性。
一個人不可能樣樣精通,我對安全不是專家,但是對安全要了解一些情況。我們知道行業(yè)不斷變化,速度非??臁<热徊豢赡馨阉械闹R都學(xué)的很透徹,至少我們能夠粗淺的像蜻蜓點水了解一些東西。另外,千萬別做一個不負(fù)責(zé)任的軟件架構(gòu)師。因為我們架構(gòu)師就像一個領(lǐng)導(dǎo)者一樣,確保所有的工作都能有效。