1. 程式人生 > >How To Use SSH Keys connect to Linux server

How To Use SSH Keys connect to Linux server

如何透過 pub key 不用打密碼連進 linux server 裡,當然可以把密碼設的超級長,之後就透過 pub key 登入比較有效率。在 ssh client side 拿到的 key 在第1 次 ssh 時還是可以使用 id/password 方式去登入,再透過 vi ~/.ssh/authorized_keys 加入到 server side 即可。

NoteThis guide is for Mac OS X and Linux users. If you are using Windows on your home computer, follow this guide instead.

Step One—Create the RSA Key Pair

ssh-keygen -t rsa

Step Two—Store the Keys and Passphrase

Once you have entered the Gen Key command, you will get a few more questions:

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

You can press enter here, saving the file to the user home (in this case, my example user is called demo).

Enter passphrase (empty for no passphrase):

It’s up to you whether you want to use a passphrase The entire key generation process looks like this:

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/demo/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /demo/.ssh/id_rsa.
Your public key has been saved in /demo/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:38:8c:74:44:4d:93:67 
[email protected]
The key's randomart image is: +--[ RSA 2048]----+ | .oo. | | . o.E | | + . o | | . = = . | | = S = . | | o + = + | | . o + o . | | . o | | | +-----------------+

The public key is now located in /demo/.ssh/id_rsa.pub The private key (identification) is now located in /demo/.ssh/id_rsa

Step Three—Copy the SSH Keys

透過  cat ~/.ssh/id_rsa.pub 就可以拿到公開的 key

再把內容都加入(append)到要被 ssh 連進去的 server 的 ~/.ssh/authorized_keys 檔案裡,就可以讓其他臺電腦不用打密碼連進 ssh server 了。

相關文章:

保衛 OpenSSH

OpenSSH(或者 Secure Shell)以經成為一個取代 telnet 協議作遠端存取用的現有標準。SSH 已經令 telnet 等協議多餘的,當中絕大部份原因是由於連線被加密,以及不再以純文字公開地傳送密碼。

然而,預設的 ssh 安裝並非完美。當你營運一個 ssh 伺服器時,有數個簡單的步驟可以明顯地加固你的安裝。

1. 採用難猜測的密碼/使用者名稱稱

如果你所營運的 ssh 是對外的,你首先會發現的事情,很可能就是駭客嘗試猜/測使用者名稱稱/密碼的記錄。駭客一般會掃描連線埠 22(ssh 預設聆聽的連線埠)來找尋執行 ssh 的機器,然後嘗試強行攻擊它。借著使用難猜測的密碼,我們希望任何攻擊在成功前會被記錄底及被留意到。

盼望你已經採用了難猜測的密碼。要不然,請嘗試選擁有以下特徵的密碼:

  • 最少有 8 個字元
  • 同時有大寫和小寫字母
  • 同時有字母和數目字
  • 有非英數的字元(例如 ! ” £ $ % ^ 等特別字元)

使用難測密碼的好處並不止於 ssh,它更會影響到系統安全的各個範疇。有關密碼的更多資訊可以在 CentOS 的文件內找到:

如果你完全沒法阻止你的使用者選用易猜測的密碼,請考慮以隨機產生或難猜測的字串作為使用者名稱稱。如果壞人不能猜測使用者名稱稱,他們便不能強加猜測密碼。然而,這只是隱晦資訊來換取安全,所以要留心使用者名稱稱透過使用者傳送的電郵等途徑而被洩漏。

2. 停用 root 登入

SSH 伺服器的設定都儲存在 /etc/ssh/sshd_confg 這個檔案。要停用 root 登入,請確定你有以下一行:

# 阻止 root 登入:
PermitRootLogin no

然後請重新啟動 sshd 服務:

service sshd restart

你果你需要 root 的許可權,請登入為一般使用者,然後使用 su 這個指令。

3. 限制使用者登入

SSH 登入可以侷限給某些需要遠端存取的使用者。如果你的系統有很多使用者,一個合理的做法就是侷限遠端存取給那真正有需要的使用者,藉以減低其他使用者採用易測密碼的影響。在 /etc/ssh/sshd_config 內加入 AllowUsers 一行,以空格隔開使用者名稱稱。例如:

AllowUsers alice bob

接著請重新啟動 sshd 服務。

4. 停用第 1 類協議

SSH 可以採用兩款協議:第 1 類及第 2 類協議。較舊的第 1 類協議的安全性較低,因此它應該被停用,除非你知道你必須要使用它。請在 /etc/ssh/sshd_config 檔內找尋以下一行,解除註釋,並作出如下修改:

# Protocol 2,1
Protocol 2

然後請重新啟動 sshd 服務。

5. 採用非標準的連線埠

根據預設值,ssh 在連線埠 22 聆聽進入的連線。一個駭客如果要斷定 ssh 是否在你的機器上執行,他最大可能就是掃描連線埠 22。一個有效混淆他的方法就是在非標準的連線埠上執行 ssh。任何未被使用的連線埠都可行,但首選的是 1024 以上的。很多人選用 2222 作為替代的連線埠(它很易記),正如 8080 經常被用作 HTTP 的替代連線埠。正正由於這個原因令它不是個好的選擇,因為任何掃描連線埠 22 的駭客亦不會放過連線埠 2222。隨機地選用一個未被使用的高位連線埠會比較合宜。要進行改動,請在你的 /etc/ssh/sshd_config 檔內加入以下一行:

# 在非標準的連線埠上執行 ssh:
Port 2345  #修改我

然後重新啟動 sshd 服務。請勿忘記在你的路由器及相關的防火牆規則裡作出任何必要的改動。譬如在 CentOS 7 你需要更改 firewalld:

$ firewall-cmd --add-port 2345/tcp
$ firewall-cmd --add-port 2345/tcp --permanent

又或者在 CentOS 6:

$ iptables -I INPUT -p tcp --dport 2345 -j ACCEPT

在 CentOS 6 及以上版本,你亦需要更新 selinux,並正確地標籤所選用的連線埠,否則 sshd 便無法存取它。舉個例說:

$ semanage port -a -t ssh_port_t -p tcp 2345 #請更改這處

因為 ssh 不再在標準的連線埠上聆聽連線,你須要告訴客戶端要連線到哪個連線埠。在指令行上執行 ssh 客戶端時,你可以用 -p 選項來指定連線埠:

$ ssh -p 2345 myserver

又或者如果你使用 konqueror 的 fish 協議,你可用:

fish://myserver:2345/remote/dir

如果你覺得每次連線時都要指定連線埠似乎很痛苦,你只需在你個人的 ~/.ssh/config 檔案裡加入一個指定連線埠的記錄:

 # 客戶端 ~/.ssh/config
Host myserver
HostName 72.232.194.162
        User bob
        Port 2345

~/.ssh/config 必須有以下存取權:

$ chmod 600 ~/.ssh/config

6. 在防火牆過濾 SSH

linux 裡有很多防火牆可以用,像是 iptables , ufw 或 firewall-cmd. 直接使用:

sudo ufw allow 22

上面的指令可以直接開啟某一個 port number.

如果你只須由一個 IP 位址進行遠端存取(例如由辦工室進入家中的伺服器),請考慮在你的路由器或 iptables 內加入一條防火牆的規則,將連線埠 22 的存取權限制到特定的 IP 位址,藉此對連線進行過濾。舉個例說,在 iptables 內你可以用這型別的規則達至這個目的:

iptables -A INPUT -p tcp -s 72.232.194.162 --dport 22 -j ACCEPT

SSH 亦對 TCP 包裝函式有內建支援,因此 ssh 服務的存取權亦可同時用 host.allow 及 hosts.deny 來進行管制。

如果你無法限制來源地的 IP 位址,而必須公開 ssh 連線埠,那麼 iptables 依然可以透過記錄及攔截來自同一 IP 位址的重覆登入嘗試,幫助你阻止強行的攻擊。例如:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT

第一條規則利用 recent 模組來記錄每個存取連線埠 22 的新嘗試。第二條規則檢查這個 IP 位址在過去 60 秒內有否嘗試 4 次或以上的連線,若然沒有更接納封包。注意這個規則須要輸入鏈採用 DROP 的預設政策。

如果你在非標準的連線埠上執行 ssh,請不要忘記對連線埠作出相應修改。情況許可的話,利用防火牆進行過濾是一個非常有效的方法來保衛 ssh 伺服器。

採用 FirewallD 服務的系統,可執行下列 firewall-cmd:

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 22 -m state --state NEW -m recent --set
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset
firewall-cmd --reload

7. 採用公鑰/私鑰來驗證

採用加密金鑰來驗證提供兩大好處。首先,如果你應用公鑰/私鑰,是方便,因為你不用再輸入密碼(除非你用密碼來保護你的金鑰)。第二,當伺服器能進行金鑰對的驗證,你便可以完全停用密碼驗證,意即存取時靠賴授權的金鑰 —— 因此不再有猜測密碼的嘗試。

建立及在你的 ssh 伺服器上安裝金鑰對是個相對地簡單的過程。

首先,在你會用來連線到伺服器的客戶端上建立一對金鑰(你須要在每臺用來連線的機器上這樣做):

$ ssh-keygen -t rsa

這樣做會在你的(隱藏了的)~/.ssh 目錄內建立兩個檔案,名叫:id_rsa 及 id_rsa.pub。第一個檔案:id_rsa 是你的私鑰,而另一個:id_rsa.pub 是你的公鑰。

如果你不想每次連線時都被問及密碼(它是用來解開特定的公鑰),在建立金鑰對的時候,你只須按 enter 作為密碼。建立金鑰對時,是否以密碼加密純粹是你的決定。如何你不將金鑰加密,任何人奪得你的本地機器後,便自動擁有遠端伺服器的 ssh 存取權。此外,本地機器上的 root 能夠存取你的金鑰:但假若你不能信任 root(或者 root 已被攻佔),你已經大禍臨頭。將金鑰加密捨棄了不用密碼的 ssh 伺服器,來換取額外的安全,得來的就是輸入密碼來使用這條金鑰。你可利用 ssh_agent 這個程式進一步簡化這個程式。

現在為你的私鑰設定許可權:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa

請將公鑰(id_rsa.pub)複製到伺服器上,然後安裝它在 authorized_keys 清單內:

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

註:一旦你匯入了公鑰,你可以在伺服器上刪除它。

最後,設定伺服器上的檔案許可權:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

如果 /etc/ssh/sshd_config 內的 StrictModes 被啟用(預設值),以上的許可權是必須的

請確保你已設定正確的 SELinux 脈絡:

$ restorecon -Rv ~/.ssh

現在當你登入伺服器的時候,你便不用再輸入密碼(除非你在建立金鑰對的時候輸入了一個密碼)。ssh 預設是會先利用金鑰進行驗證。如何它找不到金鑰,或驗證失敗,ssh 會回落到平常的密碼驗證。

一旦你檢查過可以用金鑰對來登入伺服器,你可以在你的 /etc/ssh/sshd_conf 檔內加入以下設定來停用密碼驗證:

# 停用密碼驗證,強制使用金鑰
PasswordAuthentication no

8. 常見問題(FAQ)

問:CentOS 採用 X 版的 OpenSSH,而最新版本是 Y 版。X 版藏有一個嚴重的安全性漏洞,我應否升級?

答:不應該。上游供應者有一個政策,會將最新版本的安全性修正反向移植到現有的發行版本內。只要你擁有最新的更新,你的 CentOS 發行版本已經得到全面修正。有關反向移植安全性修正的詳情,請參閱這裡:

問:我如何令 ssh 容讓以 NFS 共享使用者主目錄的機器採用無密碼的驗證?

答:SELinux 預設攔阻 root 存取以 NFS 共享、非公用的目錄及檔案,因此 ssh 無法讀取 ~/.ssh 內的使用者金鑰檔。若要批準存取權,請用以下指令更改 use_nfs_home_dirs 的設定值:

setsebool -P use_nfs_home_dirs 1

9. 連結