很多人都說 Linux 在默認配置下很安全,我在一定程度上同意這個說法(很值得商榷的話題)。不過 Linux 內置的安全模型和工具做得確實很到位,用戶只需進行簡單的調整和自定義就可以加強 Linux 服務器安全。
與惡意用戶做斗爭對于所有 Linux 系統管理員來說都是一項艱巨的任務,本文我們將介紹如何加強 Linux 服務器安全的 20 項建議,希望對保護你的系統有所幫助。
1. 物理安全
在服務器 BIOS 中禁用光驅、軟驅、U盤等可引導的外部設備,并啟用 BIOS 密碼及 GRUB 密碼來限制對系統的物理訪問。
2. 磁盤分區
我們可以通過使用不同的分區來分散存儲數據以獲得更高的數據安全性,當發生任何災難時,由于數據是隔離存儲的,會將數據損失的幾率降到最低。
3. 盡量減少軟件包以減少漏洞
建議管理員盡量避免在 Linux 中安裝非必要的軟件包,而且不要使用來源不明的包,以盡可能的避免程序漏洞。當一個服務出問題時,很可能會波及到其它服務甚至整個系統,所以「非必要的服務就不運行」這是一個鐵則。
對于 CentOS 系統可以使用 chkconfig 來查看運行在 runlevel 3 的服務:
/sbin/chkconfig --list |grep '3:on'
一旦發現有不需要的服務正常運行,可以使用如下命令禁用:
chkconfig serviceName off
對于使用 RPM 包或 DEB 安裝的服務可以使用 yum 或 apt-get 找出包名稱并用如下命令移除:
yum -y remove package-name
sudo apt-get remove package-name
4. 查看網絡偵聽端口
使用 netstat 命令可以看到什么樣的網絡應用正在偵聽哪些端口,找出不必要的程序之后再用上面的方面來處理。
netstat –tulpn
5. 使用安全的遠程連接(SSH)
Telnet 和 rlogin 都使用明文的協議,而且已被證實存在多種已經安全漏洞,SSH 是一種安全的協議,它可以使用加密技術與服務器進行通訊。
非必要時,不要使用 root 賬戶登錄 SSH,要習慣使用 sudo 來切換身份。
SSH 22 端口目標過于明顯,建議大家改成一個不常用的高端口并在 vi /etc/ssh/sshd_config 配置文件中至少配置如下選項:
#禁用root登錄
PermitRootLogin no
#僅允許特定用戶
AllowUsers username
#SSH協議版本
Protocol 2
6. 保持系統更新
盡量始終保持系統內核、應用補丁及安全修復處在最新狀態:
yum updates
yum check-update
7. 鎖定定時任務
cron 可以指定哪些用戶可以使用,只需將允許的用戶添加到 /etc/cron.allow 或將禁用的用戶添加到 /etc/cron.deny 中即可。如果希望禁用所有用戶使用任務計劃,只需將ALL添加到cron.deny文件當中。
echo ALL >>/etc/cron.deny
8. 禁用USB存儲設備檢測
很多時候我們都需要禁用 USB 存儲設備以防數據拷出,此時可以創建一個/etc/modprobe.d/no-usb文件并填入如下內容即可禁用 USB 存儲設備檢測:
install usb-storage /bin/true
9. 啟用SELinux
安全增強型 Linux(SELinux)是在內核中提供的強制訪問控制的安全機制。很多網絡文章為了方便配置都建議大家禁用 SELinux 功能,我在這里到是建議大家在考慮關閉 SELinux 前應該三思。
SELinux 提供用戶三種基本操作模式:
Enforcing:啟用和執行機器上的 SELinux 策略(默認配置)
Permissive:在此種模式下,SELinux 不會強制執行系統上的安全策略,只會產生相應日志和警告。Permissive 模式在 SELinux 排錯時經常會乃至。
Disabled:禁用 SELinux 功能
如果你想查看當前系統 SELinux 的狀態可以使用:
sestatus
如果要從禁用狀態啟用 SELinux 可以使用:
setenforce enforcing
以上配置只對當前系統狀態有用,重啟會失效。要一勞永逸開關 SELinux 可以更改其配置文件/etc/selinux/config。
10. 移除KDE/GNOME桌面
不論你是運行 LAMP 的專屬服務器還是其它類型服務器,KDE 或 GNOME 這樣 X Window 桌面環境是沒多大必要使用的,禁用之后可以提高服務器性能和增強安全性。使用如下命令即可完全卸載:
yum groupremove "X Window System"
11. 禁用IPv6
IPv6 目前還沒有大規模普及,如果你不使用 IPv6 協議,可以在 /etc/sysconfig/network 配置文件中將其禁用。
NETWORKING_IPV6=no
IPV6INIT=no
12. 限制用戶重復使用舊密碼
很多用戶習慣在強制定期更換密碼時重復循環使用以前的密碼,這對于服務器管理員來說是一種非常不好的習慣。因此建議大家限制用戶重復使用舊密碼,該功能可以通過 PAM 來實現。
RHEL/CentOS/Fedora:/etc/pam.d/system-auth
Ubuntu/Debian/Linux Mint:/etc/pam.d/common-password
在上述配置文件中的auth區塊添加一行:
auth sufficient pam_unix.so likeauth nullok
在password區塊添加一行:
password sufficient pam_unix.so nullok use_authtok md5 shadow remember=5
配置好后,服務器會禁止使用最近 5 個被使用過的用戶密碼。
13. 配置密碼過期策略
Linux 中,用戶密碼是被加密存儲到/etc/shadow文件當中的,要配置密碼過期的詳細信息需要用到change命令。例如要查看某個賬戶的密碼過期日期和時間,可以使用如下命令:
chage -l username
要更改密碼過期策略可以使用類似如下命令:
chage -M 60 username
chage -M 60 -m 7 -W 7 username
-M 密碼使用最長天數
-m 密碼使用最短天數
-W 密碼過期提示天數
14. 手動鎖定或解鎖賬戶
在不從系統中移除賬戶的情況下,對賬戶進行鎖定和解鎖是非常有用的一個安全手段。需要鎖定一個賬戶時,可以使用如下命令:
passwd -l accountname
賬戶鎖定同樣適用于 root 賬戶,當某賬戶被鎖定時會增加 (!) 字串,賬戶解鎖時移除 (!) 字串。需要解鎖時使用如下命令:
passwd -u accountname
15. 強制使用強密碼
弱密碼或用生日密碼之類的密碼太容易被字典和社會工程學攻破了,所以建議大家打開強密碼要求。Linux 中的強密碼要求還是使用 PAM 模塊,只需編輯/etc/pam.d/system-auth文件:
/lib/security/$ISA/pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-2 dcredit=-2 ocredit=-1
16. 啟用Iptables
強烈建議大家使用 Iptables 來保護 Linux 服務器安全,Iptables 可以在不同的鏈上配置不同的規則來處理數據包。
17. 在Inittab中禁用Ctrl+Alt+Delete
大多數 Linux 發行版中按下「Ctrl+Alt+Delete」時都會重啟系統,對于 Linux 生產服務器來說,這幾乎是一個白癡設計。如果你希望關閉這個默認重啟功能,可以將/etc/inittab配置文件中的如下兩千注釋掉:
# Trap CTRL-ALT-DELETE
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
18. 查看空密碼賬戶
如果系統中存在有權限的空密碼賬戶,就相當于開了一扇門。所以建議大家仔細清查一下:
cat /etc/shadow | awk -F: '($2==""){print $1}'
19. 忽略ICMP或廣播請求
要忽略 ICMP 或廣播請求我們可以編輯/etc/sysctl.conf配置文件:
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
配置文件改好之后使用如下命令載入生效:
sysctl –p
20. 定期審查日志
建議大家將日志文件進行專門的集中存放和處理,這樣可以比較有效避免入侵者對日志進行篡改,下面是 Linux 常見的默認日志路徑:
/var/log/message – 系統日志或當前活動日志
/var/log/auth.log – 驗證日志
/var/log/kern.log – 內核日志
/var/log/cron.log – 任務計劃日志
/var/log/maillog – 郵件服務器日志
/var/log/boot.log – 系統啟動日志
/var/log/mysqld.log – MySQL 服務器日志
/var/log/secure – 包含驗證和授權方面信息
/var/log/utmp或/var/log/wtmp – 登錄記錄文件