配置SSH服務使用證書登錄Ubuntu服務器


根據項目要求,需要將項目遷移到Linux系統上,作為測試,選用的是阿里雲服務器,1核CPU,1G內存(沒錯就是這么窮),操作系統Ubuntu 16.04 64位。當然其實如果使用阿里雲服務器其實是不需要單獨配置證書登錄的,因為可以在創建運行實例時直接配置證書登錄。不過因為之前我沒接觸過Linux系統,配置服務器的時候也沒有人提過登錄方式的問題,當有人提的時候服務器里別人裝了很多東西,我想如果重裝系統會被打,所以就折騰了一下,還能多水一篇博客,豈不美哉?總之閑話少說。

 

為什么使用證書登錄?通過SSH(Secure Shell)登錄Linux服務器認證方式有密碼和證書兩種,證書登錄更加安全。

=========================================================================

流程:

創建允許登錄的用戶及用戶組;配置服務器上的sshd_config;客戶端生成證書的私鑰與公鑰對;服務器添加公鑰;使用私鑰登錄服務器及其FTP

=========================================================================

准備:

登錄Shell軟件:PuTTY;證書生成軟件:puttygen

下載地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

登錄FTP軟件:FileZilla

下載地址:https://filezilla-project.org/

登錄Shell軟件XShell,登錄FTP軟件XFtp(推薦):

http://www.xshellcn.com/xiazai.html

=========================================================================

創建允許登錄的用戶及用戶組:

創建用戶:

# adduser userxxx

 

創建用戶組:

# groupadd groupxx

 

將用戶退出原來的默認組並添加到一個已有用戶組:

# usermod -g groupxx userxxx

 

如果不希望退出原來的組,使用-a(refers to append)並需要與-G(注意大寫)配合

# usermod -a -G groupxx userxxx

 

從組中刪除一個用戶,但是要求groupxx不是userxxx的主組

# gpasswd -d userxxx groupxx

 

檢查是否成功創建用戶:可以查看到該user的uid,主組id,所在組

# id userxxx

 

賦予用戶root權限

# vim /etc/sudoers

 

找到# User privilege specification,在root下面添加用戶

root ALL=(ALL:ALL) ALL
# password needed when shifting user
userxxx ALL=(ALL:ALL) ALL
# password NOT needed when shifting user
userxxx ALL=(ALL:ALL) NOPASSWD:ALL

 

=========================================================================

 

配置服務器上的sshd_config:

注意:由於阿里雲的服務器可以直接在控制台遠程訪問,因此坑少了很多,如果服務器只能通過客戶端登錄需要注意,在配置證書過程中需要禁用root登錄,禁用用戶密碼登錄,因此注意不要把自己鎖在服務器外面。

配置sshd_config文件

# vim /etc/ssh/sshd_config

 

修改端口:默認為22,建議自定義,一般高於2000不超過65555

Port 2222

 

請確認修改后的端口能正常訪問,以阿里雲服務器為例,需要在管理控制台中設置安全組規則允許2222端口正常訪問服務器。

協議:沒有特殊原因不要使用協議1

Protocol 2

 

登錄控制:

允許密鑰登錄

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

 

不允許空密碼登錄

PermitEmptyPasswords no

 

禁止圖形界面轉發及TCP轉發

AllowTcpForwarding no
X11Forwarding no

 

允許SFTP

Subsystem sftp /usr/lib/openssh/sftp-server

 

禁止root賬戶登錄

PermitRootLogin no

 

允許SSH登錄的用戶名/用戶組:使用用戶組更方便維護iii

AllowGroups groupxx
#AllowUsers userxxx

 

禁用密碼登錄:為防誤操作,禁用密碼登錄可以等測試證書登錄通過后再設置,否則會把自己關在服務器外。

PasswordAuthentication no

 

記錄詳細日志

LogLevel VERBOSE

 

=========================================================================

客戶端生成私鑰/公鑰對:

客戶端為windows:

打開puttygen.exe 默認key_type為RSA(SSH-2)位數為2048,推薦設置位數4096,點擊generate,鼠標隨機在上面空白處移動,證書就根據這些隨機點產生,等進度條走完即可。

 

生成key后可以修改comment標識key的用途。

保存public key,如果使用文本編輯器打開,類似下圖:

 

但是更方便的一種做法,是直接拷貝生成的public key,暫存到文本文檔里備用

保存private key

保存私鑰前可以對private key設置密碼,每次使用證書登錄前都要驗證密碼,更加安全,但是不設置也是可以的(我比較懶)。不設置的話會有提示確認是否不設置密碼。

 

=========================================================================

服務器上配置用戶公鑰:

注意之前設置的公鑰位置是:

AuthorizedKeysFile %h/.ssh/authorized_keys

 

也就是用戶目錄里的.ssh/authorized_keys

創建對應目錄及文件:

# mkdir /home/userxxx/.ssh
# touch /home/userxxx/.ssh/authorized_keys

 

使用echo指令將公鑰內容附加到指定文件結尾:

注意:最好在shell里粘貼公鑰,如果使用的是阿里雲服務器,直接在瀏覽器端的遠程連接粘貼公鑰會有大坑,可能部分字符串被轉成命令執行。

# echossh-rsa AA…..(content_of_pubkey)” >> /home/userxxx/.ssh/authorized_keys

 

修改文件訪問權限:

# chmod 700 /home/userxxx/.ssh
# chmod 600 /home/userxxx/.ssh/authorized_keys

 

重啟SSH服務:

# systemctl restart sshd

 

=========================================================================

到這里就可以使用證書登錄了:

客戶端為windows時,使用PuTTY

輸入正確的HostName(IP Address)與Port,在左側的Connection/SSH/Auth中設置Private Key File位置,回到Session保存,方便下次打開,點擊右下的Open,輸入用戶名(如果私鑰設置了密碼還需要輸入密碼)即可連接到服務器了。

SFTP連接:使用FileZilla

在站點管理器中新建站點:主機端口與上面相同,協議(Protocal)選擇SFTP,登錄類型選擇密鑰文件,填好用戶名及密鑰文件位置即可登錄成功。

 

因為實驗室習慣使用XShell和XFtp客戶端,而這兩個客戶端似乎無法使用由PuTTYgen生成的密鑰對,因此需要重新通過Xshell生成密鑰對。

首先新建會話,填好主機和端口后在左欄找到用戶身份驗證,方法選擇Public Key, 填寫用戶名,瀏覽用戶密鑰,在對話框中點擊生成,推薦密鑰類型為RSA,長度為4096,按照向導填寫導出的密鑰名稱、私鑰密碼等信息,下一步獲取公鑰,並將新的公鑰在服務器上注冊(如果之前已經注冊過,可以將新的公鑰直接使用echo命令追加到/home/userxxx/.ssh/authorized_keys文件后,如果之前沒有注冊過,請參考上文注冊的步驟)。完成在服務器的注冊后,回到XShell,選擇剛才生成的私鑰,確定連接即可。再轉到XFtp可以直接找到剛才生成的密鑰並進行連接,注意協議使用SFTP即可。

=========================================================================

如果客戶端是Linux或Mac:

不需要用到軟件,直接在命令行生成密鑰對或訪問服務器即可:

生成密鑰對:

# ssh-keygen -t rsa -b 4096 -o -a 100 -C “KEY_COMMENT”

 

-t設置密鑰類型,-b設置密鑰位數,-C設置注釋

提示的passphrase就是為私鑰設置的密碼,不設置的話直接兩次回車即可。

默認情況下,生成的密鑰保存在當前用戶的.ssh文件夾下,id_rsa是私鑰,id_rsa.pub是公鑰。

使用證書登錄服務器:

# ssh -I /path_of_private_key/id_rsa userxxx@<server_ip> -p 2222

 

或者設置配置文件快速訪問服務器:

# vim ~/.ssh/config
Host server1
  User userxxx
  Host server_ip
  Port 2222
  ServerAliveInterval 30
  IdentityFile /path_of_private_key/id_rsa
 
Host server2
  …
  …

 

使用以下命令即可登錄服務器:

# ssh server1

 

=========================================================================

附錄

SSH配置參數詳解:http://0001111.iteye.com/blog/1980857

/etc/ssh/sshd_config文件常用參數:

# 1. 關於 SSH Server 的整體設定,包含使用的 port 啦,以及使用的密碼演算方式  
Port 22          # SSH 預設使用 22 這個 port,您也可以使用多的 port !  
              # 亦即重復使用 port 這個設定項目即可!  
Protocol 2,1        # 選擇的 SSH 協議版本,可以是 1 也可以是 2 ,  
              # 如果要同時支持兩者,就必須要使用 2,1 這個分隔了!  
#ListenAddress 0.0.0.0   # 監聽的主機適配卡!舉個例子來說,如果您有兩個 IP,  
              # 分別是 192.168.0.100192.168.2.20 ,那么只想要  
              # 開放 192.168.0.100 時,就可以寫如同下面的樣式:  
ListenAddress 192.168.0.100          # 只監聽來自 192.168.0.100 這個 IP 的SSH聯機。  
                   # 如果不使用設定的話,則預設所有接口均接受 SSH  
PidFile /var/run/sshd.pid      # 可以放置 SSHD 這個 PID 的檔案!左列為默認值  
LoginGraceTime 600     # 當使用者連上 SSH server 之后,會出現輸入密碼的畫面,  
              # 在該畫面中,在多久時間內沒有成功連上 SSH server ,  
              # 就斷線!時間為秒!  
Compression yes      # 是否可以使用壓縮指令?當然可以?!  
   
# 2. 說明主機的 Private Key 放置的檔案,預設使用下面的檔案即可!  
HostKey /etc/ssh/ssh_host_key    # SSH version 1 使用的私鑰  
HostKey /etc/ssh/ssh_host_rsa_key  # SSH version 2 使用的 RSA 私鑰  
HostKey /etc/ssh/ssh_host_dsa_key  # SSH version 2 使用的 DSA 私鑰  
  
# 2.1 關於 version 1 的一些設定!  
KeyRegenerationInterval 3600     # 由前面聯機的說明可以知道, version 1 會使用   
                   # server 的 Public Key ,那么如果這個 Public   
                   # Key 被偷的話,豈不完蛋?所以需要每隔一段時間  
                   # 來重新建立一次!這里的時間為秒!  
ServerKeyBits 768           # 沒錯!這個就是 Server key 的長度!  
# 3. 關於登錄文件的訊息數據放置與 daemon 的名稱!  
SyslogFacility AUTH         # 當有人使用 SSH 登入系統的時候,SSH會記錄資  
                   # 訊,這個信息要記錄在什么 daemon name 底下?  
                   # 預設是以 AUTH 來設定的,即是 /var/log/secure  
                   # 里面!什么?忘記了!回到 Linux 基礎去翻一下  
                   # 其它可用的 daemon name 為:DAEMON,USER,AUTH,  
                   # LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,  
LogLevel INFO            # 登錄記錄的等級!嘿嘿!任何訊息!  
                   # 同樣的,忘記了就回去參考!  
# 4. 安全設定項目!極重要!  
# 4.1 登入設定部分  
PermitRootLogin no     # 是否允許 root 登入!預設是允許的,但是建議設定成 no!  
UserLogin no        # 在 SSH 底下本來就不接受 login 這個程序的登入!  
StrictModes yes      # 當使用者的 host key 改變之后,Server 就不接受聯機,  
              # 可以抵擋部分的木馬程序!  
#RSAAuthentication yes   # 是否使用純的 RSA 認證!?僅針對 version 1 !  
PubkeyAuthentication yes  # 是否允許 Public Key ?當然允許啦!只有 version 2  
AuthorizedKeysFile      .ssh/authorized_keys  
              # 上面這個在設定若要使用不需要密碼登入的賬號時,那么那個  
              # 賬號的存放檔案所在檔名!  
# 4.2 認證部分  
RhostsAuthentication no  # 本機系統不止使用 .rhosts ,因為僅使用 .rhosts 太  
              # 不安全了,所以這里一定要設定為 no !  
IgnoreRhosts yes      # 是否取消使用 ~/.ssh/.rhosts 來做為認證!當然是!  
RhostsRSAAuthentication no # 這個選項是專門給 version 1 用的,使用 rhosts 檔案在  
              # /etc/hosts.equiv配合 RSA 演算方式來進行認證!不要使用  
HostbasedAuthentication no # 這個項目與上面的項目類似,不過是給 version 2 使用的!  
IgnoreUserKnownHosts no  # 是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄  
              # 的主機內容?當然不要忽略,所以這里就是 no 啦!  
PasswordAuthentication yes # 密碼驗證當然是需要的!所以這里寫 yes ?!  
PermitEmptyPasswords no  # 若上面那一項如果設定為 yes 的話,這一項就最好設定  
              # 為 no ,這個項目在是否允許以空的密碼登入!當然不許!  
ChallengeResponseAuthentication yes  # 挑戰任何的密碼認證!所以,任何 login.conf   
                   # 規定的認證方式,均可適用!  
#PAMAuthenticationViaKbdInt yes      # 是否啟用其它的 PAM 模塊!啟用這個模塊將會  
                   # 導致 PasswordAuthentication 設定失效!  
   
# 4.3 與 Kerberos 有關的參數設定!因為我們沒有 Kerberos 主機,所以底下不用設定!  
#KerberosAuthentication no  
#KerberosOrLocalPasswd yes  
#KerberosTicketCleanup yes  
#KerberosTgtPassing no  
   
# 4.4 底下是有關在 X-Window 底下使用的相關設定!  
X11Forwarding yes  
#X11DisplayOffset 10  
#X11UseLocalhost yes  
# 4.5 登入后的項目:  
PrintMotd no              # 登入后是否顯示出一些信息呢?例如上次登入的時間、地點等  
             # 等,預設是 yes ,但是,如果為了安全,可以考慮改為 no !  
PrintLastLog yes     # 顯示上次登入的信息!可以啊!預設也是 yes !  
KeepAlive yes       # 一般而言,如果設定這項目的話,那么 SSH Server 會傳送  
             # KeepAlive 的訊息給 Client 端,以確保兩者的聯機正常!  
             # 在這個情況下,任何一端死掉后, SSH 可以立刻知道!而不會  
             # 有僵屍程序的發生!  
UsePrivilegeSeparation yes # 使用者的權限設定項目!就設定為 yes 吧!  
MaxStartups 10      # 同時允許幾個尚未登入的聯機畫面?當我們連上 SSH ,  
             # 但是尚未輸入密碼時,這個時候就是我們所謂的聯機畫面啦!  
             # 在這個聯機畫面中,為了保護主機,所以需要設定最大值,  
             # 預設最多十個聯機畫面,而已經建立聯機的不計算在這十個當中  
# 4.6 關於使用者抵擋的設定項目:  
DenyUsers *        # 設定受抵擋的使用者名稱,如果是全部的使用者,那就是全部  
             # 擋吧!若是部分使用者,可以將該賬號填入!例如下列!  
DenyUsers test  
DenyGroups test      # 與 DenyUsers 相同!僅抵擋幾個群組而已!  
# 5. 關於 SFTP 服務的設定項目!  
Subsystem       sftp    /usr/lib/ssh/sftp-server  

 

=========================================================================

參考:

用戶管理相關:

https://cnzhx.net/blog/linux-add-user-to-group/#usermod

http://634871.blog.51cto.com/624871/1325907

SSH配置相關:

https://cnzhx.net/blog/linux-server-ssh-key-auth-configuration/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM