1. 程式人生 > 實用技巧 >telnet和openssh

telnet和openssh

OpenSSH:
  ssh:Secure SHell,它是一個協議protocol,監聽在22/tcp,意思為安全的遠端登入
  OpenSSH:ssh協議的開源實現
  dropbear:ssh協議的另一個開源實現
為何會用到ssh?
機房內有很多主機,一般來說不可能每臺主機都配有顯示器,所以要對這樣的伺服器進行管理的話,通常都是通過遠端方式登入進來,也就是通過遠端的客戶端通過網路的方式接入進來。
一般終端裝置是連線至本地VGA顯示口或序列口上的鍵盤和顯示器。像這種遠端管理時,也需要鍵盤顯示器,比如將對方要顯示的結果顯示到顯示器,輸入的控制指令和伺服器返回的結果,都要通過網路傳輸。
預設情況下,本地的終端程式mingetty啟動好之後,本身之上再附加一個login程式,來讓使用者登入並完成認證操作。
但mingetty並沒有遠端負責登入的能力,所以,為了實現遠端登入,有個基本前提是,伺服器端需要執行一個服務程式,這個服務程式能夠把對本地的很多基於終端方式的請求給對映到主機的客戶端程式上,
二者之間使用某種特定協議來交換資料報文,這裡就需要伺服器端有一個程序,這個程序負責去構建基於C/S架構的終端,伺服器端能夠接受客戶端通過網路發來的協議資料報文,將這個協議資料報文解封裝以後,
裡面的請求單元是對本地主機上的登入或某個命令執行的請求,如果不是遠端登入的話,這一切基於網路協議的通訊就不需要了,因為本地通過VGA顯示卡和鍵盤直接進行互動就可以。所以就需要一個應用層協議,
能夠讓服務程序能夠理解請求的是什麼,更重要的是能夠有許可權去操控本地的資源。
早期,這種遠端登入機制是通過telnet協議來實現的,它也是C/S架構的,伺服器端執行telnet server,客戶端執行telnet程式,二者能夠基於telnet協議互相通訊,telnet監聽在23/tcp,
telent本身沒有任何安全加密的功能,也就意味著遠端登入時,輸入的賬號密碼都是明文傳送的,所以對於現今的網路,這種協議早就不適用了。所以後來有了telnet的後繼者也是取代者,也就是ssh
telnet使用:
# yum install telnet-server -y
telnet-server工作於基於超級守護程序管理的瞬時守護程序模式
# chkconfig telnet on
# service xinetd restart
# ss -tnl
telnet客戶端:
# yum install telnet -y
# telnet 192.168.2.20(SERVER_IP)
  login:普通使用者登入  //telnet不允許root管理員使用者直接登入,但普通使用者登入後可以切換到root使用者:su -
  # su - //切換到root使用者
SSH協議版本:
v1:基於CRC-32做MAC(訊息認證碼),這種機制不安全: 容易受到中間人(man-in-middle)攻擊
v2:雙方主機協議選擇安全的MAC方式一般用的是hmac演算法
  基於DH演算法做金鑰交換,基於RSA或DSA演算法實現身份認證
兩種方式的使用者登入認證:
  基於口令的認證:基於password認證
  基於金鑰的認證:基於key認證
OpenSSH:ssh協議的開源實現
  C/S架構:
    客戶端程式:ssh程式,還支援scp(遠端複製工具),sftp(ftp安全實現方案)
      windows客戶端也可以實現:xshell,putty,securecrt,sshsecureshellclient
    伺服器端:sshd (ssh dae)
  
  客戶端元件:
    主程式ssh,配置檔案:/etc/ssh/ssh_config
    ssh用法:
      格式:ssh [user@host [COMMAND]]  //省略user,如果是linux意為使用客戶端當前登入使用者去登入遠端伺服器,windows要輸入登入名

         ssh -l user host [COMMAND]
           -p port:遠端伺服器監聽的埠,預設是22  
           -X:支援x11轉發
           -Y:支援信任的x11轉發
    示例:
      1.登入遠端主機:# ssh [email protected]
      2.以某使用者身份登入遠端主機並執行命令:# ssh [email protected] 'ifoconfig'

    配置檔案:
      HOST PATTERN
        PARAMETER VALUE
    基於金鑰的方式認證:只輸入賬號進行登入
      客戶端生成一對金鑰,將公鑰上傳到要登入的遠端伺服器的對應使用者賬號的家目錄下,放在一個特定檔案中,這個特定檔案是使用者家目錄下的隱藏目錄:.ssh,
      .ssh一般會生成一個檔案:known_hosts,這個檔案沒有可以自己建一個,檔案中儲存對方的公鑰資訊
    [root@localhost .ssh]# cat known_hosts 
    192.168.0.200 ssh-rsa p/ooxusqcry7CUrB7qmBsbFsTc0/BI8TuP0zmL7wBaetJjX9jbbkGlEo+Z/2bJl3WRZSdP7qDYe+CYJQyk4eCyB+e3VuZtQnQ1T

       1.在客戶端生成金鑰對兒

         # ssh-keygen -t rsa [-P ''] [-f '/root/.ssh/id_rsa']

       2.將公鑰傳輸至遠端伺服器對應使用者的家目錄

         ssh-copy-id [-i [identity_file]] [user@machine]

         # ssh-copy-id -i .ssh/id_rsa.pub [email protected]

       3.測試

         客戶端:# ssh [email protected]  //不需要輸入密碼就可以遠端登入

    xshell實現:  

  工具 ->(新建使用者金鑰生成嚮導:金鑰型別:RSA,金鑰長度:2048),點選下一步 -> (金鑰名稱:id_rsa_2048,密碼:私鑰),點選下一步 -> 公鑰格式:SSH2-OpenSSH,點選儲存檔案,也可以直接複製 ->點選完成
  編輯對應使用者家目錄下的檔案:
  [root@localhost .ssh]# vi authorized_keys
  將複製的金鑰貼上到這個檔案中
  xshell客戶端再次遠端登入時,選擇public key,選擇剛才儲存的金鑰檔案,點選確定
scp:secure copy,跨主機的複製命令,能夠將檔案從一個主機複製到另一個主機,也可以將另一個主機上的檔案複製到本地主機。
工作模式:
  PULL:將另一個主機上的檔案複製到本地主機
  PUSH:將本機主機的檔案複製到另一個主機
用法:scp [options] SRC... DEST/
  存在兩種情形:
    PULL: scp [options][user@]host:PATH/TO/SOMEFILE /PATH/TO/SOMEWHERE
    push: scp [options] /PATH/FROM/SOMEFILE [user@host:/PATH/TO/SOMEWHERE]
      常用選項:
        -r:遞迴複製
        -p:保持原檔案的屬性資訊
        -q:靜默模式
        -P PORT:指明remote host的監聽埠
示例:
  PULL:# scp [email protected]:/etc/fstab /tmp/fstab.txt  //將192.168.2.10這臺主機上的/etc/fstab檔案複製到本地主機/tmp下名為fstab.txt檔案
  PUSH:# scp /etc/fstab [email protected]:/tmp/fstab.txt  //將本地主機上的/etc/fstab檔案複製到192.168.2.10這臺主機上的/tmp下名為fstab.txt檔案
sftp:依賴於ssh協議工作的ftp程式,整個資料傳輸都是加密的
  sftp [user@]host
  # sftp [email protected]  //可以以登入的使用者所擁有的的許可權訪問192.168.2.10主機上的檔案  
伺服器端:
  主程式:sshd,配置檔案:/etc/ssh/sshd_config 
  # rpm -q openssh  //確保openssh已經安裝,預設是已經安裝的
  # vim /etc/ssh/sshd_config
  常用引數:
    PORT 22022  //修改監聽埠
    listenAddress ip  //只監聽內網地址,而不要監聽外網地址
    PermitRootLogin yes  //允許root使用者遠端登入,預設是允許
    UseDNS yes  //dns反向解析,登入的時候有時會卡很長時間才會登入,如果關閉這個功能:UseDNS no

    限制可登陸使用者的方法:
      AllowGroups
      AllowUsers user1 user2 user3
        # vim /etc/ssh/sshd_config
        新增:
          AllowUsers root centos
        # tail /var/log/secure  //檢視日誌        
  示例:
    1.將/etc/ssh/sshd_config中PORT改為22022
    2.# systemctl restart sshd.service  //重啟服務
    3.# ssh [email protected] -p 22022  //遠端連線
ssh服務的最佳實踐:
  1.不要使用預設埠;
  2.禁止使用protoco version 1
  3.限制可登陸使用者
    # man sshd_config
      AllowGroups
      AllowUsers
  4.設定空閒會話超時時長
  5.利用防火牆設定ssh訪問策略
  6.僅監聽特定的IP地址
    ListenAddress
  7.基於口令認證時,使用強密碼策略
   # tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
  8.使用基於金鑰的認證
  9.禁止使用空密碼
  10.禁止root使用者直接登入
  11.限制ssh的訪問頻率和併發線上數
  12.做好日誌,經常分析
ssh協議的另一個實現: dropbear
  伺服器端:
  1.編譯安裝dropbear
    # yum groupinstall "Development Tools" "Server Platform Development" -y
    # tar xf dropbear-XXX.tar.bz2
    # cd dropbearXXX
    # ./configure
    # make PROGRAMS="dropbear scp dropbearkey dbclient"
    # make PROGRAMS="dropbear scp dropbearkey dbclient" install
    # cd /usr/local/sbin/
    # dropbear -h
    # make /etc/dropbear
    # dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
    # dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
    # dropbear -p :2202 -F -E  //執行dropbear服務,格式:dropbear -p [ip:]port -F -E,-p:指明監聽的地址和埠,-F:for background,-E:將所有的error錯誤日誌傳送到標準輸出
    # ss -tnl  //檢視2202埠是否被監聽
  客戶端:
    # ssh [email protected] -p 2202
    # dropbear -p :2202  //啟動服務自動監聽在後臺
    # dbclient [email protected]  //自己作為客戶端去連線其他主機