OpenSSH 密码和公钥认证原理探究

OpenSSH 密码和公钥认证原理探究

目录使用 OpenSSH配置远程系统上的安全命令行服务1. 使用SSH 访问远程命令行1.1 什么是OpenSSH ?1.1.1 登录方式:1.1.2 登录并执行临时命令:1.1.3 查看登录用户1.2 登录原理1.2.1 密码连接过程1.2.1.1 服务端更新密钥:1.2.1.2 移除某主机的认证信息 : ssh-keygen -R hostname1.2.2 ⭐⭐密钥认证(公钥认证)1.2.2.1 引入:1.2.2.2 密钥认证原理H4 - **完整实验 - 密钥认证 - 从servera 连接至 serverb **使得SSH 连接更加的安全:自定义 OPENSSH 服务配置

使用 OpenSSH配置远程系统上的安全命令行服务

目标:

使用ssh登录远程系统并运行命令

为用户账户配置基于密钥的身份验证,以使其无需密码就能安全的登录远程系统

限制直接以root身份登录,并为OpenSSH 服务禁用基于密码的身份验证。

1. 使用SSH 访问远程命令行

1.1 什么是OpenSSH ?

实际工作中,管理的都是远程服务器,例如,云主机。所以都是需要远程的登录到主机,管理服务器。而且也不可能直接操作物理控制台,因为云主机都是虚拟机。

通过web页面登录的实际上走的是vnc协议。

以前的时候,多使用telnet,但是现在淘汰了,用telnet一般也就是用来判断端口是不是侦听的。登录一般都是用SSH(OpenSSH,开源的)

引入:

以现有的实验环境举例:

workstation 和 servera,serverb 之间配置了OpenSSH,所以通过ssh协议登录的时候直接走密钥认证,根本不需要使用登录密码。 但是servera和serverb之间没有OpenSSH密钥认证,因此互相登录必须使用密码。

1.1.1 登录方式:

以student账户登录到servera主机:

省略写法 :ssh student@servera # 这里没有指定端口号,是因为ssh协议默认端口就是22

选项写法:ssh servera -l student -p 22 # -l 即 --login 登录名

1.1.2 登录并执行临时命令:

1.1.3 查看登录用户

当从workstation上通过ssh 连接到servera,在servera上可以通过w 命令查看:

该命令实际上是查看所有在线用户,无论是否远程登录,也包括了本地登录的用户。

⭐还可以用过以下命令查看更加 详细的情况:

$ ss -tlna | grep :22

⭐ 还可以通过rsyslog的安全日志查看登录记录

$ sudo grep sshd /var/log/secure

1.2 登录原理

1.2.1 密码连接过程

在理解一次ssh连接的原理之间,需要先了解以下一些关键点:

公钥:加密

私钥:解密

默认SSH 的连接方式为密码认证:

过程:

客户端发动连接请求时,服务端将最新的公钥发送给客户端

客户端查看当前家目录下的文件 ~/.ssh/known_hosts 是否存在对方的公钥,如果存在,则第三步,如果不存在,则询问是否添加公钥。

询问客户端输入账户的密码,然后使用服务端的公钥进行加密,并发送给服务端

服务端使用对应的私钥解密,如果正确则允许登录。

总结@jayce:

总结一下,以上的ssh连接过程:

当从servera 尝试连接到serverb, serverb会将自己最新的公钥发送给 servera 。 servera 收到了发送过来的公钥, 首先在servera:~/.ssh/known_hosts 文件中去查找,是否存在该历史公钥,如果有直接下一步,如果没有,就将其内容写入到 servera:~/.ssh/known_hosts 文件(如果没有该文件,会自动创建,前提是存在sshd服务。)

在确保servera的主机上(know_hosts)存在有serverb主机的公钥之后, 此时尝试登录的用户将会被询问远程登录账户的密码, 用户输入密码之后, 将使用 serverb 的公钥进行加密。 然后发送给serverb

serverb在接收到了加密过后的密码, 尝试使用私钥进行解密然后核对密码是否正确, 如果正确,才会准许servera 通过ssh 远程连接。

如果对连接过程还是不清楚,可以查看【附属】/第十章 SSH连接过程实验.md 中有详细的实验过程。

1.2.1.1 服务端更新密钥:

$ rm -f /etc/ssh ssh_host_* #删除公钥私钥

$ systemctl restart sshd #会重新生成

生成的密钥对存放在 /etc/ssh 目录下, 输入删除了密钥对,然后再尝试从servera 连接 serverb会发生什么 ?

提示:远程主机人正已经修改,有可能是中间人挟持攻击(略)所以一般在更新密钥的时候,远程连接的时候需要向管理员确认。

有三种不同的密钥对,区别在于使用了不同的算法

为什么会出现这个提示?

当servera 尝试 ssh 远程连接到serverb, serverb发送公钥给servera, 而servera之前是连接过serverb的,所有存在历史的公钥,但是现在,serverb的公钥修改了, 所以在 servera 上,比对历史公钥和最新的公钥的时候存在差异,所以就会报这个提示。

1.2.1.2 移除某主机的认证信息 : ssh-keygen -R hostname

ssh-keygen -R serverb 移除掉serverb的历史认证信息

移除掉之后,然后servera 重新连接serverb 就能够正常连接上了。

1.2.2 ⭐⭐密钥认证(公钥认证)

工作中,密钥人正更加安全,方便。

1.2.2.1 引入:

以实验环境为例引入, 有虚拟机workstation 和 servera, serverb 。 workstation 和servera,serverb 之间就是走的公钥认证。 公钥认证使得ssh连接不需要输入密码。

示例:

$ ssh -i ./.ssh/lab_rsa student@servera

实际上,可以不用带 -i 选项, 因为当服务端开放了密钥(或者说公钥)认证(前提),那么在ssh 连接的时候,默认会走密钥认证, 如果认证失败,才会走密码认证。

所以实际上,一般是这样登录的:

$ssh student@servera

workstation:~/.ssh/lab_rsa 和 workstation:~/.ssh/lab_rsa.pub 是密钥对。

1.2.2.2 密钥认证原理

在客户端和服务端是相互信任的情况下(绝对没有中间人)

客户端使用 ssh-keygen 命令生成密钥对 : ssh-keygen

$ ssh-keygen # 默认如果不加 -t 选项设定算法,默认的会以sha256 算法

# -t 选项选定特定的算法

$ ssh-keygen -t ecdsa

#ubuntu 示例

jayce@DESKTOP-JASQLDM:~$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/home/jayce/.ssh/id_rsa):#密钥对存放的位置

Created directory '/home/jayce/.ssh'.

Enter passphrase (empty for no passphrase):#对私钥加密 ? 多了一把锁,泄露别人也用不了(如果是为了免密码认证,这里就不要加密了)

Enter same passphrase again:

Your identification has been saved in /home/jayce/.ssh/id_rsa

Your public key has been saved in /home/jayce/.ssh/id_rsa.pub

The key fingerprint is:

SHA256:IyCSLQHKsHZykIFc7gaQfihunvz+dWOTs8dJxFB9UIQ jayce@DESKTOP-JASQLDM

The key's randomart image is: # 散列图

+---[RSA 3072]----+

|O++. ....=o |

|BBo . E . |

|B=++. o . |

|o=*o . o |

|o .o . S . |

| o. . ... |

|+ . . Bo . |

| + . o =+ |

| oo.. .. |

+----[SHA256]-----+

客户端将公钥发送服务端 user@host:~/.ssh/authorized_keys/ ssh-copy-id

$ ssh-copy-id -i 私钥 用户@主机

#eg: ssh-copy-id -i id_ecdsa.pub student@serverb

输入完命令之后,将会走密码完成复制。(拷贝到了 student@serverb:~/.ssh/authorized_keys/ )

连接时:

客户端发起连接

服务端收到信号后,随机生成字符串(每次连接都重新生成)并使用客户端提供的公钥进行加密,然后返回给客户端

客户端使用私钥进行解密。并将解密后的字符串再返回给服务端

客户端只知道公钥,私钥时正确的,服务端只知道字符串是否正确。两者都只知道自己的

服务端验证字符串是否是之前生成的,如果正确则允许连接。

H4 - **完整实验 - 密钥认证 - 从servera 连接至 serverb **

准备:初始状态:从servera 连接到serverb 需要密码认证:

servera 作为客户端,通过 ssh-keygen 生成 密钥对:

通过ssh-copy-id 命令,将 公钥 通过密码认证复制(发送)到预连接的 用户@主机

可以验证一下:

尝试连接:

完整的连接应该是:ssh -i id_rsa

⚠️ 普通密码认证,是server 发送 public key 到client, 而密钥认证是 client 生成密钥对,并发送 public key 到server

使得SSH 连接更加的安全:自定义 OPENSSH 服务配置

服务端: /etc/ssh/sshd_config

这里注意一下,补一个小概念:

SSH 作为多端程序,有客户端和服务端, 一般来讲,服务端应该是常驻进程,(也就是Linux 中的守护进程),这里的sshd就是守护进程。 为什么呢? 因为服务端应该时刻等待被连接,时刻都能都被连接上。 如果并不是单向连接,需要频繁的相互连接,那么各端都应该有守护进程。

#Port 22 //自定义端口,默认是22,修改设计Selinux 和防火墙

#AddressFamily any //局域网中侦听的端口类型, inet(ipv4) 、inet (ipv6)、any(ipv4 & ipv6)

#ListenAddress 0.0.0.0 //侦听端口,制定了端口就只能听到所侦听端口的登录申请。

#ListenAddress ::

PubkeyAuthentication yes //默认是否开启公钥认证,强烈建议开启

PermitRootLogin no //⭐⭐⭐⭐⭐强烈建议关闭(每时每刻都有在黑客在扫面是否有端口开放了root登录)

AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 //密钥默认存放位置,如果公钥认证开了 这里一定要保证是开着的

PasswordAuthenticatoin no //是否开启密码认证,如果同时开启了, 公钥认证和密码认证,那么将优先使用公钥认证。 如果公钥认证方式登录失败会使用密码认证, 而使用密码认证就有中间人挟持攻击的可能,所以一般正式生产环境,建议是关闭密码认证的。

.......

自定义sshd的配置

/etc/ssh/sshd_config

Port 22 //端口号

AddressFamily inet //IP协议类型 inet inet6 any

ListenAddress 172.25.250.11 // 接口

HostKey /etc/ssh/ssh_host_rsa_key

HostKey /etc/ssh/ssh_host_ecdsa_key

HostKey /etc/ssh/ssh_host_ed25519_key

SyslogFacility AUTHPRIV

PermitRootLogin no //关闭root远程登录

PubkeyAuthentication yes //启用公钥认证

AuthorizedKeysFile .ssh/authorized_keys

PasswordAuthentication no //关闭密码认证

ChallengeResponseAuthentication no

GSSAPIAuthentication yes

GSSAPICleanupCredentials no

UsePAM yes

X11Forwarding yes

PrintMotd no

ClientAliveInterval 60

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES

AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT

AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE

AcceptEnv XMODIFIERS

Subsystem sftp /usr/libexec/openssh/sftp-server

设定完成之后,重启 sshd 服务

$ systemctl restart sshd

相关推荐

全民钱包审核
365bet体育投

全民钱包审核

📅 07-25 👁️ 6752
当年搞出天语手机的“山寨机教母”,靠做芯片翻盘上市了
“湮灭”字
365bet体育投

“湮灭”字

📅 02-09 👁️ 4048
数据库高手必看:MySQL InnoDB与MyISAM切换指南及优化技巧
王者荣耀怎么快速提升段位
365bet体育投

王者荣耀怎么快速提升段位

📅 09-23 👁️ 5217
(建议收藏)树莓派系统从安装配置到使用超详细攻略,一篇文章带你配置好树莓派
六个数字复式三中三有多少组
365bet取款要多久

六个数字复式三中三有多少组

📅 10-03 👁️ 5001
RMVB格式视频使用什么播放器最好播放?精选4款万能播放器,总有一款适合你
在北京学编程的学校,选哪个更靠谱?
365体育app网址

在北京学编程的学校,选哪个更靠谱?

📅 09-26 👁️ 8657