標籤:

初探SSH

最近在寫自動取網元log的腳本,有用到Paramiko庫,Paramiko是SSH的Python實現.SSH協議想必大部分玩通信的小夥伴都不陌生,那麼它究竟是什麼樣的一種協議呢?

The SSH protocol (also referred to as Secure Shell) is a method for secure remote login from one computer to another. It provides several alternative options for strong authentication, and it protects the communications security and integrity with strong encryption. It is a secure alternative to the non-protected login protocols (such as telnet, rlogin) and insecure file transfer methods (such as FTP).

簡單的來說SSH實際上一種用於加密登錄以及傳輸的協議而已。它有幾種典型應用:

  • 給用戶或者自動化進程提供安全接入。
  • 互動式或者自動的傳送文件。
  • 在遠端執行命令。
  • 管理網路架構和一些對業務至關重要的系統組件。

SSH以經典的client-server模式運行,我們以登錄遠端主機為例: 首先client向server發起連接請求。server接收後將自己的公鑰發還給client。 隨後clinet和server之間進行參數協商並建立加密信道。最後用戶就可以歡快的登錄遠端主機啦。

SSH的特色在於其安全性,那麼這個安全性是如何實現的呢?其中最經典的就是通過密碼(ssh1)和公鑰驗證機制(ssh2)來實現。使用密碼登錄很簡單,只是每次輸入密碼太過於麻煩了,而且存在著"中間人"攻擊的危險。 而"公鑰登錄"是什麼呢?,原理很簡單,就是用戶將自己的公鑰存儲到遠程主機上。登錄時,遠程主機會向用戶發送一段隨機字元串,用戶用自己的私鑰將其加密後,再發回主機。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。下面我來用網元演示一下。

首先我通過伺服器上的zone8 200.200.1.183去嘗試ssh遠程登錄德哥的linux主機:

22 z8-dell2018 /.ssh # ssh 200.200.2.2 The authenticity of host 200.200.2.2 (200.200.2.2) cant be established.RSA key fingerprint is 4e:f8:d9:8e:ae:5a:28:ec:45:1e:cd:1c:4f:8d:1c:48.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 200.200.2.2 (RSA) to the list of known hosts.root@200.200.2.2s password: Last login: Tue Jan 23 21:18:24 2018 from 172.18.100.200[root@nfv-cloud-2 ~]# exit

因為200.200.2.2這台主機不在我的know_host里,所以無法確認該主機的真實性,只知道它的公鑰指紋,問你還想繼續連接嗎?

所謂"公鑰指紋",是指公鑰長度較長(這裡採用RSA演算法,長達1024位),很難比對,所以對其進行MD5計算,將它變成一個128位的指紋。上例中是4e:f8:d9:8e:ae:5a:28:ec:45:1e:cd:1c:4f:8d:1c:48,再進行比較,就容易多了。

那麼用戶怎麼知道遠程主機的公鑰指紋應該是多少?其實沒有好辦法,也只有讓遠程主機必須在自己的網站上貼出公鑰指紋,以便用戶自行核對。

我們鍵入yes後,就是把這個host加入到.ssh/know_hosts裡面去,下次登錄就變成一個可信主機了。但是每次連接上去後,還是需要我們輸入密碼進行驗證。

為了省去輸入密碼的麻煩,我們可以切換成"公鑰登錄"的方式,首先在我的200.200.1.183上生成我的公鑰私鑰對。因為是solaris系統,需要鍵入類型參數。linux就不用。

42 z8-dell2018 /.ssh # ssh-keygen -t rsa -N ""Generating public/private rsa key pair.Enter file in which to save the key (//.ssh/id_rsa): Your identification has been saved in //.ssh/id_rsa.Your public key has been saved in //.ssh/id_rsa.pub.The key fingerprint is:9b:dc:32:30:bc:b5:b0:b7:68:17:be:02:72:3f:dc:b8 root@z8-dell201843 z8-dell2018 /.ssh # lsid_rsa id_rsa.pub known_hosts

在.ssh文件夾下生成了公鑰id_rsa.pub和私鑰id_rsa。為了實現免密登錄,我們要把自己的公鑰加入到遠端主機的authorized_keys的文件里。solaris不支持ssh-copy-id命令,用寫文件的方法把文件寫到遠端去。

51 z8-dell2018 /.ssh # ssh-copy-id root@200.200.2.2-bash: ssh-copy-id: command not found53 z8-dell2018 /.ssh # ssh root@200.200.2.2 mkdir -p .ssh && cat >>.ssh/authorized_keys<id_rsa.pub root@200.200.2.2s password: 54 z8-dell2018 /.ssh #

讓我們在遠端主機下的.ssh文件夾里看一下auth*文件:

[root@nfv-cloud-2 .ssh]# lsauthorized_keys id_rsa id_rsa.pub known_hosts[root@nfv-cloud-2 .ssh]# cat authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA3T8K+0Zx+F8z1NfiMVzC7yFk1UpRImbPKG1ZqN4phSEuxyt3H5eYQS8CmHrh6cVz803Mss/l37e3MLWCV8k5aHLUkDa+3dPOWj93Q3HzqjCG/fohTKQkrpxMLpYoM8rEMsDvwR0gTDeixOnR19lFxJuaegDFuF9qb+6Wwc6svm0= root@z8-dell201860 z8-dell2018 /.ssh # cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA3T8K+0Zx+F8z1NfiMVzC7yFk1UpRImbPKG1ZqN4phSEuxyt3H5eYQS8CmHrh6cVz803Mss/l37e3MLWCV8k5aHLUkDa+3dPOWj93Q3HzqjCG/fohTKQkrpxMLpYoM8rEMsDvwR0gTDeixOnR19lFxJuaegDFuF9qb+6Wwc6svm0= root@z8-dell2018

200.200.1.183的公鑰已經被加入到了這個文件中去了。看下是否可以不用再輸密碼了:

56 z8-dell2018 /.ssh # ssh 200.200.2.2Last failed login: Thu Jan 25 12:48:51 IST 2018 from 200.200.1.183 on ssh:nottyThere was 1 failed login attempt since the last successful login.Last login: Wed Jan 24 20:39:04 2018 from 172.18.98.99[root@nfv-cloud-2 ~]#

成功了,媽媽再也不用擔心我忘記密碼了。

ssh命令的作用不止是在登錄遠端網元,上面我們就用到過通過ssh在遠端執行命令。比如你想在伺服器上看每個網元的rcpd進程如何,你可以簡單的傳入這樣的命令:

[root@nfv-cloud-2 .ssh]# ssh root@200.200.121.8 ps -ef|grep rcpdWarning: Permanently added 200.200.121.8 (RSA) to the list of known hosts.root 1070 1063 5 Jan23 ? 02:21:16 ./rcpdroot 3073 3069 0 12:12 ? 00:00:00 sh -c ps -ef|grep rcpdroot 3075 3073 0 12:12 ? 00:00:00 grep rcpd

是不是很方便。

還有通過它很方便的來傳文件:

$ ssh root@200.200.121.8 tar cz /sdlog | tar xzv

這樣就把遠端主機里的sdlog文件夾全部運送到了本地。當然了,如果你想,你也可以傳文件過去:

$ cd && tar czv /sdboot/up/* | ssh root@169.254.1.3 tar xz

這樣就把主用MCP的版本文件放到了備用MCP的相應位置。

ssh還有其它一些應用場景。 sftp就是根據ssh來實現的一種加密傳輸,也就是用ssh進行ftp傳輸。 有時我們還可以將它綁定到埠上去。但這裡我用的不多,可以移步阮大大的blog: SSH原理與運用(二):遠程操作與埠轉發。

推薦閱讀:

玩轉SSH埠轉發
使用SSH命令行傳輸文件到遠程伺服器
網路設備OpenSSH7.0兼容性測試報告
用 Mac OS X 自帶的 SSH 登陸 Linux 後出現中文亂碼,如何解決?

TAG:SSH |