SSH是一套網絡協議,目的在於安全的網絡服務與加密遠程登錄。
實現SSH協議的最主流的開源軟件是OpenSSH
Secure Shell是Linux系統首選的登錄方式,數據加密,安全傳輸,主要方式有兩種:
對稱加密(秘鑰加密)只有一個秘鑰
非對稱加密(公鑰加密)有一對秘鑰
非對稱加密分為:公鑰(Public Key)與私鑰(Private Key)
使用公鑰加密后的密文,只能使用對應的私鑰才能解開,破解的可能性很低
此種方式是公鑰私鑰放在Server端,即使client在登錄的時候,傳輸數據被竊取,黑客也沒有私鑰進行解密,因此保證了數據安全。
公鑰理解為一把鎖,私鑰是其對應的鑰匙,公鑰針對密碼加密,私鑰放在Server端
登錄Linux服務器的形式
①基於口令,賬號密碼的登錄形式
②基於公鑰,實現免密登錄
一、【基於口令驗證】
在用xshell初次登錄某虛擬機時:ssh root@192.168.178.110(可以直接輸密碼登錄,也可以如下步驟驗證遠程秘鑰之后再輸入密碼登錄)
會提示
The authenticity of host 'pyyuc (192.168.178.110)' can't be established. ECDSA key fingerprint is SHA256:CVwhwfUiD53HpLPrretR4pGltYRL6QB+5lyI. Are you sure you want to continue connecting (yes/no)? yes
這一段ssh連接的信息,表述的是無法確認192.168.178.110這台機器的真實性,但是知道了這台機器的指紋,SHA256:CVwhwfUiD53HpLPrretR4pGltYRL6QB+5lyI,讓用戶自行確認是否登錄
這時候就要驗證遠程 主機指紋是否正確
遠程掃描server指紋信息
$ssh-keyscan -t ecdsa 192.168.178.110 | ssh-keygen -lf -#192.168.178.110 SSH-2.0-OpenSSH_7.4 256
SHA256:CVwhwfUkaLPrretR4pGltYRL6QB+5lyI 123.206.16.61 (ECDSA)
系統此時應該會返回一句信息
Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.178.110' (ECDSA) to the list of known hosts. root@192.168.178.110's password:
此時表示Client已經確認Server的身份,准備開始連接,輸入Server機器的密碼,如果密碼正確,則可以登錄。
二、【基於公鑰認證】--免密登錄

公鑰登錄流程如下
- client發送自己的
公鑰給server,寫入server的authorized_keys中 - server端接收到client的連接請求后,在自己的
authorized_keys文件中匹配client的公鑰信息pubkey,並且生成一個隨機數R,使用client的公鑰pibkey針對該隨機數R進行加密,得到一個加密后的隨機數pubkey(R) - client通過私鑰進行解密得到
隨機數R,再對隨機數R和當前會話的sessionkey采用MD5生成摘要Digest1,再發送給server端 - server端會對隨機數R和當前client的sessionkey用同樣摘要算法生成Digest2
- 結果比較client發來的Digest1與Digest2是否一致,正確則完成認證
配置SSH公鑰認證
1.client本地生成公私鑰
[root@linux .ssh]# ssh-keygen -t rsa #指定rsa密鑰類型,默認一路回車 #會生成如下的公私鑰 Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub.
2.client發送自己的公私鑰到server中
#發送自己的公鑰,寫入到遠端server的authorized_keys中 $ssh-copy-id root@192.168.178.110 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/yuchao/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.178.1101's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.178.110'" and check to make sure that only the key(s) you wanted were added.
3.此時可以免密登錄了
$ssh root@192.168.178.110 #直接輸入登錄命令即可 Last failed login: Fri Jan 3 16:54:46 CST 2020 from 189.39.13.1 on ssh:notty There were 3 failed login attempts since the last successful login. Last login: Fri Jan 3 16:14:59 2020 from 222.35.146.118 [root@linux ~]# [root@linux ~]# cat ~/.ssh/authorized_keys #檢查server中的秘鑰 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbkHjqnRe31HCteHc0BSfovvs9GqutyBfWvAJQy51Std1Ir3qBnHs29aKjwPL/jm/xH
[root@linux ~]# exit #登出linux$ cat ~/.ssh/id_rsa.pubssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbkHjqnRe31HCteHc0BSfovvs9GqutyBfWvAJQy51Std1Ir3qBnHs29aKjwPL/jm/xH
【ssh配置文件】
和Linux用戶有關ssh的配置文件,存放在此路徑:$HOME/.ssh/
(沒有/root/.ssh的話配置一次免密登錄就可以)
[root@ .ssh]# pwd
/root/.ssh
[root@ .ssh]# ls
authorized_keys id_rsa id_rsa.pub known_hosts
- Known_hosts:當Client接收Server的公鑰以后,Server的公鑰信息會放在Client
$HOME/.ssh/known_hosts文件中,下次再次連接的時候,系統能夠識別出Server的公鑰已經存在了本地,因此可以跳過警告部分,直接提示輸入密碼了 - authorized_keys:Server遠程主機將
用戶的公鑰,保存在已登錄用戶的$HOME/.ssh/authorized_keys文件中。(用於客戶端免密登錄使用) - id_rsa:私鑰文件
- id_rsa.pub:公鑰文件
三、ssh與服務器安全實戰
和Linux用戶有關ssh的配置文件,存放在此路徑:$HOME/.ssh/
ssh服務的配置文件存放於/etc/ssh/sshd_config
# grep -Ev '^$|^[# ]' /etc/ssh/sshd_config(config內容太多,用grep過濾一下)
在生產服務器下,運維人員一般會禁止root用戶登錄服務器,最大程度的保證服務器的安全,被黑客攻擊的幾率,以及修改ssh的遠程連接端口
修改ssh的端口 ,Port 23354
禁止root登錄,PermitRootLogin no
禁止用密碼登錄,只能用被信任的機器,用公私鑰進行登錄,PasswordAuthentication no
1、vim 編輯sshd_config文件以下內容
Port 23354
AddressFamily any
ListenAddress 0.0.0.0
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
PermitRootLogin no
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
UseDNS no
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
注意了,此時別立即重啟服務
2、配置一個普通用戶的賬號,且支持公鑰登錄的形式
①登錄服務器,創建普通用戶,設置登錄密碼
useradd yu
passwd yu
②在自己本地機器,生成一個普通用戶的公私鑰對
ssh-keygen -t rsa
③發送公鑰給服務器,配置公鑰登錄
ssh-copy-id yu@192.168.178.110
④在正確配置了公私鑰登錄之后,yu這個用戶就可以免密登錄linux服務器了
ssh yu@192.168.178.110
3、在linux機器上配置yu用戶支持sudo命令
①使用root登錄服務器,配置yu用戶支持sudo命令
vim /etc/sudoers文件
添加如下行
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
yu ALL=(ALL) ALL
②此時嘗試用yu用戶登錄,是否能夠使用sudo命令
sudu ls /root
4、使用root賬號,重啟linux的sshd服務器
以后root用戶就無法使用密碼登錄了,只能用yuchao這個用戶進行免密登錄,最大程度保證服務器的安全了
①使用root用戶重啟sshd服務
ssh root@192.168.178.142
②重啟sshd服務
systemctl restart sshd
③此時機器已經禁止root登錄,禁止密碼登錄,且修改了ssh端口為23354
④此時只能使用配置好的yu用戶進行免密登錄了
ssh yu@192.168.178.142 -p 23354
