Linux 服務(wù)器安全簡明指南

現(xiàn)在讓我們強化你的服務(wù)器以防止未授權(quán)訪問。

經(jīng)常升級系統(tǒng)

保持最新的軟件是你可以在任何操作系統(tǒng)上采取的最大的安全預(yù)防措施。軟件更新的范圍從關(guān)鍵漏洞補丁到小 bug 的修復(fù)鹤耍,許多軟件漏洞實際上是在它們被公開的時候得到修補的纤垂。

自動安全更新

有一些用于服務(wù)器上自動更新的參數(shù)损肛。Fedora 的 Wiki上有一篇很棒的剖析自動更新的利弊的文章,但是如果你把它限制到安全更新上蜘醋,自動更新的風(fēng)險將是最小的胁塞。

自動更新的可行性必須你自己判斷,因為它歸結(jié)為你在你的服務(wù)器上做什么压语。請記住啸罢,自動更新僅適用于來自倉庫的包,而不是自行編譯的程序胎食。你可能會發(fā)現(xiàn)一個復(fù)制了生產(chǎn)服務(wù)器的測試環(huán)境是很有必要的扰才。可以在部署到生產(chǎn)環(huán)境之前厕怜,在測試環(huán)境里面更新來檢查問題衩匣。

  • CentOS 使用 yum-cron 進行自動更新。

  • Debian 和 Ubuntu 使用無人值守升級 粥航。

  • Fedora 使用 dnf-automatic琅捏。

添加一個受限用戶賬戶

到目前為止,你已經(jīng)作為 root 用戶訪問了你的服務(wù)器递雀,它有無限制的權(quán)限柄延,可以執(zhí)行任何命令 - 甚至可能意外中斷你的服務(wù)器。 我們建議創(chuàng)建一個受限用戶帳戶缀程,并始終使用它搜吧。 管理任務(wù)應(yīng)該使用 sudo來完成市俊,它可以臨時提升受限用戶的權(quán)限,以便管理你的服務(wù)器滤奈。

不是所有的 Linux 發(fā)行版都在系統(tǒng)上默認包含 sudo摆昧,但大多數(shù)都在其軟件包倉庫中有 sudo。 如果得到這樣的輸出 sudo:command not found蜒程,請在繼續(xù)之前安裝 sudo绅你。

要添加新用戶,首先通過 SSH 登錄到你的服務(wù)器搞糕。

CentOS / Fedora

1勇吊、 創(chuàng)建用戶,用你想要的名字替換 example_user窍仰,并分配一個密碼:

useradd example_user && passwd example_user

2、 將用戶添加到具有 sudo 權(quán)限的 wheel 組:

usermod -aG wheel example_user

Ubuntu

1礼殊、 創(chuàng)建用戶驹吮,用你想要的名字替換 example_user。你將被要求輸入用戶密碼:

adduser example_user

2晶伦、 添加用戶到 sudo 組碟狞,這樣你就有管理員權(quán)限了:

adduser example_user sudo

Debian

1、 Debian 默認的包中沒有 sudo婚陪, 使用 apt-get 來安裝:

apt-get install sudo

2族沃、 創(chuàng)建用戶,用你想要的名字替換 example_user泌参。你將被要求輸入用戶密碼:

adduser example_user

3脆淹、 添加用戶到 sudo 組,這樣你就有管理員權(quán)限了:

adduser example_user sudo

創(chuàng)建完有限權(quán)限的用戶后沽一,斷開你的服務(wù)器連接:

exit

重新用你的新用戶登錄盖溺。用你的用戶名代替 example_user,用你的服務(wù)器 IP 地址代替例子中的 IP 地址:

ssh example_user@203.0.113.10

現(xiàn)在你可以用你的新用戶帳戶管理你的服務(wù)器铣缠,而不是 root烘嘱。 幾乎所有超級用戶命令都可以用 sudo(例如:sudo iptables -L -nv)來執(zhí)行,這些命令將被記錄到 /var/log/auth.log中蝗蛙。

加固 SSH 訪問

默認情況下蝇庭,密碼認證用于通過 SSH 連接到您的服務(wù)器。加密密鑰對更加安全捡硅,因為它用私鑰代替了密碼哮内,這通常更難以暴力破解。在本節(jié)中病曾,我們將創(chuàng)建一個密鑰對牍蜂,并將服務(wù)器配置為不接受 SSH 密碼登錄漾根。

創(chuàng)建驗證密鑰對

1、這是在你本機上完成的鲫竞,不是在你的服務(wù)器上辐怕,這里將創(chuàng)建一個 4096 位的 RSA 密鑰對。在創(chuàng)建過程中从绘,您可以選擇使用密碼加密私鑰寄疏。這意味著它不能在沒有輸入密碼的情況下使用,除非將密碼保存到本機桌面的密鑰管理器中僵井。我們建議您使用帶有密碼的密鑰對陕截,但如果你不想使用密碼,則可以將此字段留空批什。

Linux / OS X

如果你已經(jīng)創(chuàng)建了 RSA 密鑰對农曲,則這個命令將會覆蓋它,這可能會導(dǎo)致你不能訪問其它的操作系統(tǒng)驻债。如果你已創(chuàng)建過密鑰對乳规,請?zhí)^此步驟。要檢查現(xiàn)有的密鑰合呐,請運行 ls?/ .ssh / id_rsa *暮的。

ssh-keygen -b 4096

在輸入密碼之前,按下 回車使用 /home/your_username/.ssh 中的默認名稱 id_rsaid_rsa.pub淌实。

Windows

這可以使用 PuTTY 完成冻辩,在我們指南中已有描述使用 SSH 公鑰驗證。

2拆祈、將公鑰上傳到您的服務(wù)器上恨闪。 將 example_user 替換為你用來管理服務(wù)器的用戶名稱,將 203.0.113.10 替換為你的服務(wù)器的 IP 地址缘屹。

Linux

在本機上:

ssh-copy-id example_user@203.0.113.10

OS X

在你的服務(wù)器上(用你的權(quán)限受限用戶登錄):

mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/

在本機上:

scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys

如果相對于 scp 你更喜歡 ssh-copy-id 的話凛剥,那么它也可以在 Homebrew中找到。使用 brew install ssh-copy-id 安裝轻姿。

Windows

  • 選擇 1

    :使用 WinSCP來完成犁珠。 在登錄窗口中,輸入你的服務(wù)器的 IP 地址作為主機名互亮,以及非 root 的用戶名和密碼犁享。單擊“登錄”連接。

    一旦 WinSCP 連接后豹休,你會看到兩個主要部分炊昆。 左邊顯示本機上的文件,右邊顯示服務(wù)區(qū)上的文件。 使用左側(cè)的文件瀏覽器凤巨,導(dǎo)航到你已保存公鑰的文件视乐,選擇公鑰文件,然后點擊上面工具欄中的“上傳”敢茁。

    系統(tǒng)會提示你輸入要將文件放在服務(wù)器上的路徑佑淀。 將文件上傳到 /home/example_user/.ssh /authorized_keys,用你的用戶名替換 example_user彰檬。

  • 選擇 2

    :將公鑰直接從 PuTTY 鍵生成器復(fù)制到連接到你的服務(wù)器中(作為非 root 用戶):

mkdir ~/.ssh; nano ~/.ssh/authorized_keys

上面命令將在文本編輯器中打開一個名為 authorized_keys 的空文件伸刃。 將公鑰復(fù)制到文本文件中,確保復(fù)制為一行逢倍,與 PuTTY 所生成的完全一樣捧颅。 按下 CTRL + X,然后按下 Y较雕,然后回車保存文件碉哑。
最后,你需要為公鑰目錄和密鑰文件本身設(shè)置權(quán)限:

sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys

這些命令通過阻止其他用戶訪問公鑰目錄以及文件本身來提供額外的安全性郎笆。有關(guān)它如何工作的更多信息谭梗,請參閱我們的指南如何修改文件權(quán)限。

3宛蚓、 現(xiàn)在退出并重新登錄你的服務(wù)器。如果你為私鑰指定了密碼设塔,則需要輸入密碼凄吏。

SSH 守護進程選項

1、 不允許 root 用戶通過 SSH 登錄闰蛔。

這要求所有的 SSH 連接都是通過非 root 用戶進行痕钢。當(dāng)以受限用戶帳戶連接后,可以通過使用 sudo 或使用 su - 切換為 root shell 來使用管理員權(quán)限序六。

# Authentication:
...
PermitRootLogin no

2任连、 禁用 SSH 密碼認證。

這要求所有通過 SSH 連接的用戶使用密鑰認證例诀。根據(jù) Linux 發(fā)行版的不同随抠,它可能需要添加 PasswordAuthentication 這行,或者刪除前面的 # 來取消注釋繁涂。

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

如果你從許多不同的計算機連接到服務(wù)器拱她,你可能想要繼續(xù)啟用密碼驗證。這將允許你使用密碼進行身份驗證扔罪,而不是為每個設(shè)備生成和上傳密鑰對秉沼。

3、 只監(jiān)聽一個互聯(lián)網(wǎng)協(xié)議。

在默認情況下唬复,SSH 守護進程同時監(jiān)聽 IPv4 和 IPv6 上的傳入連接矗积。除非你需要使用這兩種協(xié)議進入你的服務(wù)器,否則就禁用你不需要的敞咧。

這不會禁用系統(tǒng)范圍的協(xié)議棘捣,它只用于 SSH 守護進程。

使用選項:

  • AddressFamily inet 只監(jiān)聽 IPv4妄均。

  • AddressFamily inet6 只監(jiān)聽 IPv6柱锹。

默認情況下,AddressFamily 選項通常不在 sshd_config 文件中丰包。將它添加到文件的末尾:

echo 'AddressFamily inet' | sudo tee -a /etc/ssh/sshd_config

4禁熏、** 重新啟動 SSH 服務(wù)以加載新配置。**

如果你使用的 Linux 發(fā)行版使用 systemd(CentOS 7邑彪、Debian 8瞧毙、Fedora、Ubuntu 15.10+)

sudo systemctl restart sshd

如果您的 init 系統(tǒng)是 SystemV 或 Upstart(CentOS 6寄症、Debian 7宙彪、Ubuntu 14.04):

sudo service ssh restart

使用 Fail2Ban 保護 SSH 登錄

Fail2Ban是一個應(yīng)用程序,它會在太多的失敗登錄嘗試后禁止 IP 地址登錄到你的服務(wù)器有巧。由于合法登錄通常不會超過三次嘗試(如果使用 SSH 密鑰释漆,那不會超過一個),因此如果服務(wù)器充滿了登錄失敗的請求那就表示有惡意訪問篮迎。

Fail2Ban 可以監(jiān)視各種協(xié)議男图,包括 SSH、HTTP 和 SMTP甜橱。默認情況下逊笆,F(xiàn)ail2Ban 僅監(jiān)視 SSH,并且因為 SSH 守護程序通常配置為持續(xù)運行并監(jiān)聽來自任何遠程 IP 地址的連接岂傲,所以對于任何服務(wù)器都是一種安全威懾难裆。

有關(guān)安裝和配置 Fail2Ban 的完整說明,請參閱我們的指南:使用 Fail2ban 保護服務(wù)器镊掖。

刪除未使用的面向網(wǎng)絡(luò)的服務(wù)

大多數(shù) Linux 發(fā)行版都安裝并運行了網(wǎng)絡(luò)服務(wù)乃戈,監(jiān)聽來自互聯(lián)網(wǎng)、回環(huán)接口或兩者兼有的傳入連接堰乔。 將不需要的面向網(wǎng)絡(luò)的服務(wù)從系統(tǒng)中刪除偏化,以減少對運行進程和對已安裝軟件包攻擊的概率。

查明運行的服務(wù)

要查看服務(wù)器中運行的服務(wù):

sudo netstat -tulpn

如果默認情況下 netstat 沒有包含在你的 Linux 發(fā)行版中镐侯,請安裝軟件包 net-tools 或使用 ss -tulpn命令侦讨。

以下是 netstat 的輸出示例驶冒。 請注意,因為默認情況下不同發(fā)行版會運行不同的服務(wù)韵卤,你的輸出將有所不同:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      7315/rpcbind
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3277/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      3179/exim4
tcp        0      0 0.0.0.0:42526           0.0.0.0:*               LISTEN      2845/rpc.statd
tcp6       0      0 :::48745                :::*                    LISTEN      2845/rpc.statd
tcp6       0      0 :::111                  :::*                    LISTEN      7315/rpcbind
tcp6       0      0 :::22                   :::*                    LISTEN      3277/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      3179/exim4
udp        0      0 127.0.0.1:901           0.0.0.0:*                           2845/rpc.statd
udp        0      0 0.0.0.0:47663           0.0.0.0:*                           2845/rpc.statd
udp        0      0 0.0.0.0:111             0.0.0.0:*                           7315/rpcbind
udp        0      0 192.0.2.1:123           0.0.0.0:*                           3327/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           3327/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           3327/ntpd
udp        0      0 0.0.0.0:705             0.0.0.0:*                           7315/rpcbind
udp6       0      0 :::111                  :::*                                7315/rpcbind
udp6       0      0 fe80::f03c:91ff:fec:123 :::*                                3327/ntpd
udp6       0      0 2001:DB8::123           :::*                                3327/ntpd
udp6       0      0 ::1:123                 :::*                                3327/ntpd
udp6       0      0 :::123                  :::*                                3327/ntpd
udp6       0      0 :::705                  :::*                                7315/rpcbind
udp6       0      0 :::60671                :::*                                2845/rpc.statd

netstat 告訴我們服務(wù)正在運行 RPC(rpc.statdrpcbind)骗污、SSH(sshd)、NTPdate(ntpd)和Exim(exim4)沈条。

TCP

請參閱 netstat 輸出的 Local Address 那一列需忿。進程 rpcbind 正在偵聽 0.0.0.0:111:::111,外部地址是 0.0.0.0:* 或者 :::* 蜡歹。這意味著它從任何端口和任何網(wǎng)絡(luò)接口接受來自任何外部地址(IPv4 和 IPv6)上的其它 RPC 客戶端的傳入 TCP 連接屋厘。 我們看到類似的 SSH,Exim 正在偵聽來自回環(huán)接口的流量月而,如所示的 127.0.0.1 地址汗洒。

UDP

UDP 套接字是無狀態(tài)的,這意味著它們只有打開或關(guān)閉父款,并且每個進程的連接是獨立于前后發(fā)生的連接溢谤。這與 TCP 的連接狀態(tài)(例如 LISTENESTABLISHEDCLOSE_WAIT)形成對比憨攒。

我們的 netstat輸出說明 NTPdate :1)接受服務(wù)器的公網(wǎng) IP 地址的傳入連接世杀;2)通過本地主機進行通信;3)接受來自外部的連接肝集。這些連接是通過端口 123 進行的瞻坝,同時支持 IPv4 和 IPv6。我們還看到了 RPC 打開的更多的套接字杏瞻。

查明該移除哪個服務(wù)

如果你在沒有啟用防火墻的情況下對服務(wù)器進行基本的 TCP 和 UDP 的 nmap 掃描湿镀,那么在打開端口的結(jié)果中將出現(xiàn) SSH、RPC 和 NTPdate 伐憾。通過配置防火墻,你可以過濾掉這些端口赫模,但 SSH 除外树肃,因為它必須允許你的傳入連接。但是瀑罗,理想情況下胸嘴,應(yīng)該禁用未使用的服務(wù)。

  • 你可能主要通過 SSH 連接管理你的服務(wù)器斩祭,所以讓這個服務(wù)需要保留劣像。如上所述,RSA 密鑰和 Fail2Ban 可以幫助你保護 SSH摧玫。

  • NTP 是服務(wù)器計時所必需的耳奕,但有個替代 NTPdate 的方法。如果你喜歡不開放網(wǎng)絡(luò)端口的時間同步方法,并且你不需要納秒精度屋群,那么你可能有興趣用 OpenNTPD 來代替 NTPdate闸婴。

  • 然而,Exim 和 RPC 是不必要的芍躏,除非你有特定的用途邪乍,否則應(yīng)該刪除它們。

本節(jié)針對 Debian 8对竣。默認情況下庇楞,不同的 Linux 發(fā)行版具有不同的服務(wù)。如果你不確定某項服務(wù)的功能否纬,請嘗試搜索互聯(lián)網(wǎng)以了解該功能是什么吕晌,然后再嘗試刪除或禁用它。

載監(jiān)聽的服務(wù)

如何移除包取決于發(fā)行版的包管理器:

Arch

sudo pacman -Rs package_name

CentOS

sudo yum remove package_name

Debian / Ubuntu

sudo apt-get purge package_name

Fedora

sudo dnf remove package_name

再次運行 sudo netstat -tulpn烦味,你看到監(jiān)聽的服務(wù)就只會有 SSH(sshd)和 NTP(ntpdate聂使,網(wǎng)絡(luò)時間協(xié)議)。

配置防火墻

使用防火墻阻止不需要的入站流量能為你的服務(wù)器提供一個高效的安全層谬俄。 通過指定入站流量柏靶,你可以阻止入侵和網(wǎng)絡(luò)測繪。 最佳做法是只允許你需要的流量溃论,并拒絕一切其他流量屎蜓。請參閱我們的一些關(guān)于最常見的防火墻程序的文檔:

  • iptables是 netfilter 的控制器,它是 Linux 內(nèi)核的包過濾框架钥勋。 默認情況下炬转,iptables 包含在大多數(shù) Linux 發(fā)行版中。

  • firewallD是可用于 CentOS/Fedora 系列發(fā)行版的 iptables 控制器算灸。

  • UFW為 Debian 和 Ubuntu 提供了一個 iptables 前端扼劈。

接下來

這些是加固 Linux 服務(wù)器的最基本步驟,但是進一步的安全層將取決于其預(yù)期用途菲驴。 其他技術(shù)可以包括應(yīng)用程序配置荐吵,使用入侵檢測或者安裝某個形式的訪問控制。

現(xiàn)在你可以按你的需求開始設(shè)置你的服務(wù)器了赊瞬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末先煎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子巧涧,更是在濱河造成了極大的恐慌薯蝎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谤绳,死亡現(xiàn)場離奇詭異占锯,居然都是意外死亡袒哥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門烟央,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统诺,“玉大人,你說我怎么就攤上這事疑俭×改兀” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵钞艇,是天一觀的道長啄寡。 經(jīng)常有香客問我,道長哩照,這世上最難降的妖魔是什么挺物? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮飘弧,結(jié)果婚禮上识藤,老公的妹妹穿的比我還像新娘。我一直安慰自己次伶,他們只是感情好痴昧,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冠王,像睡著了一般赶撰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柱彻,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天豪娜,我揣著相機與錄音,去河邊找鬼哟楷。 笑死瘤载,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖擅。 我是一名探鬼主播惕虑,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磨镶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起健提,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤琳猫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后私痹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脐嫂,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡统刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了账千。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥蒙。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匀奏,靈堂內(nèi)的尸體忽然破棺而出鞭衩,到底是詐尸還是另有隱情,我是刑警寧澤娃善,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布论衍,位于F島的核電站,受9級特大地震影響聚磺,放射性物質(zhì)發(fā)生泄漏坯台。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一瘫寝、第九天 我趴在偏房一處隱蔽的房頂上張望蜒蕾。 院中可真熱鬧,春花似錦焕阿、人聲如沸咪啡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑟匆。三九已至,卻和暖如春栽惶,著一層夾襖步出監(jiān)牢的瞬間愁溜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工外厂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冕象,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓汁蝶,卻偏偏與公主長得像渐扮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掖棉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容