ssh 使用與管理
SSH 連入Linux 伺服器管理系統,是非常常見的事,當然,安全上就顯的非常重要了,在這裡寫些關於SSH 的管理方式
1. Linux SSH免密碼連線
用途:資料加密備份、資料定期同步、避免密碼洩漏
作業規格:
1.使用VMware 架設2台 Linux( centos45 及 centos45_1 )
2.使用OS為Centos45
3.centos45 為 server 端、centos45_1 為 client 端
4.登入方向,client 端使用towns 帳號,登入server 端 towns 帳號
設定方式:
1.client 端產生公鑰、私鑰(需使用 towns 帳號產生公鑰、私鑰,並放於 ~/towns/.ssh/中)
1.1. ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
使用rsa 加密演算(-t)產生公鑰、私鑰,並放於 ~/towns/.ssh/ 中檔名為 id_rsa,不設定密碼(-N "")
2.將公鑰放到server端 towns ~/.ssh/中
2.1.使用scp指令,將公錀放到 ~/towns/.ssh/
2.2.使用cp 指令(cp ~/.ssh/id_rsa.pub authorized_keys) ,將公錀內的資料放到~/home/towns/.ssh/
詳細的設定方式,我不在這裡說明請參考鳥哥 第十一章、遠端連線伺服器SSH / XDMCP / VNC / RDP的說明,在這裡,我說一下我遇到的問題
補充1:在server 端,該使用者(towns)中authorized_keys 檔案的權限,必需為644
補充2:檔案名稱必需為 authorized_keys
補充3: .ssh 目錄權限只有 ownner 能有寫入(w)權限,如果在群組加入了 w 權限,就無法使用金鑰登入了
補充4:在 ssh 的設定檔(sshd_config)中,必需將 AuthorizedKeysFile 前的 # 拿掉
-----另一方式-----------------------------------------------------------------------------------------
1. ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ""
2. ssh-copy-id -i .ssh/id_rsa.pub [user@]hostname
這個方式會直接生成 authorized_keys,要求我們打入登入主機密碼,並幫我們將檔案放到要登入的伺服器
3. 完成後,系統會請我們再次登入,這時就不用密碼了
ssh-copy-id [-i [identity_file]] [-p port] [[-o <ssh -o options>] ... ] [user@]hostname
資料來源:
鳥哥的Linux 私房菜--遠端連線伺服器
Tsung 大的blog -- ssh keygen 免輸入密碼
https://blog.longwin.com.tw/2005/12/ssh_keygen_no_passwd/
補充1:使用 4096 加密 ssh-keygen -t rsa -b 4096
補充2:使用其他 port 連 ssh -p
2. windows 免密碼連線
使用 putty產生公私鑰,並寫入server中
1. 使用 Puttygen 產生公私鑰
2. 私鑰存檔
3. 先登入 server 端,並登入指定帳號
4. 公鑰直接複製貼上到 server 端,[使用者]/.ssh/authorized_keys
5. 變更 authorized_keys 權限為 600
6. 登出 PuTTY
7. 於 Host Name(or IP address)中打入 server IP
8. 到 Connection ==> Data ==> Auto-login username,打入登入帳號(選用)
9. 到 Connection ==> SSH ==> Auth ==> 點 Browse 選取第2點的私鑰
10. Open
完成以上動作,就不用再打密碼了
註1:如果要保持登入不用打密碼,記得回到上面的 Session,將此設定存檔(save)
註2:.ssh 資料匣權限要設為 700
註3:要貼入的請 cp 由 Puttygen 產生的公鑰文字,如果使用另存的公鑰內容,會少掉 ssh-rsa ......... rsa-key-20211205 頭尾
資料來源:FAQ Book Derek大
http://blog.faq-book.com/?p=1444
Puttygen下載官方網址:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
3. 參數說明
/etc/ssh/sshd_config
PermitRootLgin no ==> 限制root 直接登入
AuthorizedKeysFile [檔案路徑] ==> 說明 Public Key 存放檔案
PasswordAuthentication yes ==> 同意使用密碼登入系統
UseDNS no ==> 關閉 DNS 查詢(可以加速登入速度)
註:其實 ssh 的設定檔中,多數參數都有說明,如果需要更詳細的說明,可以用 man sshd_config
4. 限制使用者由指定IP 登入
在/etc/ssh/sshd_config 中,新增
AllowUsers towns@192.168.56.1 <== 指定towns 只能由192.168.56.1 登入
AllowUsers towns@192.168.56 <== 指定towns 只能由192.168.56 網段登入
AllowUsers root@192.168.56 towns <== 指定root 只能由192.168.56 網段登入,towns可以任意登入
AllowGroups user <== 只允許user 群組登入
DenyUsers
DenyGroups
註:當設定了一個帳號可以由指定 IP 登入,就表示其他帳號不能登入,需要使用第三條設定方式設定,不然,大家都無法登入了 ^0^
參考資料:
瘦河馬大的文章 http://note.tc.edu.tw/375.html
5. 透過 OS 限制 SSH 登入
在 /etc/hosts.allow 中,新增
sshd: 192.168.56.1 : allow <== 限制單一IP 連入
sshd: 192.168.55.0/255.255.255.0 : allow <== 限制網段連入
在 /etc/hosts.deny 中,新增
sshd: all : deny <== 限制全部不能連入
補充1:兩個設定必需同時使用才能生效
補充2:設定後立刻生效,不需重新啟動
6. pietty其他有用設定
開放pietty右方數字(9宮格)可以使用
開啟ssh並連入指定帳號 ==> 選項 ==> 詳細設定 ==> Terminal ==> Features ==> 勾選 Disable Applecation Keypad mode ==> apply
調整卷軸行數
開啟ssh並連入指定帳號 ==> 選項 ==> 詳細設定 ==> windows ==> Lines of scrollback,數字就依需求設定
參考資料:鳥哥 第十一章
7. 限制使用者只能登入家目錄
1. 修改 sshd_config
Subsystem sftp internal-sftp
2. 設定
單人
Match user towns
ChrootDirectory /home/%u
AllowTcpForwarding no
X11Forwarding no
PermitTTY no
ForceCommand internal-sftp
註1:這個設定值必須在 UsePAM 設定值之下
註2:因為 ChrootDirectory 參數,必需將家目錄的 owner 改為 root:root,並改為 755,這時才能將使用者鎖在自己的家目錄中,不會看到其他 user 的資料匣(才能依上面的設定 /home/%u)
註3:這樣設定後,該層目錄 /home/%u 該使用者是無法存取的,必需再加資料匣後,才能提供該帳號存取
3. 重新啟動
設定完成後,使用者就只能使用SFTP 登入,且綁在家目錄中。不過,這樣的設定會看到其他帳號。liuchiu 大提供了一個方式,就是多一層目錄,就可以了 ^^
補充:其中 Subsystem sftp internal-sftp ,這一段並非絕對要改,就算不改也可以正常限制
參考資料:
liuchiu 大的 blog
http://liuchiu.pixnet.net/blog/post/24913796-[sftp]ssh%E8%A8%AD%E5%AE%9Achrootdirectory%E9%99%90%E5%88%B6%E4%BD%BF%E7%94%A8%E8%80%85%E6%A0%B9%E7%9B%AE%E9%8C%84
jaing 大的文章
http://jeffyon.blogspot.com/2017/06/sftp.html
man sshd_config
liuchiu 大的文章
https://liuchiu.pixnet.net/blog/post/24913796
will 大的文章
https://blog.miniasp.com/post/2011/08/11/OpenSSH-SFTP-chroot-with-ChrootDirectory
---------------------------------------------------------------------------------------------------------------------------------------------
單一(特定)使用人員,強制使用金鑰
Match user towns
PasswordAuthentication no
Steckexchange 討論:單一(特定)使用人員,強制使用金鑰
https://serverfault.com/questions/285800/how-to-disable-ssh-login-with-password-for-some-users
8. 確認 SSH 使用協定版本
目前所有新版的 SSH 都是使用 V2 協定,如果要確定,可以用 telnet localhost 22 連入查看,看到 SSH-2.0-OpenSSH_6.6.1,就可以確認是 V2 的版本了
參考資料:serverfault 討論 -- davey 大的回應
http://serverfault.com/questions/545555/how-can-i-find-current-ssh-protocol-version-of-current-connection
9. ssh client 端指令
ssh -p 12345 towns@192.168.56.10 <== 使用123456 port、帳號towns連接,192.168.56.10
參考資料:阿發哥
http://yuhfa.blogsport.tw/2010/10/sshport.html
10. SSH Weak MAC Algorithms Supported 弱點問題
處理方式
Disable the weak MAC algorithms
設定
在 sshd_config 中加入這兩行
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128
MACs hmac-sha1,umac-64@openssh.com,hmac-ripemd160
參考資料:
Alvin BL Koh 回應
https://developer.ibm.com/answers/questions/187318/faq-how-do-i-disable-cipher-block-chaining-cbc-mod.html
man sshd_config 中也有說明
補充1:ssh 使用參數 Q 列出目前支援的演算法(Client 端列出)
可用的功能有:cipher(支持的對稱密碼)、cipher-auth(支持認證加密的對稱密碼)、mac(支持的消息完整性碼;message integrity codes)、kex(密鑰交換算法;key exchange algorithms)、key(密鑰類型)、key-cert(證書密鑰類型)、key-plain(非證書密鑰類型)和 protocol-version(支持的 SSH 協議版本)。
ssh -Q cipher => 列出目前支援的加密方式
ssh -Q mac => 列出目前支援的消息驗證碼
ssh -Q kex => 列出目前支援的金鑰交換方式
補充2:centos 8 開始,將 ciphers 的設定改放到 /etc/crypto-policies/back-ends/opensshserver.config,所以如果要變更 cipher 要到這個檔案中修正
補充3:sshd 使用參數 T 列出目前 server 支援的演算法
延伸測試模式。檢查配置文件的有效性,將有效配置輸出到stdout然後退出。
sshd -T | grep kex => 列出目前伺服器支援的金鑰交換方式
依照 Jakuje 大的說明,就是寫上要留下的方式,將不要的刪除
參考資料:
serverfault 討論 -- Jakuje 大回應
https://serverfault.com/questions/758673/how-to-disable-diffie-hellman-group1-sha1-for-ssh
man 5 sshd_config
11. 帳號管理設定
UsePAM yes <== 將大多數的帳號管理交給 PAM 套件處理。這個開啟後,下面的設定將被取代
ClientAliveInterval 15m <== 帳號閒置時間
ClientAliveCountMax 3 <== 帳號登入次數
12. ssh 登入時反應很慢
towns 發生了,當變更主機名後,連到主機打入帳號後,等密碼跳出時很久,主要造成原因是 GSSAPIAuthentication yes 設定造成
到 sshd_config 中將以下兩個設定關閉
UseDNS no <== 在找主機時會影響,如果使用 IP 連接則無影響
GSSAPIAuthentication no <== 這樣改名後才不會變慢
13. 使用 SSH 設定檔簡化指令與連線網址
參考資料:awonwon 大的文章
https://medium.com/@awonwon/how-to-setup-ssh-config-%E4%BD%BF%E7%94%A8-ssh-%E8%A8%AD%E5%AE%9A%E6%AA%94-74ad46f99818
14. SSH 使用金鑰驗證登入,關閉使用密碼登入
設定 /etc/ssh/sshd_config
PasswordAuthentication yes => no
PubkeyAuthentication yes
15. windows 使用 putty 做 tunnel
平凡大寫了四個服務透過 SSH tunnel。FTP、VNC、RDP、web,不過,在 RDP 的部分 Distenation,towns 是設定遠端的 IP,不是 localhost
例:透過 putty 設定 SSH tunnel 連接遠端 RDP 主機
1.
開啟 Putty => Connection => SSH => Tunnels => Source Port
13389,Destination 2.3.4.5:3389 => Add => Session => Save
2. 開啟 遠端桌面連線 => 電腦 127.0.0.1:13389 => 連線
這時開啟的遠端桌面,就是透過 SSH Tunnel 連到 2.3.4.5 的 RDP 了
註1:檢查方式
於跳版機上打入 netstat -tnp 可以看到跳版機正連著 2.3.4.5:3389
註2:這一段設定只有設定一半,這個設定的前題是,已經將跳版機連線設定好了
參考資料:
平凡大文章
http://patrick-tang.blogspot.com/2013/02/ssh-tunnel-windows.html
John 大大的文章 -- ssh tunnel 詳解
https://johnliu55.tw/ssh-tunnel.html
16. 避免 SSH 連接因超時閒置斷開
putty
開啟 putty => Connection => Sending of null packets to keep session active => 設為 300秒(這個值需小於 Server 端設定的 Timeout 時間)
Linux SSH
編輯 ~/.ssh/config(檔案不存在時請自行建立) => Host * ServerAliveInterval 300(這表示每台都會每 5 分鐘送出 Alive 訊息
註:這個設定必需要 ssh server 中有設定中斷時間,如果是使用 /etc/profile 設定,這個設定值將無效
參考資料:
某外國大大的文章
https://patrickmn.com/aside/how-to-keep-alive-ssh-sessions/
17. SSH 設定檔
/etc/sshd_config <= server 端的設定檔
/etc/ssh_config <= client 端的設定檔
~/.ssh/config <= 使用者設定檔
參考資料:
stackexchange 討論 -- Gilles 回應
https://unix.stackexchange.com/questions/89083/how-to-know-the-type-of-symmetric-encryption-used-by-ssh
18. SSH debug 模式
ssh -vv [hostname]
這個指令可以列出大量資訊,可同時列出 client 及 server 端,其中有包含可用的加密方式
參考資料:
stackexchange 討論 -- Gilles 回應
https://unix.stackexchange.com/questions/89083/how-to-know-the-type-of-symmetric-encryption-used-by-ssh
19. SSH tunnel 設定
因為安全性問題,towns 需使用跳版機透過 SSH tunnel 方式連接到另一網路指定主機,架構為 local => 跳版機 => windows rdp
指令方式:
建立指定連結
ssh -L 13389:1.2.3.4:3389 towns@2.3.4.5
ssh -NL 13389:1.2.3.4:3389 towns@2.3.4.5
ssh -NfL 13389:1.2.3.4:3389 towns@2.3.4.5
ssh -L 13389:1.2.3.4:3389 -l towns 2.3.4.5
建立動態連結
ssh -D 9898 towns@1.2.3.4
config 設定方式
host Jump
HostName 2.3.4.5
User towns
LocalForward 13389 1.2.3.4:3389
註:.ssh/config 這個檔案必需是 600 權限
參考資料:
阿亮大 -- Tunelling RDP using SSH
https://derjohng.doitwell.tw/2033/%E9%9B%BB%E8%85%A6%E9%A1%9E%E5%88%A5/%E7%B6%B2%E7%AE%A1%E7%9B%B8%E9%97%9C/tunelling-rdp-using-ssh/
stackoverflow 討論 -- Johnsyweb 大回應
https://stackoverflow.com/questions/9146457/ssh-port-forwarding-in-a-ssh-config-file
20. ssh 安全性設定建議
CentOS 官網有建議關於 OpenSSH 的基本安全性設定
參考資料:
CentOS 官網
https://wiki.centos.org/zh-tw/HowTos/Network/SecuringSSH
21. 個人設定檔 .ssh/config
1. 設定檔案連接特定主機
Host test
HostName 1.2.3.4
User towns
2. 每30秒定時通知所有伺服器我還活著
Host *
ServerAliveInterval 30
22. 設定 ssh client 端 timeout 時間(測試無效)
ClientAliveCountMax = 5
ClientAliveInterval = 60
5 *60 =300 seconds 後 Client 就會斷線
參考資料:
Mohsen47 回應
https://www.digitalocean.com/community/questions/how-to-increase-ssh-connection-timeout
man sshd_config
補充:
TCPKeepAlive
由
server 端發送 TCP 仍存活的訊息,這個參數可以由 server 去確認與 client 的 TCP
連線是否還活著,如果無回訊息,server 端將會自動切斷這個
session,但是,表示如果路由暫時中斷,連接就會中斷,在不穩定的網路上,這個可能會造成常斷線,但這個設定可以避免幽靈用戶存留。預設為 yes
ClientAliveCountMax
設置在沒有 sshd(8) 接收來自客戶端的任何消息的情況下可以發送的客戶端活動消息的數量。 如果在發送客戶端活動消息時達到此閾值,sshd 將斷開客戶端,終止會話。
ClientAliveInterval
以秒為單位設置超時間隔,如果沒有從客戶端接收到數據,sshd(8) 將通過加密通道發送消息以請求客戶端回應。 預設為0,表示這些消息不會發送給客戶端。
23. MaxAuthTries 參數
這個值是寫在 sshd_config 中,用於限制使用者登入時密碼測試次數,預設值為 6,不過,有一個特殊的問題,當該值設定為 1 時,使用者將無法登入,所以這個值感覺上是指 n-1 次
24. sshd 開啟多個 port
towns 因為測試需求,需要自己開啟指定的 port,不過找對到方法,後來想了,如果可以讓 ssh service 開啟多個 port,也是可以的,果然,ssh service 是可以開啟多個 port 的,只需要在設定檔中多寫幾個 Port 就可以了,必需一行一行寫
例:
Port 22
Port 10022
參考資料:
CSDN -- Allen8421i 說明
https://blog.csdn.net/XBS7231671/article/details/113780676
25. ssh 使用 yubikey 或 google auth
這個是二擇一做法
1. 先設定好 yubikey 認證
yubikey 其實只是透過 GPG 將私鑰放入 yubikey 中,所以私鑰產生後只要能放到 yubikey 中,任何方式都可以
完整設定,可以參考 towns 這篇文章 https://blog.xuite.net/towns/hc/586883044
2. 再設定 google authenticator
google auth 的設定主要就是將 ssh 開啟 ChallengeResponseAuthentication 並設定 pam.d/sshd 加入 auth required pam_google_authenticator.so,詳細的設定請參考 IT001 大大的文章
https://it001.pixnet.net/blog/post/356150624-it%E4%BA%8B%E4%BB%B6%E7%B0%BF--centos-7-ssh-%E5%85%A9%E6%AD%A5%E9%A9%9F%E9%A9%97%E8%AD%89-google-authenticat
3. 如果要讓 ssh 可以選擇使用 yubikey 或 google auth,該怎麼做
1. 先設定 yubikey
2. 再設定 google auth
3. 將 PasswordAuthentication 設為 yes
這時,兩種方式就可以擇一了
26. 限制 SSH 連入
allowusers xxx@192.168.56.10
參考資料:
程式前沿
https://codertw.com/%E4%BC%BA%E6%9C%8D%E5%99%A8/382291/
27. OpenSSH 6、7 版本上的小差異
關於 KEX 演算法是有調整,在關閉時,需分開核對
28. ssh 預設的登入方式
29. knows_hosts 格式
主機名稱|密鑰類型|公鑰
註1:主機多名稱時,會用逗分開
註2:如果想加密主機資訊,可以帶 HashKnownHosts 參數,或寫在 /etc/ssh/ssh_config 中
註3:windows 的 ssh client 沒有 ssh_config
參考資料:
Elementor 大大資料
https://www.howtouselinux.com/post/ssh-known_hosts-file
30. 產生金鑰方式
使用 ssh-keygen 產生金鑰可以選擇五種演算法,目前如果沒加任何設定會使用 RSA 2048 bits 的公鑰
dsa | ecdsa | ed25519 | rsa | rsa1
RSA 密鑰,最小大小為 1024 位,默認為 2048 位。
DSA 密鑰必須是 FIPS 186-2 指定的 1024 位。
ECDSA 密鑰,-b 參數通過從以下三種橢圓曲線大小之一中選擇來確定密鑰長度:256、384 或 521 位。
Ed25519 密鑰具有固定長度,並且 -b 標誌將被忽略。
RSA1 密鑰,是專用於 ssh version1,預設是一串 2048 位的數字,無法使用於 version 2
參考資料:
man ssh-keygen
31. 對遠端主機下指令
ssh [user@]hostname "[command]"
例:
ssh towns@1.2.3.4 "touch /home/towns/test.txt
參考資料:
tarufa 大口述
32. 遠端登入帶密碼
ssh 在登入時預設是不能連密碼一起打入的,如果要這麼做,建議使用金鑰方式是比較好的,不過,到是有套件可以協助處理這個問題,安裝 sshpass 這個套件,就可以帶上密碼下指令了
例:
sshpass -p 'abcd' ssh towns@1.2.3.4 "touch /home/towns/test.txt
參考資料:
xhk777 大文章
https://www.twblogs.net/a/5d281249bd9eee1ede070499
33. sftp 指令
新舊版本 port 參數
7.4p1-22
sftp -P [port] [username]@[domain]
sftp -oPort=[port] [username]@[domain]
留言
張貼留言