古詩詞大全網 - 藝術簽名 - 如何建立linux ssh信任的方法與常見問題

如何建立linux ssh信任的方法與常見問題

在Linux服務器之間建立信任關系,是很多線上服務系統的基礎性工作,這樣能便於程序在多臺服務器之間自動傳輸數據,或者方便用戶不輸入密碼就可以在不同的主機間完成登錄或者各種操作。

網上關於建立Linux信任關系(ssh trust)的中文文章有壹些,但是寫得都不太詳細,這裏匯總了方方面面的資料,把多機信任關系建立方法說說清楚(文/陳運文)

壹 建立信任關系的基本操作

基本場景是想從壹臺Server服務器直接登錄另壹臺,或者將Server服務器的數據不需密碼驗證直接拷貝至Client服務器,以下我們簡稱Server服務器為S(待發送的數據文件在這臺服務器上),Client服務為C,信任關系的最簡單操作方法如下:

1 在S服務器上,進入當前用戶根目錄下的隱藏目錄 .ssh,命令如下:

cd ~/.ssh

(註:目錄名前的點好”.”表示該文件夾是壹個特殊的隱藏文件夾,ls命令下默認是看不到的,通過 ls –a 命令觀察到)

2 生成S服務器的私鑰和公鑰:

ssh-keygen -t rsa

(註:rsa是壹種加密算法的名稱,此處也可以使用dsa,關於rsa和dsa算法的介紹可見本文後半章節)

ssh-keygen生成密鑰用於信任關系生成

-此時會顯示Generating public/private key pair. 並提示生成的公鑰私鑰文件的存放路徑和文件名,默認是放在 /home/username/.ssh/id_rsa 這樣的文件裏的,通常不用改,回車就可以

然後Enter passphrase(empty for no passphrase): 通常直接回車,默認不需要口令

Enter same passphrase again: 也直接回車

然後會顯式密鑰fingerprint生成好的提示,並給出壹個RSA加密協議的方框圖形。此時在.ssh目錄下ls,就可以看到生成好的私鑰文件id_rsa和公鑰文件id_rsa.pub了

以下是各種補充說明:

註1:如果此時提示 id_rsaalready exists,Overwrite(y/n) 則說明之前已經有人建好了密鑰,此時選擇n 忽略本次操作就行,可以直接用之前生成好的文件;當然選y覆蓋壹下也無妨

註2:公鑰用於加密,它是向所有人公開的(pub是公開的單詞public的縮寫);私鑰用於解密,只有密文的接收者持有。

3 在Server服務器上加載私鑰文件

仍然在.ssh目錄下,執行命令:

ssh-add id_rsa

系統如果提示:Identity added: id_rsa (id_rsa) 就表明加載成功了

下面有幾個異常情況處理:

–如果系統提示:could not open a connection to your authentication agent

則需要執行壹下命令:

ssh-agent bash

然後再執行上述的ssh-add id_rsa命令

–如果系統提示id_rsa: No such file or directory

這是系統無法找到私鑰文件id_rsa,需要看看當前路徑是不是不在.ssh目錄,或者私鑰文件改了名字,例如如果建立的時候改成 aa_rsa,則這邊命令中也需要相應改壹下

-如果系統提示 command not found,那肯定是妳命令敲錯字符了J

-提示Agent admitted failure to sign using the key,私鑰沒有加載成功,重試ssh-add

-註意id_rsa/id_rsa.pub文件不要刪除,存放在.ssh目錄下

4 把公鑰拷貝至Client服務器上

很簡單,例如 scp id_rsa.pub user@10.11.xx.xx:~

5 ssh登錄到Client服務器上,然後在Client服務器上,把公鑰的內容追加到authorized_keys文件末尾(這個文件也在隱藏文件夾.ssh下,沒有的話可以建立,沒有關系)

cat id_rsa.pub >> ~/.ssh/authorized_keys

以下是各種補充說明,遇到問題時可以參考:

註1:這裏不推薦用文件覆蓋的方式,有些教程直接scp id_rsa.pub 到Client服務器的authorized_keys文件,會導致之前建的其他信任關系的數據被破壞,追加到末尾是更穩妥的方式;

註2: cat 完以後,Client服務器上剛才拷貝過來的id_rsa.pub文件就不需要了,可以刪除或移動到其它地方)

註3:ssh-keygen 命令通過-b參數可以指定生成的密鑰文件的長度,如果不指定則默認為1024,如果ssh-keygen –b 4096(最長4096),則加密程度提高,但是生成和驗證時間會增加。對壹般的應用來說,默認長度已經足夠勝任了。如果是rsa加密方式,那麽最短長度為768 byte

註4:authorized_keys文件的權限問題。如果按上述步驟建立關系後,仍然要驗證密碼,並且沒有其他報錯,那麽需要檢查壹下authorized_keys文件的權限,需要作下修改: chmod g-w authorized_keys

OK,現在試試在Server端拷貝壹個文件到Client服務器,應該無需交互直接就傳過去了。

但是此時從Client傳數據到Server服務器,仍然是需要密碼驗證的。如果需要兩臺服務器間能直接互傳數據,則反過來按上述步驟操作壹下就可以了

二 刪除服務器間信任關系的方法

如果想取消兩臺服務器之間的信任關系,直接刪除公鑰或私鑰是沒有用的,需要在Client服務器上,打開 ~/.ssh/ authorized_keys 文件,找到對應的服務器的公鑰字段並刪除

每個段落的開頭是ssh-rsa字樣,段尾是Server服務器的帳號和ip(如下圖紅框),需要細心的找壹下後刪除整段

密鑰文件內容和刪除Linux服務器間信任關系的方法

三 各種可能遇到的情況和處理方法

–提示 port 22: Connection refused

可能的原因:沒有正確安裝最新的openssh-server,安裝方法如下

sudo apt-get install openssh-server

不支持apt安裝的,可以手工下載:

wget ftp.ssh.com/pub/ssh/ssh-3.2.9.1.tar.gz

–關於目錄和文件的權限設置

.ssh目錄的權限必須是700,同時本機的私鑰的權限必須設置成600:

chmod 600 id_rsa

否則ssh服務器會拒絕登錄

四 關於RSA和DSA加密算法

在ssh-keygen命令中,-t參數後指定的是加密算法,可以選擇rsa或者dsa

RSA 取名自算法的三位提出者Ron Rivest, Adi Shamir, and Leonard Adleman的姓名首字母,作為壹種非對稱加密算法,RSA的安全性基於及其困難的大整數分解(兩個素數的乘積的還原問題)。關於RSA算法原理的文章很多,感興趣的朋友可以找來讀壹讀。

DSA = Digital Signature Algorithm,基於有限域離散對數難題,是Schnorr和ElGamal簽名算法的變種,壹般用於數字簽名和認證,被美國標準局(NIST)采納為數字簽名標準DSS(Digital Signature Standard),based on discrete logarithms computation.

DES = Digital Encryption Standard. Obsolete standard.

RSA算法好在網絡容易實現密鑰管理,便進行數字簽名,算法復雜,加/解速度慢,采用非對稱加密。在實際用於信任關系建立中,這兩種方法的差異很微小,可以挑選其壹使用。

五 關於SSH協議的介紹

SSH全稱Secure SHell,顧名思義就是非常安全的shell的意思,SSH協議是IETF(Internet Engineering Task Force)的Network Working Group所制定的壹種協議。SSH的主要目的是用來取代傳統的telnet和R系列命令(rlogin,rsh,rexec等)遠程登陸和遠程執行命令的工具,實現對遠程登陸和遠程執行命令加密。防止由於網絡監聽而出現的密碼泄漏,對系統構成威脅。

ssh協議目前有SSH1和SSH2,SSH2協議兼容SSH1。目前實現SSH1和SSH2協議的主要軟件有OpenSSH和SSH Communications Security Corporation 公司的SSH Communications 軟件。前者是OpenBSD組織開發的壹款免費的SSH軟件,後者是商業軟件,因此在linux、FreeBSD、OpenBSD、NetBSD等免費類UNIX系統種,通暢都使用OpenSSH作為SSH協議的實現軟件。因此,本文重點介紹壹下OpenSSH的使用。需要註意的是OpenSSH和SSH Communications的登陸公鑰/私鑰的格式是不同的,如果想用SSH Communications產生的私鑰/公鑰對來登入到使用OpenSSH的linux系統需要對公鑰/私鑰進行格式轉換。

第壹次登陸後,ssh就會把登陸的ssh指紋存放在用戶home目錄的.ssh目錄的know_hosts文件中,如果遠程系統重裝過系統,ssh指紋已經改變,妳需要把 .ssh 目錄下的know_hosts中的相應指紋刪除,再登陸回答yes,方可登陸。請註意.ssh目錄是開頭是”.”的隱藏目錄,需要ls –a參數才能看到。而且這個目錄的權限必須是700,並且用戶的home目錄也不能給其他用戶寫權限,否則ssh服務器會拒絕登陸。如果發生不能登陸的問題,請察看服務器上的日誌文件/var/log/secure。通常能很快找到不能登陸的原因。

六 關於ssh_config和sshd_config文件配置的說明

/etc/ssh/ssh_config:

Host *

選項“Host”只對能夠匹配後面字串的計算機有效。“*”表示所有的計算機。

ForwardAgent no

“ForwardAgent”設置連接是否經過驗證代理(如果存在)轉發給遠程計算機。

ForwardX11 no

“ForwardX11”設置X11連接是否被自動重定向到安全的通道和顯示集(DISPLAY set)。

RhostsAuthentication no

“RhostsAuthentication”設置是否使用基於rhosts的安全驗證。

RhostsRSAAuthentication no

“RhostsRSAAuthentication”設置是否使用用RSA算法的基於rhosts的安全驗證。

RSAAuthentication yes

“RSAAuthentication”設置是否使用RSA算法進行安全驗證。

PasswordAuthentication yes

“PasswordAuthentication”設置是否使用口令驗證。

FallBackToRsh no

“FallBackToRsh”設置如果用ssh連接出現錯誤是否自動使用rsh。

UseRsh no

“UseRsh”設置是否在這臺計算機上使用“rlogin/rsh”。

BatchMode no

“BatchMode”如果設為“yes”,passphrase/password(交互式輸入口令)的提示將被禁止。當不能交互式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用。

CheckHostIP yes

“CheckHostIP”設置ssh是否查看連接到服務器的主機的IP地址以防止DNS欺騙。建議設置為“yes”。

StrictHostKeyChecking no

“StrictHostKeyChecking”如果設置成“yes”,ssh就不會自動把計算機的密匙加入“$HOME/.ssh/known_hosts”文件,並且壹旦計算機的密匙發生了變化,就拒絕連接。

IdentityFile ~/.ssh/identity

“IdentityFile”設置從哪個文件讀取用戶的RSA安全驗證標識。

Port 22

“Port”設置連接到遠程主機的端口。

Cipher blowfish

“Cipher”設置加密用的密碼。

EscapeChar ~

“EscapeChar”設置escape字符。

/etc/ssh/sshd_config:

Port 22

“Port”設置sshd監聽的端口號。

ListenAddress 192.168.1.1

“ListenAddress”設置sshd服務器綁定的IP地址。

HostKey /etc/ssh/ssh_host_key

“HostKey”設置包含計算機私人密匙的文件。

ServerKeyBits 1024

“ServerKeyBits”定義服務器密匙的位數。

LoginGraceTime 600

“LoginGraceTime”設置如果用戶不能成功登錄,在切斷連接之前服務器需要等待的時間(以秒為單位)。

KeyRegenerationInterval 3600

“KeyRegenerationInterval”設置在多少秒之後自動重新生成服務器的密匙(如果使用密匙)。重新生成密匙是為了防止用盜用的密匙解密被截獲的信息。

PermitRootLogin no

“PermitRootLogin”設置root能不能用ssh登錄。這個選項壹定不要設成“yes”。

IgnoreRhosts yes

“IgnoreRhosts”設置驗證的時候是否使用“rhosts”和“shosts”文件。

IgnoreUserKnownHosts yes

“IgnoreUserKnownHosts”設置ssh daemon是否在進行RhostsRSAAuthentication安全驗證的時候忽略用戶的“$HOME/.ssh/known_hosts”

StrictModes yes

“StrictModes”設置ssh在接收登錄請求之前是否檢查用戶家目錄和rhosts文件的權限和所有權。這通常是必要的,因為新手經常會把自己的目錄和文件設成任何人都有寫權限。

X11Forwarding no

“X11Forwarding”設置是否允許X11轉發。

PrintMotd yes

“PrintMotd”設置sshd是否在用戶登錄的時候顯示“/etc/motd”中的信息。

SyslogFacility AUTH

“SyslogFacility”設置在記錄來自sshd的消息的時候,是否給出“facility code”。

LogLevel INFO

“LogLevel”設置記錄sshd日誌消息的層次。INFO是壹個好的選擇。查看sshd的man幫助頁,已獲取更多的信息。

RhostsAuthentication no

“RhostsAuthentication”設置只用rhosts或“/etc/hosts.equiv”進行安全驗證是否已經足夠了。

RhostsRSAAuthentication no

“RhostsRSA”設置是否允許用rhosts或“/etc/hosts.equiv”加上RSA進行安全驗證。

RSAAuthentication yes

“RSAAuthentication”設置是否允許只有RSA安全驗證。

PasswordAuthentication yes

“PasswordAuthentication”設置是否允許口令驗證。

PermitEmptyPasswords no

“PermitEmptyPasswords”設置是否允許用口令為空的帳號登錄。

AllowUsers admin

“AllowUsers”的後面可以跟著任意的數量的用戶名的匹配串(patterns)或user@host這樣的匹配串,這些字符串用空格隔開。主機名可以是DNS名或IP地址。