1. 程式人生 > 其它 >伺服器安全策略之思考與實踐

伺服器安全策略之思考與實踐

轉:https://youcongtech.com/2021/07/16/%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5%E4%B9%8B%E6%80%9D%E8%80%83%E4%B8%8E%E5%AE%9E%E8%B7%B5/

之所以決定寫這篇文章,換言之,這篇文章起源於公司自建伺服器因為沒有開啟防火牆被黑客攻擊(其中一臺公網暴露的情況下),基於那次有了一些感悟,而後公司的一位女同事的騰訊雲伺服器因為資料庫密碼過於簡單,資料庫被黑客綁架(相當於將庫的資料全部清理,最後僅留一下一句話,要xxx比特幣贖回…),這兩次黑客的挑釁,讓我對伺服器安全方面有了更多的感悟。就在今天伺服器突然又宕機了,原因還是被黑客攻擊了(黑客利用Redis的漏洞進行病毒植入),我與其作戰了一個下午,最初還以為是Redis的原因,最後發現Redis僅僅是表象,再與其更深入地作戰過程中,發現其通過Redis的漏洞,安裝了兩個病毒軟體、篡改了ssh金鑰、控制了定時任務,一切的目的只為了一個,把你伺服器上的所有資源(頻寬、CPU、記憶體等)全部用於挖礦(挖礦是需要巨大的算力)。

兩次與公司伺服器相關的黑客攻擊,其實是可以避免的,一次麻痺大意,讓黑客有了可乘之機,實在是讓人氣憤。

這次伺服器安全策略之思考與實踐,總體為以下五個部分:

  • 防火牆;
  • 使用者管理;
  • 備份管理;
  • 定時更新系統核心;
  • 服務管理。

掌握這五個方面,能應對大多數情況的黑客攻擊(與掌握和了解法律知識能在大多數情況維護我們的公民權益是相通的)。

一、防火牆

防火牆是伺服器的第一道防線,雖然不能百分百防護得到,但至少能阻擋大多數黑客的DOS或DDOS以及利用部分開源軟體的漏洞進行病毒植入等攻擊。這次伺服器之所以被黑客植入病毒,在於防火牆的埠被黑客鑽了空子,後面會提到針對此如何進行防範。

1.防火牆設定開機自啟動

1
systemctl enable firewalld

2.防火牆常用命令

(1)防火牆狀態檢視(開啟或關閉)

1
systemctl status firewalld

(2)開放埠

1
firewall-cmd --permanent --add-port=埠/tcp

(3)關閉埠

1
firewall-cmd --permanent --remove-port=埠/tcp

(4)防火牆重啟

1
firewall-cmd --reload

(5)檢視防火牆已開放埠

1
firewall-cmd --list-ports

注意:
無論是伺服器開放埠還是關閉埠必須要重啟防火牆生效,否則無效。

二、使用者管理

1.ssh埠修改

1
vim /etc/ssh/sshd_config

新增一行Port 12593即可,如圖所示:

重啟sshd:

1
systemctl restart sshd

 

需要開啟防火牆:

1
2
firewall-cmd --permanent --add-port=12593/tcp
firewall-cmd --reload

 

2.禁用root遠端登入

Ubuntu就是這樣設計的,系統安裝成功後,不能使用root登入,只能使用系統安裝時新建的普通使用者來切入到root使用者才行,最初我不太理解Ubuntu為什麼要這麼設計,而後經過一系列的教訓後才明白為什麼要慎用root或不用root。

修改配置檔案:

1
vim /etc/ssh/sshd_config

 

新增如下內容:

1
2
找到 # PermitRootLogin yus
改為 PermitRootLogin no

 

3.建立普通使用者授予一定目錄的許可權

1
2
useradd blog #新增使用者
passwd #重置密碼

例如:
我要將我的blog系統部署在Linux上,我按照上面新建blog使用者,將blog系統所需的如JDK、Redis、Nacos、MySQL、ES、MongoDB等軟體按照一定的規範進行放置。

三、備份管理

1.資料備份

編寫服務指令碼通過scp命令進行遠端傳輸到備份伺服器對應的資料備份
目錄。
核心命令如下:

1
scp  -r sql_月份或天.zip mysql@ip:/home/mysql/backup

 

資料備份指令碼內容可供參考(可以結合上面的scp命令,實現備份到另外的伺服器):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
base_dir=/home/blog/sql_script
DATE=$(date +%Y%m%d)
time=$(date "+%Y-%m-%d %H:%M:%S")
cd $base_dir
mysqldump -uroot -p123456 --databases wordpress nacos > dump_$DATE.sql

if [ $? -eq 0 ]
then
  echo "成功備份mysql資料庫,當前日期為:"$time >> /home/blog/mysql_dump.log

else

  echo "備份mysql資料庫失敗:當前日期為:"$time>> /home/blog/mysql_dump.log

fi

 

2.程式日誌備份

目前日誌主要儲存在/home/blog/dev/log目錄下。
核心命令如下(可寫入shell指令碼定時執行):

1
scp -r server_log_月份或天.zip server@ip:/home/server/backup

 

3.系統日誌備份(針對伺服器所產生的系統日誌)

一般日誌主要儲存在/var/log下。
核心命令如下(可寫入shell指令碼定時執行):

1
scp -r system_log_月份或天.zip system@ip:/home/system/backup

 

因為之前經歷過資料庫被刪,總結了相關教訓,寫下了另外一篇文章,感興趣的朋友可以閱讀:
資料庫被刪之反思

四、定期更新系統核心

也許有朋友疑問為什麼要定期更新系統核心?我歸納為如下四點:

  • 硬體相容性更好(支援更多的硬體);
  • 修復原有核心系統漏洞(有的黑客會以原有系統漏洞來達到攻擊伺服器的目的),提升系統穩定性;
  • 系統將擁有更多的記憶體(核心部分將不會被交換到虛擬記憶體中,這也是不少朋友感覺伺服器記憶體雖然16G,實際能用的可能只有12~13G左右);
  • 更多的新功能和特性,提高效率,減少運維工作量(站在巨人的肩上)。

要特別注意一點:
要按照實際情況更新系統核心,切不可隨意更新,更新前一定要有充足的準備,防止更新以後出現不相容性問題導致影響巨大(特別是生產環境,要特別小心,可以事先做試驗更新確保問題,同時也把坑給踩了)。

1.更新yum源倉庫

1
yum -y update

2.啟用 ELRepo 倉庫

1
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

3.安裝ELRepo倉庫的yum源

1
2
yum install
https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm

4.查詢可用的系統核心包

1
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

5.安裝最新版本核心

1
yum --enablerepo=elrepo-kernel install kernel-ml

6.設定新的核心為grub2的預設版本

1
grub2-set-default 0

7.生成 grub 配置檔案並重啟

1
2
3
grub2-mkconfig -o /boot/grub2/grub.cfg (必須等待該命令執行完畢後才執行reboot重啟伺服器)

reboot

8.驗證新核心

1
uname -r

五、服務管理

1.應用軟體

(1)MySQL

a.避免使用預設埠3306;
b.如需對外暴露,限制IP;
c.對外連線賬戶,密碼設定複雜且做嚴格庫表許可權控制;
d.不使用根使用者執行MySQL。

(2)Redis

a.禁止監聽公網;
b.禁止使用root使用者啟動;
c.限制Redis配置檔案訪問許可權(chmod 600 redis.conf)
d.修改預設埠(最好不要為6379);
e.開啟保護模式;
f.開啟賬號密碼認證模式;
g.資料加密,開啟SSL代理。

(3)Nginx

a.隱藏版本號(防止黑客針對版本漏洞進行攻擊);
b.開啟HTTPS;
c.開啟黑白名單;
d.新增賬號認證(一般為basic,雙重認證的體系);
e.限制請求方法;
f.拒絕User-Agent和Header頭設定;
g.圖片防盜鏈;
h.控制併發連線數;
i.限制緩衝區大小(防止緩衝區溢位攻擊)。

2.微服務

(1)通過閘道器代理訪問,僅暴露閘道器(閘道器處於公網下,一般Nginx代理閘道器,閘道器處於內網)。

(2)各個微服務處於內網,通過註冊中心建立聯絡,如涉及叢集,可通過Nginx負載均衡策略實現請求分發。

六、總結

按照上面的原則執行,基本上出問題的概率非常低,此次被黑客攻擊,就是因為違背上面的原則導致的(如假定Redis不在公網公開,或者是在公網公開並設定嚴格的認證模式,或許不會被攻擊),此次攻擊已知的病毒為networkservice和sysupdate,可能存在一些未知的病毒,最後系統因為某種原因崩潰,不得不重灌。一次又一次的慘痛經歷,此文一方面有總結筆者我在伺服器安全策略的思考與實踐,另外一方面也有算作記錄這次慘痛教訓,最後一方面希望廣大的朋友以此為鑑。再次驗證了那句話,“禍患常積於忽微,而智勇多困於所溺”。