mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

20_Linux基础-ssh服务2

一。公钥认证排错#

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 基于公钥加密的技术

image-20220824115204565

#注:第一步 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

-# 注:公私钥对是成对存在的,一个用于加密,一个用于解密,具体哪个为私钥,哪个为公钥就看使用者自己管理

注意:非对称加密计数
使用公钥进行加密,私钥解密,基本用于数据加密
使用私钥加密公钥解密,用于认证(对数据加密性没有要求,拿到就拿到)

image-20220824115746442

-# 注:第一步在 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) **

  • 公钥和私钥是成对生成的,这两个密钥互不相同,两个密钥可以互相加密和解密
  • 不能根据一个密钥而推算出另外一个密钥
  • 公钥对外公开,私钥只有私钥的持有人才知道
  • 私钥应该由密钥的持有人妥善保管

根据实现的功能不同,可以分为数据加密和数字签名


六。数据加密#

** 发送方使用接收方的公钥加密数据 **
接收方使用自己的私钥解密数据

image-20220824132431228

数据加密能保证所发送数据的机密性

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

-# 注:数据加密 主要是为了保障 接收方的数据安全性

-# 注:把 A 机器的公钥发送给 B 机器
-# 注:B 用 A 机器的公钥对传输内容进行加密,然后把信息发送给 A 机器
-# 注:将加密内容发送给 A 机器,此时只有 A 机器有权限获取里面的内容

-# 注:数据加密 主要是为了保障 接收方的数据安全性
-# 注:不能保障收到的数据一定是 B 机器发过来的

image-20220824132542539

七。数字签名#

发送方

  • 对原始数据执行 HASH 算法得到摘要值
  • 发送方用自己私钥加密摘要值
  • 将加密的摘要值与原始数据发送给接收方

image-20220824132704531

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

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

-# 数据签名
-# 注:如何保障收到的数据一定是 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 身份验证过程#

image-20220824133013889


九。电子邮件数字签名过程#

image-20220824133104520


十. 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 管理密钥#

image-20220824134452001

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 进行身份验证(勾上);允许代理转发(勾上)

image-20220824134713614

-# 注:在 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 文件中
  • 每行存放一台服务器的公钥
  • 用来验证服务器的身份

公钥验证服务器的具体细节

image-20220824135229894

image-20220824135239974

14.4 密钥方式#

SSH 的公钥认证流程

image-20220824135318183

公钥验证客户端的具体细节

image-20220824135336623

image-20220824135415658

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

image-20220824135823639

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

image-20220824140053190

TCP Wrappers 可以控制哪些服务

  • 受 super daemon(xinetd)管理的服务
  • 支持 libwrap.so 模块的服务

TCP Wrappers 的访问控制原则

  • 首先检查 hosts.allow 文件,若找到相匹配的策略,则允许访问
  • 否则继续检查 hosts.deny 文件,若找到相匹配的策略,则拒绝访问
  • 如果两个文件中都没有相匹配的策略,则允许访问

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.