---------- 20190617 ref: http://linux.vbird.org/linux_server/0310telnetssh.php SSH 的連線行為簡介 我們可以將 ssh 伺服器端與用戶端的連線步驟示意為下圖,至於步驟說明如後: 圖 11.2-2、ssh 伺服器端與用戶端的連線步驟示意圖 1. 伺服器建立公鑰檔: 每一次啟動 sshd 服務時,該服務會主動去找 /etc/ssh/ssh_host* 的檔案,若系統剛剛安裝完成時,由於沒有這些公鑰檔案,因此 sshd 會主動去計算出這些需要的公鑰檔案,同時也會計算出伺服器自己需要的私鑰檔; 2. 用戶端主動連線要求: 若用戶端想要連線到 ssh 伺服器,則需要使用適當的用戶端程式來連線,包括 ssh, pietty 等用戶端程式; 3. 伺服器傳送公鑰檔給用戶端: 接收到用戶端的要求後,伺服器便將第一個步驟取得的公鑰檔案傳送給用戶端使用 (此時應是明碼傳送,反正公鑰本來就是給大家使用的!); 4. 用戶端記錄/比對伺服器的公鑰資料及隨機計算自己的公私鑰: 若用戶端第一次連接到此伺服器,則會將伺服器的公鑰資料記錄到用戶端的使用者家目錄內的 ~/.ssh/known_hosts 。若是已經記錄過該伺服器的公鑰資料,則用戶端會去比對此次接收到的與之前的記錄是否有差異。若接受此公鑰資料, 則開始計算用戶端自己的公私鑰資料; 5. 回傳用戶端的公鑰資料到伺服器端: 用戶將自己的公鑰傳送給伺服器。此時伺服器:『具有伺服器的私鑰與用戶端的公鑰』,而用戶端則是: 『具有伺服器的公鑰以及用戶端自己的私鑰』,你會看到,在此次連線的伺服器與用戶端的金鑰系統 (公鑰+私鑰) 並不一樣,所以才稱為非對稱式金鑰系統喔。 6. 開始雙向加解密: (1)伺服器到用戶端:伺服器傳送資料時,拿用戶的公鑰加密後送出。用戶端接收後,用自己的私鑰解密; (2)用戶端到伺服器:用戶端傳送資料時,拿伺服器的公鑰加密後送出。伺服器接收後,用伺服器的私鑰解密。 在上述的第 4 步驟中,用戶端的金鑰是隨機運算產生於本次連線當中的,所以你這次的連線與下次的連線的金鑰可能就會不一樣啦! 此外在用戶端的使用者家目錄下的 ~/.ssh/known_hosts 會記錄曾經連線過的主機的 public key ,用以確認我們是連接上正確的那部伺服器。 例題: 如何產生新的伺服器端的 ssh 公鑰與伺服器自己使用的成對私鑰? (註:注意,本例題不要在已經正常運作的網路伺服器上面,因為可能會造成其他用戶端的困擾!) 答: 由於伺服器提供的公鑰與自己的私鑰都放置於 /etc/ssh/ssh_host* ,因此你可以這樣做: [root@www ~]# rm /etc/ssh/ssh_host* <==刪除金鑰檔 [root@www ~]# /etc/init.d/sshd restart 正在停止 sshd: [ 確定 ] 正在產生 SSH1 RSA 主機金鑰: [ 確定 ] <==底下三個步驟重新產生金鑰! 正在產生 SSH2 RSA 主機金鑰: [ 確定 ] 正在產生 SSH2 DSA 主機金鑰: [ 確定 ] 正在啟動 sshd: [ 確定 ] [root@www ~]# date; ll /etc/ssh/ssh_host* Mon Jul 25 11:36:12 CST 2011 -rw-------. 1 root root 668 Jul 25 11:35 /etc/ssh/ssh_host_dsa_key -rw-r--r--. 1 root root 590 Jul 25 11:35 /etc/ssh/ssh_host_dsa_key.pub -rw-------. 1 root root 963 Jul 25 11:35 /etc/ssh/ssh_host_key -rw-r--r--. 1 root root 627 Jul 25 11:35 /etc/ssh/ssh_host_key.pub -rw-------. 1 root root 1675 Jul 25 11:35 /etc/ssh/ssh_host_rsa_key -rw-r--r--. 1 root root 382 Jul 25 11:35 /etc/ssh/ssh_host_rsa_key.pub # 看一下上面輸出的日期與檔案的建立時間,剛剛建立的新公鑰、私鑰系統! 啟動 SSH 服務 [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 [root@www ~]# ssh [-f] [-o 參數項目] [-p 非正規埠口] [帳號@]IP [指令] 選項與參數: -f :需要配合後面的 [指令] ,不登入遠端主機直接發送一個指令過去而已; -o 參數項目:主要的參數項目有: ConnectTimeout=秒數 :連線等待的秒數,減少等待的時間 StrictHostKeyChecking=[yes|no|ask]:預設是 ask,若要讓 public key 主動加入 known_hosts ,則可以設定為 no 即可。 -p :如果你的 sshd 服務啟動在非正規的埠口 (22),需使用此項目; [指令] :不登入遠端主機,直接發送指令過去。但與 -f 意義不太相同。 # 1. 直接連線登入到對方主機的方法 (以登入本機為例): [root@www ~]# ssh 127.0.0.1 The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. RSA key fingerprint is eb:12:07:84:b9:3b:3f:e4:ad:ba:f1:85:41:fc:18:3b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts. root@127.0.0.1's password: <==在這裡輸入 root 的密碼即可! Last login: Mon Jul 25 11:36:06 2011 from 192.168.1.101 [root@www ~]# exit <==離開這次的 ssh 連線 # 由於 ssh 後面沒有加上帳號,因此預設使用當前的帳號來登入遠端伺服器 ---------- 20180802 ssh.txt ssh = Secure SHell ---------- 檢查 ssh 版本 #ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 ---------- 2018-07-31 常用安全限制: /etc/ssh/sshd_config 不允許root登入, 禁止 root 使用 ssh 登入 PermitRootLogin no ---------- 2018-04-24 public 和 private key是2個不同的檔案。如果資訊透過一個key來加密,那麼另外一個key就可以用於解密。而通常public key是給外部系統用,而private key則是自己用,因此才能夠雙方溝通。 設定key的時候通常會在設定一組密碼稱之為passphrase。 public key - 檔名 預設是id_rsa.pub private key - 檔名 預設是id_rsa ---------- 2018-04-22 /etc/ssh/sshd_config 不允許root登入, 禁止 root 使用 ssh 登入 PermitRootLogin no 只允許指定user從任何地方登入, 未在列表中的用戶無法登入. 若未設定, 則皆可登入. AllowUsers user1 usftp1 允許root從192.168.1.32登入: AllowUsers root@192.168.1.32 這項設定必需允許 PermitRootLogin yes 允許整個網段登入 AllowUsers root@10.200.* 可以在同一行指定多個帳戶登入用,注意IPv6 的寫法 AllowUsers axer@163.* axer@120.109.* axer@2001:288:5400:* 使用群組限制,只有允許群組 user 登入 AllowGroups user 設定完記得重啟 ssh [LINUX] # service sshd restart [FREEBSD] # /etc/rc.d/sshd reload [CENTOS7] # systemctl restart sshd.service [CENTOS7] # systemctl enable sshd.service ---------- 2018-04-22 產生加密公鑰 (id_rsa.pub) 及加密私鑰 (id_rsa) # ssh-keygen -t rsa ---------- 2018-04-20 更改 SSH 預設埠號後,在終端機連接到 SSH 要加上 -p 參數指定埠號,例如: ssh -p 2202 root@192.168.1.10 ---------- 2018-04-20 更改 SSH 預設埠號 ref: https://www.phpini.com/linux/centos-7-change-ssh-port-selinux-enable 以資安的角度,一般上建議將 SSH 預設的 22 埠號變更為其他埠號,而選擇埠號時則盡量使用 1024 以上的埠號,以及不要與其他系統服務的埠號相撞。 RHEL 及 CentOS 的 SSH Server 設定檔是 /etc/ssh/sshd_config, 以下會設定 SSH 的埠號為 2202, 先開啟 SSH 設定檔: # vi /etc/ssh/sshd_config 找到以下一行: # Port 22 改為 Port 2202 儲存檔案後離開編輯器。 現在設定 SELinux,SELinux 預設只允許 SSH 使用埠號 22, 執行以下指令開啟埠號 2202: (如果你設定的埠號不是 2202, 要將指令修改) # semanage port -a -t ssh_port_t -p tcp 2202 設定後可以執行 semanage 檢查是否開啟 2202 埠號: # semanage port -l | grep ssh ssh_port_t tcp 2202, 22 除了開啟 SELinux 外,還要設定 firewalld 開啟埠號 2202: 1 # firewall-cmd --permanent --zone=public --add-port=2202/tcp 重新載入 firewalld # firewall-cmd –reload CentOS要多執行這段: semanage port -a -t ssh_port_t -p tcp [any 1024-65535] 沒有問題後可以重新啟動 SSH Server: # systemctl restart sshd.service 更改 SSH 預設埠號後,在終端機連接到 SSH 要加上 -p 參數指定埠號,例如: ssh -p 2202 root@192.168.1.10