20_Linux基础-ssh服务2

:点击此处或下方 以展开或折叠目录

一. 公钥认证排错

1、确保公钥正确

2、确保~/.ssh/authorized_keys文件权限为600

3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限

1
2
3
4
5
6
7
8
示例
--------------------------------------------------------------------------------------------
[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 权限

二. 登录方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[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)

#注:成对存在成对加解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#注:第一次登录机器时,一般会要输入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机器发过来的

image-20220824132542539

七. 数字签名

发送方

  • 对原始数据执行HASH算法得到摘要值

  • 发送方用自己私钥加密摘要值

  • 将加密的摘要值与原始数据发送给接收方

数字签名保证数据完整性、身份验证和不可否认

.--------------------------------------------------------------------------------------------------------------------------

-#数据签名
-#注:如何保障收到的数据一定是B机器发过来的
-#注:(A机器上要有B机器的公钥,B机器也要有A机器的公钥)
-#注:A机器公钥给B机器
-#注:B机器公钥给A机器
-#注:B机器向A机器发送数据:B机器先用自己的私钥对摘要信息(hash,一般是data的hash散列值 做信息的摘要信息,验证信息-完整值)进行加密生成签名。B机器再用A机器的公钥对信息内容和签名进行加密,发送给A机器
-#注:A机器收到B机器的密文数据后,用自己的私钥进行解密。得到解密后的明文后,用B机器的公钥来解密B机器生成的签名

-#注:数据签名 验证发送方的数据安全(验证发送方是不是我想要的发送方)

image-20220824132809916

八. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
示例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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
示例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命令

1
2
3
4
[root@cPen_python ~]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service # 注:使用这个命令去执行

#注:练习 具体操作如上

十三. ssh-agent管理密钥

ssh-agent管理密钥 一个代理程序,帮助我们管理私钥
配置: xshell–> 主机属性–》ssh --》勾选 使用xagent进行身份验证 ;勾选 使用代理转发

1
2
3
4
5
[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

1
2
3
4
5
6
示例: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

使用图形客户端软件 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 文件,若找到相匹配的策略,则拒绝访问

  • 如果两个文件中都没有相匹配的策略,则允许访问