1. 程式人生 > >ssh服務詳解

ssh服務詳解

linux

什麽是openssh

openssl是使用ssh協議遠程登錄系統的連接工具。它能加密流量、防竊聽和其他攻擊。此外還能夠提供隧道功能、多種認證方法和復雜的配置選項;

openssh是一組工具的集合,其套件包括三部分:

  • 遠程操作類 ssh、scp、sftp

  • 密鑰管理類 ssh-add、ssh-keysign、ssh-keyscan和ssh-keygen

  • 服務提供者類 sshd、sftp-server、ssh-agent


openssh官方網站:

https://www.openssh.com/


為什麽是ssh

遠程連接的工具有很多,為什麽偏偏選擇ssh?

ssh英文全稱是secure shell protocol,安全的殼程序協議。有v1和v2兩個版本,目前v2是主流;

以telnet為代表的遠程連接工具已經被ssh替代,其關鍵原因就是ssh提供數據加密的功能,telnet還是明文傳輸存在被竊聽的隱患;

ssh的加密使用非對稱密鑰加密體系完成,所謂的非對稱加密,就是公鑰、私鑰組成密鑰對。可以加密對稱密鑰也可以驗證身份;

連接加密技術簡介:

通信的任一端都有一對密鑰--公鑰和私鑰

公鑰:由私鑰推導生成,但不能反推;公之於眾;安全性高但加密效率低,一般用於加密對稱密鑰;還可以解密私鑰加密的數據,進行身份認證;CA證書;

私鑰:必須保存在本機;可以對隨機字符串加密,對方用自己的公鑰解密,實現簽名;

ssh在遠程連接的用途上已經是主流,大家對此也都已形成共識,但是telent在一些場景中依然使用較廣即使它是明文傳輸;

ssh服務詳解

ssh基於C/S結構,C表示Client客戶端,S表示Server服務器端,sshd表示服務;

服務端:默認使用tcp 22端口,ss -ntl可以查看,而且既然是默認說明可以修改;

客戶端:ssh的登陸有兩種認證方式,一是基於口令,一是基於key;

ssh的命令格式一般為:ssh 用戶@ip 命令(具體man或help查看);


ssh基於口令的登陸過程:

  • 服務器開啟sshd服務,會在/etc/ssh/目錄下查找ssh_host_*文件,即公鑰私鑰文件(在安裝系統時生成);

  • 客戶端請求連接,服務端將自己的公鑰文件發給客戶端;

  • 客戶端檢查~/.ssh/known_hosts中是否有服務器公鑰,沒有的話就會在ssh連接時提示“(yes/no)”,yes就是將公鑰加入文件中;

  • 客戶端輸入口令,並用服務器公鑰加密傳給服務器端;

  • 服務器用自己的私鑰解密,得到口令,正確的話認證通過;


ssh基於key的登陸過程:

  • 客戶端生成一對密鑰(ssh-keygen);

  • 客戶端將公鑰傳遞給服務器(key-copy-id);

  • 服務器端在~/.ssh/下生成文件authorized_keys,其內容是客戶端公鑰信息;

  • 客戶端連接服務器時,會附帶本身用戶名信息等;

  • 服務器根據用戶信息對比authorized_keys文件,若一致的話則使用這個公鑰加密一串隨機字符,並發給客戶端;

  • 客戶端收到加密數據,用自己私鑰解密,並將解密的字符串發給服務器;

  • 服務器對比收到的字符串與之前生成的字符串,一致的話認證通過


/etc/ssh/sshd_config 是sshd的配置文件,很多默認的配置都在此文件定義,以下舉出幾條:

#Port 22
#這就是ssh監聽22端口的原因,可以修改

#ListenAddress 0.0.0.0
#默認監聽所有ip,安全起見可以將監聽地址指定為管理員地址

# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
#版本2的私鑰文件,rsa、dsa是非對稱密鑰體系的兩種實現方式

#LoginGraceTime 2m
#默認的2分鐘不輸入口令則退出登陸
#PermitRootLogin yes
#默認是允許root登陸

UsePAM yes
#使用pam,pam定義一個安全框架,通過特定的模塊實現對服務的安全保護

端口轉發的三種方式

ssh端口轉發的前提都是通過ssh建立“隧道”

1、本地端口轉發

網絡結構:出差員工A------[防火墻]-----ssh服務器B------telnet服務器C

場景一:員工A想要登陸公司telnet服務器,但公司出於安全考慮不允許外網直接訪問C但是允許訪問B。因此以B機器為跳板機,登陸B再以B的身份登陸C機器

在A上配置一條命令

ssh -L 12345:telnet-server:23  ssh-server -Nf
# -L本地端口轉發
# 12345是本機監聽的端口
# -N 表示不打開遠程終端
# -f 表示後臺執行

然後在A上輸入“telnet 127.0.0.1 12345”即可登陸telnet服務器,很神奇吧,其工作原理如下:

  • 本機127.0.0.1正在監聽12345端口,當收到telnet命令,觸發此端口,與127.0.0.1的另一個端口建立連接;

  • 同時觸發本機與ssh服務器建立ssh連接;

  • ssh服務器再以自己作為telnet客戶端與telnet服務器建立連接;

  • telnet服務器23端口與B建立連接,看到的都是B的信息,但是實際連接的確實A

關鍵點就是,本機監聽本機端口12345

2、遠程端口轉發

網絡結構:出差員工A------[防火墻]-----ssh客戶端B------telnet服務器C

場景二:與“場景一”類似,只是此時防火墻不允許外網主動與內網主機建立ssh連接

此場景下,出差員工當作ssh服務器,B作為ssh客戶端,其他不變

在B上配置一條命令

ssh -R 12345:telnet-server:23 ssh-server -Nf
# -R表示遠程端口轉發
# 12345 表示B監聽的遠程機器A上的端口

在A上輸入“telnet 127.0.0.1 12345”即可登陸telnet服務器,其工作原理如下:

  • A上telnet命令觸發12345端口,同時一直監聽此端口的B機器開始與A建立ssh連接;

余下的過程與“本地端口轉發一樣”

但是二者的區別是“本地端口轉發”是ssh客戶端監聽本機的12345端口,然後主動與內網的ssh服務器建立連接;

“遠程端口轉發”則是外網的ssh服務器被動接受內網的ssh連接,因為主動方式被防火墻阻止了。

3、動態端口轉發

網絡結構:A-----[防火墻]-----ssh服務器B-----http服務器C

場景三:不允許外網用戶直接訪問http服務,但是ssh服務是允許的

在A上配置一條命令:

ssh -D 1080 用戶@ssh-server
# -D 動態指定連接ssh服務的端口

在A上測試

curl --socks5 127.0.0.1 
# 默認1080端口,所以可以不寫

A設置為本機代理,當訪問1080端口,會與ssh服務器建立連接,然後再與http服務器建立連接

本文出自 “高攀” 博客,謝絕轉載!

ssh服務詳解