SSH詳解

什麼是ssh?

SSH 爲 Secure Shell 的縮寫,由 IETF 的網絡小組(Network Working Group)所制定;SSH 爲建立在應用層基礎上的安全協議。SSH 是目前較可靠,專爲遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
SSH是標準的網絡協議,可用於大多數UNIX操作系統,能夠實現字符界面的遠程登錄管理,它默認使用22號端口,採用密文的形式在網絡中傳輸數據,相對於通過明文傳輸的Telnet,具有更高的安全性。
SSH提供了口令和密鑰兩種用戶驗證方式,這兩者都是通過密文傳輸數據的。不同的是,口令用戶驗證方式傳輸的是用戶的賬戶名和密碼,這要求輸入的密碼具有足夠的複雜度才能具有更高的安全性。
而基於密鑰的安全驗證必須爲用戶自己創建一對密鑰,並把共有的密鑰放在需要訪問的服務器上。當需要連接到SSH服務器上時,客戶端軟件就會向服務器發出請求,請求使用客戶端的密鑰進行安全驗證。服務器收到請求之後,先在該用戶的根目錄下尋找共有密鑰,然後把它和發送過來的公有密鑰進行比較。如果兩個密鑰一致,服務器就用公有的密鑰加密“質詢”,並把它發送給客戶端軟件。客戶端收到質詢之後,就可以用本地的私人密鑰解密再把它發送給服務器。這種方式是相當安全的。

SSH服務認證類型:

基於口令的認證

基於口令的安全驗證的方式就是大家現在一直在用的,只要知道服務器的SSH連接帳號和口令(當然也要知道對應服務器的 IP及開放的 SSH端口,默認爲22 ),就可以通過 ssh客戶端登錄到這臺遠程主機。此時,聯機過程中所有傳輸的數據都是加密的。
事例:

ssh 192.168.152.130

在這裏插入圖片描述
基於祕鑰認證:
首先在客戶端生成一對祕鑰:

ssh-keygen -t dsa

或者

ssh-keygen -t rsa

生成的私鑰默認位置在/root/.ssh/下面
下面輸入的密碼意爲是否對私鑰再進行加密。
在這裏插入圖片描述
將剛纔客戶端生成的公鑰上傳到服務器端:
在這裏插入圖片描述

ssh-copy-id -i id_dsa.pub [email protected]

在這裏插入圖片描述
測試:

ssh 192.168.152.136

可以直接登錄了,不需要密碼

在這裏插入圖片描述

SSH配置文件詳解:

Ssh客戶端配置文件詳解:

vi /etc/ssh/ssh_config

Host *                       #選項“Host”只對能夠匹配後面字串的計算機有效。“*”表示所有的計算機。
ForwardAgent no              #設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。
ForwardX11 no                #設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)
RhostsAuthentication n       #設置是否使用基於rhosts的安全驗證。
RhostsRSAAuthentication no   #設置是否使用用RSA算法的基於rhosts的安全驗證。
RSAAuthentication yes        #設置是否使用RSA算法進行安全驗證。
PasswordAuthentication yes   #設置是否使用口令驗證。
FallBackToRsh no             #設置如果用ssh連接出現錯誤是否自動使用rsh。
UseRsh no                    #設置是否在這臺計算機上使用“rlogin/rsh”。
BatchMode no                 #如果設爲“yes”,passphrase/password(交互式輸入口令)的提示將被禁止。當不能交互式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用。
CheckHostIP yes              #設置ssh是否查看連接到服務器的主機的IP地址以防止DNS欺騙。建議設置爲“yes”。
StrictHostKeyChecking no     #如果設置成“yes”,ssh就不會自動把計算機的密匙加入“$HOME/.ssh/known_hosts”文件,並且一旦計算機的密匙發生了變化,就拒絕連接。
IdentityFile ~/.ssh/identity #設置從哪個文件讀取用戶的RSA安全驗證標識。
Port 22                      #設置連接到遠程主機的端口。
Cipher blowfish              #設置加密用的密碼。
EscapeChar ~                 #設置escape字符


Ssh服務端配置文件詳解:

vi /etc/ssh/sshd_config

Port 22  # SSH 預設使用 22 這個 port,您也可以使用多的 port !
Protocol 2,1  # 選擇的 SSH 協議版本,可以是 1 也可以是 2 ,如果要同時支持兩者,就必須要使用 2,1 這個分隔了!
ListenAddress 0.0.0.0        
#監聽的主機適配卡!舉個例子來說,如果您有兩個 IP,分別是 192.168.0.100 及 192.168.2.20 ,那麼只想要開放 192.168.0.100 時,
#就可以寫如同下面的樣式:ListenAddress 192.168.0.100 只監聽來自 192.168.0.100 這個 IP 的SSH聯機。如果不使用設定的話,則預設所有接口均接受 SSH
PidFile /var/run/sshd.pid  # 可以放置 SSHD 這個 PID 的檔案!左列爲默認值
LoginGraceTime 600 # 當使用者連上 SSH server 之後,會出現輸入密碼的畫面,在該畫面中,在多久時間內沒有成功連上 SSH server ,就斷線!時間爲秒!
Compression yes  # 是否可以使用壓縮指令?
HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私鑰
HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私鑰
HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私鑰
KeyRegenerationInterval 3600   # 由前面聯機的說明可以知道, version 1 會使用 server 的 Public Key ,每隔一段時間來重新建立一次!時間爲秒!
ServerKeyBits 768   # Server key 的長度!
SyslogFacility AUTH  # 當有人使用 SSH 登入系統的時候,SSH會記錄信息
LogLevel INFO       # 登錄記錄的等級---》全部
PermitRootLogin no  # 是否允許 root 登入!預設是允許的,但是建議設定成 no!
UserLogin no      # 在 SSH 底下本來就不接受 login 這個程序的登入!
StrictModes yes      # 當使用者的 host key 改變之後,Server 就不接受聯機
RSAAuthentication yes   # 是否使用純的 RSA 認證!?僅針對 version 1 !
PubkeyAuthentication yes  # 是否允許 Public Key ?只有 version 2
AuthorizedKeysFile .ssh/authorized_keys #設定若要使用不需要密碼登入的賬號時,那麼那個賬號的存放檔案所在檔名!
RhostsAuthentication no  # 本機系統不使用 .rhosts , .rhosts 不安全!
IgnoreRhosts yes      # 是否取消使用 ~/.ssh/.rhosts 來做爲認證!
RhostsRSAAuthentication no # 針對 version 1 ,使用 rhosts 檔案在/etc/hosts.equiv配合 RSA 演算方式來進行認證!
HostbasedAuthentication no # 這個項目與上面的項目類似,不過是給 version 2 使用的!
IgnoreUserKnownHosts no  # 是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄的主機內容
PasswordAuthentication yes # 密碼驗證當然是需要的!
PermitEmptyPasswords no  # 上面那一項如果設定爲 yes 的話,這一項就最好設定爲 no ,這個項目在是否允許以空的密碼登入!
ChallengeResponseAuthentication yes # 挑戰任何的密碼認證!所以,任何 login.conf規定的認證方式,均可適用!
PAMAuthenticationViaKbdInt yes # 是否啓用其它的 PAM 模塊!啓用這個模塊將會導致 PasswordAuthentication 設定失效!
與Kerberos 有關的參數設定!底下不用設定
  KerberosAuthentication no
  KerberosOrLocalPasswd yes
  KerberosTicketCleanup yes
  ​KerberosTgtPassing no
有關在 X-Window 底下使用的相關設定
  X11Forwarding yes
  X11DisplayOffset 10
  X11UseLocalhost yes
PrintMotd no                # 登入後是否顯示出一些信息呢?例如上次登入的時間、地點等,預設是 yes ,但是,如果爲了安全,可以考慮改爲 no !
PrintLastLog yes         # 顯示上次登入的信息!可以啊!預設也是 yes !
KeepAlive yes           # 一般而言,如果設定這項目的話,那麼 SSH Server 會傳送KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!在這個情況下,任何一端死掉後, SSH 可以立刻知道!而不會有殭屍程序的發生!
UsePrivilegeSeparation yes  # 使用者的權限設定項目!
MaxStartups 10          # 同時允許幾個尚未登入的聯機畫面?
DenyUsers *            # 設定受抵擋的使用者名稱

SSH其他功能:

SSH端口轉發:

SSH 不光會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。而且SSH 還有一個非常有用的功能,這就是端口轉發。它能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,並且自動提供了相應的加密及解密服務。這一過程有時也被叫做“隧道”(tunneling),這是因爲 SSH 爲其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。
ssh端口轉發兩大功能
1.加密SSH Client 端至SSH Server端之間的通信數據
2.爲了突破防火牆的限制完成一些之前無法建立的TCP連接
ssh端口轉發又分爲本地轉發和遠程轉發
1.本地轉發
本地轉發主要運用於目標服務器因爲防火牆規則無法訪問,只能由處於同一個局域網內的機器訪問,這時候就需要我們用本地端口轉發了
本地端口轉發格式如下:

ssh -L ::

外部主機A要訪問數據庫服務器C,但是因爲防火牆規則無法直接訪問,這時候我們要先連接內部服務器B,通過B來連接C,也就是拿B做跳板
首先我們要在外部主機上選擇一個端口作爲監聽端口,我們使用telnet訪問,所以不能用管理員訪問,而非管理員用戶對1-1023端口是沒有權限的,所以我們要選1024-65535之間未被佔用的端口。
在數據庫服務器上也要安裝telnet.server
我們只需要在外部主機上操作就可以了
首先我們看能否直接連接數據庫服務器

我們做一個本地端口轉發

ssh -L 1080:centos6:23 -Nf centos7dns

centos6就是我們要訪問的數據庫服務器
centos7dns就是我們的轉發服務器
1080就是我們選擇的本地端口
-f:後臺啓用
-N:不打開遠程shell,處於等待狀態
-g:啓用網關功能
這個時候我們只需通過本地監聽的1080端口就能訪問數據庫服務器了

2.遠程轉發
遠程轉發不同之處在於遠程轉發的監聽端口是在遠程主機上打開的,就像我們要訪問數據庫服務器C,使用遠程端口轉發就是在內部服務器B上進行,使用遠程端口轉發要保證端口轉發服務器和目標服務器之間沒有被防火牆攔截。
SSH 的遠程端口轉發的格式如下所示

ssh -R sshserver_port:remote_host:remotehost_port sshserver

遠程端口的轉發應用於數據庫服務器和內部管理都不允許外網連接,這時候我們就需要在內部管理服務器上做一個遠程端口轉發隧道,讓遠程主機可以與數據庫服務器建立連接

ssh -R 1080:centos6 -Nf centos7

這樣遠程主機監聽本地端口,使用telnet協議就可以遠程訪問數據庫服務器了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章