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

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

 

爲何使用證書登陸?經過SSH(Secure Shell)登陸Linux服務器認證方式有密碼和證書兩種,證書登陸更加安全。linux

=========================================================================shell

流程:vim

建立容許登陸的用戶及用戶組;配置服務器上的sshd_config;客戶端生成證書的私鑰與公鑰對;服務器添加公鑰;使用私鑰登陸服務器及其FTPwindows

=========================================================================瀏覽器

準備:安全

登陸Shell軟件:PuTTY;證書生成軟件:puttygen服務器

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

登陸FTP軟件:FileZillassh

下載地址: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/

相關文章
相關標籤/搜索