如何保证Linux服务器的安全
很少見有人馬上為一臺新安裝的服務器做安全措施,然而我們生活所在的這個社會使得這件事情是必要的。不過為什么仍舊這么多人把它拖在最后?我也做過相同的事,這通常可以歸結為我們想要馬上去折騰那些有趣的東西。希望這篇文章將向大家展示,確保服務器安全沒有你想得那樣難。在攻擊開始后,俯瞰你的“堡壘”,也相當享受。
這篇文章為 Ubuntu 12.04.2 LTS 而寫,你也可以在任何其他 Linux 分發(fā)版上做相同的事情。
?
我從哪兒開始?
如果服務器已經有了一個公有IP,你會希望立即鎖定 root 訪問。事實上,你得鎖定整個ssh訪問,并確保只有你可以訪問。增加一個新用戶,把它加入admin組(在/etc/sudoers預配置以擁有sudo訪問權限)。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $ sudoaddgroup admin Adding group 'admin' (GID 1001) Done. $ sudoadduser 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 informationforspenserj Enter the new value, or press ENTERforthe default ????Full Name []: Spenser Jones ????Room Number []: ????Work Phone []: ????Home Phone []: ????Other []: Is the information correct? [Y/n] y $ sudousermod-a -G admin spenserj |
- sudo的目的:為非根用戶授予根用戶的權限;
- 配置文件:/etc/sudoers
- visudo命令編輯修改/etc/sudoers配置文件
1、一般用戶賦權設置:
[root@localhost ~]# visudo……前面省略
69 ## Syntax:
70 ##
71 ##? ?? ?user? ? MACHINE=COMMANDS
72 ##
73 ## The COMMANDS section may have other options added to it.
74 ##
75 ## Allow root to run any commands anywhere
76 root? ? ALL=(ALL)? ?? ? ALL
77 admin ALL=(ALL)? ?? ? ALL? ?? ?? ?//新增加用戶行/etc/ssh/sshd_config?? 鎖定 root 訪問
| 1 2 3 4 | PermitRootLogin no PermitEmptyPasswords no PasswordAuthentication no AllowUsers spenserj |
重新加載SSH,使用修改生效,之后嘗試在一個新會話中登陸來確保所有事情正常工作。如果你不能登陸,你將仍然擁有你的原始會話來做修改。
/etc/init.d/sshd restart| |
?
更新服務器
既然你是訪問服務器的唯一用戶,你就不用擔心黑客鬼鬼祟祟進入,再次正常呼吸。當有一些針對你服務器的更新時,正是修補的機會,所以動手吧,就現在。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | $ 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里預裝了,所以去設置一些規(guī)則吧。
| 1 | $ sudomkdir/etc/iptables |
/etc/iptables/rules
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | *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?命令為規(guī)則集生效。如果你丟失連接,修補你的規(guī)則,在繼續(xù)之前再試一下
| 1 2 3 4 | $ sudoiptables-apply/etc/iptables/rules Applying new ruleset...done. Can you establish NEW connections to the machine? (y/N) y ... thenmy job isdone. See you nexttime. |
創(chuàng)建文件 /etc/network/if-pre-up.d/iptables,然后寫入下面內容。當你啟動服務器的時候,將自動載入你的iptables規(guī)則。
/etc/network/if-pre-up.d/iptables
| 1 2 | #!/bin/sh iptables-restore </etc/iptables/rules |
現在給它執(zhí)行權限,執(zhí)行文件,以確保它正常載入
| 1 2 | $ sudochmod+x/etc/network/if-pre-up.d/iptables $ sudo/etc/network/if-pre-up.d/iptables |
?
用 Fail2ban 處理潛在黑客
當談到安全的時,Fail2ban 是我最喜歡的工具之一,它將監(jiān)控你的日志文件,并且可以臨時禁止那些正在濫用你資源,或者正在強制肆虐你的SSH連接,或者正在dos攻擊你web服務器的用戶。
具體安裝查看URL? http://blog.csdn.net/zimuxin/article/details/45742999
Install Fail2ban
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ sudoapt-getinstallfail2ban [sudo] passwordforsjones: 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 寫配置,所以把它拷貝到那兒。
| 1 | sudo cp /etc/fail2ban/jail.{conf,local} |
?
配置
把 ignoreip 行修改為你的ip,并且可以設置禁止惡意用戶的時間量(默認是10分鐘)。你也將希望設置一個destemail,這里我通常輸入我自已的email地址,再在后面加上,fail2ban@blocklist.de 。BlockList.de?是一個跟蹤并且自動報告黑客IP的系統(tǒng)。
/etc/fail2ban/jail.local
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [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章節(jié)。
?
Actions
Actions 允許你對惡意行為作出反應,然而當我們想要它禁止和發(fā)郵件的時候,默認是禁用了?iptables。值得感謝的是,有一個預配置文件 action_wml,它恰恰是做這個的。
/etc/fail2ban/jail.local
| 1 2 3 4 | # 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 監(jiān)控
為了讓Fail2ban工作,需要了解要監(jiān)控哪些東西。這些已在Jails部分的配置文件,并且這有一些預載入而未啟用的例子。既然到目前為止,你僅僅在服務器上啟用了SSH訪問,那我們就只啟用SSH和SSH-DDos 監(jiān)控,然而你還是會想給安裝在這臺服務器上的公共訪問服務增加新的監(jiān)控。
/etc/fail2ban/jail.local
| 1 2 3 4 5 6 7 8 9 10 11 12 | [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增加了合適的規(guī)則。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ sudoservice fail2ban restart ?* Restarting authentication failure monitor fail2ban ???...done. $ sudoiptables -L Chain INPUT (policy DROP) target???? prot optsource??????????????destination fail2ban-ssh-ddos? tcp? --? anywhere???????????? anywhere???????????? multiport dportsssh fail2ban-ssh?tcp? --? anywhere???????????? anywhere???????????? multiport dportsssh ... Chain fail2ban-ssh(1 references) target???? prot optsource??????????????destination RETURN???? all? --? anywhere???????????? anywhere Chain fail2ban-ssh-ddos (1 references) target???? prot optsource??????????????destination RETURN???? all? --? anywhere???????????? anywhere |
在任何時間,你都可以使用sudo iptables -L 來列出你的規(guī)則,隨后列出所有當前禁止的 IP。此時,Fail2ban正在處理兩個惡意的用戶。
Banned IPs
| 1 2 | DROP?????? all? --? 204.50.33.22???????? anywhere DROP?????? all? --? 195.128.126.114????? anywhere |
?
保持最新更新
你可能現在擁有一個已經鎖定并且準備投入使用的服務器,然而這并不是你安全之旅的終點。保持最新更新(并且總是首先在非產品環(huán)境下測試),總是關閉你不需要的端口,定期檢查你的日志,并且由內而外了解你的服務器。
?
HackerNews 上的討論
我的這篇文章,在 HackerNews?上有一些很好的評論,如果你對不同觀點和更好的安全性感興趣的話,我建議你去看看。這篇文章目的是作為服務器安全的新手指南,在這篇文章結束的時候,并不意味著你的服務器是無懈可擊的。用本文來快速鎖定一個新服務器,在它之上為你特有的情況建立其他措施。你可能希望查詢 IPV6 安全,改變你的SSH端口(通過隱藏達到安全目的),安全內核(SELinux和GRSecurity),跟蹤系統(tǒng)改變,并且如果你的服務器曾經不安全或已經在線相當長時間了的話,全面檢查一番。一臺服務器有好幾百個入口點,并且每一個你安裝的應用都帶來了額外的潛在漏洞,但是通過合適的工具,你可以免去困擾,直接去睡大覺了。
總結
以上是生活随笔為你收集整理的如何保证Linux服务器的安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 花呗和信用卡怎么互相还账
- 下一篇: centos下fail2ban安装与配置