一. 公钥认证排错 1、确保公钥正确
2、确保~/.ssh/authorized_keys文件权限为600
3、确保家目录以及.ssh目录权限为755以下权限,即属组和其他人没有7的权限
1 2 3 4 5 6 7 8 示例 -------------------------------------------------------------------------------------------- [root@cPen_web .ssh] [wy@cPen_web .ssh]$ vim authorized_keys [wy@cPen_web .ssh]$ chmod 600 authorized_keys [wy@cPen_web home]$ chmod 755 wy [wy@cPen_web ~]$ chmod 755 .ssh
二. 登录方式 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] [root@cPen_web .ssh] [root@cPen_web .ssh] [root@cPen_web .ssh] ………… 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 ………… --------------------------------------------------------------------------------------------------------------------------------- [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 A机器下 [root@cPen_web .ssh] ……………… Are you sure you want to continue connecting (yes /no/[fingerprint])? yes ……………… [root@cPen_web .ssh] 192.168.0.30 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A= B机器下 [root@cPen_web .ssh] [root@cPen_web ssh] 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] ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBO+Xv/RYitaOHx0iyAbcOXLIPZEn75xh94pJ2L+MWOV/V3YRezYCgHJSwAJm5N9ceqtYCKoXUL3cCJeuGiiDH0A=
第一次登录 输入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 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 ~] /usr/bin/ssh [root@cPen_web ~] openssh-clients-8.0p1-4.el8_1.x86_64 [root@cPen_web ~] =============================================================================== 示例2:启动sshd服务的实际上是执行行的服务启动脚本文件 /usr/sbin/sshd(真正执行服务的脚本) [root@cPen_web ~] openssh-server-8.0p1-4.el8_1.x86_64 [root@cPen_web ~] Redirecting to /bin/systemctl restart sshd.service [root@cPen_web ~] =============================================================================== 示例3:直接执行脚本/usr/sbin/sshd 启动服务 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_web ~] [root@cPen_web ~] 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 ~] [root@cPen_web ~] 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服务端 --------------------------------------------------------------------------------------------------------------------------------- [root@cPen_web ~] [root@cPen_web ~] 2297 [root@cPen_web ~] 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 ~] tcp6 0 0 [::]:ftp [::]:* LISTEN 2297/vsftpd [root@cPen_web ~] 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
修改了配置文件端口号,启动不起来,原因是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 ~] 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 ~] =============================================================================== 示例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 ~] Port 2233 ListenAddress 192.168.0.29 PermitRootLogin no AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no UsePAM yes ----------------------------------------------------------------------------------- [root@cPen_centos8 ~] sanchuang ALL=(ALL) NOPASSWD:ALL [root@cPen_python ~] ------------------------------------------------------------------------------------- [root@cPen_web ~] -------------------------------------------------------------------------------------------- [root@cPen_web ~] Permission denied (publickey,gssapi-keyex,gssapi-with-mic). =============================================================================== PasswordAuthentication no 示例6:物理机上 公钥登录(sanchuang用户登录) -------------------------------------------------------------------------------------------------------------------------------- [sanchuang@cPen_web .ssh]$ vim authorized_keys ……………… [sanchuang@cPen_web .ssh]$ chmod 600 authorized_keys [sanchuang@cPen_web .ssh]$ chmod 755 /home/sanchuang =============================================================================== 示例7:ssh命令登陆 -------------------------------------------------------------------------------------------------------------------------------- ssh命令登陆 -l 指定登陆的用户名 -p 指定server的端口 -i 指定私钥文件,默认会在~/.ssh/去找私钥 -o 接特定设置选项 ssh -o StrictHostKeyChecking=no 192.168.0.132 -p 223 =============================================================================== 示例8:修改完成之后重新加载配置的方法(sshd_config) -------------------------------------------------------------------------------------------------------------------------------- [root@cPen_web ~] [root@cPen_web ~] [root@cPen_web ~] [root@cPen_web ~] =============================================================================== 示例9:man 5 查看配置文件帮助文档 -------------------------------------------------------------------------------------------------------------------------------- man 1 普通的命令 man 5 查看配置文件的帮助文档 [root@cPen_web .ssh] =============================================================================== 示例10:UsePAM yes -------------------------------------------------------------------------------------------------------------------------------- UsePAM yes 模块文件:/etc/pam.d/ -------------------------------------------------------------------------------------------- [root@cPen_python ~] [root@cPen_python pam.d] 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] cPen_centos8 =============================================================================== 示例12:解析出百度的ip -------------------------------------------------------------------------------------------------------------------------------- [root@cPen_centos8 pam.d] [root@cPen_centos8 pam.d]
十二. 练习 修改端口为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 ~] 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 [sanchuang@mysql-binary .ssh]$ ssh-add -l 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机器 -------------------------------------------------------------------------------------------- [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第一次连接服务器时
公钥验证服务器的具体细节
14.4 密钥方式 SSH的公钥认证流程
公钥验证客户端的具体细节
SSH公钥认证的基本实现步骤
1、在客户机创建密钥对
ssh-keygen -t rsa
指定rsa算法设置保护私钥文件的密码 在~/.ssh
下生成两个文件 id_rsa
是用户的私钥id_rsa.pub
是用户的公钥2、将公钥文件上传至服务器
14.5 SSH客户端 使用scp命令远程复制文件/目录
使用sftp命令从服务器下载文件
14.6 通过SSH运行服务器中的窗口程序 运行服务器中的图形程序是SSH的重要应用
xlock是运行在SSH服务器中,而显示在SSH客户机中的窗口程序
14.7 SSH客户端应用 使用图形客户端软件 SecureCRT
使用图形客户端软件 WinSCP
14.8 SSH访问控制 **SSH使用TCP Wrappers实现访问控制 **
主要配置文件
/etc/hosts.allow
/etc/hosts.deny
TCP Wrappers可以控制哪些服务
TCP Wrappers的访问控制原则