1. 程式人生 > >簡單的命令改善你的Linux安全

簡單的命令改善你的Linux安全

本文中,我們將討論如何通過一些Linux的安全命令,加固你的Linux系統。

在最開始,我們需要問的一個問題是:Linux是已經足夠被安全加固了嗎?答案當然是否定的。那些嫻熟的攻擊者所帶來的危險是與日俱增的。每天、甚至是每小時都有新的漏洞被發現。對這些漏洞的利用方法通常建立在它們被發現後的數小時之內。一些漏洞甚至直到有人將其利用到攻擊的主機上才被發現。可見,安全應該是我們所有人需要關心的。因此,我想在本文中用一些實際的例子來展示如何增強系統的安全性。

沒有一個帖子或是一本書能夠回答Linux所有的安全問題或是涉及所有可能的威脅。因此,本文理所當然地也不可能包括所有,但是我們希望你一定會發現到其“用武之處”。

我們的主要議題包括:

控制檯安全
密碼生命週期
Sudo的通知
SSH調優
使用Tripwire進行入侵檢測
使用Firewalld
迴歸iptable
限制編譯器
不可修改檔案
用Aureport來管理SELinux
使用sealert工具

一、控制檯安全

你可以通過限制能夠登入的一組特定終端來限制root使用者的訪問。為了實現該目的,請編輯/etc/下安全檔案的內容。該檔案列出的是允許root使用者登入的所有裝置。

我建議你只允許root使用者去登入到一個終端之上,且強制所有其他使用者都使用非root使用者的身份進行登入。而如果確實需要root使用者許可權的時候,請使用su命令來獲取。

二、密碼生命週期

密碼的生命週期就是允許你為密碼指定一個有效的時間週期。時間到期後,系統將強制要求使用者輸入一個新的密碼。這樣有效地確保了密碼的定期更換,以及密碼在被偷盜、破解或為人所知的情況下能夠迅速過期。

有兩種方法可以實現這個效果。第一種方法是通過命令列使用如下的改變命令:

$ chage -M 20 likegeeks

我們使用- M選項為likegeeks使用者設定了有效期限為20天的密碼。

你也可以輸入不帶任何選項的chage命令,它會自動提示你選項:

$ chage likegeeks

第二種方法是在/etc/login.defs中為所有使用者設定預設值。你可以參照下面,按需改變其數值:

PASS_MAX_DAYS 20 PASS_MIN_DAYS 0 PASS_WARN_AGE 5

三、Sudo的通知

Sudo命令雖然可以使得你的“生活”更為輕鬆,但是它們也會因為Linux的安全問題而毀了你的“生活”。

我們都知道,sudo命令允許非root使用者以root身份執行各種命令。你可以在/etc/sudoers檔案中查到所有的sudo配置。

你可以禁止使用者去執行那些root才能執行的命令。

當sudo命令被使用的時侯,你可以通過在檔案中新增如下一行語句,以配置其向外傳送電子郵件。

mailto [email protected]

當然你也可以用如下語句改變sudo的發郵件狀態:

mail_always on

四、SSH調優

只要說到Linux安全,我們必然會討論到SSH服務。SSH應該是你係統中重要的一種服務,它使你能夠輕鬆地連線到自己的系統。而且這可能是在出現各種狀況的時候,唯一能讓你的系統“倖存”的途徑。所以對SSH的調優是非常重要的。

由於我們在本文所使用的是CentOS 7,那麼其SSH的配置檔案就存放在:

/etc/ssh/sshd_config

讓我們來深入瞭解一下吧。

攻擊者所使用的掃描器或自動工具一般嘗試運用預設埠22來連線SSH。因此通常情況下,你應該改變SSH的原有埠到另一個未使用的埠上,比如說5555。

Port 5555

你也可以通過更新PermitRootLogin的值為no來限制root的登入,例如:

PermitRootLogin no

並禁用無密碼的通道,且改用公鑰登入的方式。

PasswordAuthentication no PermitEmptyPasswords no

其實還有另外一種可能阻止攻擊的調整,但它要求SSH通過正向和反向DNS查詢遠端的主機名,這將在系統日誌檔案中生成一些適當的警告。你只需啟用UseDNS的值便可實現。

UseDNS yes

此外,當GSSAPI伺服器被要求驗證相關使用者的身份時,SSH會呼叫一個不常用的功能來實現GSSAPI的認證方式。為了避免這種情況可能會引起的某種麻煩,請按照如下將GSSAPIAuthentication設為no:

GSSAPIAuthentication no

考慮到SSH通常會出現的超時問題,你可以通過正確地配置ServerAliveInterval、ServerAliveCountMax和TCPKeepAlive的值來進行管控。

例如下面的規則就意味著每隔60秒就產生一個數據包。

ServerAliveInterval 15 ServerAliveCountMax 3 TCPKeepAlive yes

通過調整這些值,你可以提供一個更長的連線。

ClientAliveInterval 30 ClientAliveCountMax 5

你可以通過指定那些被允許用來使用SSH的使用者名稱,從而使得SSH服務更為安全。

AllowUsers user1 user2

或者指定允許的組:

AllowGroup group1 group2

除此之外,你還可以為SSH啟用諸如Google Authenticator這樣的雙因素認證方式:

$ yum install google-authenticator

然後執行之,以驗證是否成功安裝:

$ google-authenticator

你的移動手機上應該已經安裝了Google authenticator的應用,那麼請將下面一行新增到/etc/pam.d/sshd之中。

auth required pam_google_authenticator.so

最後的事情就是通過新增下面一行到/etc/ssh/sshd_config中,以通知SSH。

ChallengeResponseAuthentication yes

然後重啟你的SSH:

$ systemctl restart sshd

之後,當你使用SSH登入的時候,它將會詢問一個驗證碼。這便意味著你的SSH已經能夠應對暴力破解的攻擊,且更為穩固了。

五、使用Tripwire進行入侵檢測

Tripwire是Linux安全裡的重要工具之一。這是一種基於主機的入侵檢測系統(HIDS)。它通過收集配置和檔案系統的細節,並使用這些資訊來提供系統先前與當前狀態之間的參考點等方式進行工作。該過程監測檔案或目錄的屬性包括:進去哪些被新增或修改了、誰修改的、修改了什麼、何時修改的。因此它就是你檔案系統的“看門狗”。

你需要訪問EPEL儲存庫來獲取Tripwire。你可以按如下方法輕鬆地新增該庫:

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm $ 
rpm -ivh epel-release-7-9.noarch.rpm

一旦成功安裝了EPEL庫,你就可以安裝Tripwire了:

$ sudo yum install tripwire

在使用Tripwire之前,你需要用如下命令來建立本地和網站金鑰:

$ tripwire-setup-keyfiles

它會提示你輸入一個用於網站和本地金鑰檔案的密碼。Tripwire也會建議你使用大寫字母、小寫字母、數字和標點符號的組合。

你可以通過更改如下檔案來定製Tripwire:

/etc/tripwire/twpol.txt

因為每一行都有註釋,且描述也很到位,因此該檔案還是比較容易閱讀和修改的。

你可以用如下的方式更新自己的Tripwire策略。

$ tripwire --update-policy --secure-mode low /etc/tripwire/twpol.txt

Tripwire將通過參考你的更改,在螢幕上持續重新整理顯示各個階段的步驟。當這些完成之後,你就應該能夠以如下方式初始化Tripwire資料庫了:

$ tripwire --init

然後Tripwire將開始掃描系統。它所需要的時長取決於系統的總體規模。

任何對檔案系統更改將被認為是一種系統的入侵,因此管理員會被通知到,而且他需要使用受信任的檔案予以系統恢復。正是出於這個原因,Tripwire必須去驗證任何的系統更改。你可以通過如下命令來驗證你的現有的策略檔案:

$ tripwire --check

關於Tripwire,我的最後一點建議是:請額外去加固twpol.txt和twcfg.txt檔案的安全。

更多有關Tripwire的選項和設定,你可以通過man tripwire查閱到。

六、使用Firewalld

Firewalld替代了iptables,並且通過在不停止當前連線的情況下啟用各種配置的更改,從而改善了Linux的安全管理。

Firewalld作為守護程序形式執行著。它允許各種規則被即時地新增和更改,而且它使用各種網路區域來為任何以及所有與網路相關的連線定義一種信任級別。

要想知道Firewalld的當前執行狀態,你可以輸入如下命令:

$ firewall-cmd --state

你可以用如下命令羅列出預定義的區域:

$ firewall-cmd --get-zones

其值也可以如下方式進行更新:

$ firewall-cmd --set-default-zone=

你可以用以下命令獲取任何特定區域的所有相關資訊:

$ firewall-cmd --zone= --list-all

你也能列出所有支援的服務:

$ firewall-cmd --get-services

而且你可以新增或刪除額外的服務。

$ firewall-cmd--zone=--add-service= $ firewall-cmd--zone=--remove-service=

你能通過如下命令列出任何特定區域中所有開放的埠:

$ firewall-cmd --zone= --list-ports

你可用如下方式管理TCP/UDP埠的增加與刪除:

$ firewall-cmd--zone=--add-port= $ firewall-cmd--zone=--remove-port=

你可以如下命令新增或刪除埠的轉發:

$ firewall-cmd--zone=--add-forward-port=  $ firewall-cmd--zone=--remove-forward-port=

Firewalld是非常全面的。其中Firewalld最棒的地方當數:你可以在不需要停止或重新啟動防火牆服務的情況下,管理該防火牆的體系結構。而這正是運用IPtables所無法實現的。

七、迴歸iptable

有一些人仍然還是喜歡IP tables 勝過Firewalld。那麼如果你正好處於這種想捨去Firewalld而回歸IP tables的話,請首先禁用Firewalld:

$ systemctl disable firewalld  $ systemctlstop firewalld

然後來安裝IP tables:

$ yum install iptables-services  $ touch /etc/sysconfig/iptables  $ touch /etc/sysconfig/ip6tables

現在你就可以啟動IP tables的服務了:

$ systemctlstart iptables  $ systemctlstart ip6tables  $ systemctl enable iptables  $ systemctl enable ip6tables

為了能讓核心採用新的配置,你必須重新啟動系統。

八、限制編譯器

如果你的系統被黑掉了,那麼攻擊者會對系統使用的是哪種編譯器很感興趣。為什麼呢?因為他們可以去下載一個簡單的C檔案(POC),並且在你的系統上進行編譯,從而在幾秒鐘之內就成為了root使用者。如果編譯器是開啟的話,他們還可以在你的系統上做一些嚴重的破壞。

首先,你需要檢查單個的資料包以確定其包含有哪些二進位制檔案。然後你需要限制這些二進位制檔案的許可權。

$ rpm -q --filesbypkg gcc | grep 'bin'

現在我們需要建立一個可以訪問二進位制檔案的編譯器的組名稱了:

$ groupadd compilerGroup

然後,你可以賦予這個組能夠改變任何二進位制檔案的所有權:

$ chown root:compilerGroup /usr/bin/gcc

最後重要的是:僅編譯器組才有改變該二進位制檔案的許可權:

$ chmod 0750 /usr/bin/gcc

至此,任何試圖使用gcc的使用者將會看到許可權被拒絕的資訊了。

我知道有些人可能會說,如果攻擊者發現編譯器被關閉了的話,他會去下載編譯器本身。這就是另外一個故事了,我們會在未來的文章中涉及到的。

九、不可修改檔案

不可修改檔案是Linux系統中一種最為強大的安全特性。任何使用者(即使是root使用者),無論他們的檔案許可權是怎樣的,都無法對不可修改檔案進行寫入、刪除、重新命名甚至是建立硬連結等操作。這真是太棒了!

它們是保護配置檔案或防止你的檔案被修改的理想選擇。請使用chattr命令來將任何檔案變得不修改:

$ chattr +i /myscript

你也可以如下方法去除其不可修改屬性:

$ chattr -i /myscript

/sbin 和/usr/lib兩個目錄內容能被設定為不可改變,以防止攻擊者替換關鍵的二進位制檔案或庫檔案成為惡意軟體版本。我將其他有關使用不可改變檔案的例子,留給你去想象。

十、用Aureport來管理SELinux

通常情況下,如果你使用的是主機控制面板,或者當有一個或多個特定的應用程式可能會碰到一些問題的時候,他們是不會執行在SELinux已啟用的模式下的,也就是說你會發現SELinux是禁用掉的。

但是禁用SELinux確實會將系統暴露於風險之中。我的觀點是:由於SELinux有一定的複雜性,對於我們這些仍想獲益於安全性的人來說,完全可以通過執行aureport的選項來使得工作輕鬆些。

aureport工具被設計為建立一些基於列特徵的報告,以顯示在審計日誌檔案中所記錄的那些事件。

$ aureport --avc

你也可以運用同樣的工具來建立一個可執行檔案的列表:

$ aureport -x

你也可以使用aureport來產生一個認證的全量報告:

$ aureport -au -i

或者你還可以列出那些認證失敗的事件:

$ aureport -au --summary -i --failed

或者你也需要一個認證成功的事件的摘要:

$ aureport -au --summary -i --success

可見,當你使用一個執行著SELinux的系統來進行系統的故障診斷的時侯,你作為系統管理員首要考慮的應該就是使用aureport的各種好處了。

十一、使用Sealert工具

除了aureport工具你也可以使用一個很好的Linux安全工具—sealert。你可以用以下的命令來進行安裝:

$ yum install setools

那麼現在我們就有了一個工具,它將積極地從/var/log/audit/audit.log這一日誌檔案中返回各種警告,並將其轉換得更為“人性化”且可讀。

這個稱為sealert的工具,其目的是能報告出任何與SELinux有關聯的問題。你可以這樣來使用它:

$ sealert -a /var/log/audit/audit.log

關於所生成的報告,其最好之處是:在每個被發現的問題的警報末尾,系統都會給出如何去解決該問題的相關解釋。

在這篇文章中,我們討論了一些可以幫助你加固Linux系統的安全技巧。當然,對於各種執行的服務而言,仍有許多值得加固的Linux安全技巧有待發掘。我希望你能從本文中找到對你有用和有趣的內容。