2018年04月13日 更新,添加了 fail2ban 進階配置教程鏈接,更新了命令。
落格博客全站遷移到了 遺囑,每月最低只要 15塊人民幣,支持我的話考慮用我的邀請碼註冊,還送 $10 (合 60 多塊人民幣) 優惠! 😚
最近路由購買了一台vps用來學習...... 是的! 你沒有看錯! 我真的是用來認真的學習的!
=。=
總之,在購買了一台vps之後,你總是需要做足一些基礎的安全措施來保證你的vps不會淪為某些傻逼的肉雞。
好吧,這次因為我購買的是一台Linux系統的vps,那麼我就以這個為栗子來進行記錄了。
由於一台vps就相當於一台擁有獨立IP的,直接暴露于互聯網之上的電腦,這在為你帶來便利的同時也直接讓你的vps與危險畫上了等號,密碼窮舉、DDOS攻擊、各種各樣你想到的想不到的攻擊方法都在等待著你,不要相信你那驚悚的創意能想出多麼強大的密碼,統計學告訴我們——還是相信RSA吧!
使用RSA金鑰組登陸SSH
首先就來說一下SSH密碼窮舉的問題——別告訴我你還在telnet,否則我們沒得聊,請立即關閉這個頁面!
這個世界上,總有不少的傻逼在無聊的做著SSH弱口令掃描這種事情,相信我,你比不過字典。所以,關閉SSH的密碼驗證是一個不錯的選擇。
以前我們老師就講:其實最安全的電腦反而是那些沒有密碼的電腦,沒有密碼也就無從破解——因為系統會拒絕遠端登入。
可是關閉了SSH密碼驗證怎麼登錄呢? vnc? 不,不。我們可以使用RSA金鑰組。
通過生成RSA公私金鑰組,將公開金鑰上傳到伺服器,自己保留私密金鑰,這樣不僅加強了密碼,更帶來了不需要密碼就能登錄的便利①
①:不需要密碼是一種選擇,路由推薦各位還是在此基礎上依舊使用一個密碼,這樣即使有人得到了你的私密金鑰備份,也不太容易免密碼登錄你的vps了。
按照如下示例來使用命令:ssh-keygen
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 |
logcg.com:~ r0uter$ ssh-keygen -b 2048 -t rsa //ssh-keygen是命令 //-b后边接要采用的字节长度;一般为1024,最短也要768,我采用了2048;变态一点你可以选择4096,但相信我,2048已经明显感觉会延迟一会儿才能计算完毕了。 //-t即为加密的方式,我们选择RSA,还有其他的这里略过不讲。 Generating public/private rsa key pair. //提示正在生成密钥对 Enter file in which to save the key (/Users/r0uter/.ssh/id_rsa): //接下来输入两次你的密码;①留空按回车则为免密码登录啦! Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/r0uter/.ssh/id_rsa. Your public key has been saved in /Users/r0uter/.ssh/id_rsa.pub. The key fingerprint is://你的key指纹 e0:e0:f0:40:8d:0f:c0:e0:00:12:c8:00:1e:fc:1d:4f r0uter@logcg.com The key's randomart image is: +--[ RSA 2048]----+ | | | | |.. . . | |.o0 .. 0 . | |.o0000000 | | . ..0000 . | | .00000 | | 000000 | | 00000 | +-----------------+ |
當然了,命令回饋中的一些必要內容我已經給塗鴉過了,你大概看著差不多就對了。
接下來,我們再使用scp命令,將生成好的公開金鑰扔到伺服器上去:
1 2 |
r0uter$ scp .ssh/id_rsa.pub root@你的vps域名或者ip:/root/ //这里会要求你的SSH密码 |
的還是SSH到伺服器上,把這個 id_rsa.pub 檔案複製到ssh的相應目錄裡,然後改名為 authorized_keys
要注意的是,你想要這對金鑰登錄哪個帳戶,就放到哪個帳戶下,比如我要自動登入root,那麼我就會這樣做:
1 2 3 4 5 6 |
mkdir ~/.ssh //如果当前用户目录下没有 .ssh 目录,就先创建目录 chmod 700 ~/.ssh mv id_rsa.pub ~/.ssh cd .ssh mv id_rsa.pub authorized_keys chmod 600 authorized_keys |
這些簡單的目錄檔操作我就不再過多做解釋了大致就是將 id_rsa.pub 改名並且放到ssh的使用者配置目錄裡,當然,因為我這裡是新系統,所以直接就改名了,你要是目錄中本身就已經有了 authorized_keys 這個文件,那你就需要備份原檔或者直接將 id_rsa.pub 的內容追加到裡邊去。
這樣,我們就已經可以使用RSA金鑰檔來登錄ssh了。
關閉ssh的密碼登錄
1 |
/etc/ssh/sshd_config |
在如上目錄找到ssh服務的設定檔,將如下欄位進行修改:
1 2 3 4 5 |
#PasswordAuthentication yes //修改为如下内容: PasswordAuthentication no //使用命令重启ssh服务: /etc/init.d/ssh restart |
對了, id_rsa 這個檔我建議你也拷出來額外備份,它就是你電腦上要保存的私密金鑰,一旦丟了,你可能就需要vnc上你的vps來重置ssh啦!
另外,為了避免Write failed: Broken pipe錯誤,你也可以順便在這個文檔末尾加上下面一條命令,然後再重啟 ssh 服務。
1 |
ClientAliveInterval 60 |
這樣,你的vps很大程度上就比較安全了,不過,如果你的vps用來做網站了,開啟了HTTPd之類的服務,那可能你還需要
安裝 CSF 防火牆
通過安裝csf防火牆,可以有效的遮罩嘗試入侵你vps的IP,進階的配置我們也不需要知道,但至少你應該安裝它。
使用 CSF 防火牆,我專門寫了一篇文章來指導你安裝並配置它,這和 ufw 衝突,如果你決定使用 csf,就忽略本文中的 ufw 相關部分即可。
安裝 fail2ban 軟體
這個軟體將通過使用 iptables 防火牆,將嘗試爆破 ssh 密碼的 IP 封停,預設10分鐘,這樣可以有效防止攻擊。
1 |
apt install fail2ban |
如果你和我一樣使用 nginx 來提供服務,那麼你也可以考慮進階配置一下 fail2ban 來讓它進一步保護 nginx Fail2Ban 高級配置 保護 Nginx 服務
禁用Linux多餘埠
禁用掉所有埠,只留下需要使用的埠永遠都是正確的選擇:
使用如下命令來檢測是否存在 ufw,不再推薦直接編輯 iptables 了,這東西不是一般人玩得轉的,所以 Ubuntu 官方也推出了一個更簡單易用的 iptables 前端來供一般管理員使用,其實功能也挺強大,但是命令精簡了不少?,具體介紹請移步:Ubuntu 下更簡單的防火牆 Uncomplicated Firewall
1 |
ufw status |
如果終端顯示防火牆未啟動(理論上都應該是這樣,因為 ufw 是系統內置的。)
我們使用如下命令來添加規則:
1 2 3 4 5 6 7 8 9 10 |
ufw allow ssh ufw allow http ufw allow https //你也可以使用端口来开启 ufw allow 53 //请务必开启 ssh 端口,如果你不是标准端口,请记得开启,否则后果自负! ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y //会提示你影响ssh 连接,但只要提前加入了规则,就不会影响。 |
你看,命令多簡單? 用什麼添加什麼。它也會預設打開一些埠比如說 ICMP。
另外,它會預設設置 iptables 的 INPUT 表為拒絕,方便安全。
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 |
iptables -F //清空配置 iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //ssh端口打开 iptables -A OUTPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p udp --sport 53 -j ACCEPT //dns端口打开 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT //本地回环总得打开吧 iptables -A INPUT -p tcp -s 0/0 --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp -s 0/0 --dport 443 -j ACCEPT iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT //http常用端口打开 iptables-save > /etc/iptables.up.rules //保存配置文件 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT //如果上边的配置你不用,至少要执行这条命令; //上面一条命令的作用是把正在活动的连接写成配置加入防火墙 iptables -P INPUT DROP //设置其他 INPUT 流量为拒绝 iptables -L //使更改后的配置生效——重新加载配置。 |
這樣,將來你要使用什麼服務,就照貓畫虎往裡邊添加什麼埠就好了,額外的埠用不到開了也沒用還容易被掃埠被黑=。=
對了! 記得使用如下命令來匯出配置,然後配置啟動載入,否則一會兒各種規則就消失不見啦!
還有,不要找 iptables 的重啟命令了——這玩意兒在 ubuntu 裡已經是內核級別——也就是說,是即時載入生效噠!
1 2 3 4 5 6 7 8 9 |
iptables-save > /etc/iptables.up.rules //导出配置,以后可以直接编辑; iptables-restore < /etc/iptables.up.rules //导入配置,编辑之后就可以导入立即生效! //编辑/etc/network/interfaces文件来添加启动配置 auto eth0 iface eth0 inet dhcp pre-up iptables-restore < /etc/iptables.up.rules //最后这一条就是要添加进的命令! |
添加中文環境配置(選)
如果你使用的是國內的 vps,那你可能還需要修改 ubuntu 的更新源為國內鏡像源,可以移步阿里雲 Ubuntu 更新鏡像源
在更新之後,你很可能會遇到 locale 為空的報錯,那麼安裝一下語言環境:
1 |
apt-get install language-pack-zh-hans language-pack-zh-hans-base |
總結
這樣一來,你關閉了ssh密碼驗證,安裝了反入侵防火牆,還關閉了所有不常用端口,還利用腳本保護了 nginx 服務器……理論上你的vps至少跳出了容易被抓的肉雞行列,後續的安全配置,就可以根據需求大家各自定制啦!
本文由 落格博客 原創撰寫:落格博客 » 購買了VPS之後你應該做足的安全措施
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/884.html
我再研究下,謝謝你了
關閉密碼登錄後,再次連接提示:沒有權限 (公鑰,GSSAPI-keyex,GSSAPI與 - 麥克風).
也關閉了SELinux,不知道咋回事,試了好幾次,求大神分析下
嘗試在 /等等/SSH/ssh_config 文件中添加你的私鑰名,比如說 身份文件 〜/.SSH/id_rsa.某台計算機
默認就有了
那就嘗試重新配置一下證書吧,可能是由於兩端不匹配造成的,如果確定排除這個問題,那我也沒轍了,畢竟我沒遇到過這個問題。 :)
SFTP用證私鑰可以登錄
那應該是你的私鑰格式問題吧,可能ssh讀不出來之類,檢查下編碼,就我自己來說,sftp客戶端和ssh用的私鑰的格式是不同的,它們並不通用。
R0uter你好,我是surveillance104.
其實關於傳送ssh public key 可以通过cat命令一步搞定:
cat .ssh/id_rsa.pub | ssh root@ip address “cat >> ~/.ssh/authorized_keys”
//id_rsa.pub其實也可以是其他名字 我建議通過數字編號(比如說id_rsa0.pub)因為如果你控制兩個或兩個以上的vps管理的話//
當然如果沒有.ssh文件夾的話可以這樣:
mkdir .ssh
關於其他安全提示我已經學到了 非常感謝R0uter的教學
注意cat命令的引號是 “‘ 而不是 「」 這個我手滑打錯了 抱歉
你這個命令相當於用ssh把公開金鑰的內容用文本的形式傳給了伺服器然後執行;我的命令是用scp將檔拷貝到遠端伺服器,其實scp也可以順便拷貝成 authorized_keys檔案名,這樣的話如果寫清楚路徑,那也是一句話,還避免了管道的使用。其實是殊途同歸的。
區別還是有的:你的一句話方便複製卻不方便手打,一旦手滑,就容易打錯,而用scp則少了一些符號的使用,從命中率上來講,還是我的方法更合適
;)