如何儘量減少Linux伺服器安全漏洞
* 原則上講單一功能的系統比多功能的系統更安全。減少可用攻擊點,典型的包括卸載不必要的軟體,不必要的登錄用戶名,關閉或移除不必要的服務。其他的還有給kernel打補丁,重編譯kernel,關閉打開的網路介面,安裝侵入偵察系統,防火牆,入侵預防系統。
第一步,通過伺服器的想要功能來決定安裝什麼服務。例如,如果要搭建web伺服器你應該安裝Linux, Nginx, postgresql, 和 python服務,其他的東西都不要安裝,因為安裝額外的軟體或運行額外的服務創造了不必要的易攻擊點。
Linux管理員可以通過命令列管理網路和服務,但是一些新手管理員傾向于用GUI,GUI佔用了大量系統資源,運行不必要的服務。如果要用,在用完之後可以殺掉GUI進程。
一些通用安全優化步驟
- 資料加密通訊
- 避免用不安全的協定發送明文資訊或密碼
- 最小化伺服器中不必要的軟體
- 關閉不需要的 SUID 和 SGID 的特殊許可權
- 保持系統為最新,尤其是安全補丁
- 使用安全擴展
- 考慮用SELinux
- 提要使用者密碼複雜度
- 定期更改密碼,避免重複使用同一個密碼
- 當使用者登錄錯誤次數太多時,鎖定用戶
- 不允許使用空密碼
- SSH
- 關閉不必要的服務
- 提高 /tmp /var/tmp /dev/shm 目錄的安全性 +隱藏 BIND DNS 服務版本和 web server 版本
- 提高 sysctl.conf 安全
- 安裝 Root Kit Hunter and ChrootKit Hunter
- 最小化開放網路埠
- 配置系統防火牆
- 更安全合理的分區
- 關閉不需要的檔許可權
- 維護系統日誌,把日誌鏡像到分離的日誌伺服器
- 安裝Logwatch並每天查看Logwatch emails
- 使用侵入偵察系統
- 安裝linux Socket 監控
- 安裝Mod_security
- 限制用戶許可權
- 備份
- 伺服器物理安全
伺服器物理安全
- 配置 BIOS,關閉從CD/DVD/USB和外部設備啟動。啟用 BIOS 密碼和GRUB密碼防治在物理上訪問你的系統。
保持系统最新
- sudo apt-get update; sudo apt-get upgrade
su
- 確保只有在 sudo 組裡的用戶可以運行su
關閉root用戶
- 出於安全原因,可以在不需要root使用者操作伺服器時將其關閉
- passwd -l root # 鎖定root
- passwd -u root # 解鎖
關閉user shell登入
usermod -s /usr/sbin/nologin "username"
console
- 在默认下,许多终端都是激活的,詳見/etc/securetty,注释掉不需要的终端。
- 確保只有root用戶可以修改 /etc/securetty 檔
chown root:root /etc/securetty
chmod 0600 /etc/securetty
共享内存(Shared memory)
- 共用記憶體可以用來攻擊運行的服務 如apache
vim /etc/fstab
# 加入行如下
#secure shared memory
tmpfs /run/shm tmpfs defaults,noexec,nosuid 0 0
# 重新載入
# mount -a
提高IP安全
- 在 /etc/sysctl.conf 文件中加入
# Ignore ICMP broadcast requests
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Disable source packet routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# Ignore send redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Block SYN attacks
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# Log Martians
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Ignore Directed pings
net.ipv4.icmp_echo_ignore_all = 1
關閉IPv6
vi /etc/sysctl.conf
#disable ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# 重新載入
sudo sysctl -p
TCP Wrapper
TCP Wrapper是基於規則的訪問清單,包含以下2個檔
- /etc/hosts.allow
- /etc/hosts.deny
注意:
- 每個服務在hosts.allow和hosts.deny只能有一個規則
- 在hosts.allow和hosts.deny的設置立即生效
- 在兩個檔中的最後一行必須以新的一行結束
- 兩個檔的語法相似定義如下
daemon : client [:option1:option2:...]
- 例如,如果你想允許指定IP(或IP範圍)而拒絕其他IP通過SSH訪問.
# 在 /etc/hosts.allow 文件中加入
sshd : 111.111, 222.222.222.222
# 在/etc/hosts.deny 文件中加入
sshd : ALL