我也是開發人員,這是我的看法:
問題比您想像的還要嚴重
沒有湯匙
開發與軟件。開發是指製造或改善產品,服務和流程。軟件是重要的工具,但不是唯一的工具。優秀的開發人員將在更廣泛的意義上定義流程,以了解要創建哪些軟件組件以及要建議的人力,後勤,風險管理流程。開發依賴於尚未實現的人員,後勤和書面流程的軟件系統沒有任何意義。
開發沒有規則,因為開發正在定義規則。這就是使開發成為最惡劣的安全環境的原因。
但這並不意味著不應建立某些控制措施。相反,許多控制應該由開發團隊自己設置。
工程過程
有些公司主張在自上而下的過程中將業務與技術分開。這實際上很受歡迎,因為這表明沒有技術知識的商人應該居於首位。 懶惰的人喜歡。但是在工程中,自上而下的設計根本行不通。 Feyman(1985)在分析挑戰者爆炸事件的總統委員會上發表了一篇不錯的文章。從根本上講,自上而下的工程設計最終會使公司破產。而且我的市場經驗進一步加強了這種理解。
挑戰者爆炸就是一個很好的例子。美國國家航空航天局的經理在調查委員會的鏡頭上作證說,他們開發了一種橡膠,該橡膠在冰點以下60度下仍能保持柔韌性。由一位專員進行的一項簡單的高中物理實驗(將橡膠成分放入鉗中壓入冰水中)與這一事實相矛盾。這是一個很好的例子,因為這種橡膠成分需要柔軟,以使助推器不爆炸。由於這樣做需要夏季溫度,因此增壓器僅在夏季工作。單個組件的特性定義了整個產品的可見特性,這是非常有限的。
工程應該自下而上進行,因為您需要了解每個組件的局限性和弱點,以精製流程來減輕它們的影響。 。緩解過程通常不是軟件,並且會影響產品的成本。這意味著各個組件的特徵和局限性將定義產品,服務和過程的特徵。
自上而下的過程從根本上打破了。在紙上採用這種哲學的許多公司仍然在市場上取得成功。但是,當您考察他們的大型項目和最成功的項目時,您會發現它們是在正常公司規則範圍之外進行的。擁有深厚的工程知識和對市場有遠見的人得到非正式授權後,就會獲得最大的成功。由於這是非正式的,因此管理層認為自上而下的過程是有效的。他們認為所有其他團隊都不稱職。對於最初的項目大綱在離開“頂層”階段時被完全忽略並且沒有描述所構建的產品,服務和過程的事實視而不見。
您的經理可以定義您在月底之前設計一個遠程傳輸設備,因為他得出的結論是,這將使旅行業務獲得高額利潤……但那不會實現。自上而下的項目就是這樣,設定了技術上不合理的期望。
不要誤會我的意思,很高興能從多個角度看到問題。自下而上,自上而下,SWOT等等對於分析是健康的,但是真正的工程工作是自下而上的。沒有技術可行性就沒有真正的目標。
開發安全性
我們要記住,軟件開發人員將定期更改公司軟件,因此,他們可以:更改任何人的屏幕上顯示的內容,向包括他們自己在內的任何人發送自動電子郵件,或打開後門以執行他們想要的操作。這意味著僱用為開發人員的罪犯可能會對公司造成重大損害。
最糟糕的是,有許多公司沒有執行源代碼存儲庫證據,然後僱用的開發人員可以提供與給定源不同的二進製文件。這使犯罪的開發人員可以劫持公司的系統,如果不僱用他們的話,這些事情很快就會停止工作。
對我來說,開發安全性應集中在:
- 源代碼版本控制:確保將所需的源代碼和第三方組件存儲在安全的位置。
- 戰略分工:初級和臨時開發人員必須只能訪問源代碼和數據。他們只需要訪問要更改的組件,就可以避免初級開發人員能夠理解所有系統的內部工作原理並加以利用。
- 信任核心開發人員:高級/核心開發人員將必須了解所有內容,可以訪問所有內容,計劃和分發任務以及診斷嚴重問題。這個核心必須在開發和生產中都可以訪問整個事物。他們是您制定安全策略的合作夥伴。我們必須接受核心開發者擁有公司的所有權。我的老老闆曾經說過:“我們很幸運,盧卡斯站在我們這邊,另一方面他會摧毀我們”。核心開發人員如果願意,可能會造成很大的損失,並且沒有防火牆和生產控制措施可以防止這種情況發生。
- 通過防火牆隔離環境:將您的開發網絡與您的測試網絡,從您的生產網絡。在一家公司中,我定義了網絡10.1。作為發展,10.2。作為測試和10.3。作為生產。 10.2和10.3網絡僅通過公司CVS接收代碼,並根據admin命令自動構建它們。儘管這是一家小型初創公司,並且我在生產和開發團隊中工作,但我還是做了一些官僚機構來避免自己的錯誤(開發人員可以是您最好的盟友)。我還通過網絡更改了終端顏色:在生產服務器中連接時,終端背景為紅色,測試為黃色,開發為綠色。由於我所有的服務器都使用相同的配置,因此如果打開提示,很容易將它們混淆。以我的經驗,大多數問題來自未經測試的軟件和新軟件的安裝。明確說明:我認為您在哪裡是一項強大的安全功能。它與訪問無關,但與安全性有關。
- 聘請經驗豐富的測試開發人員:測試的關鍵方面是擁有大量良好的模擬數據,這些數據對於公司面臨的問題有意義。蒙特卡洛(Monte-Carlo)模擬非常適合生成對其他開發人員有意義的大型數據集,並且可以帶來更強大,更靈活的軟件和流程。對我而言,沒有“生產”失敗,開發人員總是要怪罪。必須編寫維護任務和意外事件。軟件必須具有彈性。
- 源代碼審查:讓人們在接受修改之前先審查源代碼。所有項目都應在源代碼控制上進行分支,並應檢查合併。源代碼審查僅應困擾於惡意軟件檢測,訪問升級,訪問配置文件以及對源代碼含義和作用的良好解釋。代碼的質量將通過測試而不是源代碼審查來保證。您可以在大多數開源項目中看到這一點。
- 測試策略測試更多是一種企業文化,而不是框架。一些公司採用市場框架,進行一些測試,但是其代碼質量很差。發生這種情況是因為您需要能夠進行有意義的測試的人員。實際上,開發必須成為測試驅動的。我不知道其他安全的開發方式。令人奇怪的是,人類,採購和諮詢服務也都必須經過測試。供應商常常聲稱他們的產品性能完美無缺,但是我還沒有發現完美的產品。
- 如果不加以監控,政策是毫無意義的。我知道一家公司有一個官僚機構,即每個數據庫表都應該在屬性級別上有描述。 95%的屬性被描述為“ $ {table name}的$ {attribute name}”。它沒有解釋屬性的真正含義,值可能包含的內容和內容。
- 適當的薪酬和工作環境。要擁有技能和個性上都不錯的開發人員,您必須有良好的薪酬政策。金錢固然重要,但還遠遠不夠。您還需要具有遠見/穩定性,真正的認識和良好的工作環境。例如,您可以選擇一個較小的城市,而在紐約,該開發辦公室中人們居住在小公寓中,而相同的報酬可以使房屋更大,更接近工作地點。更大的計算機,良好的實驗室對於技術愛好者來說也是一個加分。
- 數據安全許多活動需要敏感的生產數據,應在專門的實驗室中進行訪問。除非您的信息是公開的或不敏感的,否則最好的策略可能是將實驗室放置在物理訪問受控的良好社區中。只允許將一些模擬數據放在不敏感的個人筆記本電腦和組件上。那是可能的。例如,我為一家公司開發了45億條記錄的訪問量很大的數據存檔。我當時在家中工作,因此完全不使用公司數據。當我提交代碼時,它在第一次嘗試中就按預期工作。除了硬件故障和生產環境的遷移,我們在10年內具有100%的可用性。開發人員隨身攜帶源代碼的風險不相關。這個特殊的系統花了我3個月的時間進行開發,這次大部分時間是為了了解組件的性能限制。現在,這就是我內心的知識。即使沒有源代碼,我也可以在大約一周的時間內重新開發此解決方案。
- 強大的日誌對於了解每個人所做的事情都很重要。最好的辦法是由框架生成日誌,記錄短時間的詳細屏幕,更長的訪問和活動時間,甚至更長的公司日誌。每當訪問屏幕(包括屏幕設計)時,我的關鍵系統都會記錄日誌。一些關鍵資源應該由觸發器本身記錄在數據庫本身上,並且應該標記關鍵表或資源以進行源代碼審核。
-日誌篩選很難手動完成。了解如何在日誌上進行過濾以查看關鍵事件。一種非常有用的過濾器是使投訴報告與用戶訪問權限和活動交叉。如果您有足夠的日誌,則會發現巧合。例如:在問題user1始終登錄之前。
關於不訪問生產系統
要求開發人員不訪問生產系統的規則是因為用戶在那里以避免開發人員提交代碼以向他/她自己的用戶顯示特權信息。我認為這是一個非常非常弱的安全措施,很容易在源代碼審核中檢測到。有幾種簡單的方法可以避免此問題:
- 開發人員加一名低薪員工;
- 向自己發送電子郵件;
- 打開一個系統中的後門。
尋找後門,訪問升級和惡意軟件的源代碼審核似乎更有效率。它允許您在測試漏洞利用程序時將其識別出來並予以解僱。當然,熟練的開發人員可以將漏洞隱藏起來,因此使用清晰明了的語言和變量名很重要。僅在需要特殊性能或混淆性的應用程序的書面證明中使用奇怪的解決方案。例如,1 << 4與1 * 16相同。這僅在語言本身沒有進行此優化並且發生性能瓶頸的情況下才有意義。出於同樣的原因,太多的符號語言也是不好的。源代碼應該是任何怪胎都可以讀取的。
問題比您想像的還要嚴重
開發人員可能造成的最容易和最嚴重的損害與工具安裝無關。即使開發環境是託管的,如果公司沒有強大的防火牆,源代碼存儲庫,僅基於源代碼存儲庫和代碼審查的基礎架構,也不會有太大的改變。