高性能Linux服務器構建實戰 第一章 服務器安全運維

1. 安全運維

1.1 賬戶和登錄安全


1.1.1 用戶和用戶組管理

cat/less/more /etc/passwd
awk -F':' '{print $1}' /etc/passwd
wc -c/l/w  #字節/行數/字數
userdel games
groupdel games
usermod -s /sbin/nologin nagios   #禁用該用戶登錄

1.1.2 系統服務管理

service/sysv-rc-conf /chkconfig
service --status-all  #查看服務列表
chkconfig --list #顯示所有服務
chkconfig [--add] [--del] name
chkconfig --level 345 bluetooth off #指定藍牙在345等級中關閉
服務名稱 服務內容
acpid 電源管理,重要,建議開啓
apmd 高級電源能源管理服務,監控電池性能
kudzu 檢測硬件是否變化,建議開啓
crond 爲linux下自動安排的進程提供運行服務,建議開啓
atd 類似crond,提供在指定時間做指定的事情,與window下計劃任務功能相同
keytables 裝載鏡像鍵盤,選擇啓動
iptables 內置防火牆,必須啓動
xinetd 支持多種網絡服務的核心守護進程,建議開啓
xfs 使用X window桌面系統必須的服務
network 啓動網絡服務,必須啓動
sshd linux遠程登錄服務,建議開啓
syslog 系統日誌服務,重要,建議開啓
運行等級 個人理解
0 爲停機,機器關閉
1 爲單用戶模式,就像Win9x 下的安全模式類似
2 爲多用戶模式,但是沒有NFS 支持
3 爲完整的多用戶模式,是標準的運行級
4 一般不用,在一些特殊情況下可以用它來做一些事情,例如在筆記本電腦的電池用盡時,可以切換到這個模式來做一些設置
5 就是 X11 ,進到 X Window 系統了
6 爲重啓,運行 init 6 機器就會重啓

1.1.3 登錄密碼安全管理

vi /etc/ssh/sshd_config 
Protocol 2 #允許使用ssh2
PubkeyAuthentication yes #啓動PublickKey認證
AuthorizedKeysFile .ssh/authorized_key #PublicKey文件路徑
PasswordAuthentication no #禁用口令登錄
/etc/rc.d/init.d/sshd restart

1.1.4 用戶root權限管理

sudo vi /etc/sudoers /sudo visudo  #檢查sudoers語法
sudo su -  #切換到root用戶
sudo [-l]  #顯示當前用戶的權限 [-V] #顯示版本
user01 ALL=(ALL) NOPASSWD: ALL
用戶名 網絡中的主機=(執行命令的目標用戶) 執行的命令範圍

1.1.5 系統歡迎頁面管理

/etc/issue、/etc/issue.net、/etc/redhat-release、/etc/motd
vi /etc/ssh/sshd_config 
Banner /etc/issue.net  #在ssh登錄後顯示內容,默認不開啓

ssh或telnet登錄顯示issue.net內容
本地登錄顯示issue內容
系統公告 /etc/motd #可發佈系統維護、升級、警告黑客等信息 

1.1.6禁用Control-Alt-Delete鍵盤關閉命令

CentOS5.x以下
vi /etc/inittab
# ca::ctrlaltdel:/sbin/shutdown -t3 -r now
CentOS6.x以上 
vi /etc/init/control-alt-delete.conf
# exec /sbin/shuddown -r now "Control-Alt-Delete pressed"

1.2遠程訪問和認證安全


1.2.1 取消telnet使用ssh登錄

telnet 是古老的遠程登錄認證服務,在網絡上用明文傳送口令和數據。
sshd 通過使用ssh,加密所有傳輸的數據並壓縮,加快網絡傳輸速度,防止dns和ip欺騙。

vi /etc/ssh/sshd_config
Port 22 #sshd監聽端口,建議更改默認5位以上的陌生數字
Protocol 2 #ssh協議版本,ssh1有缺陷和漏洞,默認ssh2
ListenAddress 0.0.0.0 #sshd服務器綁定的ip地址
HostKey /etc/ssh/ssh_host_dsa_key #服務器密匙文件路徑
KeyRegenerationInterval 1h #多少秒後系統自動自動生成服務器密匙,防止被盜用
ServerKeyBits 1024 #服務器密匙長度
SyslogFacility AUTHPRIV #記錄來自sshd消息的時候是否"facility code"
LogLevel INFO #sshd日誌消息級別
LoginGraceTime 2m #如果用戶登錄失敗,切斷鏈接前服務器需要等待的時間
PermitRootLogin no #超級用戶root能不能用ssh登錄,建議no
StricModes yes #ssh在接收登錄請求之前是否檢查用戶根目錄和rhosts文件的權限和所有權,建議yes
RSAAuthentication no #是否開啓RSA密鑰驗證,針對SSH1
PubkeyAuthentication yes #設置是否開啓公鑰驗證
AuthorizedKeysFile .ssh/authorized_keys #設置公鑰驗證文件的路徑,與PubkeyAuthentication配合使用
IgnoreUserKnownHosts no #SSH在進行RhostsRSAAuthentication 安全驗證時是否忽略用戶 "$HOME/.ssh/known_hosts"文件
IgnoreRhosts yes #驗證時是否使用 "~/,rhosts" 和 "~/.shosts" 文件
PasswordAuthentication yes # 設置是否開啓密碼驗證機制
PermitEmptyPasswords no #是否允許用口令爲空的賬戶登錄系統,選擇no
ChallengeResponseAuthentication no #禁用s/key密碼
UsePAM no #不通過PAM驗證
X11Forwarding yes #用戶設置是否允許X11轉發
PrintMotd yes #設置sshd是否在用戶登錄的時候顯示 "/etc/motd" 中的信息。
PrintLastLog no #是否顯示上次登錄信息,建議no
Compression yes #是否壓縮命令,建議yes
TCPKeepAlive yes #防止死連接,建議yes
UseDNS no #是否使用DNS反向解析
MaxStartups 5 #設置同時允許幾個尚未登入的聯機,用戶連上SSH尚未輸入密碼的聯機。
MaxAuthTries 3 #失敗嘗試登錄次數3
AllowUsers <用戶名 用戶名2> #指定允許通過遠程訪問的用戶
AllowGroups <組名 組名2> #指定允許通過遠程訪問的用戶組
DenyUsers <用戶名 用戶名2> #禁止通過遠程訪問的用戶
DenyGroups <組名 組名2> #禁用通過遠程訪問的用戶組

1.2.2 合理使用shell歷史記錄命令

/etc/bashrc 或 /etc/bash.bashrc 或 ~/.bashrc
HISTFILESIZE=4000
HISTSIZE=4000
HISTTIMEFORMAT='%F %T'
export HISTTIMEFORMAT

/etc/profile 提供系統審計和故障排查的歷史功能
#history
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
HISTDIR=/usr/share/.history
if [ -z $USER_IP ]; then
        USER_IP=`hostname`
fi

if [ ! -d $HISTDIR ]; then
        mkdir -p $HISTDIR
        chmod 777 $HISTDIR
fi

if [ ! -d $HISTDIR/${LOGNAME} ]
        then
        mkdir -p $HISTDIR/${LOGNAME}
        chmod 300 $HISTDIR/${LOGNAME}
fi

export HISTSIZE=4000
DT='date + %Y%m%d_%H%M%S'
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null


find / -path /media -prune -o -name '*.history' -print 2>/dev/null #查找除/media目錄以外的*.history文件

1.2.3 啓用tcp_wrappers防火牆

分析tcp/ip封包軟件,類似的ip封包軟件有iptables
iptables通過ip過濾機制實現第一層防護,直觀地監視系統的運行狀態,阻擋惡意攻擊。
tcp_wrappers實現某些服務的開發和關閉、允許和禁止,更有效的保證系統運行。

service:host(s) [:action]

service: #服務名,sshd、vsftpd、sendmail
host(s): #主機名或ip,192.168.1.0、www.scooky.com
action: #符合條件後採取的動作

ALL:ALL EXCEPT 192.168.1.100 #除了192.168.1.100這臺機器,任何機器執行所有服務時或被允許或被拒絕

vi /etc/hosts.allow
sshd: 192.168.1.100
sshd: 192.168.1.101
sshd: www.scooky.com

vi /etc/hosts.deny
sshd:ALL

允許來自192.168.1.100/101或www.scooky.com的ssh連接,其餘的主機被限制。

1.3 文件系統安全


1.3.1 鎖定系統重要文件

chattr [-RV] [-v version] [mode] 文件或目錄
-R #遞歸修改所有的文件及子目錄
-V #詳細顯示修改內容,並打印出來
mode
a #append,允許添加不能刪除,常用於服務器日誌文件安全設定。
i  #immutable,不允許對文件進行任何操作,包括root。

lsattr [-adlRvV] 文件或目錄
-a #列出目錄中所有文件
-d #顯示指定目錄的屬性
-R #遞歸方式列出目錄中文件
-v #顯示文件或目錄版本

防止root被盜,對重要文件鎖定,常用的有:
chattr -R +i /bin /boot /lib /sbin
chattr -R +i /usr/bin /usr/include /usr/lib /usr/sbin
chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/hosts
chattr +i /etc/resolv.conf
chattr +i /etc/fstab
chattr +i /etc/sudoers
chattr +a /var/log/messages
chattr +a /var/log/wtmp

1.3.2 文件權限檢查和修改

find / -type f -perm -2 -o -perm -20 | xargs ls -al #查找系統中任何用戶都有寫權限的文件
find / -type d -perm -2 -o -perm -20 | xargs ls -ld #查找系統中任何用戶都有寫權限的目錄
find / -type f -perm -4000 -o -perm -2000 -print | xargs ls -al #查找系統中所有含有s位的程序
find / -user root -perm -2000 -print  -exec md5sum {} \; #檢查系統中所有suid及sgid文件
find / -user root -perm -4000 -print  -exec md5sum {} \; #檢查系統中所有suid及sgid文件
find / -nouser -o -nogroup #檢查系統中沒有屬主的文件

1.3.3 /tmp、/var/tmp、/dev/shm 安全設定

/tmp、/var/tmp用來存放臨時文件的主要目錄
/dev/shm是linux下的共享內存設備,啓動系統時默認加載,使用tmpfs內存文件系統,數據駐留在RAM中,通過/dev/shm可直接操控系統內存。

1. 設立/tmp分區法
將/tmp設定爲獨立的磁盤分區,修改/etc/fstab的/tmp掛載屬性,增加nosuid(不允許任何suid程序)、noexec(不能執行腳本)、nodev(不存在設備文件)三個選項,重新掛載/tmp分區即可。
將/var/tmp鏈接到/tmp下
mv /var/tmp/* /tmp
ln -s /tmp /var/tmp
2. 建立loopback文件系統法
通過創建loopback文件系統來利用linux內核的loopback特性將文件系統掛載到/tmp下
dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000
mke2fs -j /dev/tmpfs
cp -av /tmp /tmp.old
mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp
chmod 1777 /tmp
mv -f /tmp.old/* /tmp/
rm -rf /tmp.old
編輯/etc/fstab,以便系統啓動時自動加載loopback文件系統
/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0

修改/dev/shm安全設置
vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,nosuid,noexec,rw 0 0

1.4 系統軟件安全管理


yum(yellow dog updater modified)
rpm -qa | grep yum #檢查是否安裝了yum

/etc/yum.conf #主配置文件
/etc/yum.repos.d #資源配置目錄

/etc/yum.repos.d/CentOS-Base.repo #資源庫配置
name #發行版名稱,Base表明此段尋找的事Base包信息
mirrorlist #yum在互聯網上查找升級文件的URL地址,basearch代表硬件架構(i386、x86-64等)
gpgcheck #是否啓動gpg檢查,啓用需要配置GPG-RPM-KEY的位置
gpgkey #指定GPG密鑰的地址

yum自動下載升級資源包默認放置在/var/cache/yum目錄下

yum install dhcp #安裝dhcp
yum remove licp #刪除licq包和有依賴性的包
yum checkin-update #檢查可更新的RPM包
yum update #更新所有RPM包
yum update kernel kernel-source #更新指定的RPM包
yum upgrade #大規模的版本,與update的區別是陳舊的包也會升級
yum info #列出資源庫中所有可以安裝或更新的RPM信息
yum into perl* #列出資源庫中特定的可以安裝或更新以及安裝的RPM包信息
yum info updates #列出資源庫中所有可以更新的RPM包信息
yum info installed #列出所有已安裝的所有RPM包信息
yum info extras #列出已經安裝,但不包含資源庫中的RPM包信息,也就是其他網站下載的RPM包
yum list updates #列出資源庫中所有可以更新的RPM包
yum list installed #列出已安裝的RPM包
yum list extras #列出已安裝,但不包含在資源庫中的RPM包,也就是其他網站下載的RPM包
yum list # 列出資源庫中所有可以安裝或更新的RPM包
yum list gcc* #列出資源庫中特定的可以安裝或更新以及已安裝的RPM包
yum search wget #搜索特定字符的RPM包信息
yum provides realplay #搜索包含特定文件名的RPM包
yum clean packages #清除暫存的RPM包
yum clean headers #清除暫存的RPM頭文件
yum clean oldheaders #清除暫存中舊的RPM頭文件
yum [clean /clean all] #清除暫存舊的rpm頭文件和包文件

yum第三方源
EPEL,企業版Linux附件軟件包
RPMForge,第三方軟件源倉庫

1.5 Linux後門入侵檢測工具


文件級別rootkit,通過修改系統的重要文件來達到隱藏自己的目的,通常容易被替換的系統程序有,login、ls、ps、ifconfig、du、find、netstat,檢查文件完整性工具常見的有Tripwire、aide等。

內核級別rootkit,對系統底層獲得完全控制權,修改內核,截獲運行程序向內核提交的命令,並重定向到入侵者所選擇的程序,只有防範攻擊者將系統維持在最小權限工作,避免內核被植入rootkit。

rootkit後門檢測工具[chkrootkit](http://www.chkrootkit.org/)
1. 準備gcc編譯環境
yum -y install gcc
yum -y install gcc-c++
yum -y install make
2. 安裝chkrootkit
從官網下載chkrootkit源碼
tar zxvf chkrootkit.tar.gz
cd chkrootkit-*
make sense
cd ..
cp -r chkrootkit-* /usr/local/chkrootkit
rm -rf chkrootkit-*
3. 使用chkrootkit
/usr/local/chkrootkit/chkrootkit -h #顯示幫助信息
-p dir1:dir2:dirN #指定chkrootkit檢測時使用系統命令的目錄
/usr/local/chkrootkit/chkrootkit #開始檢測系統
4. chkrootkit的缺點
chkrootkit在檢查rootkit的過程中使用了部分系統命令,如果依賴的系統命令被替換,此時檢測的結果將變得完全不可信。爲了避免這個問題,在服務器對外開放之前,事先將chkrootkit使用的系統命令進行備份,使用時用備份命令進行檢測。
mkdir /usr/share/.commands
cp `which --skip-alias awk cut echo find egrep id head ls netstat ps strings sed uname` /usr/share/.commands
/usr/local/chkrootkit/chkrootkit -p /usr/share/.commands/
cd /usr/share/
tar zcvf commands.tar.gz .commands
rm -rf commands.tar.gz
在/usr/share/下建立一個.commands的隱藏文件,將chkrootkit使用的系統命令壓縮備份,然後下載到一個安全的地方,服務器被入侵後,可以上傳回來通過chkrootkit -p參數指定路徑進行檢測。

rootkit後門檢測工具[RKHunter](http://www.rootkit.nl/projects/rootkit_hunter.html)
1. 安裝RKHunter
tar -zxvf rkhunter-1.4.0.tar.gz
cd rkhunter-1.4.0
./installer.sh --layout default --install
2. 使用rkhunter
/usr/local/bin/rkhunter-help   #顯示幫助
/usr/local/bin/rkhunter -c         #開始檢測
/usr/local/bin/rkhunter --check --skip-keypress   #開始檢測並跳過enter確認
3. 定時運行
/etc/crontab
09 3 * * * root /usr/local/bin/rkhunter --check --cronjob

1.6 服務器遭受攻擊後的處理過程


1. 一般思路
切斷網絡、查找攻擊源、分析入侵原因和途徑、備份用戶數據、重新安裝系統、修復程序或系統漏洞、恢復數據和連接網絡。

2. 檢查並鎖定可疑用戶
w   #列出所有登錄過的所有用戶
passwd -l nobody #鎖定nobody用戶
ps -ef | grep $pts/3 #根據w命令的TTY找到pid值
kill -9 6051 #將此用戶踢下線
last #查看用戶登錄事件

3. 檢查並關閉系統可疑進程
pidof sshd #查找正在運行軟件的pid值
ls -al /proc/13276/exe #進入內存目錄找到pid對應的exe文件信息
fuser -n tcp 25 #指定tcp、udp協議找到進程pid
ps -ef | grep 2037 #根據pid找到運行目錄

4. 檢查文件系統完好性
對比/bin/ls文件的大小
rpm -Va #rpm工具驗證,文件標記M被篡改或替換

1.7 一次Linux被入侵後的分析


  1. 攻擊者通過80端口的web服務文件漏洞進行shell注入,進入系統,在/var/tmp目錄下創建隱藏目錄,將rootkit後門文件傳到該路徑下。
  2. 通過後門程序,獲取超級用戶權限,通過這臺服務器進行對外發包
  3. 攻擊者ip地址可能是代理的,也可能是控制其他的肉雞服務器
  4. 爲了永久控制這臺機器,修改了系統默認賬戶mail,將mail賬戶變爲登錄,並設置了密碼。
  5. 攻擊完成後,自動清理了系統訪問日誌,毀滅證據。

防範:
1. 安裝穩定版本操作系統,刪除系統默認不需要的用戶。
2. 系統登錄改爲公鑰認證,避開密碼認證缺陷。
3. 安裝高版本的web服務器和對程序代碼進行審覈。
4. 使用linux下的tcp_wrappers防火牆,限制SSH登錄的源地址。

參考:

高性能Linux服務器構建實戰 – 高俊峯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章