認識ssh


注:以下是Unix-like的相關操作  Windows 並沒有 ssh 的客戶端程序,因此所有的程序windows都得要下載其他第三方軟件才行

主要有 pietty, psftp 及 filezilla 等

putty/pscp/psftp 他們分別對應了 ssh/scp/sftp  Windows的相關軟件操作 不做介紹


SSH 協議,在預設的狀態中,本身就提供兩個服務器功能:

    1. 一個就是類似 telnet 的遠程聯機使用 shell 的服務器,亦即是俗稱的 ssh ;

    2. 另一個就是類似 FTP 服務的 sftp-server !提供更安全的 FTP 服務。


非對稱密鑰系統

    透過兩把不一樣的公鑰與私鑰來進行加密與解密的過程

    公鑰 (public key):提供給遠程主機進行數據加密的行爲,也就是說,大家都能取得你的公鑰來將數據加密的意思;

    私鑰 (private key):遠程主機使用你的公鑰加密的數據,在本地端就能夠使用私鑰來進行解密。私鑰是不能夠外流的!只能保護在自己的主機上。

    目前在 SSH 使用上,主要是利用 RSA/DSA/Diffie-Hellman 等機制喔!


ssh聯機過程

    1. 服務器建立公鑰文件: 

        每一次啓動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的文件, sshd 會主動去計算出這些需要的公鑰文件,和主機自己需要的私鑰文件

        重裝系統也會執行以上操作

    2. 客戶端主動聯機要求: 

        若客戶端想要聯機到 ssh 服務器,則需要使用適當的客戶端程序來聯機,包括 ssh, pietty 等客戶端程序;

    3. 服務器傳送公鑰給客戶端

        接收到客戶端的聯機要求後,服務器便將第一個步驟取得的公鑰傳送給客戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的!);

    4. 客戶端記錄/比對服務器的公鑰數據及隨機計算自己的公私鑰: 

        client第一次聯機會把server的公鑰文件記錄到用戶家目錄內的 ~/.ssh/known_hosts 。

        若已經記錄過了,則客戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰數據, 則開始計算客戶端自己的公私鑰數據;

        密鑰是隨機運算產生於每次聯機當中

    5. 回傳客戶端的公鑰數據到服務器端: 

        用戶將自己的公鑰傳送給服務器。

        此時服務器:『具有服務器的私鑰與客戶端的公鑰』,

        客戶端則是: 『具有服務器的公鑰以及客戶端自己的私鑰』

        在此次聯機的服務器與客戶端的密鑰系統 (公鑰+私鑰) 並不一樣,所以才稱爲非對稱式密鑰系統

    6. 開始雙向加解密

        (1)服務器到客戶端:服務器傳送數據時,拿用戶的公鑰加密後送出。客戶端接收後,用自己的私鑰解密;

        (2)客戶端到服務器:客戶端傳送數據時,拿服務器的公鑰加密後送出。服務器接收後,用服務器的私鑰解密。


啓動ssh服務

Unix-like 系統當中,默認就已經含有 SSH 的所有需要的軟件了!其中包含了

可以產生密碼等協議的LinuxOpenSSL軟件和OpenSSH軟件

服務端直接啓動就是以 SSH daemon ,簡稱爲 sshd 來啓動

    [root@www ~]# /etc/init.d/sshd restart

    [root@www ~]# netstat -tlnp | grep ssh

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name

    tcp        0      0 :::22          :::*             LISTEN  1539/sshd


客戶端連接服務器 使用ssh指令

    [root@www ~]# ssh [-f] [-o 參數項目] [-p 非正規埠口] [賬號@]IP [指令]

    選項與參數:

    -f :需要配合後面的 [指令] ,不登入遠程主機直接發送一個指令過去而已;

    -o 參數項目:主要的參數項目有:

    ConnectTimeout=秒數 :聯機等待的秒數,減少等待的時間

    StrictHostKeyChecking=[yes|no|ask]:預設是 ask,若要讓 public key

          主動加入 known_hosts ,則可以設定爲 no 即可。

    -p :如果你的 sshd 服務啓動在非正規的埠口 (22),需使用此項目;

    [指令] :不登入遠程主機,直接發送指令過去。但與 -f 意義不太相同。


ssh 192.168.129.158                                                                                                                                                                                         1

The authenticity of host '192.168.129.158 (192.168.129.158)' can't be established.

RSA key fingerprint is b5:49:85:1e:6d:0d:81:2d:2d:ef:30:12:cd:36:0d:fe. 這一行後邊的就是遠程服務器的公鑰指紋碼

Are you sure you want to continue connecting (yes/no)? yes 輸入 yes 將指紋碼寫入本地公鑰記錄文件 (~/.ssh/known_hosts)

Warning: Permanently added '192.168.129.158' (RSA) to the list of known hosts. 加入之後未來比對該服務器的正確性之用


    登陸服務器執行指令之後立刻離開 常用在需要關閉遠程服務器時使用

    [Jade@localhost-3:~]  ssh -f  [email protected] find / &> ~/find1.log

    [email protected]'s password:


    聯機時自動在本地添加公鑰 寫程序腳本需要連接多臺主機時比較有用

    [Jade@localhost-3:~]ssh -o StrictHostKeyChecking=no [email protected]                                                                                                                                                

    Warning: Permanently added '192.168.129.158' (RSA) to the list of known hosts.

    [email protected]'s password:


如果服務器的ssh公鑰變化(比如刪除了服務器/etc/ssh/ssh_host_*文件 或重裝系統後)那麼客戶端ssh聯機時就會報錯

因爲本地存儲的公鑰(~/.ssh/know_host中對應ip後的數據)和服務器的公鑰不同造成 此時只要刪除本地know_host對應ip的行 重新連接寫入即可

[Jade@localhost-3:~/shell] ssh [email protected]                                                                                                                                                                            

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

46:69:89:d8:b7:e1:28:49:ac:4f:92:fd:8e:2d:a2:05.

Please contact your system administrator.

Add correct host key in /Users/Jade/.ssh/known_hosts to get rid of this message.

Offending RSA key in /Users/Jade/.ssh/known_hosts:42

RSA host key for 192.168.129.158 has changed and you have requested strict checking.

Host key verification failed.


sftp:使用ssh的通道(part22)模擬FTP的文件上傳與下載

[Jade@localhost-3:~] sftp [email protected]

[email protected]'s password:

Connected to 192.168.129.158.

sftp> 這裏即可輸入ftp相關的指令

針對遠方服務器主機 (Server) 之行爲
變換目錄到 /etc/test 或其他目錄cd /etc/test
cd PATH
列出目前所在目錄下的文件名ls
dir
建立目錄mkdir directory
刪除目錄rmdir directory
顯示目前所在的目錄pwd
更改檔案或目錄羣組chgrp groupname PATH
更改檔案或目錄擁有者chown username PATH
更改檔案或目錄的權限chmod 644 PATH
其中,644 與權限有關!回去看基礎篇!
建立連結檔ln oldname newname
刪除檔案或目錄rm PATH
更改檔案或目錄名稱rename oldname newname
離開遠程主機exit (or) bye (or) quit
針對本機 (Client) 之行爲(都加上 l, L 的小寫 )
變換目錄到本機的 PATH 當中lcd PATH
列出目前本機所在目錄下的文件名lls
在本機建立目錄lmkdir
顯示目前所在的本機目錄lpwd
針對資料上傳/下載的行爲
將檔案由本機上傳到遠程主機put [本機目錄或檔案] [遠程]
put [本機目錄或檔案]
如果是這種格式,則檔案會放置到目前遠程主機的目錄下!
將檔案由遠程主機下載回來get [遠程主機目錄或檔案] [本機]
get [遠程主機目錄或檔案]
若是這種格式,則檔案會放置在目前本機所在的目錄當中!可以使用通配符,例如:
get *
get *.rpm
亦是可以的格式!


注意上傳文件夾的話需要OpenSSH 5.4即以上


scp:異地直接複製

[root@www ~]# scp [-pr] [-l 速率] file  [賬號@]主機:目錄名 <==上傳

[root@www ~]# scp [-pr] [-l 速率] [賬號@]主機:file  目錄名 <==下載

選項與參數:

-p :保留原本檔案的權限數據;

-r :複製來源爲目錄時,可以複製整個目錄 (含子目錄)

-l :可以限制傳輸的速度,單位爲 Kbits/s ,例如 [-l 800] 代表傳輸速限 100Kbytes/s


將本地的shell目錄 保留原本文件權限數據 複製到遠程主機~/目錄下

[Jade@localhost-3:~] scp -pr shell [email protected]:~/

[email protected]'s password:

將遠程文件複製到本地

[Jade@localhost-3:~] scp [email protected]:~/top.txt ./

[email protected]'s password:

top.txt



sshd服務器詳細設定

[root@bird ~]# vim /etc/ssh/sshd_config

只要是預設有出現且被批註的(#)設定值爲默認值

通常只是設置不允許root的ssh登錄 ssh的版本設爲V2 其餘默認已經很好

wKiom1g1TmnjO5OMAAQXAWuuG_c313.png-wh_50

wKiom1g1TmuCZgdmAAO7RqJ0N4w355.png-wh_50

wKioL1g1Tm3jSupCAAQ_WQTT_lI345.png-wh_50

wKiom1g1Tm3QzBzNAACkD0Y5j3E975.png-wh_50

製作不用密碼立即登入的ssh用戶

    1. 客戶端建立兩把鑰匙:利用的指令爲 ssh-keygen 這個命令;

    2. 客戶端放置好私鑰文件:將 Private Key 放在 Client 上面的家目錄,亦即 $HOME/.ssh/ , 並且得要注意權限喔!

    3. 將公鑰放置服務器端的正確目錄與文件名去:

        最後,將那把 Public Key 放在任何一個你想要用來登入的服務器端的某 User 的家目錄內之 .ssh/ 裏面的認證文件即可完成整個程序。

爲jade用戶(新創建的)設置ssh的無需密碼登錄服務器

    client操作

jade用戶創建密鑰文件

bash-3.2$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/Users/jade/.ssh/id_rsa):

Created directory '/Users/jade/.ssh'.

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /Users/jade/.ssh/id_rsa.

Your public key has been saved in /Users/jade/.ssh/id_rsa.pub.

The key fingerprint is:

94:6b:ad:7b:b5:77:0d:b1:fc:f3:34:77:18:23:53:cb [email protected]


注意目錄和兩個密鑰文件的權限設定

bash-3.2$ ls -ld .ssh/; ls -l .ssh/

drwx------  4 jade  staff  136 11 23 14:32 .ssh/

total 16

-rw-------  1 jade  staff  1675 11 23 14:32 id_rsa

-rw-r--r--  1 jade  staff   404 11 23 14:32 id_rsa.pub


將公鑰上傳到服務器的用戶家目錄

bash-3.2$ scp ~/.ssh/id_rsa.pub [email protected]:~


    server操作

/home/wanjiadi/下如果沒有.ssh目錄 手動創建 注意權限

[jade@bird ~]# mkdir .ssh;chmod 700 .ssh

將client端上傳的公鑰使用cat 新增到authorized_keys中

[jade@bird ~]# cat id_rsa.pub >> .ssh/authorized_keys

[jade@bird ~]# chmod 644 .ssh/authorized_keys

[jade@bird ~]# ls -l .ssh

-rw-r--r--. 1 jade jade 404 11月 23 18:34 authorized_keys


當你還想要登入其他的主機時,只要將你的 public key copy 到其他主機上面去,並且新增到某賬號的 ~/.ssh/authorized_keys 這個文件中即可


建議安全設定

其實sshd的數據是加密的 所以在Internet上面傳遞時比較安全 至於sshd服務本身並不是那麼安全 安全設定建議 以下三條

服務器軟件本身的設定強化:/etc/ssh/sshd_config

# 修改 sshd_config 並且重新啓動 sshd !

[root@www ~]# vim /etc/ssh/sshd_config

PermitRootLogin no  <==約在第 39 行,請拿掉批註且修改成這樣

DenyGroups  nossh   <==底下這兩行可以加在檔案的最後面

DenyUsers   testssh


TCP wrapper 的使用:/etc/hosts.allow, /etc/hosts.deny

[root@www ~]# vim /etc/hosts.allow

sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0


[root@www ~]# vim /etc/hosts.deny

sshd : ALL


iptables 的使用: iptables.rule, iptables.allow

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow

iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule


ssh進階應用


非22端口啓動ssh服務

    很多 cracker 會使用掃描程序亂掃整個 Internet 的端口漏洞,這個 port 22 就是一個很常被掃描的端口

[root@www ~]# vim /etc/ssh/sshd_config
Port 4444
Port 4445  <==注意喔!要有兩個 Port 的設定才行!
[root@www ~]# /etc/init.d/sshd restart

centos6.7直接就可以使用了 老版本可能會出現SELinux的錯誤 必須自行定一個SELinux的規則放行模塊才行

# 1. 於 /var/log/audit/audit.log 找出與 ssh 有關的 AVC 信息,並轉爲本地模塊

[root@www ~]# cat /var/log/audit/audit.log | grep AVC | grep ssh |
\>  audit2allow -m sshlocal > sshlocal.te
 <==擴展名要是 .te 才行

[root@www ~]# grep sshd_t /var/log/audit/audit.log |
\>  audit2allow -M sshlocal
 <==sshlocal 就是剛剛建立的 .te 文件名

******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i sshlocal.pp   <==這個指令會編譯出這個重要的 .pp 模塊!

# 2. 將這個模塊加載系統的 SELinux 管理當中!
[root@www ~]# semodule -i sshlocal.pp

#3. 再重新啓動 sshd 並且觀察埠口吧!
[root@www ~]# /etc/init.d/sshd restart
[root@www ~]# netstat -tlunp | grep ssh
tcp        0      0 0.0.0.0:4444   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 0.0.0.0:4445   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 :::4444       :::*         LISTEN      7322/sshd
tcp        0      0 :::4445       :::*         LISTEN      7322/sshd


聯機方式指定端口

[Jade@localhost-3:~] ssh [email protected] -p4444

查看端口使用情況

[root@bird ~]# netstat -tnp | grep 4444
tcp        0      0 192.168.129.158:
4444     192.168.129.174:49988       ESTABLISHED 15879/sshd

rsync進行同步鏡像備份

    見rsync篇筆記





















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