一文學會 SSH 服務

一文學會 SSH 服務

作者 | 阿文

我是一名雲計算工程師,在實際工作中經常遇到很多人把使用Windows那套習慣帶來Linux上來,其中最嚴重的一點就是使用密碼的方式來進行登錄鑑權。我不止一次的提醒他們不要在Linux上使用密碼而應該使用密鑰的方式鑑權,因為密鑰比密碼從安全性上來說根本不是一個量級的。

本文我就詳細帶大家來全方位的瞭解下SSH以及在Linux 系統中的使用和一些簡單的使用技巧。

一文学会 SSH 服务

什麼是SSH?

簡單的說,SSH是一種網絡協議,用於計算機之間的加密登錄。

在早期其實也有一些例如 telnet這樣的工具,如果你是一名網絡管理員,在操作交換機和路由器時候一定會和telnet 打過交道,但是telnet 協議是明文傳輸的,因此它並不安全。正是由於這個原因後來有了SSH,SSH全稱:Secure Shell,安全的命令解釋器,為客戶機提供安全的Shell環境,用於遠程管理,默認端口:TCP 22,它被廣泛的應用在unix 和Linux 操作系統中。

在Linux中的SSH 主要是 OpenSSH。

  • 主要軟件包:openssh-server、openssh-clients

  • 服務名:sshd

  • 服務端主程序:/usr/sbin/sshd

  • 客戶端主程序:/usr/bin/ssh

  • 服務端配置文件:/etc/ssh/sshd_config

  • 客戶端配置文件:/etc/ssh/ssh_config

要通過SSH 來登錄計算機非常的簡單,只需要執行如下命令即可:

ssh user@ip

例如要通過root 用戶登錄52.33.1.2這臺機器則執行:

即可,它會默認使用22端口來進行登錄。

SSH服務器端配置文件sshd_config,默認在/etc/ssh/目錄下面的sshd_config 文件。

一文学会 SSH 服务

SSH登錄的用戶驗證方式

  • 密碼驗證:使用服務器中系統帳號對應的密碼;

  • 密鑰對驗證:使用客戶機中生成的公鑰、私鑰。

密碼驗證

密碼驗證需要在系統中設置一個密碼,設置密碼如下:

[root@centos ~]# passwd root

Changing password for user root.

New password:

Retype new password:

passwd: all authentication tokens updated successfully.

只要你的SSH 沒有禁止密碼登錄,並且用戶屬性沒有設置成nologin,都可以通過密碼來進行連接即可。但是密碼登錄非常的不安全,互聯網上幾乎無時無刻不遭受惡意入侵,入侵者通過暴力破解的方式來對目標系統進行密碼破解。最簡單的破解只需要三中個工具即可完成。

  • masscan 掃描目標主機哪些端口是開放的;

  • hydra 可以指定ip和詞典來對目標主機進行密碼暴力破解;

  • 詞典。

以下面的命令解釋,入侵者要破解58.12.95.153這臺機器的ssh密碼。只需要知道它的端口和用戶名就可以,程序會代替人自動去進行密碼校驗直到試出正確密碼。

root@ubuntu:~# hydra -s 22 -v -l root -P pass.txt 58.12.95.153 ssh

只要入侵者的密碼庫足夠豐富,破解的機器性能足夠強大,破解不是問題。而一般人所使用的密碼並不會特別複雜,因此密碼的方是破解非常簡單。

密鑰認證

SSH 支持通過密鑰的方是來進行驗證,包括rsa算法或dsa 算法等。例如rsa 算法,RSA加密算法是一種非對稱加密算法,在公開密鑰加密和電子商業中被廣泛使用。

1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,可以實現非對稱加密。這種算法用他們三個人的名字命名,叫做RSA算法。從那時直到現在,RSA算法一直是最廣為使用的"非對稱加密算法"。毫不誇張地說,只要有計算機網絡的地方,就有RSA算法。

這種算法非常可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還無法破解(至少沒人公開宣佈)。因此可以認為,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。

要使用密鑰認證,首先需要創建一對密鑰對,執行<code>ssh-keygen -t rsa/<code>按幾次回車鍵即可生成密鑰文件。

[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]-----+

默認情況下所生成的密鑰文件在 ~/.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 可以追加其他設備的公鑰內容到該文件中實現密鑰方式登錄。比如我一臺機器A 希望登錄機器B,我把A機器中的id_rsa.pub 內容複製粘貼到B機器的authorized_keys 末行即可。

在使用時需要主要~/.ssh 的目錄必須為700,目錄中的三個文件的權限必須為600,否則無法正常使用密鑰認證。

修改服務端配置文件中的如下內容:

PasswordAuthentication no

重啟ssh 服務即可實習禁止密碼登錄。

客戶端使用密鑰登錄可以使用如下命令:

ssh -i 密鑰文件 用戶名@ IP 地址

一文学会 SSH 服务

SSH 的客戶端

在 ~/.ssh/config中可以配置客戶端的一些連接參數,可以執行:

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配置含義如下:

  • <code>Host/<code>:用來指定該key的Host名字,通配符<code>*/<code>表示任意Host 的配置。

  • <code>Hostname/<code>:此處指定<code>Host

    /<code>對應的具體域名或 IP 地址。

  • Port:說明目標Host 的連接端口。

  • User root:說明該配置的用戶得是root。

  • IdentityFile ~/.ssh/id_rsa:這行最為關鍵,指定了該使用哪個ssh key文件,這裡的key文件一定指的是私鑰文件。

配置完成之後,比如我們要登錄aliyun這個Host,執行如下命令即可。

ssh aliyun

一文学会 SSH 服务

SSH 反向隧道

我們可以通過 SSH 實現內網穿透,通過 SSH 的方式在一個內網訪問另外一個內網,我們把他稱為 SSH 反向代理。

一文学会 SSH 服务

步驟如下:

  • 內網主機 10.1.100.12 ,SSH 端口為22;

  • 外網主機 121.42.110.23 ,SSH 端口為22開放一個要綁定內網主機的外網端口,例如2222;

我們要通過外網主機B 的2222端口連接到內網主機10.1.100.12。

首先,在外網主機修改<code>/etc/ssh/sshd_config/<code>文件,如果沒有添加即可:

GatewayPorts yes

然後重啟SSH 服務。

在192.168.10.11執行:

ssh -NfR 2222:localhost:22 [email protected]

參數說明:

一文学会 SSH 服务

通過ssh的2222端口連接外網主機,就可以代理到內網主機。

一文学会 SSH 服务

SSH 故障排查

1.遇到 SSH 連接異常

可以查看提示,如果提示不明顯,可以使用 -vvv 參數打印詳細的debug 信息:

ssh -vvv

一般可以在debug 信息中找到連接失敗的問題。

2.遇到 ssh 連接卡很久

這種情況首先確認下 sshd_config 中的2個配置是否是如下這樣:

UseDNS no

GSSAPIAuthentication no

UseDNS 選項打開狀態下,當客戶端試圖登錄SSH服務器時,服務器端先根據客戶端的IP地址進行DNS PTR反向查詢出客戶端的主機名,然後根據查詢出的客戶端主機名進行DNS正向A記錄查詢,驗證與其原始IP地址是否一致,這是防止客戶端欺騙的一種措施,但一般我們的是動態IP不會有PTR記錄,打開這個選項不過是在白白浪費時間而已,不如將其關閉。

另外一個是GSSAPI 認證會消耗很長時間,其實關閉了也沒多大影響,一般 SSH 依次進行的認證方法的是 publickey, gssapi-keyex, gssapi-with-mic, password, 這個你可以ssh -v開啟 debug 模式在連接日誌看到。一般用戶只使用 password 認證方式,但前面 3 個認證過程系統還是會嘗試,這就浪費時間了,也就造成 SSH 登錄慢。

關於 GSSAPI 相關的認證,消耗的時間比較多,具體可以查看 SSH 連接日誌。

GSSAPI 主要是基於 Kerberos 的,因此要解決這個問題也就變成要系統配置有 Kerberos, 一般用戶是沒有配置 Kerberos的。


分享到:


相關文章: