一。公钥认证排错#
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 文件,若找到相匹配的策略,则拒绝访问
- 如果两个文件中都没有相匹配的策略,则允许访问