目录

SSH的简介

连接过程

SSH加密的方式

1.对称加密

 2.非对称加密:

 SSH的工作流程

 1.版本号协商

2.密钥和算法协商

 3.认证阶段

进行SSH连接:两种方法

基于口令的认证:

 基于公钥的认证:免密登录

实际操作:

4.会话请求阶段

 5.交互会话阶段

注意

SSH服务配置

安装ssh

配置文件分析

 一些常用参数

ssh-keygen


SSH的简介

        SSH(Secure Shell Protocol,安全的壳程序协议)--- 它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能:一个是类似telnet的远程连接使用shell的服务器;另一个就是类似ftp服务的sftp-server,提供更安全的ftp服务

        正常情况下都是用过SSH,使用Xshell或者mobaxterm都是通过ssh协议链接到我们的Linux上。能连接上主要是因为Linux系统都默认安装了ssh软件,并且启动了ssh的服务;会监听22号端口

连接过程

        连接的时候:新建连接->IP:port -> 用户名和密码 :基于口令的登录

        远程连接到服务器之后,你输入命令:通过ssh传输到linux然后去执行,执行完成之后然后返回到远程连接工具上

        ssh --- secure shell protocol 安全的壳程序协议。ssh会对我们的传输进行加密

        提供了两个服务 ---  ssh远程登录的服务,sftp传输文件的服务

SSH加密的方式

1.对称加密

        使用同一个秘钥进行加密和解密    

        有一个密钥key,加密的数据 name=user password=123456. 使用key对name和password进行加密,对方使用key对name和password进行解密 拿到解密后的真实数据。 

对称加密特点:

        对称加密的加密强度高,很难破解。在实际应用过程中不得不面临一个棘手的问题:如何安全的保存密钥

 2.非对称加密:

        指的是有一对密钥(公钥和私钥):使用公钥对数据加密,加密后只能私钥去解密

1.远程server端收到client端用户TopGun的登陆请求,server端将自己的公钥发给client端。

2.client端使用该公钥对密码进行加密。

3.client端将自己加密好的密码发送到server端。

4.server端用自己的私钥对密码进行解密,然后验证client的身份是否合法

5.若验证结果通过,给client相应的响应。

私钥是server端独有,这就保证了client的登陆信息,即使在网络传输过程中被偷窃数据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性

        ssh进行连接的时候会使用到:加密算法,密钥交换算法,完整性效验。

        ssh中如何应用的加密方式:ssh即使用了对称加密又使用了非对称加密,非对称加密是在认证用户连接的时候使用,对称加密是在用户连接之后开始传输数据的时候加密数据  

 SSH的工作流程

 1.版本号协商

启动了sshd服务之后,服务会默认监听22号端口

客户向服务发起tcp请求,请求的22端口,然后三次握手连接

服务器向客户端发送第一个报文:ssh-<主协议版本号><次协议版本号><软件版本号>

#SSH主要有两个版本:ssh1和ssh2

客户端收到报文后比较版本,然后选择合适的版本

客户端回应服务器使用那个版本

2.密钥和算法协商

        服务器和客户端分别发送自己的算法协商报文:公钥算法列表,加密算法列表,MAC(消息验证码),算法列表,压缩算法列表

        客户端和服务器的选择都支持算法

        服务器和客户端利用DH交换算法、主机密钥对等参数 ,生成回话密钥和回话ID(客户端和服务端各自计算出来)

        DH算法 --- 客户端和服务器会利用这个算法计算出一个key(不是互相传输的)

        会话秘钥 --- ssh连接成功之后,使用对称加密对传输的数据进行加密,使用加密的密钥就是会话密钥

        会话ID --- ssh断开连接,现在要回复连接,通过会话id:每次是计算出来的可以保证一定的安全性

        所以每一个新的ssh连接的时候,都会产生新的会话密钥和会话ID:每次是计算出来的可以保证一定的安全性。

        最终的结果就是客户端和服务器都掌握了会话密钥和会话ID:进行传输数据的时候就可以使用会话密钥进行加密和解密

产生会话密钥的流程:

1.客户端去请求服务器,服务器会将自己的公钥发给客户端

        服务器的公钥是如何产生的:由sshd服务生成一对密钥(公钥和私钥),公钥发送给客户端,私钥服务器自己保留。

2.服务器生成会话ID,发送客户端

        服务器发送服务器的公钥以及会话ID给客户端

3.如果客户端是第一次连接到ssh服务器,客户端会将服务器的公钥数据记录到自己家目录下./ssh/known_hosts文件。

        客户端掌握了服务器端的公钥,会话ID

4.进行密钥交换:DH交换算法

DH交换算法:

        通讯双方(张三、李四)需要先约定好算法参数(algorithm parameters):一个素数 p 作为模数,一个素数 g 作为基数(g 也称为“生成元”)。这两个算法参数是可以对外公开滴。
对于张三而言,需要先想好一个秘密的自然数 a 作为私钥(不能公开),然后计算 A = g^a mod p 作为自己的公钥(可以公开)。
        对李四而言也类似,先想好一个秘密的自然数 b 作为私钥(不能公开),然后计算 B = g^b mod p 作为自己的公钥(可以公开)。
        张三和李四互相交换各自的公钥。
        然后张三计算出 k = B^a mod p,李四计算出 k = A^b mod p
好处:
        张三和李四分别计算出来的 k 必定是一致的
        张三和李四都无法根据已知的数来推算出对方的私钥(张三无法推算出 b,李四无法推算出 a)
        对于一个旁观者(偷窥者),虽然能看到 p,g,A,B,但是无法推算出 a 和 b(就是说,旁观者无法推算出双方的私钥),自然也无法推算出 k

 3.认证阶段

进行SSH连接:两种方法

        有一个很重要的问题就是:如何确认服务器是安全的,是你想请求的服务器。

        如果有一个黑客冒充了服务器:他也会给你发送公钥, 你把自己的密码使用黑客的公钥进行加密,发送给了黑客,那黑客就使用自己的私钥进行解密。黑客就拿到了你的密码

        解决这个问题 --- 要确保我请求的就是服务器而不是黑客,拿到就是服务器的公钥而不是黑客的公钥

基于口令的认证:

        服务器把这个问题抛给客户端,让客户端去确认现在连接正确性。

        无论你请求的是服务器还是黑客,它都给你返回公钥,客户端手动的去确认你是否信任这个公钥,如果信任你就去连接,如果不信任就断开连接。

C:\Users\14527>ssh root@192.168.149.168
The authenticity of host '192.168.149.168 (192.168.149.168)' can't be established.
# 无法确定主机“192.168.149.168(192.168.149.168)”的真实性
ECDSA key fingerprint is SHA256:WUMLMInDK3sihMvoSSOFm9rLFDSUKHpE3azYyEhHREY.
# ECDSA 密钥指纹是 SHA256:WUMLMInDK3sihMvoSSOFm9rLFDSUKHpE3azYyEhHREY.
# 没有直接返回公钥,而是对公钥进行hash,返回hash值
Are you sure you want to continue connecting (yes/no/[fingerprint])?
是否确定要继续连接
如果信任这个公钥,你就输入yes
如果不信任, 你就输入 no
Warning: Permanently added '192.168.149.168' (ECDSA) to the list of known hosts.
Connection closed by 192.168.149.168 port 22
# 警告:永久添加192.168.149.168 到已知主机列表中 ~/.ssh/known_hosts

        每当客户端第一次使用ssh连接这个ssh服务器,它都会给你提示这个
        如果输入yes进行连接,他会将公钥写入用户家目录 ./ssh/known_hosts文件中
        等到下一次你连接的时候,就不会再出现上面的提示,因为会比较./ssh/known_hosts中有没有当前公钥的信息。如果有就直接进入输入密码
        如果没有就提示。

客户端确认了公钥是受信任的之后:输入密码之后的流程

 基于公钥的认证:免密登录

  1. 客户端要首先生成一对密钥(公钥和私钥)

  2. 把客户端的公钥需要你手动放到服务器上面(要手动的放到服务器,首先得知道这个服务器)

    这里就已经确保服务器是可信的。放到服务器的用户家目录的~/.ssh/authorized_keys

  3. 客户端请求服务器

  4. 服务器收到客户端的请求之后,先生成随机数random_server, 使用客户端放在authorized_keys这个文件中的公钥对随机数进行加密

    pubkey(random_server)发送给客户端

  5. 客户端有公钥和私钥,客户端收到这个加密的数据pubkey(random_server), 客户端使用私钥进行解密拿到random_server

    使用MD5(hash) 对random_server和sessionkey(会话密钥,在密钥交换步骤产生的)加密形成一个摘要digest1

    发送给服务器

  6. 服务器接收到digest1, 然后服务器本身自己使用之前协商过的MD5算法,自己也知道random_server, 也知道会话密钥sessionkey

    也是使用MD5算法对random_server sessionkey进行加密形成摘要digest2,最后去比较digest1 和 digest2是否相等

    如果相等,登录成功,如果不相等,登录失败      

实际操作:

1.客户端产生公钥和私钥
  当前系统上本身支持的算法:

         HostKey /etc/ssh/ssh_host_rsa_key
        HostKey /etc/ssh/ssh_host_ecdsa_key
        HostKey /etc/ssh/ssh_host_ed25519_key

查询算法方法:

[root@bogon ~]# cd /etc/ssh/
[root@bogon ssh]# ls
moduli        ssh_host_ecdsa_key        ssh_host_rsa_key
ssh_config    ssh_host_ecdsa_key.pub    ssh_host_rsa_key.pub
ssh_config.d  ssh_host_ed25519_key
sshd_config   ssh_host_ed25519_key.pub
[root@bogon ssh]# cd .ssh
-bash: cd: .ssh: No such file or directory
[root@bogon ssh]# cd .ssh/
-bash: cd: .ssh/: No such file or directory
[root@bogon ssh]# vim sshd_config 

#       $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $
  
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# System-wide Crypto policy:
# This system is following system-wide crypto policy. The changes to
# Ciphers, MACs, KexAlgoritms and GSSAPIKexAlgorithsm will not have any
# effect here. They will be overridden by command-line options passed on
# the server start up.
# To opt out, uncomment a line with redefinition of  CRYPTO_POLICY=
# variable in  /etc/sysconfig/sshd  to overwrite the policy.
"sshd_config" 149L, 4444C                         

使用rsa这种算法:HostKey /etc/ssh/ssh_host_rsa_key

        产生公钥和私钥的命令: ssh-Keygen=>ssh key generate=>生成密钥的

                                                 ssh-keygen -t rsa或者dsa或者ecdsa
使用rsa
        ssh-keygen -t rsa

[root@bogon ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #默认储存路径,不需要输入,直接回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #(是否添加密码)直接回车
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IHjPYHxS1q3vwQXftacC9TrWskMcOxHXvRrVQigW50M root@bogon
The key's randomart image is:
+---[RSA 2048]----+
|      o. ...Eo..o|
|   o o  . =++ o.=|
|  . B o  o =o=.oo|
|   o B .. . =ooo.|
|      o So + *o..|
|          + @.o  |
|         . + *   |
|          . o    |
|             .   |
+----[SHA256]-----+

查询rsa:

[root@bogon ~]# cd .ssh/
[root@bogon .ssh]# ls -l
total 8
-rw-------. 1 root root 1811 Jan 13 03:20 id_rsa
-rw-r--r--. 1 root root  392 Jan 13 03:20 id_rsa.pub
[root@bogon .ssh]# 

        id_rsa: 客户端的私钥
        id_rsa.pub: 客户端的公钥
        使用公钥进行加密,使用私钥进行解密

2.将我们的公钥存放在服务器端(ip:192.168.149.118)的authorized_keys这个文件中
公钥是id_rsa.pub,把这个公钥的内容放入服务器端authorized_keys文件中

        1)直接使用命令:ssh-copy-id 主机名

[root@bogon .ssh]# ssh-copy-id root@192.168.149.118
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.149.118's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.149.118'"
and check to make sure that only the key(s) you wanted were added.

        2)直接将id_rsa.pub拷贝到服务器端,然后把id_rsa.pub的内容写入authorized_keys中
          将id_rsa.pub 拷贝到 服务器端
          scp id_rsa.pub 192.168.149.118:/root
          将id_rsa.pub的内容写入~/.ssh/authorized_keys
          cd /root
          cat id_rsa.pub >> ~/.ssh/authorized_keys

4.会话请求阶段

 在第三步完成之后, 认证通过后,客户端向服务器端发送会话请求

 5.交互会话阶段

会话请求通过后,服务器端和客户端进行信息的交互

注意

        ssh连接的时候,是需要指定用户的 ssh root@192.168.149.118, 可以是root用户也可以其他的普通用户。

        连接所产生的公钥和私钥,authorized_keys,known_hosts这些文件都存储在我们用户家目录下的~/.ssh/,使用不同的用户登录,对应会在用户家目录产生.ssh这个目录

        如果要配置免密登录(基于公钥的认证), 需要是两台Linux机器, 一台作为客户端,一台作为服务端。

SSH服务配置

安装ssh

[root@localhost ~]# yum install openssh-server

配置文件分析

[root@localhost ~]# vim /etc/ssh/sshd_config 
21.#Port 22  # 默认监听22端口,可修改
22.#AddressFamily any  # IPV4和IPV6协议家族用哪个,any表示二者均有
23.#ListenAddress 0.0.0.0 # 指明监控的地址,0.0.0.0表示本机的所有地址(默认可修改)
24.#ListenAddress :: # 指明监听的IPV6的所有地址格式

26.#HostKey /etc/ssh/ssh_host_rsa_key     # rsa私钥认证,默认
27.#HostKey /etc/ssh/ssh_host_ecdsa_key   # ecdsa私钥认证
28.#HostKey /etc/ssh/ssh_host_ed25519_key # ed25519私钥认证


34 #SyslogFacility AUTH  # ssh登录系统的时会记录信息并保存在/var/log/secure
35.#LogLevel INFO   # 日志的等级

39.#LoginGraceTime 2m   # 登录的宽限时间,默认2分钟没有输入密码,则自动断开连接
40 #PermitRootLogin prohibit-password  # 只允许root以密钥形式登录,不能以密码的方式登录 可以设置PermitRootLogin yes,允许管理员登录
41.#StrictModes yes   # 是否让sshd去检查用户主目录或相关文件的权限数据
42.#MaxAuthTries 6  # 最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才能再次输入密码
43.#MaxSessions 10   # 允许的最大会话数

49.AuthorizedKeysFile .ssh/authorized_keys # 选择基于密钥验证时,客户端生成一对公私钥之后,会将公钥放到.ssh/authorizd_keys里面
65 #PasswordAuthentication yes  # 登录ssh时是否进行密码验证
66 #PermitEmptyPasswords no    # 登录ssh时是否允许密码为空

……
123.Subsystem sftp /usr/libexec/openssh/sftp-server #支持 SFTP ,如果注释掉,则不支持sftp连接
AllowUsers user1 user2 #登录白名单(默认没有这个配置,需要自己手动添加),允许远程登录的用户。如果名单中没有的用户,则提示拒绝登录

 一些常用参数

Permitrootlogin参数

参数类别是否允许ssh登录登录方式交互shell
yes允许无限制无限制
no不允许
prohibit-password允许仅允许使用密码无限制
forced-commands only允许仅允许密钥授权的口令
ssh-keygen

        于生成、管理、转换密钥的工具软件

[root@localhost ~]# ssh-keygen -t  rsa
  • -t --- 指定密钥类型

  • rsa --- rsa公钥加密算法,可以产生公钥和私钥

  • 执行后会在对应账户的家目录中产生一个隐藏目录.ssh,其中有2个文件

    • id_rsa:私钥文件

    • id_rsa.pub:公钥文件

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐