一。公鑰認證排錯#
1、確保公鑰正確
2、確保~/.ssh/authorized_keys 檔案權限為 600
3、確保家目錄以及.ssh 目錄權限為 755 以下權限,即屬組和其他人沒有 7 的權限
示例
--------------------------------------------------------------------------------------------
[root@cPen_web .ssh]# ssh -vvv wy@192.168.0.30 # 注:看ssh登錄時的詳細信息
#注:B機器下操作
[wy@cPen_web .ssh]$ vim authorized_keys # 注:把A機器的公鑰粘過去
[wy@cPen_web .ssh]$ chmod 600 authorized_keys
[wy@cPen_web home]$ chmod 755 wy # 注:公鑰認證家目錄其他人權限不能太高
[wy@cPen_web ~]$ chmod 755 .ssh # 注:給.ssh也是755 權限
二。登錄方式#
[root@cPen_web .ssh]# ssh wy@192.168.0.30
[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy
[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy -p 22 # 注:指定用戶,指定端口(默認22號端口)
[root@cPen_web .ssh]# ssh -vvv 192.168.0.30 wy # 注:查看登錄過程的詳細信息
…………
debug1: Trying private key: /root/.ssh/id_dsa
debug3: no such identity: /root/.ssh/id_dsa: No such file or directory
debug1: Trying private key: /root/.ssh/id_ecdsa
debug3: no such identity: /root/.ssh/id_ecdsa: No such file or directory
debug1: Trying private key: /root/.ssh/id_ed25519
debug3: no such identity: /root/.ssh/id_ed25519: No such file or directory
debug1: Trying private key: /root/.ssh/id_xmss
debug3: no such identity: /root/.ssh/id_xmss: No such file or directory
…………
#注:默認會去尋找~/.ssh/id_rsa,然後再找id_dsa等等...
#注:rsa dsa ecdsa 加密算法
---------------------------------------------------------------------------------------------------------------------------------
#注:不接任何用戶名,會以A機器上的當前用戶去登錄B機器上的同名用戶(不管B機器有沒有這個用戶) (沒有就登錄失敗)
[sanchuang@cPen_web ~]$ ssh 192.168.0.30
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
sanchuang@192.168.0.30's password:
[sanchuang@cPen_web ~]$
----------------------------------
#注:登錄時默認會去尋找家目錄下的~/.ssh/id_rsa去進行認證,所有盡量不要在生成key的時候將它的默認路徑更改
三。登錄驗證原理 - 密碼登錄#
1、密碼登錄
client 向 server 發送登陸請求,server 將自己的公鑰發送給 client
client 使用這個公鑰,將密碼進行加密,發送給 server
server 用私鑰解密登錄密碼,驗證合法性
server 返回驗證結果給 client
這個流程有一個問題,怎麼保證收到的公鑰就是目標 server 的公鑰?(中間人攻擊)
如果一個攻擊者中途攔截了 client 的登錄請求,發送自己的公鑰給 client,client 端就會用攻擊者的公鑰進行數據加密,攻擊者接收到信息後,用自己的私鑰就可以解密了,這就竊取了 client 的登錄信息了
為了解決這個問題,client 端第一次登錄的時候,會進行一個公鑰確認
確認 server 服務端的這個 host 主機摘要,確認成功之後就會將 server 端的 pubkey 保存在~/know_hosts 裡面
以後每次連接都會驗證這個 know_hosts 裡的 key 和收到的 pubkey 是否一致
server 主機的 pubkey 保存在 /etc/ssh/ 目錄下,默認使用 ssh_host_ecdsa_key.pub
#注:SSH 基於公鑰加密的技術
#注:第一步 A 機器向 B 機器發送登錄請求(還沒有道輸入密碼的階段)
#注:B 機器接收到 A 機器的請求之後,把 B 機器的公鑰發送給 A 機器
#注:A 機器拿到公鑰之後,用公鑰對密碼進行加密(密碼是密文,不能讓別人知道)
#注:A 機器把加好密的這一串密文發給 B
#注: B 機器收到來此 A 機器的機密之後的密碼,用私鑰解密,得到 passwd,再與 /etc/shadow 密碼進行比較驗證是否通過
#注:B 機器向 A 機器返回登錄結果(成功或者失敗)
#注:密碼登錄涉及公鑰加密,ssh 整個都設計公鑰加密(無論是密碼登錄或公鑰登錄)
#注:沒有保證第 3 方人攻擊
#注:公鑰加密私鑰解密、私鑰加密公鑰解密(為了區分後面 +.pub)
#注:成對存在成對加解密
#注:第一次登錄機器時,一般會要輸入yes(是否信任B主機),然後把key放到know_hosts裡面
A機器下
[root@cPen_web .ssh]# ssh 192.168.0.30 -l wy -p 22
………………
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
………………
[root@cPen_web .ssh]# cat known_hosts
192.168.0.30 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A=
B機器下
[root@cPen_web .ssh]# cd /etc/ssh # 注:ssh服務的配置文件
[root@cPen_web ssh]# ls
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
[root@cPen_web ssh]# cat ssh_host_ecdsa_key.pub # 注:默認使用ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A=
#注:A機器保存的key就是B機器/etc/ssh/ssh_host_ecdsa_key.pub下面的
#注:A機器生成的公鑰就是B機器/etc/ssh/ssh_host_ecdsa_key.pub下面的
第一次登錄 輸入 yes 的原因:信任它
-# 注:為了增加安全性,第一次連接 B 主機的時候,都会進行一個主機確認(yes)
-# 注:輸入 yes 表示,是可信任主機,那就是將主機的 pubkey 保存在~/.ssh/known_hosts 裡面,以後每次連接都會驗證接收的 key 是否和 know_hosts 裡一致,不一致,會登錄異常
.--------------------------------------------------------------------------------------------------------------------------
-# 注:A 機器向 B 機器發送請求登錄
-# 注:B 機器向 A 機器返回公鑰
-# 注:如果 A 機器向 B 機器發送請求的時候,被 C 給攔截了
-# 注:C 就偽造一下,把它的公鑰發送給 A
-# 注:A 把密文用 C 的公鑰加密發送給 B,c 就可以拿自己的密鑰解密信息,不安全
-# 注:只能自己確認(人為確認)接收的公鑰是否是 B 機器的,輸入 yes,know_hosts 就是自己信任的主機,把 B 主機的公鑰保存到 know_hosts 裡面
-# 注:後續都會拿 know_hosts 裡面 這個公鑰和 B 發送的公鑰進行比較(密鑰不一致時會提示 登錄失敗不受信任)
-# 注:這個 key 是屬於主機的 key,驗證這台主機的
-# 注:公鑰登錄的 key 屬於用戶的,是驗證用戶的 key
四。登錄驗證原理 - 公鑰認證登錄#
2、公鑰認證登錄
client 端生成公鑰對,將公鑰追加在 server 端的~/.ssh/authorized_keys(1 行 1 個公鑰)
發送登錄請求,server 收到請求之後,生成隨機字符串發送給 client
client 用自己的私鑰對字符串進行加密,發送給 server
server 收到加密字符串之後用公鑰解密,比較解密出的字符串和之前生成的字符串是否一致
返回結果給 client
-# 注:公私鑰對是成對存在的,一個用於加密,一個用於解密,具體哪個為私鑰,哪個為公鑰就看使用者自己管理
注意:非對稱加密計數
使用公鑰進行加密,私鑰解密,基本用於數據加密
使用私鑰加密公鑰解密,用於認證(對數據加密性沒有要求,拿到就拿到)
-# 注:第一步在 A 機器上生成公鑰對
-# 注:B 主機將 A 主機的公鑰寫入 B 主機用戶的~/.ssh/authorized_keys 裡面
-# 注:A 主機向 B 機器發送登錄請求
-# 注:B 機器收到請求之後,會生成一個隨機字符串。把這個隨機字符串發送給 A 機器
-# 注:A 機器收到隨機字符串後,用私鑰加密
-# 注:A 機器將加密之後的字符串發送給 B 機器
-# 注:B 機器拿到 A 機器的加密字符串之後,用公鑰解密,再比較解密之後的字符串和生成的字符串是否一致。
-# 注:B 機器再返回結果-# 注:ABC3 台機器,A 上面的公鑰在 BC 上都有,C 也能公鑰解密,得到字符串(對數據加密性沒有要求,拿到就拿到)
五。總結#
5.1 SSH 服務介紹#
遠程 Shell 應用程序
- 允許用戶在遠程機器上執行任意命令
- 讓標準輸出在本地
- 早期明文遠程協議:telnet
SSH(Secure Shell,安全的外殼)
- 為客戶機提供安全的 Shell 環境,用於遠程管理
- 默認端口:TCP
22
SSH 基於公鑰加密(非對稱加密)技術
- 數據加密傳輸
- 客戶端和伺服器的身份驗證
5.2 公鑰加密體系#
** 公鑰(Public Key)和私鑰(Private Key) **
- 公鑰和私鑰是成對生成的,這兩個密鑰互不相同,兩個密鑰可以互相加密和解密
- 不能根據一個密鑰而推算出另外一個密鑰
- 公鑰對外公開,私鑰只有私鑰的持有人才知道
- 私鑰應該由密鑰的持有人妥善保管
根據實現的功能不同,可以分為數據加密和數字簽名
六。數據加密#
** 發送方使用接收方的公鑰加密數據 **
接收方使用自己的私鑰解密數據
數據加密能保證所發送數據的機密性
.--------------------------------------------------------------------------------------------------------------------------
-# 注:數據加密 主要是為了保障 接收方的數據安全性
-# 注:把 A 機器的公鑰發送給 B 機器
-# 注:B 用 A 機器的公鑰對傳輸內容進行加密,然後把信息發送給 A 機器
-# 注:將加密內容發送給 A 機器,此時只有 A 機器有權限獲取裡面的內容-# 注:數據加密 主要是為了保障 接收方的數據安全性
-# 注:不能保障收到的數據一定是 B 機器發過來的
七。數字簽名#
發送方
- 對原始數據執行 HASH 算法得到摘要值
- 發送方用自己私鑰加密摘要值
- 將加密的摘要值與原始數據發送給接收方
數字簽名保證數據完整性、身份驗證和不可否認
.--------------------------------------------------------------------------------------------------------------------------
-# 數據簽名
-# 注:如何保障收到的數據一定是 B 機器發過來的
-# 注:(A 機器上要有 B 機器的公鑰,B 機器也要有 A 機器的公鑰)
-# 注:A 機器公鑰給 B 機器
-# 注:B 機器公鑰給 A 機器
-# 注:B 機器向 A 機器發送數據:B 機器先用自己的私鑰對摘要信息(hash,一般是 data 的 hash 散列值 做信息的摘要信息,驗證信息 - 完整值)進行加密生成簽名。B 機器再用 A 機器的公鑰對信息內容和簽名進行加密,發送給 A 機器
-# 注:A 機器收到 B 機器的密文數據後,用自己的私鑰進行解密。得到解密後的明文後,用 B 機器的公鑰來解密 B 機器生成的簽名-# 注:數據簽名 驗證發送方的數據安全(驗證發送方是不是我想要的發送方)
八. SSH 身份驗證過程#
九。電子郵件數字簽名過程#
十. OpenSSH#
OpenSSH
- 官方站點:http://www.openssh.com
- 主要軟體包:openssh-server、openssh-clients
- 服務名:
sshd
- 服務端主程序:/usr/sbin/sshd # 注:都是可執行的腳本
- 客戶端主程序:/usr/bin/ssh # 注:都是可執行的腳本
- 服務端配置文件:/etc/ssh/
sshd_config
- 客戶端配置文件:/etc/ssh/
ssh_config
-# 注:xshell 就是模擬 ssh 的客戶端
-# 注:linux yum 下下來的包基本都是 rpm 包
示例1:查看命令屬於哪個包下載的
---------------------------------------------------------------------------------------------------------------------------------
ssh是通過openssh下載的
[root@cPen_web ~]# which ssh
/usr/bin/ssh
[root@cPen_web ~]# rpm -qf /usr/bin/ssh
openssh-clients-8.0p1-4.el8_1.x86_64
[root@cPen_web ~]# yum list |grep openssh
===============================================================================
示例2:啟動sshd服務的實際上是執行行的服務啟動腳本文件 /usr/sbin/sshd(真正執行服務的腳本)
[root@cPen_web ~]# rpm -qf /usr/sbin/sshd
openssh-server-8.0p1-4.el8_1.x86_64
[root@cPen_web ~]# service sshd restart # 注:service 守護進程 幫它去管理服務
Redirecting to /bin/systemctl restart sshd.service
[root@cPen_web ~]#
#注:守護進程可以幫助管理,想關閉或打開。自己管理的話,很難,要手動的kill 或者 先kill再起來
===============================================================================
示例3:直接執行腳本/usr/sbin/sshd 啟動服務
---------------------------------------------------------------------------------------------------------------------------------
#如果服務起來,會有22號端口屬於listen監聽狀態
[root@cPen_web ~]# service sshd stop
[root@cPen_web ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1709 root 5u IPv4 37939 0t0 TCP cPen_web:ssh->192.168.0.42:54537 (ESTABLISHED)
sshd 2185 root 5u IPv4 50589 0t0 TCP cPen_web:ssh->192.168.0.42:57389 (ESTABLISHED)
[root@cPen_web ~]# /usr/sbin/sshd
[root@cPen_web ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1709 root 5u IPv4 37939 0t0 TCP cPen_web:ssh->192.168.0.42:54537 (ESTABLISHED)
sshd 2185 root 5u IPv4 50589 0t0 TCP cPen_web:ssh->192.168.0.42:57389 (ESTABLISHED)
sshd 2282 root 4u IPv4 52306 0t0 TCP *:ssh (LISTEN) # 注:處於監聽狀態
sshd 2282 root 6u IPv6 52308 0t0 TCP *:ssh (LISTEN)
===============================================================================
示例4:直接啟動vsftpd服務端
---------------------------------------------------------------------------------------------------------------------------------
#注:vsftpd是服務端,ftp是客戶端
[root@cPen_web ~]# vsftpd # 注:啟動vsftpd服務端(可以直接啟動)
#注:查看服務是否起來(4種)
[root@cPen_web ~]# pidof vsftpd
2297
[root@cPen_web ~]# ps -ef |grep vsftpd
root 2297 1 0 14:50 ? 00:00:00 vsftpd
root 2300 2186 0 14:51 pts/1 00:00:00 grep --color=auto vsftpd
[root@cPen_web ~]# netstat -auplt |grep vsftpd
tcp6 0 0 [::]:ftp [::]:* LISTEN 2297/vsftpd
[root@cPen_web ~]# lsof -i:21
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vsftpd 2297 root 3u IPv6 52524 0t0 TCP *:ftp (LISTEN)
十一. SSH 服務端配置文件#
/etc/ssh/sshd_config
- 重啟 sshd 服務生效
修改了配置文件端口號,啟動不起來,原因是 selinux 是 enforcing 狀態需要修改
.--------------------------------------------------------------------------------------------------------------------------
-# 注:一般配置文件都是以 #開頭的注釋行
-# 注:只有 root 用戶有權限修改它
示例1:過濾出有效行
--------------------------------------------------------------------------------------------------------------------------------
[root@cPen_web ~]# grep -v -E "^#|^$" /etc/ssh/sshd_config # 注:-E支持擴展正則 ; -v不顯示
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
……………………
Subsystem sftp /usr/libexec/openssh/sftp-server
===============================================================================
示例2:vim /etc/ssh/sshd_config
--------------------------------------------------------------------------------------------------------------------------------
[root@cPen_web ~]# vim /etc/ssh/sshd_config
#Port 22 # 注:默認端口號
#AddressFamily any # 注:ip地址 (ipv4\ipv6) any 任何
#ListenAddress 0.0.0.0 # 注:本機上面的所有ip地址
#ListenAddress :: # 注:ipv6
===============================================================================
示例3:ipv6地址
--------------------------------------------------------------------------------------------------------------------------------
IPv6的地址長度為128位,是IPv4地址長度的4倍。於是IPv4點分十進制格式不再適用,採用十六進制表示。
#注:以: 冒號分隔
===============================================================================
示例4:網絡連接失敗 排錯
--------------------------------------------------------------------------------------------------------------------------------
1、ping通 確保網絡是聯通的
2、確保服務是起來的
[C:\~]$ telnet 192.168.0.29 2233
1端口沒起,2防火牆
[C:\~]$ telnet 192.168.0.29
Connecting to 192.168.0.29:23...
Connecting to 192.168.0.29:2233...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
SSH-2.0-OpenSSH_8.0
===============================================================================
示例5:配置文件常用配置詳解
--------------------------------------------------------------------------------------------------------------------------------
[root@cPen_web ~]# vim /etc/ssh/sshd_config
#Port 22
Port 2233 # 注:修改默認監聽端口(默認22端口)
#AddressFamily any
ListenAddress 192.168.0.29 # 注:設置本機監聽ip地址,默認為0.0.0.0(表示在本機任意ip地址上監聽)
PermitRootLogin no # 注:禁止root用戶登錄(no 不予許root用戶登錄,默認為yes)
#PubkeyAuthentication yes # 注:是否開啟公鑰認證(默認開啟)
AuthorizedKeysFile .ssh/authorized_keys # 注:配置公鑰認證的文件(這個文件可以改 沒必要)
# 注:前面的家目錄沒有寫
PasswordAuthentication no # 注:是否開啟密碼認證,默認為yes
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
UsePAM yes # 注:使用pam認證(一般為yes不用改它)(pam幫我們進行認證,而不是ssh)
#UseDNS yes # 注:是否將客戶端主機名解析成ip,可以將其設置為no
# 注:此過程不順利的話,會非常的慢,會影響登錄認證的速度,可以將其設置為no
#注:一般來說不會開啟密碼認證
#注:一般來說一個機器不允許root用戶登錄,一般來說給用戶加sudo權限,用超級用戶登錄
#注:pam是linux下面的pam模塊,認證模塊。我們登錄進來後,pam幫我們做的密碼/密碼認證,身份認證狀態檢驗
#注:pam認證模塊 --> 配置路徑 /etc/pam.d/ 這個目錄下面存放的是每個需要認證的服務的配置,文件名就是服務名
#注:DNS --> 域名解析服務。網絡中使用ip地址通信。域名最終都要解析成ip的
#注:DNS域名解析服務。主機名也可以使用DNS解析 (比如cPen_centos8)
#注:如果在DNS範疇之內,可以通過主機名來訪問這台主機,或者通過ip地址來訪問
-----------------------------------------------------------------------------------
[root@cPen_centos8 ~]# visudo
sanchuang ALL=(ALL) NOPASSWD:ALL
[root@cPen_python ~]# service sshd restart # 注:重啟服務後22號端口已有的連接還在
-------------------------------------------------------------------------------------
#注:主機B登錄
[root@cPen_web ~]# ssh 192.168.0.29 -p 2233 # 注:指定端口2233
#注:已經連接了的端口,即使改了端口,也不會有影響(只要不關閉窗口)
#注:修改配置文件只是在磁碟上進行修改,對於正在運行的程序,需要把配置加載到磁碟上(重啟、reload、kill -1)
#注:修改完配置文件後,root用戶 和 密碼登錄 登錄不上去了(禁止使用密碼登錄)
--------------------------------------------------------------------------------------------
#注:修改配置文件並重啟服務時 PermitRootLogin no
#注:B機器root用戶登錄不上了
[root@cPen_web ~]# ssh 192.168.0.29 -p 2233
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
===============================================================================
PasswordAuthentication no # 注:是否開啟密碼密碼認證,默認為yes
示例6:物理機上 公鑰登錄(sanchuang用戶登錄)
--------------------------------------------------------------------------------------------------------------------------------
#注:ssh生成公鑰:(xshell菜單欄)工具 --> 新建用戶密鑰生成向導 --> 下一步(一直) --> 保存公鑰pub key:id_rsa_2048.pub
#注:把pub key複製到sanchuang用戶下面去
[sanchuang@cPen_web .ssh]$ vim authorized_keys
………………
[sanchuang@cPen_web .ssh]$ chmod 600 authorized_keys
[sanchuang@cPen_web .ssh]$ chmod 755 /home/sanchuang
#注:物理機(xshell)生成一對密鑰對,放在虛擬機上
#注:物理機上生成的key,在物理機上登,對物理機進行驗證
#注:屬性 --> 用戶身份驗證 --> 方法:Public Key ; 用戶名:sanchuang ; 用戶密鑰:id_rsa_2048(剛才生成的密鑰)
#注:這個key是物理機上的key,key粘到哪個用戶下,就以哪個用戶登錄。在物理機上生成密鑰對,要登你的虛擬機,使用xshell生成和管理密鑰對,需要登錄虛擬機的sanchuang用戶,把物理機的pub key賦給sanchuang用戶家目錄下~/.ssh/authorized_keys,使用物理機去登。在物理機上生成的key,在物理機上登,sanchuang保存的是物理機的key,只能對物理機進行驗證
#注:連不成功的話,設置selinux 關掉(setenforce 0)。修改端口需要添加selinux的規則,一般來說不會去添加它的規則,而是把它關掉
#注:連不上的話,把iptables也關掉(iptables -F)
===============================================================================
示例7:ssh命令登錄
--------------------------------------------------------------------------------------------------------------------------------
ssh命令登錄
-l 指定登錄的用戶名
-p 指定server的端口
-i 指定私鑰文件,默認會在~/.ssh/去找私鑰
-o 接特定設置選項
#無序輸入yes,自動保存hostkey
ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223
#注:腳本裡這樣寫 無序輸入yes
===============================================================================
示例8:修改完成之後重新加載配置的方法(sshd_config)
#注:ssh起來後(默認會讀磁碟裡ssh配置文件)放到內存去運行
--------------------------------------------------------------------------------------------------------------------------------
#注:修改完成之後重新加載配置的方法(sshd_config)
[root@cPen_web ~]# kill -1 2282
[root@cPen_web ~]# kill -HUP 2282
[root@cPen_web ~]# service sshd restart # 注:重新啟動服務
[root@cPen_web ~]# service sshd reload # 注:重新加載配置
===============================================================================
示例9:man 5 查看配置文件幫助文檔
--------------------------------------------------------------------------------------------------------------------------------
man 1 普通的命令
man 5 查看配置文件的幫助文檔
[root@cPen_web .ssh]# man 5 /etc/ssh/sshd_config # 注:man 5 查看配置文件幫助文檔
===============================================================================
示例10:UsePAM yes
--------------------------------------------------------------------------------------------------------------------------------
UsePAM yes # 注:使用pam認證(一般為yes不用改它)
#注:pam是linux下面的pam模塊,認證模塊。我們登錄進來後,pam幫我們做的密碼/密碼認證,身份認證狀態檢驗
模塊文件:/etc/pam.d/ # 注:存放路徑;用於認證的模塊,linux可插入認證模塊
--------------------------------------------------------------------------------------------
[root@cPen_python ~]# cd /etc/pam.d/ # 注:裡面是pam的配置
[root@cPen_python pam.d]# ls # 注:裡面全是認證的模塊;每一個服務一個文件
chfn fingerprint-auth passwd postlogin runuser-l smtp.postfix sudo-i systemd-user
chsh fingerprint-auth-ac password-auth postlogin-ac smartcard-auth sshd su-l vlock
config-util login password-auth-ac remote smartcard-auth-ac su system-auth vmtoolsd
crond other polkit-1 runuser smtp sudo system-auth-ac vsftpd
===============================================================================
示例11:hostname -f 查看主機名全稱
--------------------------------------------------------------------------------------------------------------------------------
[root@cPen_centos8 pam.d]# hostname -f
cPen_centos8
===============================================================================
示例12:解析出百度的ip
--------------------------------------------------------------------------------------------------------------------------------
[root@cPen_centos8 pam.d]# host www.baidu.com
[root@cPen_centos8 pam.d]# ping www.baidu.com
十二。練習#
修改端口為 2233
禁止 root 用戶登錄
禁止密碼登錄
創建管理員用戶 sanchuang, 給 sanchuang 所有 sudo 權限
在 Windows 機器上生成密鑰對,後續 A,B 兩台虛擬機器都使用公鑰認證進行登錄
* 注意關閉防火牆和 selinx
iptables -F
getenforce 0 --> 或者修改配置文件 /etc/selinux/config --disabled,永久修改需要重啟機器
.--------------------------------------------------------------------------------------------------------------------------
-# 注:不是錯誤,使用 service sshd restart 命令實際上是執行 /bin/systemctl restart sshd.service 命令
[root@cPen_python ~]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service # 注:使用這個命令去執行
#注:練習 具體操作如上
十三. ssh-agent 管理密鑰#
ssh-agent 管理密鑰 一個代理程序,幫助我們管理私鑰
配置: xshell--> 主機屬性 --》ssh --》勾選 使用 xagent 進行身份驗證;勾選 使用代理轉發
[sanchuang@mysql-binary .ssh]$ ssh-add id_rsa # 注:添加主機密鑰給agent管理
#注:把虛擬機上面的key也交給給ssh-agent去管理
[sanchuang@mysql-binary .ssh]$ ssh-add -l # 注:查看agent管理了哪些密鑰
2048 SHA256:eJz1xcOJnntAP/R0w1if7oEaukIbiwh0vmtp9Q605ls (RSA)
.--------------------------------------------------------------------------------------------------------------------------
-# 注:ssh-agent 的概念:幫你管理密鑰的,默認情況下 ssh-agent 開在物理機上的。ssh-agent 就是一個中間商,保存管理密鑰的。在 xshell 裡面開啟了 ssh-agent 之後,從 A 機器登錄到 B 機器,它會先取看一下 A 機器 root 家目錄下面有沒有公私鑰,沒有的話 會從 ssh-agent 裡面捞取它的公私鑰
-# 注:B 機器沒有 A 機器的公鑰,它會去找 ssh-agent 裡面管理的那個公鑰對(中間商),最後認證是拿物理機的key去做認證的
,因為物理機裡面跑了 1 個 ssh-agent,管理了物理機的 pubkey,物理機的 pubkey 可以登錄 A 又可以登錄 B,滿足的條件是物理機能夠登錄到 B
-# 注:再來一台主機 C,想要從 A 調到 C,先決條件是 C 要有物理機的 pubkey,C 對物理機授了權,然後物理機的 key 又由 ssh-agent 去管理,就可以從 A 主機跳到 C 主機。(家目錄下面沒有私鑰生成,就去找 ssh-agent 管理的密鑰對,只要 C 有物理機的公鑰,就都可以登錄了)
-# 注:這個服務是 xshell 的,只能通過 xshell 裡面才能進行這一系列操作(xshell 管理 ssh-agent)
.--------------------------------------------------------------------------------------------------------------------------
-# 注:(xshell 菜單欄)文件 --> 打開(下拉) --> 屬性(右鍵) --> SSH --> 允許 Xagent 進行身份驗證(勾上);允許代理轉發(勾上)
-# 注:在 B 機器上勾上(現在要在 A 機器上登錄 B 機器)
.--------------------------------------------------------------------------------------------------------------------------
#注:物理機上面有 2 個虛擬機 A、B,物理機使用 xshell 去連接 A 和 B。剛在在 A、B 上都創建了 sanchuang 用戶,並且把物理機的 pub key 都給了 A、B 兩台機器的 sanchuang 用戶。現在,在 A 機器上想要連接 B 機器的 sanchuang 用戶,應該怎麼做?B 機器上沒有 A 機器的 key
#注:答:把 A 的 key 給 B(在 A 機器上生成自己的 key,這樣的話太麻煩了)
#注:用戶加的是哪一台的 pubkey,就是允許哪一台的主機登錄,加的 authorized_keys 是為哪一台機器授權
#注:A、B 機器 2 台主機之間進行通訊的話,有 1 個本地的概念,它會在本地用戶的家目錄下面去找 key;物理機沒有這個概念,因為它是通過 xshell (ssh 的客戶端,圖形界面的 ssh 命令) 去連接的,它通過 xshell 去管理它的 key
示例:A機器上登錄到B機器
--------------------------------------------------------------------------------------------
#注:前提確保 Windows可以免密碼登錄到A、B機器
[sanchuang@cPen_python ~]$ ssh 10.122.148.108 -p 2233
Last login: Sun Nov 15 19:59:00 2020 from 10.122.38.250
[sanchuang@cPen_centos8 ~]$
十四。其他總結#
14.1 SSH 服務端配置文件#
SSH 登錄使用的用戶名
- 伺服器中的本地系統用戶的帳號名
SSH 登錄的用戶驗證方式
- 密碼驗證:使用伺服器中系統帳號對應的密碼
- 密鑰對驗證:使用客戶機中生成的公鑰、私鑰
SSH 客戶端文件通常無需修改
14.2 SSH 客戶端#
使用 ssh 命令遠程登錄
- 方式 1: ssh 用戶名
@
伺服器地址 - 方式 2: ssh
-l
用戶名 伺服器地址 - 方式 3: ssh 伺服器地址
客戶機使用第一次連接伺服器時
[root@localhost ~]# ssh root@10.10.10.1
14.3 known_hosts 文件#
客戶機使用 ssh 第一次連接伺服器時
- 將伺服器上 sshd 守護進程的公鑰複製到本地
- 存放到本地~/.ssh/known_hosts 文件中
- 每行存放一台伺服器的公鑰
用來驗證伺服器的身份
公鑰驗證伺服器的具體細節
14.4 密鑰方式#
SSH 的公鑰認證流程
公鑰驗證客戶端的具體細節
SSH 公鑰認證的基本實現步驟
-
1、在客戶機創建密鑰對
ssh-keygen -t rsa
指定 rsa 算法- 設置保護私鑰文件的密碼
- 在
~/.ssh
下生成兩個文件 id_rsa
是用戶的私鑰id_rsa.pub
是用戶的公鑰
-
2、將公鑰文件上傳至伺服器
-
上傳到伺服器~/.ssh/authorized_keys 文件
-
文件中每行保存一個用戶的公鑰
-
scp ~/.ssh/id_rsa.pub
root@10.10.10.1:~/.ssh/authorized_keys
-
14.5 SSH 客戶端#
使用 scp 命令遠程複製文件 / 目錄
- 方式 1: scp 用戶名 @伺服器地址:源文件 目標路徑
- 方式 2: scp 本地文件 用戶名 @伺服器地址:目標路徑
- 若複製的是目錄,則需添加 “-r” 選項
使用 sftp 命令從伺服器下載文件
- 格式:sftp 用戶名 @伺服器地址
14.6 通過 SSH 運行伺服器中的窗口程序#
運行伺服器中的圖形程序是 SSH 的重要應用
- ssh 命令需要在圖形界面虛擬終端下運行
- 命令格式:
ssh -X username@sshserver
xlock 是運行在 SSH 伺服器中,而顯示在 SSH 客戶機中的窗口程序
14.7 SSH 客戶端應用#
使用圖形客戶端軟體 SecureCRT
- 主要用途:基於 SSH 協議遠程登錄以便管理伺服器
- 下載地址:http://www.vandyke.com/
使用圖形客戶端軟體 WinSCP
- 主要用途:基於 sftp、scp 或 ftp 的方式下載 / 上傳數據
- 下載地址:http://winscp.net/
14.8 SSH 訪問控制#
**SSH 使用 TCP Wrappers 實現訪問控制 **
主要配置文件
- /etc/hosts.allow
- /etc/hosts.deny
TCP Wrappers 可以控制哪些服務
- 受 super daemon(xinetd)管理的服務
- 支持 libwrap.so 模塊的服務
TCP Wrappers 的訪問控制原則
- 首先檢查 hosts.allow 文件,若找到相匹配的策略,則允許訪問
- 否則繼續檢查 hosts.deny 文件,若找到相匹配的策略,則拒絕訪問
- 如果兩個文件中都沒有相匹配的策略,則允許訪問