之前對一個B/S架構的系統進行了一輪基本的安全測試。項目結束,順便做一下總結。
文章目錄
- 前言
- 1. WEB應用安全
- 2. WEB伺服器安全
-
- 2.1 WEB伺服器狀态資訊
- 2.2 WEB伺服器SSL版本控制
- 2.3 WEB伺服器目錄清單
- 3. 資料庫安全
-
- 3.1 mysqld管理者使用者檢查
- 3.2 資料庫使用者檢查
- 3.3 Log與曆史指令
- 3.4 mysql_secure_installation
- 4. 端口檢查
- 5. 作業系統掃描與加強
- 6. 代碼掃描
- 7. 寫在最後
前言
從傳統意義上來講,BS架構的産品,基本上包含了浏覽器端可見的UI相關的service,背景的web服務架構,資料庫這幾個方面。 是以,一個基本的安全測試方案也應該包含對這幾個方面的測試;除此之外還應該包含對代碼、服務運作環境(作業系統)的測試。接下來就分别對這幾個方面進行簡單的描述和分析。
1. WEB應用安全
這一塊主要是檢查,從使用者層面通過浏覽器通路系統的時候,是否會對系統造成有意或者無意的損害。這裡主要是防止不懷好意的人員從浏覽器層面突破系統,比如通過浏覽器加載執行惡意腳本等。
對于WEB應用安全的測試原理,說起來并不複雜。業界工具也大同小異,主要是通過類似爬蟲的方式,逐層掃描WEB頁面,檢查分析頁面控件的屬性設定是否趨向于安全;如果頁面中存在超連結,則會進入超連結對應的頁面繼續掃描分析。
對于這一方面的測試,業界做的比較好的工具是IBM出品的AppScan,這是一個收費的商業軟體,并且可以進行集中式的license管理。能夠設定掃描的深度,用到的中間件或者技術等等;通過這些設定,能夠極大的縮短掃描時間,提高掃描的效率和準确度。最終輸出測試報告,從兩個次元對問題進行歸類;一個次元是把問題根據嚴重程度分類,另一個次元是把問題根據類型分類。
下面兩個圖簡單展示了IBM AppScan掃描報告的一些資訊。有興趣的可以參照我的另一篇部落格。

2. WEB伺服器安全
目前主流的WEB伺服器有Apache、Nginx、IIS,有經驗的攻擊者可以通過這些WEB伺服器以及其相關的特性擴充的已知脆弱性進行定向攻擊和滲透踩點。
2.1 WEB伺服器狀态資訊
舉個例子,已知某個web伺服器的A版本有個漏洞,攻擊者可以很容易地通過這個漏洞繞到服務背景。如果攻擊者通過WEB伺服器狀态資訊發現,某個系統剛剛好用的就是這個WEB伺服器的A版本,可想而知,這個系統會被瞬間攻破。對于一些有經驗的開發或者運維人員,一般情況下都會修改WEB伺服器真實的banner資訊,或者設定banner資訊不可得到。這樣,攻擊者要麼得不到WEB伺服器banner資訊,要麼得到一個假的banner資訊。 在測試的時候,這裡可以通過httprint工具來驗證一下,通常滲透者也是用這個工具進行滲透測試踩點工作的。
下圖就是通過httprint擷取的資訊,能夠很容易的看出來這是不熟在CentOS上的Apache 2.2.15版本。
對于不同的WEB伺服器有不同的修改方法。 比如Apache,可以修改httpd.conf檔案,例如” ServerSignature On” 修改成 “ServerSignature Off”。
2.2 WEB伺服器SSL版本控制
目前有些版本的SSL被證明是不安全的,系統開發過程中要避免使用這些不安全的SSL版本。對應Apache來說,也是在httpd.conf配置檔案中來設定支援的SSL版本資訊,這樣一來,對于跟清單中版本不一緻的SSL請求,全部拒絕。
正常情況下,這裡的一般配置格式是 SSLProtocol -ALL +TLSvxx +TLSvxx ,可以了解為先拒絕所有版本,再添加指定版本。
2.3 WEB伺服器目錄清單
這裡主要是檢查,是否能夠随随便便就得到WEB伺服器的目錄清單,這是很危險的,滲透者不僅僅能夠獲得WEB伺服器的目錄結構,還可能從中很容易的擷取一些重要敏感配置資訊。這裡推薦一個目錄掃描神器——DirBuster。具體的使用和配置不在本文讨論範圍之内,這裡僅僅從哲學層面提供思想和方法(聽起來挺牛逼的哈)。也可以用其它類似的工具,例如wwwscan、cansina等。
3. 資料庫安全
不同的資料庫有不同的安全檢查與配置項。這裡以MySQL為例進行簡單闡述。
3.1 mysqld管理者使用者檢查
檢查my.cnf配置檔案,檢視mysqld的管理者使用者配置。這裡最好設定為一個獨立的普通使用者,最好不要使用root使用者。
3.2 資料庫使用者檢查
預設情況下,mysql資料庫安裝好以後,可能會存在匿名使用者、空密碼的localhost或者root使用者等。另外,如果系統需要某個資料庫使用者遠端通路資料庫,那需要設定該使用者遠端接入資料庫的位址白名單。
如下圖,這個資料庫的設定顯然是不夠安全的,除了最後一個使用者之外,其他都是空密碼的使用者,需要删除。
3.3 Log與曆史指令
當使用者操作資料庫的時候,可能會有一些敏感資訊儲存在log檔案或者history檔案中,這也是不安全的。這裡應該重點關注“.bash_history” 和 “.mysql_history”這兩個檔案,最好删除掉,并且避免資料庫繼續生成這兩個檔案。接下來我們看看為什麼要這樣子。
這是在測試伺服器上列出來的兩個檔案。
接下來我們看看檔案裡面記錄了啥内容。先來看看.bash_history檔案中的内容,妥妥的,所有指令記錄啊。
再來看看.mysql_history檔案,底褲都沒穿啊。
修改方法也很簡單,删除對應檔案,并link到空裝置。
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history
3.4 mysql_secure_installation
事實上,當安裝mysql的時候,會有一個名為mysql_secure_installation的工具被自動安裝,通過這個工具可以自動進行一些安全相關的設定。
```powershell
# cd /usr/bin/
# ./mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):enter
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]Y
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!```
4. 端口檢查
這一塊沒有太多要講的,主要是通過端口掃描工具(例如NMAP)列出所有已經打開的端口,然後根據業務需要,關閉不需要的端口,修改連結的預設端口。
5. 作業系統掃描與加強
作業系統本身也會有漏洞,一般社群或者廠商也會定期釋出系統更新檔,這一步是定期執行的工作,主要是掃描檢視作業系統目前是否含有漏洞以及沒有安裝的更新檔。現在業界也有不少自動掃描并執行加強的套件可以選擇。Nessus 就是一款比較好的作業系統漏洞掃描工具。
6. 代碼掃描
最後,從多層防護立體防禦的角度來講,開發的源代碼也是需要進行安全掃描的。這裡主要檢查是否采用了不安全的算法,不安全的函數定義,不安全的随機數等等。
7. 寫在最後
其實網絡安全領域,攻與防是一個相輔相成的狀态,新的攻擊手段會促進新的防禦手段;反過來,新的防禦技術也會影響攻擊手段的多樣化。在各種技術日新月異的當今,網絡安全測試與評估也越來越複雜化,多樣化。 這裡僅僅列舉了一點最基本的思路,僅僅想靠這些完成一個系統的網絡安全評估是遠遠不夠的。需要網絡安全從業人員不斷的學習和研究新的攻防技術。