說明:我並沒有一個系統的網路安全知識體系,隨筆裡面提到的內容是個人在從事運維行業這幾年中總結出來的一點經驗,僅供大家參考。

  說到linux主機安全加固,我可以想到的就是三個方向吧,基線整改、訪問控制和主機漏洞修復。運維小夥伴在做基線整改、設定訪問策略或者修復主機漏洞前需要考慮的一個問題是這樣操作後是否會對業務造成影響,所以在做安全加固前,一定要做好驗證,相應的回退方案也要準備好。

(1)基線整改

  基線掃描報告一般是由各安全廠商給出,比如綠盟、安恆、啟明星辰等等,使用安全產品或離線指令碼等對目標主機進行掃描,掃描完成後生成基線報告,關於基線報告的內容大家可以自行百度,一般報告中會包含“口令策略”、“系統服務”、“檔案許可權”、“日誌審計”等等幾個大類,每個大類下面還會有一些具體基線項,針對每一項會有該項的檢查結果、判定依據、檢查點和加固方案等內容。下圖是啟明星辰的基線檢查報告中的部分內容。

  基線檢查報告中我們需要關注的就是檢查結果為“不合規”的檢查項。然後根據檢查點和加固方案進行整改。

(2)訪問控制

linux主機的訪問控制包括:賬號管理、配置iptables、檔案許可權管理。下面我主要說一下關於iptables如何進行規劃和配置。

配置iptables:很多運維場景其實是內網伺服器iptables全部關閉,selinux全部disabled,並沒有做好每臺主機的防火牆策略。假如給你一個工作,讓你獨立規劃某個業務平臺(10臺主機)的防火牆策略,你該如何下手?

我的經驗:

①確認每臺主機上部署了什麼中介軟體,比如tomcat、mysql、kafka、redis、自研程式,開啟了哪些埠。我常用的命令是 netstat 和 lsof 這兩個命令結合起來進行分析。舉個栗子:

以message-1伺服器上kafka服務為例:通過netstat命令檢視到該伺服器上開啟9092埠

root@message-1:~# netstat -tlunp | grep 9092
tcp6 0 0 192.168.66.95:9092 :::* LISTEN 16437/java
root@message-1:~#

然後,我們想看下現在9092埠都有哪些連線 ,我們可以用lsof命令檢視,可以看到 public-1和public-2同message-1建立連線的,

root@message-1:~# lsof -i:9092
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 16437 root 97u IPv6 58655 0t0 TCP message-1:9092 (LISTEN)
java 16437 root 114u IPv6 158945 0t0 TCP message-1:9092->public-2:44528 (ESTABLISHED)
java 16437 root 157u IPv6 79706 0t0 TCP message-1:9092->public-1:55198 (ESTABLISHED)
java 16437 root 158u IPv6 79990 0t0 TCP message-1:9092->public-1:19143 (ESTABLISHED)
java 16437 root 186u IPv6 73525 0t0 TCP message-1:9092->public-2:3933 (ESTABLISHED)
java 16437 root 187u IPv6 73449 0t0 TCP message-1:9092->public-1:37570 (ESTABLISHED)
java 16437 root 188u IPv6 73526 0t0 TCP message-1:9092->public-2:44505 (ESTABLISHED)
java 16437 root 189u IPv6 73451 0t0 TCP message-1:9092->public-1:42576 (ESTABLISHED)
java 16437 root 194u IPv6 158973 0t0 TCP message-1:9092->public-1:46261 (ESTABLISHED)
java 16437 root 212u IPv6 79713 0t0 TCP message-1:9092->public-1:3805 (ESTABLISHED)
java 16437 root 213u IPv6 79712 0t0 TCP message-1:9092->public-1:39880 (ESTABLISHED)
java 16437 root 214u IPv6 79714 0t0 TCP message-1:9092->public-1:37571 (ESTABLISHED)
java 16437 root 215u IPv6 79715 0t0 TCP message-1:9092->public-1:62056 (ESTABLISHED)
java 16437 root 217u IPv6 79716 0t0 TCP message-1:9092->public-1:34639 (ESTABLISHED)
java 16437 root 218u IPv6 79717 0t0 TCP message-1:9092->public-1:1315 (ESTABLISHED)
java 16437 root 219u IPv6 79718 0t0 TCP message-1:9092->public-1:12077 (ESTABLISHED)
java 16437 root 220u IPv6 79719 0t0 TCP message-1:9092->public-1:54739 (ESTABLISHED)
java 16437 root 221u IPv6 79720 0t0 TCP message-1:9092->public-1:62374 (ESTABLISHED)
java 16437 root 222u IPv6 73527 0t0 TCP message-1:9092->public-2:14295 (ESTABLISHED)
java 16437 root 223u IPv6 77294 0t0 TCP message-1:9092->public-1:22867 (ESTABLISHED)
java 16437 root 224u IPv6 72642 0t0 TCP message-1:9092->public-1:38827 (ESTABLISHED)
java 16437 root 225u IPv6 72643 0t0 TCP message-1:9092->public-1:34489 (ESTABLISHED)
java 16437 root 226u IPv6 79930 0t0 TCP message-1:9092->public-1:25297 (ESTABLISHED)
java 16437 root 230u IPv6 73341 0t0 TCP message-1:9092->public-1:44317 (ESTABLISHED)
java 16437 root 231u IPv6 81406 0t0 TCP message-1:9092->public-2:64640 (ESTABLISHED)
java 16437 root 233u IPv6 80129 0t0 TCP message-1:9092->public-1:42729 (ESTABLISHED)
java 16437 root 234u IPv6 80130 0t0 TCP message-1:9092->public-1:38797 (ESTABLISHED)
java 16437 root 235u IPv6 73452 0t0 TCP message-1:9092->public-1:30003 (ESTABLISHED)
java 16437 root 236u IPv6 77295 0t0 TCP message-1:9092->public-1:27578 (ESTABLISHED)
java 16437 root 237u IPv6 77296 0t0 TCP message-1:9092->public-1:11596 (ESTABLISHED)
java 16437 root 238u IPv6 77297 0t0 TCP message-1:9092->public-1:57318 (ESTABLISHED)
java 16437 root 240u IPv6 77298 0t0 TCP message-1:9092->public-1:13398 (ESTABLISHED)
java 16437 root 241u IPv6 80132 0t0 TCP message-1:9092->public-1:51598 (ESTABLISHED)
java 16437 root 242u IPv6 80133 0t0 TCP message-1:9092->public-1:8571 (ESTABLISHED)
java 16437 root 243u IPv6 80134 0t0 TCP message-1:9092->public-1:38849 (ESTABLISHED)
java 16437 root 244u IPv6 80135 0t0 TCP message-1:9092->public-1:58260 (ESTABLISHED)
java 16437 root 246u IPv6 80162 0t0 TCP message-1:9092->public-1:27890 (ESTABLISHED)
java 16437 root 247u IPv6 80163 0t0 TCP message-1:9092->public-1:24008 (ESTABLISHED)
java 16437 root 253u IPv6 83011 0t0 TCP message-1:9092->public-2:50076 (ESTABLISHED)
java 16437 root 254u IPv6 83012 0t0 TCP message-1:9092->public-2:8293 (ESTABLISHED)
java 16437 root 255u IPv6 83013 0t0 TCP message-1:9092->public-2:55405 (ESTABLISHED)
java 16437 root 256u IPv6 83014 0t0 TCP message-1:9092->public-2:25186 (ESTABLISHED)
java 16437 root 257u IPv6 83015 0t0 TCP message-1:9092->public-2:55834 (ESTABLISHED)
java 16437 root 258u IPv6 83016 0t0 TCP message-1:9092->public-2:14103 (ESTABLISHED)
java 16437 root 259u IPv6 83017 0t0 TCP message-1:9092->public-2:51100 (ESTABLISHED)
java 16437 root 260u IPv6 73528 0t0 TCP message-1:9092->public-2:11548 (ESTABLISHED)
java 16437 root 261u IPv6 73529 0t0 TCP message-1:9092->public-2:6708 (ESTABLISHED)
java 16437 root 262u IPv6 83018 0t0 TCP message-1:9092->public-2:55665 (ESTABLISHED)
java 16437 root 266u IPv6 73538 0t0 TCP message-1:9092->public-2:27084 (ESTABLISHED)
root@message-1:~#

這時我們就知道public節點上有某個程式和message節點上的9092埠有建立連線。知道這些就夠了,這時message節點上的iptable的策略就是

配置主機 src ip src port dst ip dst port protocol
message-1 public主機ip any message主機ip any tcp

②這樣每臺主機的防火牆策略就梳理出來了,然後按照梳理出來的策略編寫iptable規則,配置然後進行驗證,就可以了。注意首先應該放開的策略就是 ssh埠。當然你可能說我不放開會有問題嗎?沒有問題,就是伺服器ssh連不上,然後被別人笑一下,被領導說一頓而已,問題不大。

③每臺主機配置iptables規則時,出方向一般是不做限制的。只是針對入方向進行限制。

④有的同學可能會說了,iptable太複雜了,什麼三表五鏈,很難。其實只需要在INPUT鏈上配置好相應的規則,你就可以完美處理好上面的工作。

(3)主機漏洞修復

關於主機漏洞修復,其實我也沒有那麼多經驗,主要是根據主機漏洞報告進行整改,報告提出問題,谷歌給出答案,就這樣。

其實修復主機漏洞我遇到的解決途徑主要以下幾個:

(1)升級中介軟體版本:最常見的就是 openssh漏洞、tomcat漏洞、mysql漏洞等等

(2)修改中介軟體配置

(3)修改主機配置

做為運維人員還是要根據具體問題,尋找相應的解決辦法。