黑客入侵你Linux服務器的一萬種玩法...
黑客入侵你Linux服務器的一萬種玩法...
因此做為運維人員,就必須了解一些安全運維準則,同時,要保護自己所負責的業務,首先要站在攻擊者的角度思考問題,修補任何潛在的威脅和漏洞。
本文主要分為如下部分展開:
- 賬戶和登錄安全
- 遠程訪問和認證安全
- 文件系統安全
賬戶和登錄安全
賬戶安全是系統安全的第一道屏障,也是系統安全的核心,保障登錄賬戶的安全,在一定程度上可以提高服務器的安全級別,下面重點介紹下 Linux 系統登錄賬戶的安全設置方法。
①刪除特殊的賬戶和賬戶組
Linux 提供了各種不同角色的系統賬號,在系統安裝完成后,默認會安裝很多不必要的用戶和用戶組。
如果不需要某些用戶或者組,就要立即刪除它,因為賬戶越多,系統就越不安全,很可能被黑客利用,進而威脅到服務器的安全。
Linux系統中可以刪除的默認用戶和組大致有如下這些:
- 可刪除的用戶,如 adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher 等。
- 可刪除的組,如 adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers 等。
②關閉系統不需要的服務
Linux 在安裝完成后,綁定了很多沒用的服務,這些服務默認都是自動啟動的。
對于服務器來說,運行的服務越多,系統就越不安全,越少服務在運行,安全性就越好,因此關閉一些不需要的服務,對系統安全有很大的幫助。
具體哪些服務可以關閉,要根據服務器的用途而定,一般情況下,只要系統本身用不到的服務都認為是不必要的服務。
例如:某臺 Linux 服務器用于 www 應用,那么除了 httpd 服務和系統運行是必須的服務外,其他服務都可以關閉。
下面這些服務一般情況下是不需要的,可以選擇關閉:
anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、gpm、haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscd portmap、readahead_early、restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswdd ypserv
③密碼安全策略
在 Linux 下,遠程登錄系統有兩種認證方式:
- 密碼認證
- 密鑰認證
密碼認證方式是傳統的安全策略,對于密碼的設置,比較普遍的說法是:至少 6 個字符以上,密碼要包含數字、字母、下劃線、特殊符號等。
設置一個相對復雜的密碼,對系統安全能起到一定的防護作用,但是也面臨一些其他問題,例如密碼暴力破解、密碼泄露、密碼丟失等,同時過于復雜的密碼對運維工作也會造成一定的負擔。
密鑰認證是一種新型的認證方式,公用密鑰存儲在遠程服務器上,專用密鑰保存在本地,當需要登錄系統時,通過本地專用密鑰和遠程服務器的公用密鑰進行配對認證,如果認證成功,就成功登錄系統。
這種認證方式避免了被暴力破解的危險,同時只要保存在本地的專用密鑰不被黑客盜用,攻擊者一般無法通過密鑰認證的方式進入系統。
因此,在 Linux 下推薦用密鑰認證方式登錄系統,這樣就可以拋棄密碼認證登錄系統的弊端。
Linux 服務器一般通過 SecureCRT、Putty、Xshell 之類的工具進行遠程維護和管理,密鑰認證方式的實現就是借助于 SecureCRT 軟件和 Linux 系統中的 SSH 服務實現的。
④合理使用 su、sudo 命令
su 命令:是一個切換用戶的工具,經常用于將普通用戶切換到超級用戶下,當然也可以從超級用戶切換到普通用戶。
為了保證服務器的安全,幾乎所有服務器都禁止了超級用戶直接登錄系統,而是通過普通用戶登錄系統,然后再通過 su 命令切換到超級用戶下,執行一些需要超級權限的工作。
通過 su 命令能夠給系統管理帶來一定的方便,但是也存在不安全的因素,例如:系統有 10 個普通用戶,每個用戶都需要執行一些有超級權限的操作,就必須把超級用戶的密碼交給這 10 個普通用戶。
如果這 10 個用戶都有超級權限,通過超級權限可以做任何事,那么會在一定程度上對系統的安全造成了威協。
因此 su 命令在很多人都需要參與的系統管理中,并不是最好的選擇,超級用戶密碼應該掌握在少數人手中,此時 sudo 命令就派上用場了。
sudo 命令:允許系統管理員分配給普通用戶一些合理的“權利”,并且不需要普通用戶知道超級用戶密碼,就能讓他們執行一些只有超級用戶或其他特許用戶才能完成的任務。
比如:系統服務重啟、編輯系統配置文件等,通過這種方式不但能減少超級用戶登錄次數和管理時間,也提高了系統安全性。
因此,sudo 命令相對于權限無限制性的 su 來說,還是比較安全的,所以 sudo 也被稱為受限制的 su,另外 sudo 也是需要事先進行授權認證的,所以也被稱為授權認證的 su。
sudo 執行命令的流程是:將當前用戶切換到超級用戶下,或切換到指定的用戶下,然后以超級用戶或其指定切換到的用戶身份執行命令。
執行完成后,直接退回到當前用戶,而這一切的完成要通過 sudo 的配置文件 /etc/sudoers 來進行授權。
sudo 設計的宗旨是:賦予用戶盡可能少的權限但仍允許它們完成自己的工作,這種設計兼顧了安全性和易用性。
因此,強烈推薦通過 sudo 來管理系統賬號的安全,只允許普通用戶登錄系統,如果這些用戶需要特殊的權限,就通過配置 /etc/sudoers 來完成,這也是多用戶系統下賬號安全管理的基本方式。
⑤刪減系統登錄歡迎信息
系統的一些歡迎信息或版本信息,雖然能給系統管理者帶來一定的方便,但是這些信息有時候可能被黑客利用,成為攻擊服務器的幫兇。
為了保證系統的安全,可以修改或刪除某些系統文件,需要修改或刪除的文件有四個,分別是:
/etc/issue /etc/issue.net /etc/redhat-release /etc/motd
/etc/issue 和 /etc/issue.net 文件都記錄了操作系統的名稱和版本號,當用戶通過本地終端或本地虛擬控制臺等登錄系統時,/etc/issue 的文件內容就會顯示。
當用戶通過 ssh 或 telnet 等遠程登錄系統時,/etc/issue.net 文件內容就會在登錄后顯示。
在默認情況下 /etc/issue.net 文件的內容是不會在 ssh 登錄后顯示的,要顯示這個信息可以修改 /etc/ssh/sshd_config 文件,在此文件中添加如下內容即可:Banner /etc/issue.net。
其實這些登錄提示很明顯泄漏了系統信息,為了安全起見,建議將此文件中的內容刪除或修改。
/etc/redhat-release 文件也記錄了操作系統的名稱和版本號,為了安全起見,可以將此文件中的內容刪除。
/etc/motd 文件是系統的公告信息。每次用戶登錄后,/etc/motd 文件的內容就會顯示在用戶的終端。
通過這個文件系統,管理員可以發布一些軟件或硬件的升級、系統維護等通告信息,但是此文件的最大作用就是可以發布一些警告信息,當黑客登錄系統后,會發現這些警告信息,進而產生一些震懾作用。
看過國外的一個報道,黑客入侵了一個服務器,而這個服務器卻給出了歡迎登錄的信息,因此法院不做任何裁決。
遠程訪問和認證安全
①遠程登錄取消 telnet 而采用 SSH 方式
telnet 是一種古老的遠程登錄認證服務,它在網絡上用明文傳送口令和數據,因此別有用心的人就會非常容易截獲這些口令和數據。
而且,telnet 服務程序的安全驗證方式也極其脆弱,攻擊者可以輕松將虛假信息傳送給服務器。
現在遠程登錄基本拋棄了 telnet 這種方式,而取而代之的是通過 SSH 服務遠程登錄服務器。
②合理使用 Shell 歷史命令記錄功能
在 Linux 下可通過 history 命令查看用戶所有的歷史操作記錄,同時 shell 命令操作記錄默認保存在用戶目錄下的 .bash_history 文件中。
通過這個文件可以查詢 shell 命令的執行歷史,有助于運維人員進行系統審計和問題排查。
同時,在服務器遭受黑客攻擊后,也可以通過這個命令或文件查詢黑客登錄服務器所執行的歷史命令操作。
但是有時候黑客在入侵服務器后為了毀滅痕跡,可能會刪除 .bash_history 文件,這就需要合理的保護或備份 .bash_history 文件。
③啟用 Tcp_Wrappers 防火墻
Tcp_Wrappers 是一個用來分析 TCP/IP 封包的軟件,類似的 IP 封包軟件還有 iptables。
Linux 默認都安裝了 Tcp_Wrappers。作為一個安全的系統,Linux 本身有兩層安全防火墻,通過 IP 過濾機制的 iptables 實現第一層防護。
iptables 防火墻通過直觀地監視系統的運行狀況,阻擋網絡中的一些惡意攻擊,保護整個系統正常運行,免遭攻擊和破壞。
如果通過了第一層防護,那么下一層防護就是 Tcp_Wrappers 了。通過 Tcp_Wrappers 可以實現對系統中提供的某些服務的開放與關閉、允許和禁止,從而更有效地保證系統安全運行。
文件系統安全
①鎖定系統重要文件
系統運維人員有時候可能會遇到通過 Root 用戶都不能修改或者刪除某個文件的情況,產生這種情況的大部分原因可能是這個文件被鎖定了。
在 Linux 下鎖定文件的命令是 Chattr,通過這個命令可以修改 ext2、ext3、ext4 文件系統下文件屬性,但是這個命令必須有超級用戶 Root 來執行。和這個命令對應的命令是 lsattr,這個命令用來查詢文件屬性。
對重要的文件進行加鎖,雖然能夠提高服務器的安全性,但是也會帶來一些不便。
例如:在軟件的安裝、升級時可能需要去掉有關目錄和文件的 immutable 屬性和 append-only 屬性,同時,對日志文件設置了 append-only 屬性,可能會使日志輪換(logrotate)無法進行。
因此,在使用 Chattr 命令前,需要結合服務器的應用環境來權衡是否需要設置 immutable 屬性和 append-only 屬性。
另外,雖然通過 Chattr 命令修改文件屬性能夠提高文件系統的安全性,但是它并不適合所有的目錄。Chattr 命令不能保護 /、/dev、/tmp、/var 等目錄。
根目錄不能有不可修改屬性,因為如果根目錄具有不可修改屬性,那么系統根本無法工作:
/dev 在啟動時,syslog 需要刪除并重新建立 /dev/log 套接字設備,如果設置了不可修改屬性,那么可能出問題。
/tmp 目錄會有很多應用程序和系統程序需要在這個目錄下建立臨時文件,也不能設置不可修改屬性。
/var 是系統和程序的日志目錄,如果設置為不可修改屬性,那么系統寫日志將無法進行,所以也不能通過 Chattr 命令保護。
②文件權限檢查和修改
不正確的權限設置直接威脅著系統的安全,因此運維人員應該能及時發現這些不正確的權限設置,并立刻修正,防患于未然。下面列舉幾種查找系統不安全權限的方法。
查找系統中任何用戶都有寫權限的文件或目錄:
查找文件:find / -type f -perm -2 -o -perm -20 |xargs ls -al 查找目錄:find / -type d -perm -2 -o -perm -20 |xargs ls –ld
查找系統中所有含“s”位的程序:
find / -type f -perm -4000 -o -perm -2000 -print | xargs ls –al
含有“s”位權限的程序對系統安全威脅很大,通過查找系統中所有具有“s”位權限的程序,可以把某些不必要的“s”位程序去掉,這樣可以防止用戶濫用權限或提升權限的可能性。
檢查系統中所有 suid 及 sgid 文件:
find / -user root -perm -2000 -print -exec md5sum {} ;
find / -user root -perm -4000 -print -exec md5sum {} ;
將檢查的結果保存到文件中,可在以后的系統檢查中作為參考。
檢查系統中沒有屬主的文件:
find / -nouser -o –nogroup
沒有屬主的孤兒文件比較危險,往往成為黑客利用的工具,因此找到這些文件后,要么刪除掉,要么修改文件的屬主,使其處于安全狀態。
③/tmp、/var/tmp、/dev/shm 安全設定
在 Linux 系統中,主要有兩個目錄或分區用來存放臨時文件,分別是 /tmp 和 /var/tmp。
存儲臨時文件的目錄或分區有個共同點就是所有用戶可讀寫、可執行,這就為系統留下了安全隱患。
攻擊者可以將病毒或者木馬腳本放到臨時文件的目錄下進行信息收集或偽裝,嚴重影響服務器的安全。
此時,如果修改臨時目錄的讀寫執行權限,還有可能影響系統上應用程序的正常運行,因此,如果要兼顧兩者,就需要對這兩個目錄或分區進行特殊的設置。
/dev/shm 是 Linux 下的一個共享內存設備,在 Linux 啟動的時候系統默認會加載 /dev/shm,被加載的 /dev/shm 使用的是 tmpfs 文件系統,而 tmpfs 是一個內存文件系統,存儲到 tmpfs 文件系統的數據會完全駐留在 RAM 中。
這樣通過 /dev/shm 就可以直接操控系統內存,這將非常危險,因此如何保證 /dev/shm 安全也至關重要。
對于 /tmp 的安全設置,需要看 /tmp 是一個獨立磁盤分區,還是一個根分區下的文件夾。
如果 /tmp 是一個獨立的磁盤分區,那么設置非常簡單,修改 /etc/fstab 文件中 /tmp 分區對應的掛載屬性,加上 nosuid、noexec、nodev 三個選項即可。
修改后的 /tmp 分區掛載屬性類似如下:
LABEL=/tmp /tmp ext3 rw,nosuid,noexec,nodev 0 0
其中,nosuid、noexec、nodev 選項,表示不允許任何 suid 程序,并且在這個分區不能執行任何腳本等程序,并且不存在設備文件。
在掛載屬性設置完成后,重新掛載 /tmp 分區,保證設置生效。
對于 /var/tmp,如果是獨立分區,安裝 /tmp 的設置方法是修改 /etc/fstab 文件即可。
如果是 /var 分區下的一個目錄,那么可以將 /var/tmp 目錄下所有數據移動到 /tmp 分區下,然后在 /var 下做一個指向 /tmp 的軟連接即可。
也就是執行如下操作:
[root@server ~]# mv /var/tmp/* /tmp [root@server ~]# ln -s /tmp /var/tmp
如果 /tmp 是根目錄下的一個目錄,那么設置稍微復雜,可以通過創建一個 loopback 文件系統來利用 Linux 內核的 loopback 特性將文件系統掛載到 /tmp 下,然后在掛載時指定限制加載選項即可。
一個簡單的操作示例如下:
[root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000 [root@server ~]# mke2fs -j /dev/tmpfs [root@server ~]# cp -av /tmp /tmp.old [root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp [root@server ~]# chmod 1777 /tmp [root@server ~]# mv -f /tmp.old/* /tmp/ [root@server ~]# rm -rf /tmp.old
最后,編輯 /etc/fstab,添加如下內容,以便系統在啟動時自動加載 loopback 文件系統:
/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0
文章轉自公眾號: 網絡安全學習圈