如何保證Linux伺服器的安全
很少見有人馬上為一臺新安裝的伺服器做安全措施,然而我們生活所在的這個社會使得這件事情是必要的。不過為什麼仍舊這麼多人把它拖在最後?我已經做了相同的事情,它常常可以歸結為想要馬上進入有趣的東西。希望這篇文章將向大家展示,確保伺服器安全沒有你想得那樣難。在攻擊開始後,俯瞰你的“堡壘”會相當享受的。
這篇文章為Ubuntu 12.04.2 LTS而寫,你也可以在任何其他Linux分發版上做相同的事情。
我從哪兒開始?
如果伺服器已經有了一個公有IP,你會希望立即鎖定 root 訪問。事實上,你得鎖定整個ssh訪問,並確保只有你可以訪問。增加一個新使用者,把它加入admin組(在/etc/sudoers預配置以擁有sudo訪問許可權)。
$ sudo addgroup admin Adding group 'admin' (GID 1001) Done. $ sudo adduser spenserj Adding user `spenserj' ... Adding new group `spenserj' (1002) ... Adding new user `spenserj' (1001) with group `spenserj' ... Creating home directory `/home/spenserj' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for spenserj Enter the new value, or press ENTER for the default Full Name []: Spenser Jones Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y $ sudo usermod -a -G admin spenserj
你也將希望在你電腦上建立一個私有key,並且在伺服器上禁用討厭的密碼驗證。
$ mkdir ~/.ssh $ echo "ssh-rsa [your public key]" > ~/.ssh/authorized_keys
/etc/ssh/sshd_config
PermitRootLogin no PermitEmptyPasswords no PasswordAuthentication no AllowUsers spenserj
重新載入SSH,使用修改生效,之後嘗試在一個新會話中登陸來確保所有事情正常工作。如果你不能登陸,你將仍然擁有你的原始會話來做修改。
$ sudo service ssh restart ssh stop/waiting ssh start/running, process 1599
更新伺服器
既然你是訪問伺服器的唯一使用者,你就不用擔心黑客鬼鬼祟祟進入,再次正常呼吸。當有一些針對你伺服器的更新時,正是修補的機會,所以動手吧,就現在。
$ sudo apt-get update ... Hit http://ca.archive.ubuntu.com precise-updates/universe Translation-en_CA Hit http://ca.archive.ubuntu.com precise-updates/universe Translation-en Hit http://ca.archive.ubuntu.com precise-backports/main Translation-en Hit http://ca.archive.ubuntu.com precise-backports/multiverse Translation-en Hit http://ca.archive.ubuntu.com precise-backports/restricted Translation-en Hit http://ca.archive.ubuntu.com precise-backports/universe Translation-en Fetched 3,285 kB in 5s (573 kB/s) Reading package lists... Done $ sudo apt-get upgrade Reading package lists... Done Building dependency tree Reading state information... Done The following packages have been kept back: linux-headers-generic-lts-quantal linux-image-generic-lts-quantal The following packages will be upgraded: accountsservice apport apt apt-transport-https apt-utils aptitude bash ... 73 upgraded, 0 newly installed, 0 to remove and 2 not upgraded. Need to get 61.0 MB of archives. After this operation, 151 kB of additional disk space will be used. Do you want to continue [Y/n]? Y ... Setting up libisc83 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up libdns81 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up libisccc80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up libisccfg82 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up libbind9-80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up liblwres80 (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up bind9-host (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up dnsutils (1:9.8.1.dfsg.P1-4ubuntu0.6) ... Setting up iptables (1.4.12-1ubuntu5) ... ...
安裝防火牆
安裝現在正最流行的防火牆軟體?好,行動吧。那就配置一個防火牆。之後你總是可以增加另一個異常,幾分鐘額外的工作並不會折騰死你。Iptables在Ubuntu裡預裝了,所以去設定一些規則吧。
$ sudo mkdir /etc/iptables
/etc/iptables/rules
*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT DROP [0:0] # Accept any related or established connections -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT -I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT # Allow all traffic on the loopback interface -A INPUT -i lo -j ACCEPT -A OUTPUT -o lo -j ACCEPT # Allow outbound DHCP request - Some hosts (Linode) automatically assign the primary IP #-A OUTPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT # Outbound DNS lookups -A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT # Outbound PING requests -A OUTPUT -p icmp -j ACCEPT # Outbound Network Time Protocol (NTP) request -A OUTPUT -p udp --dport 123 --sport 123 -j ACCEPT # SSH -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT # Outbound HTTP -A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT -A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT COMMIT
通過 iptables-apply 命令為規則集生效。如果你丟失連線,修補你的規則,在繼續之前再試一下
$ sudo iptables-apply /etc/iptables/rules Applying new ruleset... done. Can you establish NEW connections to the machine? (y/N) y ... then my job is done. See you next time.
建立檔案 /etc/network/if-pre-up.d/iptables,然後寫入下面內容。當你啟動伺服器的時候,將自動載入你的iptables規則。
/etc/network/if-pre-up.d/iptables
#!/bin/sh iptables-restore < /etc/iptables/rules
現在給它執行許可權,執行檔案,以確保它正常載入
$ sudo chmod +x /etc/network/if-pre-up.d/iptables $ sudo /etc/network/if-pre-up.d/iptables
用 Fail2ban 處理潛在黑客
當談到安全的時,Fail2ban 是我最喜歡的工具之一,它將監控你的日誌檔案,並且可以臨時禁止那些正在濫用你資源,或者正在強制肆虐你的SSH連線,或者正在dos攻擊你web伺服器的使用者。
Install Fail2ban
$ sudo apt-get install fail2ban [sudo] password for sjones: Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: gamin libgamin0 python-central python-gamin python-support whois Suggested packages: mailx The following NEW packages will be installed: fail2ban gamin libgamin0 python-central python-gamin python-support whois 0 upgraded, 7 newly installed, 0 to remove and 2 not upgraded. Need to get 254 kB of archives. After this operation, 1,381 kB of additional disk space will be used. Do you want to continue [Y/n]? y ...
雖然 Fail2ban 安裝一個預設配置(/etc/fail2ban/jail.conf),但我們希望在 /etc/fail2ban/jail.local 寫配置,所以把它拷貝到那兒。
sudo cp /etc/fail2ban/jail.{conf,local}
配置
把 ignoreip 行修改為你的ip,並且可以設定禁止惡意使用者的時間量(預設是10分鐘)。你也將希望設定一個destemail,這裡我通常輸入我自已的email地址,再在後面加上 ,fail2ban@blocklist.de 。BlockList.de 是一個跟蹤並且自動報告黑客IP的系統。
/etc/fail2ban/jail.local
[DEFAULT] # "ignoreip" can be an IP address, a CIDR mask or a DNS host ignoreip = 127.0.0.1/8 bantime = 600 maxretry = 3 # "backend" specifies the backend used to get files modification. Available # options are "gamin", "polling" and "auto". # yoh: For some reason Debian shipped python-gamin didn't work as expected # This issue left ToDo, so polling is default backend for now backend = auto # # Destination email address used solely for the interpolations in # jail.{conf,local} configuration files. destemail = root@localhost,fail2ban@blocklist.de
這有一些其他的你想檢查的配置,儘管預設配置已經相當不錯了,所以,快速瀏覽這些,直到你讀到Actions章節。
Actions
Actions 允許你對惡意行為作出反應,然而當我們想要它禁止和發郵件的時候,預設是禁用了 iptables。值得感謝的是,有一個預配置檔案 action_wml,它恰恰是做這個的。
/etc/fail2ban/jail.local
# Choose default action. To change, just override value of 'action' with the # interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local # globally (section [DEFAULT]) or per specific section action = %(action_mwl)s
Jails 監控
為了讓Fail2ban工作,需要了解要監控哪些東西。這些已在Jails部分的配置檔案,並且這有一些預載入而未啟用的例子。既然到目前為止,你僅僅在伺服器上啟用了SSH訪問,那我們就只啟用SSH和SSH-DDos 監控,然而你還是會想給安裝在這臺伺服器上的公共訪問服務增加新的監控。
/etc/fail2ban/jail.local
[ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6 [ssh-ddos] enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 6
應用改變
既然我們已經配置了Fail2ban,你將希望重新載入它,並且確保向iptables增加了合適的規則。
$ sudo service fail2ban restart * Restarting authentication failure monitor fail2ban ...done. $ sudo iptables -L Chain INPUT (policy DROP) target prot opt source destination fail2ban-ssh-ddos tcp -- anywhere anywhere multiport dports ssh fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh ... Chain fail2ban-ssh (1 references) target prot opt source destination RETURN all -- anywhere anywhere Chain fail2ban-ssh-ddos (1 references) target prot opt source destination RETURN all -- anywhere anywhere
在任何時間,你都可以使用sudo iptables -L 來列出你的規則,隨後列出所有當前禁止的 IP。此時,Fail2ban正在處理兩個惡意的使用者。
Banned IPs
DROP all -- 204.50.33.22 anywhere DROP all -- 195.128.126.114 anywhere
保持最新更新
你可能現在擁有一個已經鎖定並且準備投入使用的伺服器,然而這並不是你安全之旅的終點。保持最新更新(並且總是首先在非產品環境下測試),總是關閉你不需要的埠,定期檢查你的日誌,並且由內而外瞭解你的伺服器。
HackerNews 上的討論
我的這篇文章,在 HackerNews 上有一些很好的評論,如果你對不同觀點和更好的安全性感興趣的話,我建議你去看看。這篇文章目的是作為伺服器安全的新手指南,在這篇文章結束的時候,並不意味著你的伺服器是無懈可擊的。用本文來快速鎖定一個新伺服器,在它之上為你特有的情況建立其他措施。你可能希望查詢 IPV6 安全,改變你的SSH埠(通過隱藏達到安全目的),安全核心(SELinux和GRSecurity),跟蹤系統改變,並且如果你的伺服器曾經不安全或已經線上相當長時間了的話,全面檢查一番。一臺伺服器有好幾百個入口點,並且每一個你安裝的應用都帶來了額外的潛在漏洞,但是通過合適的工具,你可以免去困擾,直接去睡大覺了。
原文連結: Spenser Jones 翻譯: 伯樂線上 - 伯樂線上讀者
相關文章
- 如何保證Web伺服器安全Web伺服器
- 如何保證海外伺服器的安全和速度?伺服器
- 應該如何保證伺服器的安全與穩定伺服器
- 華納雲:如何保證海外伺服器的安全和速度?伺服器
- 如何保證MongoDB的安全性?MongoDB
- Linux:保證資料安全落盤Linux
- gorm是如何保證協程安全的GoORM
- Linux系統:保證資料安全落盤Linux
- 保護Linux伺服器安全的四個要點!Linux伺服器
- HTTPS 如何保證資料傳輸安全HTTP
- 企業WiFi認證,如何保證企業WiFi安全?WiFi
- 代理伺服器是如何保護網路安全的?伺服器
- 為什麼說HTTPS比HTTP安全? HTTPS是如何保證安全的?HTTP
- 深入理解Https如何保證通訊安全HTTP
- Java下如何保證多執行緒安全Java執行緒
- 遠端辦公如何保證資料安全?
- 如何利用Linux伺服器提高Web介面的身份認證安全性Linux伺服器Web
- BSN長話短說之十:如何保證NFT的安全
- 區塊鏈安全如何保證?公有私有哪家強?區塊鏈
- Jtti:如何提高Linux伺服器的安全性?JttiLinux伺服器
- 網際網路的安全是如何保證的:TLS、SSL 和 CATLS
- 如何提高Linux伺服器安全性?Linux伺服器
- 保證執行緒安全的技術執行緒
- CodeArts如何保證客戶程式碼和應用安全?
- 如何保證網站的安全架構,不被黑客攻擊網站架構黑客
- 網路安全和伺服器安全有什麼區別?如何保護您的網路伺服器伺服器
- RSA2009:雲端計算服務如何保證安全?
- 一文看懂https如何保證資料傳輸的安全性的HTTP
- 解讀Java8中ConcurrentHashMap是如何保證執行緒安全的JavaHashMap執行緒
- 計算機網路——如何保證網路傳輸的安全性計算機網路
- 專案中對外暴露的http介面的安全性如何保證HTTP
- 如何提升 Linux 伺服器安全的開源工具和技巧?Linux伺服器開源工具
- 除了防火牆,還要部署什麼裝置才能保證伺服器安全?防火牆伺服器
- 前後端API互動如何保證資料安全性?後端API
- linux伺服器是什麼?如何快捷安全管理?Linux伺服器
- 保證網上購物安全的 16 種方法
- 如何計算保證金
- Spring Cloud中如何保證各個微服務之間呼叫的安全性SpringCloud微服務
- 個人使用者如何保證工作時使用企業郵箱的安全?