本文就討論一下 Linux 系統(tǒng)和應(yīng)用安全。我們知道,在開發(fā)一個(gè)應(yīng)用的過程中,需要涉及代碼、操作系統(tǒng)、網(wǎng)絡(luò)和數(shù)據(jù)庫等多個(gè)方面。所以,只是了解代碼安全肯定是不夠的,我們還需要了解常見的基礎(chǔ)環(huán)境和工具中的安全機(jī)制,學(xué)會通過正確地配置這些安全機(jī)制,來提升安全保障。
談到 Linux,我相信你每天都在使用 Linux 進(jìn)行各種開發(fā)和運(yùn)維操作。但是,大多數(shù)情況下,公司不會給每一個(gè)員工分配專有的 Linux 服務(wù)器,而是多個(gè)開發(fā)和運(yùn)維共用一臺 Linux服務(wù)器。那么,其他員工在使用 Linux 服務(wù)器的時(shí)候,會不會對我們自己的數(shù)據(jù)和進(jìn)程產(chǎn)生影響呢?另外,我在 Web 安全中講過,黑客可以通過很多漏洞控制 Linux 服務(wù)器,那我們又該如何避免和控制黑客的破壞呢?
一、如何理解Linux中的安全模型?
要解決這些安全問題,我們首先要了解一個(gè)安全模型,Linux 的安全模型。
我們先來看一下 Linux 的構(gòu)成,Linux 可以分為內(nèi)核層和用戶層。用戶層通過內(nèi)核層提供的操作接口,來執(zhí)行各類任務(wù)。
既然 Linux 的內(nèi)核安全這么重要,那我們是不是要在防護(hù)上付出大量的精力呢?事實(shí)上,正如我們不需要在開發(fā)應(yīng)用時(shí)(尤其是使用 Java 這類相對高層的語言時(shí)),過多地關(guān)心操作系統(tǒng)相關(guān)的內(nèi)容一樣,我們在考慮 Linux 安全時(shí),也不需要過多地考慮內(nèi)核的安全,更多的是要考慮用戶層的安全。所以,對于 Linux 內(nèi)核層的安全,我們只需要按照插件漏洞的防護(hù)方法,確保使用官方的鏡像并保持更新就足夠了。
既然,使用最多的是用戶層,那我們就來看一下,用戶層的操作都有什么。
在 Linux 中,用戶層的所有操作,都可以抽象為“主體 -> 請求 -> 客體”這么一個(gè)流程。比如,“打開 /etc/passwd”這一操作的主體是實(shí)際的用戶,請求是讀,客體是/etc/passwd 這個(gè)文件。
Linux 系統(tǒng)是一個(gè)支持多用戶的操作系統(tǒng),它通過普通的文本文件來保存和管理用戶信息。這其中,有 2 個(gè)比較關(guān)鍵的文件:/etc/passwd和/etc/shadow。
我們知道,在 Linux 中,/etc/passwd是全局可讀的,不具備保密性。因此,/etc/passwd不會直接存儲密碼,而是用 x 來進(jìn)行占位。那實(shí)際的用戶密碼信息,就會存儲到僅 ROOT 可讀的/etc/shadow中。
在/etc/shadow中,除了加密后的密碼,也保存了諸如密碼有效天數(shù)、失效多少天告警之類的密碼管理策略。我們可以通過 Chage 命令來對密碼管理策略進(jìn)行修改,比如,通過下面的 Chage 命令,就可以強(qiáng)制 Test 用戶在 60 天內(nèi)必須對密碼進(jìn)行修改。通過這樣的方式,就可以降低密碼泄漏的可能性了。
chage-M60test
因?yàn)檎J(rèn)證這個(gè)功能是由 Linux 內(nèi)核來提供的,所以在用戶層,我們需要關(guān)心的安全問題,就是弱密碼導(dǎo)致的身份信息泄漏。為了解決這個(gè)問題,在/etc/shadow中,我們可以制定適當(dāng)?shù)拿艽a策略。除此之外,我們也可以通過John the Ripper,使用已知的弱密碼庫,來對 Linux 中的弱密碼進(jìn)行檢測。下面的命令,就是使用 John the Ripper 檢測弱密碼。
因此,“最小權(quán)限”原則在 Linux 系統(tǒng)中的應(yīng)用是非常重要的。那你可能會問了,Linux 系統(tǒng)中的操作那么多,每個(gè)操作都需要自己進(jìn)行權(quán)限配置嗎?當(dāng)然不是,我們常常會使用一些已知的工具,來實(shí)現(xiàn)“最小權(quán)限”啟動長駐進(jìn)程的功能,而你需要做的,就是正確地啟動或者配置這些工具。
比如說,我們可以通過 mysqld 啟動 MySQL 服務(wù),mysqld 會將 MySQL 的進(jìn)程分配到“mysql”這個(gè)用戶,并在 ROOT 下建立守護(hù)進(jìn)程。具體的效果如下:
root 2973530.00.01154321360? S Aug120:00/bin/sh/usr/mysql 29755331.34.3112827565729572? Sl Aug1222593:40/usr/local/