25個Linux 伺服器安全小貼士

oschina發表於2013-06-27

  大家都認為 Linux 預設是安全的,我大體是認可的 (這是個有爭議的話題)。Linux預設確實有內建的安全模型。你需要開啟它並且對其進行定製,這樣才能得到更安全的系統。Linux更難管理,不過相應也更靈活,有更多的配置選項。

  對於系統管理員,讓產品的系統更安全,免於駭客和黑客的攻擊,一直是一項挑戰。這是我們關於“如何讓Linux系統更安全” 或者 “加固Linux系統“之類話題的第一篇文章。本文將介紹 25個有用的技巧和竅門 ,幫助你讓Linux系統更加安全。希望下面的這些技巧和竅門可以幫助你加強你的系統的安全。

  1. 物理系統的安全性

  配置BIOS,禁用從CD/DVD、外部裝置、軟碟機啟動。下一步,啟用BIOS密碼,同時啟用GRUB的密碼保護,這樣可以限制對系統的物理訪問。

  1. 通過設定GRUB密碼來保護Linux伺服器

  2. 磁碟分割槽

  使用不同的分割槽很重要,對於可能得災難,這可以保證更高的資料安全性。通過劃分不同的分割槽,資料可以進行分組並隔離開來。當意外發生時,只有出問題的分割槽的資料才會被破壞,其他分割槽的資料可以保留下來。你最好有以下的分割槽,並且第三方程式最好安裝在單獨的檔案系統/opt下。

/
/boot
/usr
/var
/home
/tmp
/opt

  3. 最小包安裝,最少漏洞

  你真的需要安裝所有的服務麼?建議不要安裝無用的包,避免由這些包帶來的漏洞。這將最小化風險,因為一個服務的漏洞可能會危害到其他的服務。找到並去除或者停止不用的服務,把系統漏洞減少到最小。使用‘chkconfig‘命令列出執行級別3的執行所有服務。

# /sbin/chkconfig --list |grep '3:on'

  當你發現一個不需要的服務在執行時,使用下面的命令停止這個服務。

# chkconfig serviceName off

  使用RPM包管理器,例如YUM或者apt-get 工具來列出所有安裝的包,並且利用下的命令來解除安裝他們。

# yum -y remove package-name
# sudo apt-get remove package-name
  1. 5 chkconfig Command Examples
  2. 20 Practical Examples of RPM Commands
  3. 20 Linux YUM Commands for Linux Package Management
  4. 25 APT-GET and APT-CACHE Commands to Manage Package Management

  4. 檢查網路監聽埠

  在網路命令 ‘netstat‘ 的幫助下,你將能夠看到所有開啟的埠,以及相關的程式。使用我上面提到的 ‘chkconfig‘ 命令關閉系統中不想要的網路服務。

# netstat -tulpn
  1. Linux 網路管理中的 20 條 Netstat 命令

  5. 使用 SSH(Secure Shell)

  Telnetrlogin 協議只能用於純文字,不能使用加密的格式,這或將導致安全漏洞的產生。SSH 是一種在客戶端與伺服器端通訊時使用加密技術的安全協議。

  除非必要,永遠都不要直接登入 root 賬戶。使用 “sudo” 執行命令。sudo 由 /etc/sudoers 檔案制定,同時也可以使用 “visudo” 工具編輯,它將通過 VI 編輯器開啟配置檔案。

  同時,建議將預設的 SSH 22 埠號改為其他更高的埠號。開啟主要的 SSH 配置檔案並做如下修改,以限制使用者訪問。

# vi /etc/ssh/sshd_config
  關閉 root 使用者登入
PermitRootLogin no
  特定使用者通過
AllowUsers username
  使用第二版 SSH 協議
Protocol 2
  1. SSH 伺服器安全維護五條最佳實踐

  6. 保證系統是最新的

  得一直保證系統包含了最新版本的補丁、安全修復和可用核心。

# yum updates
# yum check-update

  7. 鎖定 Cron任務

Cron有它自己內建的特性,這特性允許定義哪些人能哪些人不能跑任務。這是通過兩個檔案/etc/cron.allow 和 /etc/cron.deny 控制的。要鎖定在用Cron的使用者時可以簡單的將其名字寫到corn.deny裡,而要允許使用者跑cron時將其名字加到cron.allow即可。如果你要禁止所有使用者使用corn,那麼可以將“ALL”作為一行加到cron.deny裡。

# echo ALL >>/etc/cron.deny
  1. 11 個linux Cron排程例項

  8.  禁止USB探測

很多情況下我們想去限制使用者使用USB,來保障系統安全和資料的洩露。建立一個檔案‘/etc/modprobe.d/no-usb‘並且利用下面的命令來禁止探測USB儲存。

install usb-storage /bin/true

  9.開啟SELinux

  SELinux(安全增強linux)是linux核心提供的一個強制的訪問控制安全機制。禁用SELinux意味著系統丟掉了安全機制。要去除SELinux之前仔細考慮下,如果你的系統需要釋出到網路,並且要在公網訪問,你就要更加註意一下。

  SELinux 提供了三個基本的操作模式,他們是:

  1. 強制執行:這是預設是模式,用來啟用和強制執行SELinux安全措略。
  2. 許可模式:這種模式下SELinux不會強制執行安全措略,只有警告和日誌記錄。這種模式在SELinux相關問題的故障排除時候非常有用。
  3. 關閉模式:SELinux被關閉。

  你可以使用命令列‘system-config-selinux‘, ‘getenforce‘ or ‘sestatus‘來瀏覽當前的SEliux的狀態。

# sestatus

  如果是關閉模式,通過下面的命令開啟SELinux

# setenforce enforcing

  你也可以通過配置檔案‘/etc/selinux/config‘來進行SELinux的開關操作。

  10. 移除KDE或GNOME桌面

  沒必要在專用的LAMP伺服器上執行X Window桌面比如KDE和GNOME。可以移掉或關閉它們,以提高系統安全性和效能。開啟/etc/inittab然後將run level改成3就可以關閉這些桌面。如果你將它徹底的從系統中移走,可以用下面這個命令:

# yum groupremove "X Window System"

  11. 關閉IPv6

  如果不用IPv6協議,那就應該關閉掉它,因為大部分的應用和策略都不會用到IPv6,而且當前它不是伺服器必需的。可以在網路配置檔案中加入如下幾行來關掉它。

# vi /etc/sysconfig/network
NETWORKING_IPV6=no
IPV6INIT=no

  12. 限制使用者使用舊密碼

  如果你不希望使用者繼續使用老密碼,這一條很有用。老的密碼檔案位於 /etc/security/opasswd。你可以使用 PAM 模組實現。

  RHEL / CentOS / Fedora 中開啟 ‘/etc/pam.d/system-auth‘ 檔案。

# vi /etc/pam.d/system-auth

  Ubuntu/Debian/Linux Mint 中開啟 ‘/etc/pam.d/common-password‘ 檔案。

# vi /etc/pam.d/common-password

  在 ‘auth‘ 塊中新增下面一行。

auth        sufficient    pam_unix.so likeauth nullok

  在 ‘password‘ 塊新增下面一行,禁止使用者重新使用其過去最後用過的 5個密碼。

password   sufficient    pam_unix.so nullok use_authtok md5 shadow remember=5

  伺服器只記錄最後的 5 個密碼。如果你試圖使用曾用的最後 5個老密碼中的任意一個,你將看到如下的錯誤提示。

Password has been already used. Choose another.

  13. 如何檢查使用者密碼過期?

  在 Linux 中,使用者的密碼以加密的形式儲存在 ‘/etc/shadow‘ 檔案中。要檢查使用者的密碼是否過期,你需要使用 ‘chage‘ 命令。它將顯示密碼的最後修改日期及密碼期限的細節資訊。這些細節就是系統決定使用者是否必須修改其密碼的依據。

  要檢視任一存在使用者的老化資訊,如 過期日時長,使用如下命令。

#chage -l username

  要修改任一使用者的密碼老化,使用如下命令。

#chage -M 60 username
#chage -M 60 -m 7 -W 7 userName
  引數
  1. -M 設定天數最大數字
  2. -m 設定天數最小數字
  3. -W 設定想要的天數

  14. 手動鎖定或解鎖使用者賬號

  鎖定和解鎖功能是非常有用的,你可以鎖定一個賬號一週或一個月,而不是將這個賬號從系統中剔除。可以用下面這個命令鎖定一個特定使用者。

# passwd -l accountName

  提示:這個被鎖定的使用者僅對root使用者仍然可見。這個鎖定是通過將加密過的密碼替換成(!)來實現的。如果有個想用這個賬號來進入系統,他會得到類似下面這個錯誤的提示。

# su - accountName
This account is currently not available.

  解鎖一個被鎖定的賬號時,用下面這個命令。這命令會將被替換成(!)的密碼改回來。

# passwd -u accountName

  15. 增強密碼

  有相當數量的使用者使用很弱智的密碼,他們的密碼都可以通過字典攻擊或者暴力攻擊攻破。‘pam_cracklib‘模組存於在PAM 中,它可以強制使用者設定複雜的密碼。通過編輯器開啟下面的檔案。

# vi /etc/pam.d/system-auth

  在檔案中增加一行,使用認證引數(lcredit, ucredit, dcredit  或者 ocredit 對應小寫字母、大寫字母,數字和其他字元)

/lib/security/$ISA/pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-2 dcredit=-2 ocredit=-1

  16. 啟用Iptable(防火牆)

  高度推薦啟用linux防火牆來禁止非法程式訪問。使用iptable的規則來過濾入站、出站和轉發的包。我們可以針對來源和目的地址進行特定udp/tcp埠的准許和拒絕訪問。

  1. Basic IPTables Guide and Tips

  17. 禁止Ctrl+Alt+Delete重啟

  在大多數的linux發行版中,按下‘CTRL-ALT-DELETE’將會讓你的系統重啟。只說生產伺服器上這是不是一個很好的做法,這可能導致誤操作。

  這個配置是在‘ /etc/inittab‘檔案,如果你開啟這個檔案,你可以看到下面類似的段落。預設的行已經被註釋掉了。我們必須註釋掉他。這個特定按鍵會讓系統重啟。

# Trap CTRL-ALT-DELETE
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  18. 檢查空密碼帳號

  任何空密碼的賬戶意味這可以讓Web上任何無授權的使用者訪問,這是linux伺服器的一個安全威脅。所以,確定所有的使用者擁有一個複雜的密碼並且不存在特權使用者。空密碼帳號是安全風險,可以被輕易的攻克。可以利用下面的命令來檢查是否有空密碼賬戶存在。

# cat /etc/shadow | awk -F: '($2==""){print $1}'

  19. 登入前顯示SSH提示

  在ssh認證時候,使用一個法律和安全警示是很好的建議。關於SSH警示可以看下面的文章。

  1. Display SSH Warning Message to Users

  20. 監視使用者行為

  如果你有很多的使用者,去收集每一個使用者的行為和和他們的程式消耗的資訊非常重要。可以隨後和一些效能優化和安全問題處理時進行使用者分析。但是如果監視和蒐集使用者行為資訊呢 ?

  有兩個很有用的工具‘psacct‘ 和 ‘acct‘可以用來監視系統中使用者的行為和程式。這些工具在系統後臺執行並且不斷記錄系統中每一個使用者的行為和各個服務比如Apache, MySQL, SSH, FTP, 等的資源消耗。對這些工具更多的安裝配置和使用資訊,請訪問下面的網址:

  1. Monitor User Activity with psacct or acct Commands

  21. 定期檢視日誌

  將日誌移動到專用的日誌伺服器裡,這可避免入侵者輕易的改動本地日誌。下面是常見linux的預設日誌檔案及其用處:

  1. /var/log/message – 記錄系統日誌或當前活動日誌。
  2. /var/log/auth.log – 身份認證日誌。
  3. /var/log/kern.log – 核心日誌。
  4. /var/log/cron.log – Crond 日誌 (cron 任務).
  5. /var/log/maillog – 郵件伺服器日誌。
  6. /var/log/boot.log – 系統啟動日誌。
  7. /var/log/mysqld.log – MySQL資料庫伺服器日誌。
  8. /var/log/secure – 認證日誌。
  9. /var/log/utmp or /var/log/wtmp :登入日誌。
  10. /var/log/yum.log: Yum 日誌。

  22. 重要檔案備份

  在生產環境裡,為了災難恢復,有必要將重要檔案備份並儲存在安全的遠端磁帶保險庫、遠端站點或異地硬碟。

  23. NIC 繫結

  有兩種型別的NIC繫結模式,需要在繫結介面用得到。

  1. mode=0 – 迴圈賽模式
  2. mode=1 – 啟用和備份模式

  NIC繫結可以幫助我們避免單點失敗。在NIC繫結中,我們把兩個或者更多的網路卡繫結到一起,提供一個虛擬的介面,這個介面設定ip地址,並且和其他伺服器會話。這樣在一個NIC卡down掉或者由於其他原因不能使用的時候,我們的網路將能保持可用。

  相關閱讀 : Create NIC Channel Bonding in Linux

  24. 保持 /boot 只讀

  linux核心和他的相關的檔案都儲存在/boot目下,預設情況下是可以讀寫的。把它設為了只讀可以減少一些由於非法修改重要boot檔案而導致的風險。

# vi /etc/fstab

  在檔案最後增加下面的行,並且儲存

LABEL=/boot     /boot     ext2     defaults,ro     1 2

  如果你今後需要升級核心的話,你需要修回到讀寫模式。

  25.不鳥ICMP和Broadcast請求

  在/etc/sysctl.conf中新增下面幾行,遮蔽掉ping和broadcast請求。

Ignore ICMP request:
net.ipv4.icmp_echo_ignore_all = 1

Ignore Broadcast request:
net.ipv4.icmp_echo_ignore_broadcasts = 1

  執行下面這一行載入修改或更新

#sysctl -p

  如果你覺得了上述安全小貼士很好用,或還有什麼其它需要補充進去,請在下面的評論框裡寫寫,不斷追求進步的TecMint一如既往地願意聽到您的評論、建議以及討論。

相關文章