安全加密之--openssh

時間:2018.1.10
作者:李強
參考:man,info,magedu講義,萬能的internet
實驗環境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4
聲明:以下英文純屬個人翻譯,英文B級,歡迎糾正,以下內容純屬個人理解,並沒有對錯,只是參考,盜版不糾,纔能有限,希望不誤人子弟爲好。

1、OPENSSH

[http://www.openssh.com/portable.html]

OPENSSH是一個歷史悠久的工具,BSD的。用來實現ssh協議的一個工具,目前的ssh主版本爲V2
主要的軟件包有:
openssh(要這個軟件包生效,要安裝下面的2個軟件包)
openssh-server
openssh-clients

配置文件:

/etc/ssh目錄

二進制文件:

  • opensclient

/usr/bin/ssh|scp|slogin|ssh-agen|ssh-add|ssh-keygen|ssh-copy-in|sftp

  • openserver

/usr/bin/sshd|sshd-keygen

幫助文件:

具體查看man ssh|sshd|ssh_config|sshd_config等。

ssh

ssh 用來安全的登錄遠程主機使用的工具(OPENSSH SSH Client)

語法:
  ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char]
         [-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
         [-O ctl_cmd] [-o option] [-p port] [-Q cipher | cipher-auth | mac | kex | key] [-R [bind_address:]port:host:hostport]
         [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [user@]hostname [command]
描述:
ssh(SSH client)是一個登錄遠程主機並在遠程主機上執行命令的工具。
它是用來取代rlogin和rsh,爲2個不可信的主機在不安全的網絡上之間建立一個安全的加密的連接。
X11連接和任意的TCP端口都能轉發在此安全的通道上。這就是下面的講的靜態端口轉發和動態端口轉發。
選項 說明
-1,2;-4,6 1和2是強制指定用ssh協議的哪個版本,4,6是強制指定ipv4還是ipv6地址,默認版本2,ipv4
-b bind_address 綁定使用本地主機哪個地址作爲建立連接源ip,僅在設備有多個地址時考慮使用
-c cipher_spec 選擇用戶加密會話的加密規範,默認是3des,man ssh_config 查關鍵字Ciphers有詳細信息
-e
-F configfile 指定配置文件,如果在命令行指定了配置文件,那麼全局配置文件就會被忽略,默認個人配置文件爲~/.ssh/config,沒有建立
-l login_name 指定登錄遠程主機的用戶名,默認爲當前客戶端終端用戶名
-p port 指定要連接遠程主機的哪個接口
-v verbose mode ,打印關於程序的排除故障信息,主要用來排除連接,驗證,配置文件的問題,可以多個v,比如-vv,-vvv,最多三個,一個比一個詳細
-X,x X11 開啓X11轉發和關閉X11轉發
-n null 將標準輸入重定向到/dev/null ,也就是把保準輸入都丟給垃圾桶不處理。後面加& 就是後臺執行不接收標準輸入。參考-f選項

例子:

ssh 127.0.0.1 //這是最簡單的命令,用戶名默認當前主機名,端口默認爲22

ssh [email protected] -p 9527 //指定登錄用戶名爲root,訪問端口爲9527

ssh -l root -p 9527 127.0.0.1 //同上

ssh 127.0.0.1 cat /etc/passwd //登錄後執行cat /etc/passwd命令即退出

  • 基於用戶密碼的驗證

服務器端會將/etc/ssh/sshhost*_key.pub中的公鑰傳給客戶端(選哪個公鑰看協商的加密算法是哪個),客戶端選擇yes/no保存到~/.ssh/know_hosts
然後客戶端用基於服務器端的公鑰進行數據加密,進行用戶名和密碼校驗,通過後,登錄成功。

  • 基於key的驗證

正常情況下,我們只需要信任服務器即可,但是現在我們要相互信任,就不要對暗號了。
所以clinet生成密鑰對,server器本身就有密鑰對,現在我們收到了服務器的公鑰,此時我們把自己的公鑰傳給服務器,服務器將其放在~/.ssh/authorized_keys中,以後我們用不同用戶登錄server的時候,服務器就去響應的用戶下找這個文件,然後取出它的公鑰來加密一個隨機數,client通過自己的私鑰解密報文得到隨機數,然後通過服務器的公鑰加密,server通過自己的私鑰解密後,將此隨機數和自己的隨機數對比,如果一致,則允許登錄。

ssh-keygen //生成密鑰對
ssh-keygen -p //加密私鑰
ssh-copy-id //把公鑰複製給遠程主機


graph LR

A[client]-->|1:客戶端發起請求|B[server]

A[client]-->|2:服務器查找公鑰並加密隨機數|B[server]

A[client]-->|3:客戶端私鑰解密,用服務器公鑰加密隨機數|B[server]

A[client]-->|4:服務器用私鑰解密,對比2個隨機數|B[server]

ssh靜態端口轉發

端口轉發就是隧道tunnel,ssh監聽需要走隧道的端口,然後數據從ssh tunnel走。

舉例比如http服務,如果在瀏覽器中配置socket代理,那麼當你發起http請求的時候,將數據轉發給你ssh指定監聽的本地端口,比如1080,當1080收到來自http的數
據,然後會丟給ssh處理,ssh會將http的數據封裝在ssh報文中,在ssh client和ssh server之間建立的連接中傳遞,然後ssh接收到這個報文解密後,轉發此報文。
ssh server就是個代理的中轉站。

端口轉發兩大功能:

加密client和server之間的通訊數據,一些telnet,ftp,http等明文傳輸的數據,可以封裝在ssh協議的的載荷中。

能夠突破防火牆的限制,建立一些無法建立的TCP連接。

  • 選項

    -L  local_socket:remote_socket  :指定本地ip和端口和對端ip和端口,ssh就會開一個本地端口來監聽,當收到訪問此端口的數據就通過隧道轉發給ssh server,然後ssh server和remote_socket建立鏈接。
    -R  remote_socket:local_socket  :指定對端ip和端口和本地ip和端口,
  • 例子

ssh -L 127.0.0.1:9527:192.168.23.71:23
telnet 127.0.0.1 9527

graph LR
A[A主機]-->|A能ssh到B|C[B主機]
A[A主機]-->|A想telnet到C|D[C主機]
A[A主機]-->|禁止telnet訪問|B[防火牆]
B[防火牆]-->C[B主機]
C[B主機]-->|B能telnet到C|D[C主機]

現在A想要telnet訪問C主機,但是C主機上拒絕了A的訪問,怎麼辦呢,這裏就可以用到ssh端口轉發的第二個功能,突破防火牆的限制,建立一些無法建立的連接

ssh動態端口轉發

  • 選項

    -D [bind_address:]port:指定一個本地端口,然後ssh將做爲一個socket服務器,支持sockets4和sockets5兩種協議,這裏就不需要指定http要訪問的哪些網站的地址和端口,動態的從http請求裏獲取,然後ssh server解密後,代理其轉發出去。
  • 例子

![這裏本來是要插入下,當我本地通過瀏覽器的socket代理訪問網頁時,在ssh server 產生的一些的,server 去和remote_socket建立的TCP鏈接,makedown語法不會]

配合端口轉發使用的選項

  • 選項
-N: 指定不執行遠程命令,就是不打開遠程的bash窗口,僅對端口轉發有效
-f:指定ssh後臺啓用,

ssh 和sshd 配置文件

  • ssh
/etc/ssh/ssh_config    //
~/.ssh/config         //
~/.ssh/know_hosts
  • sshd
/etc/ssh/sshd_config
/etc/ssh/shots.equiv
/etc/ssh/ssh_known_hosts
~/.ssh/authorized_keys

安全日誌信息

tail -f /var/log/secure

scp

scp 用來遠程主機和本地主機之間的文件複製,但是有個問題就是scp並不檢查文件是否變化,因此會產生不必要的帶寬浪費,

  • 語法:
     scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program]
         [[user@]host1:]file1 ... [[user@]host2:]file2
  • 描述:

scp 基於ssh的一個遠程主機之間的文件複製。看上面的格式也可以看出來,用戶名可以不寫,默認是當前用戶,主機名或ip地址可以不寫默認自己,文件名必須要寫。主機名後面必須要加上:後面的文件名其實也可以不用寫,默認是登陸用戶的家目錄。但是源文件總是要☞的。

  • 選項
-q:quit,靜默不顯示
-r:Recursively,遞歸,默認只能複製普通文件,如果想要複製目錄需要加-r選項,注意的是這裏針對軟連接複製過來的內容是軟連接的源文件而不是源文件本身
-p:Preserves,保存文件的權限,修改時間和訪問時間
-P:Port ,這裏注意的是,因爲-p給preserves用了,因此指定遠程主機端口用大寫的-P
  • 例子

本地到遠程

scp /etc host2:file

遠程到本地

scp host2:file /etc

遠程到遠程

scp host1:file1 host1:file2 host2:/tmp

rsync

rsync 這個工具就解決了scp的問題,它主要用於主機之前的文件同步,如果文件屬性沒有變化,就不會同步。這樣我想到了雲盤的自動同步功能。

rsync 是由單獨的軟件包rsync提供的和openssh沒有關係,但是它是承載在remote shell鏈接上的,默認是ssh,可以-e指定rsh等。

rsync 是個服務,getent services rsync 用873/tcp

rsync是非獨立服務,需要安裝xinetd軟件包由xinetd服務代理。默認是關閉狀態,不使用rsync daemon模式。

配置文件爲/etc/rsyncd.conf

  • 用法
       Local:  rsync [OPTION...] SRC... [DEST]

       Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

       Access via rsync daemon:
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

       Usages with just one SRC arg and no DEST arg will list the source files instead of copying.
  • 描述

rsync 不支持2個遠程主機之間的文件複製,src和dest都必須要有安裝rsync

rsync 有2中傳輸模式,一種是通過remote shell(ssh或者rsh);一種是通過TCP直接鏈接到rsync daemon。如上所示,remote ssh 主機後爲":"而daemon 主機後爲"::"

  • 選項

    -a:--archive 歸檔
    -b:--backup 備份
    -r:--recursive 遞歸
    -n:--dry-run 模擬
    -v:--verbose 顯示過程
    -p:--perms 保留權限
    -t:--times 保留時間戳
    -g:--group 保留所有組
    -o:--owner 保留所有者
    -l:--links 只複製軟鏈接本身
    -L:複製軟鏈接的源,
  • 注意

    複製文件時的格式如果最後爲/,比如/etc/代表複製目錄,/etc就是文件的意思
    總之你能想到的cp之間那些事情,基本上rsync也能幹,具體的man rsync

  • 例子

sftp

sftp 這個工具是基於ssh實現的ftp工具,也就是ssh轉發了ftp包,sftp用法和ftp基本一樣。其是一個交互式命令。

  • 用法
     sftp [-1Cv] [-B buffer_size] [-b batchfile] [-F ssh_config] [-o ssh_option] [-P sftp_server_path]
          [-R num_requests] [-S program] [-s subsystem | sftp_server] host
     sftp [user@]host[:file ...]
     sftp [user@]host[:dir[/]]
     sftp -b batchfile [user@]host
  • 描述

  • 選項
-b:batchfile ,直接執行file裏的命令而不是通過交互式讀取stdin,有些命令執行失敗會中斷sftp,可以在命令前加dash,如-get xxxx
  • 交互式命令

登錄後輸入?或help即可知

2、pssh軟件包

[http://code.google.com/p/parallel-ssh/]

pssh這個是用python編寫的基於ssh和scp的並行工具軟件包。
parellels
配置文件

庫文件

/usr/lib/python2.7/site-packages/psshlib 目錄下

二進制文件

/usr/bin/pssh|pscp.pssh|pnuke|pslurp|prsync

幫助文件

man pssh|pscp.pssh|pnuke|pslurp|prsync

pssh

  • 用法
       pssh  [-vAiIP]  [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout]
       [-O options] [-x args] [-X arg] command ...

       pssh -I [-vAiIP] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir]  [-t  time-
       out] [-O options] [-x args] [-X arg] [command ...]
  • 描述

parallels ssh program,在多個主機上並行執行ssh的一個工具。pssh有2個變量需要發給遠程主機,因此遠程主機的sshd_config配置文件中必須要有如下配置:

AcceptEnv PSSH_NODENUM PSSH_HOST

PSSH_NODENUM 表示每個ssh會話的編號從0開始,PSSH_HOST 表示host列表中的主機名

  • 選項

    -H:--host host_string 主機少的時候用"" 空格隔開多個主機 如host1 ,"host1 host2 host3"
    -h:--hosts host_file  主機多的時候,放置在hostfile文件中 格式如上:user@host:port
    -i:--inline 當每個主機命令完成後,顯示stdout和stderr
    -o:--outdir 標準輸出的存放目錄,文件按照指定的host_socket命名
    -e: --errdir 標準錯誤輸出的存放目錄,文件按照指定的host_socket命名
    -p: --print 顯示輸出,功能有限,多個主機輸出會交錯
    更多詳情man pssh
  • 例子

pssh -i -H "192.168.23.61 192.168.23.71" cd /home;pwd;ls

pssh -H 192.168.23.71 -o /tmp/stdout -e /tmp/stderr hostnamectl

pscp.pssh

pscp.pssh 用於並行將本地文件複製到遠程主機

  • 用法
       pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O
       options] [-x args] [-X arg] local remote
  • 描述

將本地的local文件複製到多臺主機上,命名爲remote

  • 選項
    -a:--archive 歸檔,保留一些屬性
    -r:--recurvise 遞歸,複製目錄時使用

pslurp

pslurp 用於並行複製遠程主機文件到本地

  • 用法
       pslurp  [-vAr]  [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout]
       [-O options] [-x args] [-X arg] [-L localdir] remote local
  • 描述

將遠程多臺主機上的remote文件複製到本地,命名爲local

  • 選項
    -L:指定從遠程主機下載到本機的存儲的目錄
    -r:遞歸複製目錄

prsync

  • 用法
  • 描述

和pscp一樣的用法,和rsync一樣的特性,不同的是並行在多臺主機上執行

  • 選項
    -a:--archive 歸檔模式
    -r:--recursive 遞歸

3、dropbear

dropbear 是ssh的另一種實現,因爲其體積小,功能簡單因此常用於嵌入設備中。

編譯dropbear

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