本文是筆者查閱網上資料做的總結,關於SSH原理,什麼是對稱加密和非對稱加密,本文不過多介紹。這里介紹一下SHH的工作過程、配製方法,可能出現的問題及解決方法。
說明:本文中涉及的例子,SSH客戶端為:本地主機A,SSH伺服器為:伺服器B
SSH協議採用C-S(客戶端-伺服器端)架構進行雙方的身份驗證以及數據的加密。
伺服器端組件監聽指定的埠,負責安全連接的建立、對連接方的身份認證、以及為通過身份認證的用戶建立正確的環境。
客戶端負責發起最初的TCP握手、安全連接的建立、驗證伺服器的身份與之前記錄中的一致、並將自己的驗證信息提供給伺服器。
一個SSH會話的建立過程分為兩個階段。第一階段,雙方溝通並同意建立一個加密連接通道以供後續信息傳輸用。第二階段,對請求接入的用戶進行身份驗證以確定伺服器端是否要給該用戶開放訪問許可權。
當客戶端發起TCP連接時,伺服器端返回信息說明自己支持的協議版本,如果客戶端上支持的協議與之匹配,則連接繼續。伺服器會提供自己的公共主機密鑰(public host key)以讓客戶端確認自己訪問的是正確的機器。
然後,雙方採用一種Diffie-Hellman演算法共同為該會話建立密鑰。每一方的一部分私有數據,加上來自對方的一部分公共數據,通過這種演算法計算,能夠得出完全相同的密鑰用於本次會話。
整個會話的通訊內容都使用該密鑰進行加密。這個階段使用的公鑰/私鑰對與用戶驗證身份用的SSH密鑰是完全無關的。
經典Diffie-Hellman演算法的計算步驟如下:
這個共享密鑰的加密方式被稱為二進制數據包協議(binary packet protocol)。該過程能夠讓雙方平等的參與密鑰生成的過程,而不是由單方掌握。這種共享密鑰生成的過程是安全的,雙方沒有交換過任何未經加密的信息。
生成的密鑰是對稱式密鑰,一方用於加密信息的密鑰等同於另一方用於解密信息的密鑰,而任何第三方由於不持有該密鑰,是無法解密雙方傳遞的內容的。
會話加密通道建立後,SSH開始進入用戶認證階段。
下一步,伺服器驗證用戶身份以決定是否准許其訪問。驗證有不同的方式,選擇的驗證方式取決於伺服器的支持。
最簡單的驗證是密碼驗證:伺服器要求客戶端輸入密碼,客戶端輸入的密碼經過上述的通道加密傳輸給伺服器。
雖然密碼是加密過的,然而該方法仍然不被推薦,因為用戶經常為了省事而使用過於簡單的密碼,而這類密碼很容易就能夠被自動化腳本破解。
最流行的驗證方式是SSH密鑰對,這也是當前最推薦的方式。SSH密鑰對是非對稱密鑰,私鑰和公鑰分別用於不同的功能。
公鑰用於加密,而私鑰用於解密。公鑰可以隨意上傳、共享,因為公鑰的流通並不會危及到私鑰的保密性。
SSH密鑰對的驗證過程起始於上一部分加密通道建立之後,其具體執行步驟如下:
簡單來說,伺服器端用公鑰加密信息,客戶端用私鑰解密信息以證明自己持有私鑰。該過程同時使用了對稱加密和非對稱加密,兩種方式各有自己的功用。
命令如下:
用戶名:為要登錄的伺服器B中已存在的用戶賬戶名
IP地址:為伺服器B的IP地址
-p 埠號:用來指定埠號,默認為22
第一次登錄時,會提示如下提示:
大概意思是說,你正在訪問的主機不能驗證它的真實性,它的RSA key(當前訪問主機的公鑰)指紋是怎樣的,你確定要繼續連接嗎?
輸入yes繼續,會提示,已永久把當前訪問主機的RSA key添加到了已知主機文件(用戶目錄下,.ssh 文件夾中的knwon_hosts文件)中。之後再次 SSH 登錄就不再有該提示了。
接著,輸入登錄賬戶的密碼即可。
SSH 密碼登錄,需要伺服器開啟密碼驗證許可權,編輯伺服器SSH配置命令如下:
在 sshd_config 文件中,Protocol 2 下面 #PasswordAuthentication yes,將前面的#號去掉,保存退出。
公鑰登錄,即免密碼登錄。避免的每次登錄都要輸入的麻煩,也防止了中間人攻擊。是SSH遠程登錄最常用的登錄方式。
提示輸入密鑰對名稱,直接回車,使用默認名稱即可;
提示輸入密碼(使用私鑰時,要輸入密碼),直接回車,不使用密碼即可。
首先,登錄伺服器B,在進行下面的操作。
找到 #PubkeyAuthentication yes,刪除 #號,保存退出。
重啟 ssh 服務
也可指定驗證私鑰:
本地主機A,生成密鑰對後:
sudo vim /etc/selinux/config
⑵ SSH連接密碼怎麼獲取
修改你的ssh配置文件,將其中的PermitRootLogin的參數設置為yes
配置文件路徑如:/etc/ssh/sshd_config
重啟ssh服務,命令如下:
/etc/init.d/sshd restart
或
/etc/init.d/ssh restart
然後修改root的密碼,將密碼修改為123456.
⑶ SSH 密碼與秘鑰登錄方式
密碼登錄顧名思義極其簡單,登錄之前需要在ssh伺服器上有相應的用戶名與登錄密碼。
密碼登錄命令行:ssh username@hostname -p port
username:登錄用戶名
hostname:ssh伺服器,既可以是ip也可以是域名
port:這個為可選項,即ssh伺服器的埠,如果為空則默認埠為22
秘鑰登錄使用加密的
終端下生成秘鑰命令:ssh-keygen -t rsa(如果不輸入密碼,則不需要密碼)
生成過程中會提示輸入秘鑰文件的名稱,如果輸入為 Key,則會生成 Key 與 Key.pub 兩個文件, Key為私鑰,Key.pub為公鑰。將Key放入本機用戶目錄的 .ssh目錄下,將.ssh目錄許可權改為700
將生成的公鑰 Key.pub 上傳至目標伺服器,並將Key.pub放置於用戶目錄的.ssh目錄,同樣.ssh目錄許可權也為700
然後執行 cat Key.pub >> authorized_keys 將公鑰導入,並確定authorized_keys許可權為 600
秘鑰配置好後,可以執行 ssh -i Key username@hostname -p port
ssh 默認秘鑰為 id_rsa, 需要加上參數-i 指明秘鑰
⑷ ssh localhost 配置免密登陸仍需要密碼的解決方法
最近在看spark的書籍,書中第一步搭建單機spark的時候,有一個操作是設置ssh無密碼的登陸了。萬萬沒想到,在這一步就卡住了。已經成功配置了免密登陸,但是ssh localhost還是需要輸入密碼。在阿里雲香港伺服器掛掉之後,網路了兩天才找到解決方法。特此記錄。
查看日誌是分析問題中很重要的一環,因為ssh中會出現各種不同的問題,每種問題的解決方法不一樣。
ssh -vvv localhost 報的錯誤信息
日誌顯示ssh跳過了dsa的認證方式,最後只能通過密碼認證的方式。
通過查詢資料發現,ssh 7.0之後就已經默認關閉了dsa認證方式。
於是修改ssh的配置文件ssh_config,在驗證方式中加入dsa
按照教程修改完配置文件後,ssh localhost任然需要輸入密碼,查看日誌如下。·
可以看出修改過後,ssh時已經提供了DSA秘鑰,但是好像校驗沒有通過,所以最後還是進入了輸入密碼驗證的環節。
通過查閱資料和自己推理,問題可能出在服務端校驗不通過,因為伺服器端也不支持dsa這種認證方式,那就試著修改一下伺服器端的配置文件。
ssh_config 和 sshd_config 分別是ssh客戶端和伺服器端的配置文件,ssh localhost就是一個本地客戶端向本地伺服器請求的過程。
修改sshd文件後,ssh localhost還是需要密碼。就在我差點自閉的時候,看到有帖子說要重啟一下ssh伺服器。
重啟完成後,ssh localhost免密登陸成功。長舒一口氣。
後來經過測試,修改ssh配置文件不用重啟服務,但是修改sshd配置文件,是要重啟才能生效的。
據說是因為dsa是不加密的,後面都改用rsa了,遇上同樣問題的小夥伴可以自己去查一下。
``
⑸ ssh登錄自動輸入密碼
現有解決方案有expect 和 sshpass 等第三方解決方案,因不想引入過多依賴決定自己實現。
通過查找 資料 發現以上方案是對tty直接寫入來達到效果,但是我用bash腳本直接對tty寫入確只能在屏幕顯示,不能被程序獲取,於是轉入使用ruby按照以上資料來自己實現,
發現將第6,7,8行注釋掉之後報如下錯誤:
對ssh_askpass 查找 資料 發現環境變數 SSH_ASKPASS 和 DISPLAY可以定義一個程序用來在ssh沒有聯接終端時提供密碼。
**SSH_ASKPASS **設為提供密碼的程序
DISPLAY 設為 :0
測試發現ssh 調用 SSH_ASKPASS 定義的程序時,帶 參數執行,如
***# $SSH_ASKPASS * [email protected]'s password:
只要程序列印正確密碼,ssh即可驗證通過,於是問題解決,也不需要用ruby去實現了。
示例如下:
項目GitHub地址
這樣即可自動輸入密碼ssh登錄。
網上幾乎都是expect 和 sshpass等方案來實現自動輸入密碼,此方法原理網上資料少有,記錄之。
2016.11.24
⑹ 關掉 ssh 的密碼登陸
0.檢查是否已經安裝 ssh-keygen 了
如果出現上面的錯誤需要從 1.安裝 ssh-key 開始;否則從 2.創建授權文件 開始。
1.安裝 ssh-key
安裝 RSA 的 key,一路 ENTER 就行了。
2.創建授權文件
將本地的 id_rsa.pub 的內容寫入 authorized_keys , 注意:是本地的,不是伺服器的 。
3.免密碼登陸測試
理論上,直接就登陸上去了
1.修改配置文件
修改一下內容,一般都已經設置了,修改一下就好了, 不要添加哦 。
2.重啟 ssh 服務
OK,這樣就可以防止別人破解密碼了
關閉SSH傳統密碼登陸方式
⑺ windows下ssh如何設置用戶密碼
windows下ssh設置用戶密碼步驟如下:
1、創建公鑰、公鑰
ssh-keygen -t rsa
出現提示後,直接回車到最後一步。
2、把公鑰 id_rsa.pub 復制到遠程機器的 /home/username/.ssh目錄 並命名為 authorized_keys
方法1: 一步到位:scp ~/.ssh/id_rsa.pub username@hostname:~/.ssh/authorized_keys
方法2: 復制 scp ~/.ssh/id_rsa.pub username@hostname:~
登陸 ssh username@hostname
追加 cat id_rsa.pub >> .ssh/authorized_keys
復制過去就可以,多台遠程主機就多次復制。 如果你本機登陸用戶和遠程登陸用戶一致的話,就可以直接 ssh hostname直接登陸。
3、解決本地登陸用戶與遠程登陸用戶不一致
雖然不用輸入密碼了,但是還得 ssh username@hostname 來登陸,很不方便。 解決很簡單,修改本地登陸用戶的 ~/.ssh/config 文件,如果沒有的話就自建一個,內容如下:
Host hostname
user username
Host hostname2
user username2
這樣,本地和遠程登陸用戶名不一致也可以 ssh hostname 登陸了。
⑻ linux ssh 帶密碼
可以用expect實現,下面是個通用的,參數分別是用戶名、密碼、遠程主機名/IP、和執行的命令,可以根據自己需要修改:
#!/usr/bin/expect
set timeout 3
set username [lindex $argv 0]
set password [lindex $argv 1]
set remhost [lindex $argv 2]
set command [lindex $argv 3]
spawn ssh $username@$remhost $command
expect {
"*re you sure you want to continue connecting*"
{
send "yes\n"
expect {
"*assword*"
{
send "$password\n"
}
}
}
"*assword*"
{
send "$password\n"
}
}
expect eof
⑼ linux怎麼修改ssh密碼
1、把遠程主機抄ip和埠號填寫上然後襲選擇連接方式為「SSH」。單擊「打開」,就成功連接遠程的Linux伺服器。
⑽ 如何自動輸入密碼ssh連接到其他機器
主要的解決方法有三種:
1. 生成ssh公鑰,建立和對方機器的信任關系;
2. 使用expect腳本;
3. 使用sshpass。
這里介紹一下sshpass相關內容
下載並安裝sshpass):
# tar zxvf sshpass-xxxx.tar.gz
# cd sshpass-xxxx
# ./configure
# make && make install
基本用法:sshpass -p [密碼] ssh [user]@[host]
免去第一次登錄機器時的確認提示(Are you sure you want to continue connecting (yes/no)):
sshpass -p [密碼] ssh [user]@[host] -o StrictHostKeyChecking=no
後面也可以跟上其他ssh命令,如scp等
例1,公司的一個環境,大部分機器的login密碼是"1root",少部分是"123qwe",新建一個hssh.sh文件,按如下修改,到/usr/bin/目錄下。
[cpp] view plain
#!/bin/sh
#_main_
temp_file=/tmp/hssh.1
ip=192.168.$1
case "$1" in
"204.188"|"207.31"|"205.199") password="123qwe";;
*) password="1root"
esac
sshpass -p $password ssh root@$ip -o StrictHostKeyChecking=no 2>$temp_file
if [ $? != 0 ];then
#for some reason,machine had reinstall, we need to delete that IP address in known_hosts file before ssh it.
grep -q "REMOTE HOST IDENTIFICATION HAS CHANGED" $temp_file
if [ $? = 0 ];then
key_file=`grep "Offending key in" $temp_file | cut -d' ' -f 4 | cut -d ':' -f1 2>/dev/null`
cat $key_file | grep -v "$ip" > $temp_file
sudo cp -v $temp_file $key_file
sshpass -p $password ssh root@$ip -o StrictHostKeyChecking=no 2>$temp_file
fi
fi
那麼我們每次只要輸入hssh XXX.XXX 等就可以ssh到對應機器上了