如何創建一個足夠安全的SSH鏈接?

1 概述

使用SSH鏈接服務器是一件很日常的事,可是,鏈接是否足夠安全是一個使人擔心的問題。本文從以下幾個方面介紹瞭如何創建一個足夠安全的SSH鏈接:python

  • 端口
  • 協議
  • 用戶
  • 密碼
  • 密鑰對
  • ssh-agent

2 端口

第一步就是修改默認端口22,修改/etc/ssh/sshd_config中的Port便可,好比這裏修改成1234端口:算法

Port 1234

注意這裏須要配合SELinu添加端口,不然不能啓動sshd服務,在CentOS8中能夠經過semanage添加端口,首先查看是否安裝policycoreutils-python-utilsubuntu

rpm -qa | grep policycoreutils-python-utils

若是沒有安裝就使用yum安裝:安全

sudo yum install policycoreutils-python-utils

接着添加ssh端口:bash

sudo semanage port -m -t ssh_port_t -p tcp 1234

查看是否添加成功:服務器

sudo semanage port -l | grep ssh

在這裏插入圖片描述

3 SSH協議

SSH2協議要比SSH1安全,所以建議使用,一樣修改配置文件:ssh

Protocol 2 # 若是沒有就末尾添加

注意服務器添加Protocol 2後,客戶端也須要在/etc/ssh/sshd_config中添加Protocol 2tcp

4 超時斷開

修改成60s未操做自動斷開:函數

ClientAliveInterval 60 
# 以秒爲單位,超過60s未操做自動斷開

ClientAliveCountMax 0 
# 若是客戶端沒有響應則判斷一次超時,該參數設置容許超時的次數

5 限制用戶

5.1 禁用Root用戶登陸

PermitRootLogin no

5.2 指定用戶登陸

AllowUsers testuser

這樣只能經過ssh testuser@ip鏈接到該服務器。加密

另外還能夠爲用戶添加指定ip,好比筆者的本機內網ip192.168.1.7,修改成:

AllowUser testuser@192.168.1.7

這樣其餘ip就不能登陸了。

5.3 禁用特定用戶登陸

DenyUser testuser

禁止經過testuser登陸。

相似的配置還有AllowGroupsDenyGroups

6 密碼

6.1 禁用(空)密碼登陸

PermitEmptyPasswords no
PasswordAuthentication no

6.2 錯誤次數

MaxAuthTries 6

默認爲最多容許3次密碼錯誤(須要除2),修改成2則表示若是密碼輸入錯誤一次即自動斷開。

7 日誌

LogLevel VERBOSE

默認爲INFO,修改成VERBOSE能夠獲得更加詳細的信息。

8 密鑰對

8.1 生成密鑰對

上面已經設置了不能使用密碼登陸,那麼,換句話說須要使用密鑰登陸,生成密鑰並不難:

ssh-keygen -t rsa

只須要指定算法便可,默認爲3072位,可選4096位。

可是,相比起傳統的RSA,在OpenSSH 6.5中引入了另外一種叫Ed25519的更加安全的算法,使用橢圓曲線進行加密。Ed25519相比起RSA的優勢有:

  • 體積更小:相比起RSA 3072544個字符,Ed25519只有68個字符
  • 更快:生成速度比RSA快,同時簽名速度也比RSA
  • 更安全:簽名過程不依賴隨機數生成器,不依賴哈希函數的防碰撞特性,沒有時間通道攻擊的問題

生成方式很簡單:

ssh-keygen -a 100 -t ed25519 -f ~/.ssh/ed25519

參數說明以下:

  • -a:指定KDFKey Derivation Function)的輪數
  • -t:指定算法,可選dsaecdsaecdsa-sked25519ed25519-skrsa
  • -f:指定位置

生成以後複製公鑰便可:

ssh-copy-id user@ip -i ~/.ssh/ed25519.pub

8.2 私鑰密碼

好比按上述方式生成密鑰對時,會提示輸入私鑰密碼:

在這裏插入圖片描述

這裏的密碼會在使用私鑰鏈接的時候提示:

在這裏插入圖片描述

8.3 使用不一樣密鑰對

假設您有多臺服務器:server1server2server3,則能夠爲不一樣服務器使用不一樣的密鑰對,而不是使用同一個密鑰對:

ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server3

接着複製公鑰到對應的服務器上:

ssh-copy-id user@server1 -i ~/.ssh/server1.pub
ssh-copy-id user@server2 -i ~/.ssh/server2.pub
ssh-copy-id user@server3 -i ~/.ssh/server3.pub

9 ssh-agent

9.1 這是什麼?

ssh-agent是一個程序,能夠幫助管理私鑰。代理能提供以下用途:

  • 自動選擇密鑰:使用不一樣密鑰鏈接到不一樣主機時,須要手動指定密鑰(好比上面的使用不一樣密鑰對的例子中,鏈接到不一樣服務器時須要加上-i參數),ssh-agent能夠自動選擇,不須要手動指定
  • 自動輸入私鑰密碼:若是私鑰設置了密鑰(好比上面的私鑰密碼例子),可是又須要頻繁地使用私鑰進行認證時,ssh-agent能夠幫助自動輸入私鑰的密碼

9.2 使用

首先啓動:

eval `ssh-agent` # 注意是反引號

接着添加私鑰:

# 以上面「使用不一樣的密鑰對」爲例
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1

這樣鏈接的時候就不須要手動指定-i參數了。

若是私鑰指定了密碼,會在ssh-add時進行提示輸入:

在這裏插入圖片描述

這樣下次使用帶密鑰的私鑰鏈接時就不須要輸入密碼了。

10 2FA

Two-Factor Authentication,縮寫2FA,意爲雙重認證雙因子認證等等,顧名思義就是進行兩步認證的操做,可選的應用有:

  • Google Authenticator
  • Authy
  • Yubico
  • Duo

好比Google Authenticator,安裝以後,鏈接服務器須要進行輸入驗證碼的操做。

具體的話就不演示了,由於筆者須要常常鏈接,所以這個選項對筆者來講不太實際,想要實現的話具體能夠參考這裏

11 參考

相關文章
相關標籤/搜索