根據項目要求,需要將項目遷移到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里粘貼公鑰,如果使用的是阿里雲服務器,直接在瀏覽器端的遠程連接粘貼公鑰會有大坑,可能部分字符串被轉成命令執行。
# echo “ssh-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.100 及 192.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/
