作者 | 阿文
責(zé)編 | 郭芮
我是一名云計(jì)算工程師,在實(shí)際工作中經(jīng)常遇到很多人把使用windows那套習(xí)慣帶來linux上來,其中最嚴(yán)重的一點(diǎn)就是使用密碼的方式來進(jìn)行登錄鑒權(quán)。我不止一次的提醒他們不要在Linux上使用密碼而應(yīng)該使用密鑰的方式鑒權(quán),因?yàn)槊荑€比密碼從安全性上來說根本不是一個(gè)量級的。
本文我就詳細(xì)帶大家來全方位的了解下SSH以及在Linux 系統(tǒng)中的使用和一些簡單的使用技巧。
1.什么是SSH?
簡單的說,SSH是一種網(wǎng)絡(luò)協(xié)議,用于計(jì)算機(jī)之間的加密登錄。
在早期其實(shí)也有一些例如 telnet這樣的工具,如果你是一名網(wǎng)絡(luò)管理員,在操作交換機(jī)和路由器時(shí)候一定會和telnet 打過交道,但是telnet 協(xié)議是明文傳輸?shù)?,因此它并不安全。正是由于這個(gè)原因后來有了SSH,SSH全稱:Secure Shell,安全的命令解釋器,為客戶機(jī)提供安全的Shell環(huán)境,用于遠(yuǎn)程管理,默認(rèn)端口:TCP 22,它被廣泛的應(yīng)用在unix 和Linux 操作系統(tǒng)中。
在Linux中的SSH 主要是 OpenSSH。
-
主要軟件包:openssh-server、openssh-clients
-
服務(wù)名:sshd
-
服務(wù)端主程序:/usr/sbin/sshd
-
客戶端主程序:/usr/bin/ssh
-
服務(wù)端配置文件:/etc/ssh/sshd_config
-
客戶端配置文件:/etc/ssh/ssh_config
要通過SSH 來登錄計(jì)算機(jī)非常的簡單,只需要執(zhí)行如下命令即可:
ssh user@ip
例如要通過root 用戶登錄52.33.1.2這臺機(jī)器則執(zhí)行:
即可,它會默認(rèn)使用22端口來進(jìn)行登錄。
SSH服務(wù)器端配置文件sshd_config,默認(rèn)在/etc/ssh/目錄下面的sshd_config 文件。
2.SSH登錄的用戶驗(yàn)證方式
-
密碼驗(yàn)證:使用服務(wù)器中系統(tǒng)帳號對應(yīng)的密碼;
-
密鑰對驗(yàn)證:使用客戶機(jī)中生成的公鑰、私鑰。
密碼驗(yàn)證
密碼驗(yàn)證需要在系統(tǒng)中設(shè)置一個(gè)密碼,設(shè)置密碼如下:
[root@centos ~]# passwd root
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
只要你的SSH 沒有禁止密碼登錄,并且用戶屬性沒有設(shè)置成nologin,都可以通過密碼來進(jìn)行連接即可。但是密碼登錄非常的不安全,互聯(lián)網(wǎng)上幾乎無時(shí)無刻不遭受惡意入侵,入侵者通過暴力破解的方式來對目標(biāo)系統(tǒng)進(jìn)行密碼破解。最簡單的破解只需要三中個(gè)工具即可完成。
-
masscan 掃描目標(biāo)主機(jī)哪些端口是開放的;
-
hydra 可以指定ip和詞典來對目標(biāo)主機(jī)進(jìn)行密碼暴力破解;
-
詞典。
以下面的命令解釋,入侵者要破解58.12.95.153這臺機(jī)器的ssh密碼。只需要知道它的端口和用戶名就可以,程序會代替人自動(dòng)去進(jìn)行密碼校驗(yàn)直到試出正確密碼。
root@ubuntu:~# hydra -s 22 -v -l root -P pass.txt 58.12.95.153 ssh
只要入侵者的密碼庫足夠豐富,破解的機(jī)器性能足夠強(qiáng)大,破解不是問題。而一般人所使用的密碼并不會特別復(fù)雜,因此密碼的方是破解非常簡單。
密鑰認(rèn)證
SSH 支持通過密鑰的方是來進(jìn)行驗(yàn)證,包括rsa算法或dsa 算法等。例如rsa 算法,RSA加密算法是一種非對稱加密算法,在公開密鑰加密和電子商業(yè)中被廣泛使用。
1977年,三位數(shù)學(xué)家Rivest、Shamir 和 Adleman 設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對稱加密。這種算法用他們?nèi)齻€(gè)人的名字命名,叫做RSA算法。從那時(shí)直到現(xiàn)在,RSA算法一直是最廣為使用的"非對稱加密算法"。毫不夸張地說,只要有計(jì)算機(jī)網(wǎng)絡(luò)的地方,就有RSA算法。
這種算法非??煽浚荑€越長,它就越難破解。根據(jù)已經(jīng)披露的文獻(xiàn),目前被破解的最長RSA密鑰是768個(gè)二進(jìn)制位。也就是說,長度超過768位的密鑰,還無法破解(至少?zèng)]人公開宣布)。因此可以認(rèn)為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。
要使用密鑰認(rèn)證,首先需要?jiǎng)?chuàng)建一對密鑰對,執(zhí)行ssh-keygen -t rsa
按幾次回車鍵即可生成密鑰文件。
[root@centos ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:eHM9jL0Ry+hxt7H3ShEsKlkAxPvnKgN8KejMQ8iot3s root@centos
The key's randomart image is:
+---[RSA 2048]----+
| oo.. |
| . . . |
| . . o o |
| .. o O + . |
|o. o .oS * X + |
|o.o + o..=.o = = |
|.= + o. . + .|
|. * E o . . ..|
| .o= o.. ...|
+----[SHA256]-----+
默認(rèn)情況下所生成的密鑰文件在 ~/.ssh/ 目錄下:
[root@centos ~]# cd ~/.ssh/
[root@centos .ssh]# pwd
/root/.ssh
[root@centos .ssh]# ls
authorized_keys id_rsa id_rsa.pub
其中:
-
id_rsa 是私鑰文件;
-
id_rsa.pub 是公鑰文件;
-
authorized_keys 可以追加其他設(shè)備的公鑰內(nèi)容到該文件中實(shí)現(xiàn)密鑰方式登錄。比如我一臺機(jī)器A 希望登錄機(jī)器B,我把A機(jī)器中的id_rsa.pub 內(nèi)容復(fù)制粘貼到B機(jī)器的authorized_keys 末行即可。
在使用時(shí)需要主要~/.ssh 的目錄必須為700,目錄中的三個(gè)文件的權(quán)限必須為600,否則無法正常使用密鑰認(rèn)證。
修改服務(wù)端配置文件中的如下內(nèi)容:
PasswordAuthentication no
重啟ssh 服務(wù)即可實(shí)習(xí)禁止密碼登錄。
客戶端使用密鑰登錄可以使用如下命令:
ssh -i 密鑰文件 用戶名@ IP 地址
3.SSH 的客戶端
在 ~/.ssh/config中可以配置客戶端的一些連接參數(shù),可以執(zhí)行:
man ssh_config
它的配置如下所示
Host *
PasswordAuthentication no
ChallengeResponseAuthentication no
HashKnownHosts yes
ProxyCommand ssh [email protected] -p 65422 -W %h:%p
Host aliyun
HostName 114.113.199.88
User hedu
IdentityFile ~/.ssh/cloudsupport
Port 1046
其中,config配置含義如下:
-
Host
:用來指定該key的Host名字,通配符*
表示任意Host 的配置。 -
Hostname
:此處指定Host
對應(yīng)的具體域名或 IP 地址。 -
Port:說明目標(biāo)Host 的連接端口。
-
User root:說明該配置的用戶得是root。
-
IdentityFile ~/.ssh/id_rsa:這行最為關(guān)鍵,指定了該使用哪個(gè)ssh key文件,這里的key文件一定指的是私鑰文件。
配置完成之后,比如我們要登錄aliyun這個(gè)Host,執(zhí)行如下命令即可。
ssh aliyun
4.SSH 反向隧道
我們可以通過 SSH 實(shí)現(xiàn)內(nèi)網(wǎng)穿透,通過 SSH 的方式在一個(gè)內(nèi)網(wǎng)訪問另外一個(gè)內(nèi)網(wǎng),我們把他稱為 SSH 反向代理。

步驟如下:
-
內(nèi)網(wǎng)主機(jī) 10.1.100.12 ,SSH 端口為22;
-
外網(wǎng)主機(jī) 121.42.110.23 ,SSH 端口為22開放一個(gè)要綁定內(nèi)網(wǎng)主機(jī)的外網(wǎng)端口,例如2222;
我們要通過外網(wǎng)主機(jī)B 的2222端口連接到內(nèi)網(wǎng)主機(jī)10.1.100.12。
首先,在外網(wǎng)主機(jī)修改/etc/ssh/sshd_config
文件,如果沒有添加即可:
GatewayPorts yes
然后重啟SSH 服務(wù)。
在192.168.10.11執(zhí)行:
ssh -NfR 2222:localhost:22 [email protected]
參數(shù)說明:

通過ssh的2222端口連接外網(wǎng)主機(jī),就可以代理到內(nèi)網(wǎng)主機(jī)。
5.SSH 故障排查
1.遇到 SSH 連接異常
可以查看提示,如果提示不明顯,可以使用 -vvv 參數(shù)打印詳細(xì)的debug 信息:
ssh -vvv
一般可以在debug 信息中找到連接失敗的問題。
2.遇到 ssh 連接卡很久
這種情況首先確認(rèn)下 sshd_config 中的2個(gè)配置是否是如下這樣:
UseDNS no
GSSAPIAuthentication no
UseDNS 選項(xiàng)打開狀態(tài)下,當(dāng)客戶端試圖登錄SSH服務(wù)器時(shí),服務(wù)器端先根據(jù)客戶端的IP地址進(jìn)行DNS PTR反向查詢出客戶端的主機(jī)名,然后根據(jù)查詢出的客戶端主機(jī)名進(jìn)行DNS正向A記錄查詢,驗(yàn)證與其原始IP地址是否一致,這是防止客戶端欺騙的一種措施,但一般我們的是動(dòng)態(tài)IP不會有PTR記錄,打開這個(gè)選項(xiàng)不過是在白白浪費(fèi)時(shí)間而已,不如將其關(guān)閉。
另外一個(gè)是GSSAPI 認(rèn)證會消耗很長時(shí)間,其實(shí)關(guān)閉了也沒多大影響,一般 SSH 依次進(jìn)行的認(rèn)證方法的是 publickey, gssapi-keyex, gssapi-with-mic, password, 這個(gè)你可以ssh -v開啟 debug 模式在連接日志看到。一般用戶只使用 password 認(rèn)證方式,但前面 3 個(gè)認(rèn)證過程系統(tǒng)還是會嘗試,這就浪費(fèi)時(shí)間了,也就造成 SSH 登錄慢。
關(guān)于 GSSAPI 相關(guān)的認(rèn)證,消耗的時(shí)間比較多,具體可以查看 SSH 連接日志。
GSSAPI 主要是基于 Kerberos 的,因此要解決這個(gè)問題也就變成要系統(tǒng)配置有 Kerberos, 一般用戶是沒有配置 Kerberos的。