[TOC]
# 安全事件
互聯網時代最重要的是數據,數據備份的同時還要加固系統防止泄露和涂改等。 最近筆者接到一個網友的詢問,它的服務器數據庫留下了這樣一段話( To recover your lost Database and avoid leaking it: Send us 0.05 Bitcoin (BTC) to our Bitcoin address 14yVUjTFesHAusWZ8qytA9faYmKfqEFpYv and contact us by Email with your Server IP or Domain name and a Proof of Payment. Your Database is downloaded and backed up on our servers. If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise. )其實這是用戶的服務器中了勒索病毒,中病毒的原因有可能很多種,軟件的漏洞、服務器密碼的泄露、服務器中了木馬或病毒等,通常中此病毒后用戶可以通過以下兩個網站尋求解決方案:
* https://id-ransomware.malwarehunterteam.com/
* https://www.nomoreransom.org/
但是通常是沒有太好的解決方案,除非按照黑客的要求提供0.05比特幣。但是作為系統管理員的您可以防范于未然,提前加固我們的服務器安全。如何加固,我們分為系統加固、網絡加固、安全測試和入侵排查幾個方面來介紹。
# 系統加固
關于加固服務器可以按照以下步驟來執行:
服務器安全不只是數據庫方面,您可參考以下內容,加固服務器的安全性:
* 服務器設置大寫、小寫、特殊字符、數字組成的12-16位的復雜密碼 ,也可使用密碼生成器自動生成復雜密碼,我們可以通過這個在線地址自動生成復雜密碼 https://suijimimashengcheng.51240.com/?
* 刪除服務器上設置的不需要的用戶?
* 對于不需要登錄的用戶,請將用戶的權限設置為禁止登錄?
* 修改遠程登錄服務的默認端口號以及禁止超級管理員用戶登陸?
* 較為安全的方法:只使用密鑰登錄禁止密碼登陸 (針對Linux系統)?
* 防火墻限定指定的端口訪問
* 不建議向公網開放核心應用服務端口訪問,例如MySQL、Redis等
*注:做好云服務器系統的安全防護可以有效加強云服務器系統安全, 但也無法保證絕對安全, 建議定期做好云服務器系統的安全巡檢及數據備份,以防突發情況導致數據丟失、或業務不可用。
## 設置密碼策略
修改文件/etc/login.defs 。
```
PASS_MAX_DAYS 90 密碼最長有效期
PASS_MIN_DAYS 10 密碼修改之間最小的天數
PASS_MIN_LEN 8 密碼長度
PASS_WARN_AGE 7 口令失效前多少天開始通知用戶修改密碼
```
## 設置密碼強度
編輯文件/etc/pam.d/password-auth。
```
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= difok=1 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1
```
* difok= 定義新密碼中必須要有幾個字符和舊密碼不同
* minlen=新密碼的最小長度
* ucredit= 新密碼中可以包含的大寫字母的最大數目。-1 至少一個
* lcredit=新密碼中可以包含的小寫字母的最大數
* dcredit=定新密碼中可以包含的數字的最大數目
*注:這個密碼強度的設定只對"普通用戶"有限制作用,root用戶無論修改自己的密碼還是修改普通用戶的時候,不符合強度設置依然可以設置成功*
## 設置登錄次數
編輯文件 /etc/pam.d/sshd。
```
auth required pam_tally2.so deny=3 unlock_time=150 even_deny_root root_unlock_time300
```
* pam_tally2 查看被鎖定的用戶
* pam_tally2 --reset -u username 將被鎖定的用戶解鎖
## 禁止root用戶遠程登錄
禁止ROOT用戶遠程登錄 。打開 /etc/ssh/sshd_config
```
#PermitRootLogin no
```
*注:生效需要重啟sshd守護進程*
## 設置賬戶保存歷史命令條數 & 超時時間
打開 /etc/profile ,修改如下。
```
HISTSIZE=1000
TMOUT=600
```
# 網絡加固
網絡是入侵主要的途徑,有效控制的網絡出入可以降低被入侵的風險,這里我們就需要使用到Linux自帶的防火墻(iptables)。以下是服務器的案例
# 目錄規劃與備份
## 目錄規劃
我們在做業務時最重要的就是合理規劃目錄,以騰訊云的計算產品為例,我們可以看到它分為:
* 系統盤,系統盤通常存放操作系統的內容,此盤不建議我們存放數據
* 數據盤(云盤),數據盤主要用來存放數據
在系統盤中,建議可以/var/log下的日志,進行日志的切割,同時定期刪除這些日志文件。數據盤最好有合理的規劃,來看以下目錄的規劃案例。
```
[djangowang@localhost ~]# cd /data1/
[djangowang@localhost ~]# tree -d -L 2
.
|-- backup # 數據備份目錄
| |-- database
| |-- file_history
| |-- panel
| `-- site
|-- php_session # 擴展目錄
|-- Recycle_bin # 回收站
| |-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606275469.6741953
| |-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606487788.4557512
| `-- _bt_www_bt_wwwroot_bt_fastadmin.puppeter.com_t_1606488343.4240072
|-- server # 程序目錄
| |-- cron
| |-- data
| |-- mysql
| |-- nginx
| |-- panel
| |-- php
| |-- phpmyadmin
| |-- pure-ftpd
| `-- stop
|-- wwwlogs
| `-- waf
`-- wwwroot # 個人網站發布目錄
|-- book.puppeter.com
|-- discuz
|-- fastadmin.puppeter.com
`-- test.puppeter.com
```
## 數據備份
有合理的目錄規劃后,我們就可以很方便的來備份這些重要的數據。備份的方式有多重具體可以參考(高級系統管理-> 系統備份),如果數據比較大建議直接打包指定目錄的數據,如果不打或者比較多的文本文件建議打包壓縮這些文件,以(目錄規劃)為例,最重要的文件應該是 /data1/wwwroot/ 下的文件,所以我們可以直接tar命令打包備份它們。
```
[djangowang@localhost ~]# tar -czvf backup.tar.gz /data1/wwwroot/*
```
*注: tar的-z參數是壓縮,會涉及大量的cpu計算,這種備份建議放在凌晨服務器不繁忙的情況下進行自動備份*
# 安全測試
安全測試就是從一個黑客的角度通過工具以黑盒的方式來檢測網站是否安全,這里推薦Hydra工具。Hydra(“九頭蛇”)黑客工具(官網:https://www.mh-sec.de/ ),可以暴力破解各種服務的密碼,包括不限于如下:
* 破解ssh
* 破解ftp
* get方式提交,破解web登錄
* post方式提交,破解web登錄
* 破解https
* 破解teamspeak
* 破解cisco
* 破解smb
* 破解pop3
* 破解MySQL
## Hydra安裝
```
[djangowang@localhost ~]# yum install hydra
```
## Hydra參數
* \-R 繼續從上一次進度接著破解。
* \-S 采用SSL鏈接。
* \-s PORT 可通過這個參數指定非默認端口。
* \-l LOGIN 指定破解的用戶,對特定用戶破解。
* \-L FILE 指定用戶名字典。
* \-p PASS 小寫,指定密碼破解,少用,一般是采用密碼字典。
* \-P FILE 大寫,指定密碼字典。
* \-e ns 可選選項,n:空密碼試探,s:使用指定用戶和密碼試探。
* \-C FILE 使用冒號分割格式,例如“登錄名:密碼”來代替-L/-P參數。
* \-M FILE 指定目標列表文件一行一條。
* \-o FILE 指定結果輸出文件。
* \-f 在使用-M參數以后,找到第一對登錄名或者密碼的時候中止破解。
* \-t TASKS 同時運行的線程數,默認為16。
* \-w TIME 設置最大超時的時間,單位秒,默認是30s。
* \-v / -V 顯示詳細過程。
## Hydra使用案例
1. 如何檢測Linux服務器的登錄密碼。hydra -l 用戶名 -P 密碼字典 -t 線程數 -vV(顯示詳細過程) -e ns IP ssh
```
[djangowang@localhost ~]# hydra -l root -P ruopass.txt -t 10 -vV -e ns 122.51.60.210 ssh
```
2.如何破解MySQL。
```
[djangowang@localhost ~]# hydra -l root -P ruopass.txt -t 5 -Vv localhost mysql
```
3. 如何破解Windows服務器登錄密碼。hydra -l 用戶名 -P 密碼字典 -t 線程數 -vV(顯示詳細過程) -e ns rdp。
```
[djangowang@localhost ~]# hydra -l administrator -P ruopass.txt -t 5 -Vv 129.211.103.202 rdp -s 3389
```
# 入侵排查
以下我們來介紹一下入侵排查的思路。
## 查看當前登錄用戶狀態
通過(w ) 命令確認當前用戶登錄狀態。
```
[[djangowang@localhost ~]# w
09:18:10 up 254 days, 18:58, 2 users, load average: 0.29, 0.11, 0.08
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19May20 48days 1.05s 1.05s -bash
root pts/0 116.77.73.251 09:17 2.00s 0.02s 0.00s w
```
如果有異常用戶在線,可以先修改密碼后再將異常用戶踢出,踢出方法如下:
```
[djangowang@localhost ~]# ps -ef | grep tty1
root 4203 4189 0 2020 tty1 00:00:01 -bash
root 23703 23463 0 09:19 pts/0 00:00:00 grep --color=auto tty1
[djangowang@localhost ~]# kill -9 4203
[djangowang@localhost ~]# w
09:19:16 up 254 days, 18:59, 1 user, load average: 0.10, 0.09, 0.07
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 116.77.73.251 09:17 4.00s 0.02s 0.00s w
```
## 排查登錄信息
在Linux系統中,我們通過last命令來查看用戶登錄信息,他包含登錄用戶名、TTY、IP、登錄時間等信息。
```
[djangowang@localhost ~]# last
root pts/0 116.77.73.251 Sat Jan 16 09:17 still logged in
root pts/0 116.77.73.251 Fri Jan 15 21:20 - 21:41 (00:20)
root pts/0 14.17.22.36 Fri Jan 15 16:02 - 16:15 (00:13)
...
```
我們可以通過此信息排查過去一段時間內是否有用戶登錄過,通過哪個用戶登錄并做了什么。( last ) 命令會讀取/var/log/wtmp文件,此文件記錄了這些登錄信息,如果黑客清理了此文件我們就會查不到登錄信息。 這里可以加一個特殊的權限位,讓用戶變為只能追加且不能刪除,執行命令如下。
```
[djangowang@localhost ~]# chattr +a /var/log/wtmp
```
## 排查歷史命令
在Linux系統中,我們通過 history 命令,排查用戶執行的命令或修改的文件,但不包含文件內容。history命令的用法如下。
```
[djangowang@localhost ~]# history | more
1 2021-01-16 09:17:38 dig cdntest.site
2 2020-09-08 10:46:47 dig cdntest.site
3 2020-09-08 10:46:47 dig cdntest.site
4 2020-09-08 10:46:47 dig cdntest.site
5 2020-09-08 10:46:48 dig cdntest.site
6 2020-09-08 10:46:48 dig cdntest.site
7 2020-09-08 10:46:48 dig cdntest.site
8 2020-09-08 10:46:48 dig cdntest.site
```
history命令讀取了宿主目錄中的.bash_history 文件,為了防止黑客清理此文件,建議增加特殊標志位。
```
[djangowang@localhost ~]# chattr +a ~/.bash_history
```
## 排查開放的端口和連接狀態
我們可以通過( netnstat ) 命令來查看與本機建立連接的IP和端口。
```
[djangowang@localhost ~]# netstat?-antlp?|?more
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 172.16.16.2:22 116.77.73.251:54092 ESTABLISHED 28352/sshd: root@pt
tcp 0 0 172.16.16.2:40688 169.254.0.55:5574 ESTABLISHED 8034/YDService
...
```
通過lsof命令查看端口,就能查看到他的進程ID和一些相關信息。
```
[djangowang@localhost ~]# lsof -i 40688
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
YDService 8034 root 37u IPv4 375815846 0t0 TCP VM_16_2_centos:40688->169.254.0.55:lsi-bobcat (ESTABLISHED)
```
通過查看/proc文件中的fd,就能查看到程序的位置。
```
[djangowang@localhost ~]# ls -al /proc/8034/fd/*
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/0 -> /dev/null
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/1 -> /dev/null
l-wx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/15 -> /usr/local/qcloud/YunJing/ydsvc.err
lrwx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/16 -> /usr/local/qcloud/YunJing/log/hids.log
l-wx------ 1 root root 64 Jan 14 23:14 /proc/8034/fd/17 -> /usr/local/qcloud/YunJing/ydsvc.err
...
```
[djangowang@localhost ~]# 通過查看進行啟動時間確認是否有異常。
```
[djangowang@localhost ~]# ps -p 8034 -o lstart
STARTED
Thu Jan 14 23:14:45 2021
```
最后我們通過程序目錄的位置,啟動的時間和其他相關的信息判斷進程是否是正確的或是偽裝的木馬病毒,并做相關的處理。
## 排查啟動項
執行系統命令 (systemctl list-unit-files)其中左邊是服務名稱,右邊是狀態,enabled是開機啟動,disabled是開機不啟動。
```
[djangowang@localhost ~]# systemctl list-unit-files | grep enabled
brandbot.path enabled
acpid.service enabled
atd.service enabled
...
```
## 排查定時任務
通過crontab -l 命令列出當前的定時任務,并刪除不需要的定時任務。
```
[djangowang@localhost ~]# crontab?-l??#?列出當前用戶的計時器設置
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
```
## 排查系統日志
以下日志位置是我們需要主要關注的日志。
| 日志位置 | 說明 |
| --- | --- |
| /var/log/messages | 系統相關日志 |
| /var/log/cron | 定時任務日志 |
| /var/log/secure | 記錄驗證和授權方面的信息,只要涉及賬號和密碼的程序都會記錄,比如SSH登錄,su切換用戶,sudo授權,甚至添加用戶和修改用戶密碼都會記錄在這個日志文件中 |