筆者在今年七月的時候,去參加了著名DevOps社群名人艦長的Lab,玩了一趟 輕輕鬆鬆體驗 DevSecOps,那時候用的環境是Gitlab版,把應用程式資訊安全直接整合到了DevOps中。他的概念是白箱掃描、機密掃描、第三方元件以及映像檔容器安全性掃描等等一大堆全部都整合在一起(可以看看介紹)。
掃出來後,如果資訊安全評估這是必須被修正的,那就要根據評估結果,開立workitem提供給開發團隊進行後續修補作業。
我好想要這個玩具。
這整件事情最棒的是,單一平台後,資訊安全修補項目正式被納入了開發團隊的工項,可以揭露現有程式的風險。進而由決策者(如PO)來決定,哪些項目應該被優先排入開發排序中,權衡需要移出多少開發能量去進行弱點的修補,又不會影響到商業價值的交付太多。
要知道,開發人員最容易變成瓶頸,如果拿了一個十年前就開發好的專案,突然來一個黑箱或白箱掃描,掃出了一千個弱點,即使高風險只有區區兩百個,叫開發人員30天內把它不計成本的修完,這是不現實的。
系統開發的過程中,商業價值是不斷被交付給需求單位的,如果因為資安考量而突然把所有業務都喊卡而只在意修補,那其實跟銀行大門開著就有風險被搶,決定關門大吉一樣的不現實。差別只在於軟體開發過程與辛苦很難以具現化,但如果把銀行大門拉下來那一秒就會有媒體開始報導了。
這兩年為了要解決組織內這一系列的問題,在外面跑了好多場研討會,也忘記是從哪一場聽到GitHub Advanced Security。應該是在參加完上面說的那場Lab後(ithome主辦的2023台灣雲端大會),因為被GitLab 驚呆了,想說萬一內部以後問當時怎麼選擇的產品。一回來就開始找azure devops service上面是不是有如SAST或是安全性掃描的,結果還真的被我找到了。
本來7月的時候看azure devops service roadmap,那時候說 GitHub Advanced Security 這個功能在Q3的時候會GA,所以7月的時候只能眼巴巴的看著別人preview申請。筆者因為忙碌加上沒有多編太多的費用,以及行政流程等問題,所以就等著他GA再來試用看看。
終於,在前幾天(9/29)的時候,GitHub Advanced Security終於全球GA了。
這表示我可以透過這個產品,進行SAST、機密掃描以及SCA元件安全掃描了。但是因為才出來沒多久,所以只能先寫有關於之前我們在研究的一些機密處理的議題來分享。後續將GitHub Advanced Security 玩一陣子後,會再上來寫新文章。
又回到Day 7之前有談到,我們對於branch的管理策略是,main面向營運環境,而develop是面向測試環境。這兩個環境如果要把編譯好的產出物,進行佈署的動作,就會面臨到不同環境一大堆不一樣的參數問題。例如:DB的連線資訊,包含IP、帳號、密碼,或是LDAP的IP、機密,或是憑證等等等。
把這些東西放在版本控管系統中是不安全的,可以參考這篇文章 Over 100,000 GitHub repos have leaked API or cryptographic keys。
因此,在我們先導專案中,目前就先把知道的機密資訊給獨立抽出來,然後使用pipeline library的功能去處理。
下面我就來介紹我們怎麼處理一般變數或是機密變數,我們先來看一下下面這段Config:
<connectionStrings>
<add name="InsDBCon" connectionString="Data Source=10.10.10.10,1433;Initial Catalog=mysiteDB;User Id=mysite;Password=abcd1234;Connect Timeout=90;Connect Timeout=3000;Pooling=true;" />
</connectionStrings>
在.net framework專案中,我們通常都會把大部分的設定檔,都放在web.config裡面,這是大家都知道的事情。但是既然我們要自動化,那表示我們必須在自動化的過程中,可以將web.config裡面的的參數進行安全的替代這個動作。因此,這次要做的示範就是拿上面那段web.config 的connectionstrings 來進行替代的動作。
那我們有看到幾個關鍵的參數,包含了
那我們在pipeline的Library先按下 + Variable group。
然後填入了一些資訊如上圖,我稍微說明一下:
現在我就建立了一個Variable group。
其實引用非常簡單,我們在Day 12的時候,有寫過測試環境的pipeline,那我們再次拿來利用,看如何引用這個variable group。
variables:
- name: solution
value: 'SourceCode/mysite/mysite.sln'
- name: buildPlatform
value: 'Any CPU'
- name: buildConfiguration
value: 'Release'
- group: 'Variable SIT' //指定使用的變數群組名稱
變數這裡的語法的最後面,可以看到指定使用變數群組名稱為 Variable SIT,那因為這個pipeline第一次要存取這個變數群組,因此會需要授權,那我們就勇敢地按下去。
那由於我有下一個Task 叫做printAllVariables ,會把所有的變數都印出來,我們到pipeline的執行細節去看,就可以看到我們的變數群組那些參數,都被列在環境變數中了。而且會發現到,當時我們設定Password 為機密變數,在這裡也會被打為****。
再來,就是找方法去替代掉web.config裡面的那些標的了。
上到營運環境要注意的事項真多。