Contents

COSCUP2017隨意筆記

COSCUP 2017 VPS 安全維護

COSCUP 2017 有場關於 VPS 安全維護的議程,整理了幾個重要的安全概念。

iptables 防火牆

iptables 是 Linux 核心內建的封包過濾防火牆,透過設定規則來決定允許或拒絕哪些網路流量。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看目前規則
sudo iptables -L -n -v

# 只允許特定 IP 連接 SSH(Port 22)
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j DROP

# 允許已建立連線的封包通過
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 儲存規則(CentOS/RHEL)
sudo service iptables save

基本安全原則:

  • 預設拒絕所有進入流量,再開放必要的 Port
  • 限制 SSH 只允許特定 IP 或 IP 段連接
  • 定期審查防火牆規則

WAF(Web Application Firewall)

WAF 是應用層防火牆,比 iptables 更進一步,能識別並阻擋 SQL Injection、XSS、CSRF 等應用層攻擊。

常見的開源 WAF 方案:

  • ModSecurity:Apache/Nginx 的 WAF 模組,搭配 OWASP Core Rule Set 使用
  • NAXSI:Nginx 的 WAF 模組,規則相對簡單
1
2
# 安裝 ModSecurity(Ubuntu/Debian)
sudo apt install libapache2-mod-security2

SELinux 基本概念

SELinux(Security-Enhanced Linux) 是 Linux 核心的強制存取控制(MAC)安全模組,由 NSA 開發,主要用於 CentOS/RHEL。

SELinux 在一般 DAC(用戶/群組/其他)權限之上,增加了一層基於標籤的存取控制,即使程序被入侵,也能限制其對系統資源的存取。

1
2
3
4
5
6
7
8
9
# 查看 SELinux 狀態
getenforce       # 顯示 Enforcing / Permissive / Disabled
sestatus         # 更詳細的狀態

# 暫時切換為 Permissive 模式(不重開機)
sudo setenforce 0

# 查看 SELinux 稽核記錄
sudo ausearch -m avc -ts recent

SELinux 的三種模式:

  • Enforcing:強制執行政策,違規操作會被阻擋並記錄
  • Permissive:只記錄違規,不阻擋(適合測試)
  • Disabled:完全關閉

SSH 跳板機(Jump Host)

SSH 跳板機(Jump Host / Bastion Host)是一種常見的網路安全架構。內部伺服器不直接對外開放 SSH,只有跳板機對外,所有 SSH 連線都必須先連到跳板機,再從跳板機連到目標伺服器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 方法一:手動跳板
ssh user@jump-host
ssh user@internal-server

# 方法二:使用 ProxyJump(SSH 7.3+,推薦)
ssh -J user@jump-host user@internal-server

# 方法三:在 ~/.ssh/config 設定
# Host internal
#     HostName 192.168.1.10
#     User admin
#     ProxyJump user@jump-host

優點:

  • 內部伺服器的 SSH 不暴露在公網
  • 所有 SSH 存取行為集中在跳板機上,便於稽核

集中式日誌管理

將所有伺服器的 log 發送到獨立的日誌伺服器,好處包括:

  • 即使伺服器被入侵,攻擊者無法竄改已發出的 log
  • 集中查詢、分析,便於告警設定

常見方案:

  • rsyslog + 遠端伺服器:簡單的集中式 log 方案
  • ELK Stack(Elasticsearch + Logstash + Kibana):功能完整的日誌分析平台
  • Graylog:開源的集中式日誌管理系統
1
2
3
# rsyslog 設定發送 log 到遠端(/etc/rsyslog.conf)
*.* @log-server:514    # UDP
*.* @@log-server:514   # TCP

參考資料