Linux基础服务ssh(一)理论、实战配置和配置文件解析

一、非对称加密体系基础知识

  1. 对称加密:加密和解密使用相同算法,但是加解密时需要提供相同的密钥。
  2. 非对称加密:使用属于同一密钥对的公钥和私钥来进行加解密,一般使用公钥加密、私钥解密(不是绝对的)。
  3. 在SSH服务的身份验证阶段,只支持服务端保公钥同时客户端保留私钥。所以通常是这两种方式:
  • 服务端生成密钥对,服务端将自己的秘钥分发给客户端。
  • 客户端生成密钥对,客户端将自己的公钥分发给服务端。(推荐使用的方法

二、SSH介绍

2.1 SSH概要
  1. SSH是传输层和应用层上的安全协议。所以它提供安全性的方法是:加密连接双方的会话。
  2. 作为服务端的主机
  • SSH服务的守护进程是sshd。
  • 默认监听在22端口。
  • 配置文件是/etc/ssh/sshd_config
  1. 作为客户端的主机
  • 通常使用ssh客户端工具,例如ssh、scp、sftp、ssh-copy-id等命令。
  • 这些命令都是讲请求发送到服务端的22端口,交由服务端来执行相关命令。
  • 服务端的相关配置文件和顺序:命令行配置选项>/etc/ssh/ssh_config>~/.ssh/config
  • 客户端还可以端口转发、代理认证、连接共享。
  • SSH登录时请求分配的是伪终端。
2.2 SSH的验证方式
  1. 主机验证
  2. 用户验证
2.3 SSH的身份验证机制
  1. 分类
  • 密码验证机制
  • 公钥认证机制(双机互信场景下是必须的)。
  1. 默认顺序:gssapi-with-mic,hostbased,**publickey**,keyboard-interactive,**password**
  2. 可以在ssh客户端配置文件中用PreferredAuthentications改变认证顺序。

三、双机SSH服务配置实战

centos:192.168.0.106 作为服务端
ubuntu:192.168.0.109 作为客户端

  1. 服务端开启ssh服务:systemctl start sshd
3.1 主机验证过程
  1. 客户端发起ssh连接请求:ssh 192.168.0.106
  2. 客户端到~/.ssh/knowx_hosts/etc/ssh/konwn_hosts下搜索是否有服务端的主机信息(host key,也就是客户端的公钥)
  • 如果搜索不到则客户端主机会询问是否保存服务端发送过来的host key。
  • 若能搜索到则与服务端这次发送过来的host key相匹配则直接进入身份验证过程。若不相同也是询问是否保存这次服务端发送过来的host key。
tyson@tyson-virtual-machine:~/.ssh$ ssh [email protected]
The authenticity of host '192.168.0.106 (192.168.0.106)' can't be established.
ECDSA key fingerprint is SHA256:D8xUSX+B7tctYyZ7lMmUlTAJ1pHBv3gq+8vOp9PAZ7o.
Are you sure you want to continue connecting (yes/no)? 
  • secureCRT使用ssh登陆时主机验证的提示也是类似的

Linux基础服务ssh(一)理论、实战配置和配置文件解析_第1张图片

  • 可以看到客户端保存了服务端的公钥
tyson@tyson-virtual-machine:~/.ssh$ cat known_hosts 
|1|4kWt5ynYjSn1QxcgCK4mUNSIVOk=|cpZbgBkXUfXmPam8OKBOHTz4UPY= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLX6vHnGec09JPKpfZIk9ZpB7x7RwodIRnTDT6lNqq9VICZfdFUShcfguZTWQj5jeLB7EzicY30aKmcJYKC8fTM=
  • 可以在服务端查看对比,确认在主机验证阶段,客户端保存的就是服务端的公钥(这个和身份验证刚好相反),只不过客户端前面多了主机索引用以快速搜索服务端的后host key
[root@Tyson'sComputer ~]# cat /etc/ssh/ssh_host_ecdsa_key.pub 
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLX6vHnGec09JPKpfZIk9ZpB7x7RwodIRnTDT6lNqq9VICZfdFUShcfguZTWQj5jeLB7EzicY30aKmcJYKC8fTM=
  • 这里是以ECDSA算法为例的,通常使用的是RSA算法。
  • 实际上两边都会将公钥用ssh-keygen转换成指纹用以提高比较速度。可以看到两端的指纹是一样的。
[root@Tyson'sComputer ~]# ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub 
256 SHA256:D8xUSX+B7tctYyZ7lMmUlTAJ1pHBv3gq+8vOp9PAZ7o no comment (ECDSA)
tyson@tyson-virtual-machine:~/.ssh$ ssh-keygen -l -f known_hosts 
256 SHA256:D8xUSX+B7tctYyZ7lMmUlTAJ1pHBv3gq+8vOp9PAZ7o |1|eBRdn5lUDzacJE9P4r5XdOATRHk=|A6xRFYn1QeTWlqNPPJ+qdKqE7fY= (ECDSA)

  • ssh还支持host key 图像化指纹比较(但是会有误差)
[root@Tyson'sComputer ~]# ssh-keygen -lv -f /etc/ssh/ssh_host_ecdsa_key.pub 
256 SHA256:D8xUSX+B7tctYyZ7lMmUlTAJ1pHBv3gq+8vOp9PAZ7o no comment (ECDSA)
+---[ECDSA 256]---+
|         .o++*B .|
|         .o..=.o.|
|        .  .. oo |
|       +    ..o. |
|        S  ..o.+o|
|         o  o+@=o|
|          .  BOo |
|           .++.o |
|           .=E*  |
+----[SHA256]-----+
tyson@tyson-virtual-machine:~/.ssh$ ssh-keygen -lv -f known_hosts 
256 SHA256:D8xUSX+B7tctYyZ7lMmUlTAJ1pHBv3gq+8vOp9PAZ7o |1|eBRdn5lUDzacJE9P4r5XdOATRHk=|A6xRFYn1QeTWlqNPPJ+qdKqE7fY= (ECDSA)
+---[ECDSA 256]---+
|         .o++*B .|
|         .o..=.o.|
|        .  .. oo |
|       +    ..o. |
|        S  ..o.+o|
|         o  o+@=o|
|          .  BOo |
|           .++.o |
|           .=E*  |
+----[SHA256]-----+
  1. 理论上双方在主机认证的过程中还会使用DH算法生成会话秘钥,并读取host key对会话秘钥进行签名。双方对比的是签名后的指纹。

四、身份验证过程

  1. 身份验证机制的顺序:gssapi-with-mic,hostbased,publickey,keyboard-interactive,password.
  2. 我们通常用的是密码认证机制(password)和公钥认证机制(public key)
  3. 这些顺序都可以在客户端的/etc/ssh/ssh_config去修改
  4. 若使用公钥认证机制进行身份认证,客户端需要将自己生成的公钥发送到服务端B的~/.ssh/authorized_keys中。(记住,身份认证阶段是客户端分发自己的公钥给服务端,而主机认证阶段是服务端分发自己的公钥给客户端),演示如下:
  • 客户端先生成公钥
tyson@tyson-virtual-machine:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tyson/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/tyson/.ssh/id_rsa.
Your public key has been saved in /home/tyson/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:gVour/10zcqnnX0OXcSdyS7jlh2WwdiHWkJX/GW6G2k tyson@tyson-virtual-machine
The key's randomart image is:
+---[RSA 2048]----+
|            . .o.|
|       .   . .=oB|
|      o .   ..oXB|
|     +   .   +o.=|
|    o . S   .o B.|
|     o     o. E.o|
|      . . . o=.+.|
|     o . o ooo...|
|    . ... +oo .o.|
+----[SHA256]-----+
tyson@tyson-virtual-machine:~/.ssh$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCe6ZQQQWrTApXSaAsiCM0W3PtRDlqYVvSSKlKBMWhXN1cs2dLyaXyV2AKzegrIPMjX/HXV3EMCPD8ucIn+FWX30agGubI7E2OVAbg8ya533N1BuGvCL86OxcjybrCHGA1jpWVS/+edKQdX1N3OLhRensD+ZRU0wXC/Y1TTmF4LG28Cs2skn/5lvonu1F/KwkT+shXO98vy6O1mGaXi9RzarHH06XgsW2GNeW6rI92InCMdl3a6TSPLTzugtLNTk9wtrmPySLmkAQlRPHfegPgci1Y+JDBo2uaWlkzzQo0pZ6kMPAu/0q+9pnHoIwvz+EGPO11Ir+nRMlXcFnl38y1j tyson@tyson-virtual-machine
  • 服务端保存客户端的公钥
[root@Tyson'sComputer ~]# echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCe6ZQQQWrTApXSaAsiCM0W3PtRDlqYVvSSKlKBMWhXN1cs2dLyaXyV2AKzegrIPMjX/HXV3EMCPD8ucIn+FWX30agGubI7E2OVAbg8ya533N1BuGvCL86OxcjybrCHGA1jpWVS/+edKQdX1N3OLhRensD+ZRU0wXC/Y1TTmF4LG28Cs2skn/5lvonu1F/KwkT+shXO98vy6O1mGaXi9RzarHH06XgsW2GNeW6rI92InCMdl3a6TSPLTzugtLNTk9wtrmPySLmkAQlRPHfegPgci1Y+JDBo2uaWlkzzQo0pZ6kMPAu/0q+9pnHoIwvz+EGPO11Ir+nRMlXcFnl38y1j tyson@tyson-virtual-machine">> ~/.ssh/authorized_keys 
  • 服务端重启ssh服务:systemctl restart sshd
  • 客户端测试吗,可不需要密码认证就完成了身份认证
tyson@tyson-virtual-machine:~/.ssh$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCe6ZQQQWrTApXSaAsiCM0W3PtRDlqYVvSSKlKBMWhXN1cs2dLyaXyV2AKzegrIPMjX/HXV3EMCPD8ucIn+FWX30agGubI7E2OVAbg8ya533N1BuGvCL86OxcjybrCHGA1jpWVS/+edKQdX1N3OLhRensD+ZRU0wXC/Y1TTmF4LG28Cs2skn/5lvonu1F/KwkT+shXO98vy6O1mGaXi9RzarHH06XgsW2GNeW6rI92InCMdl3a6TSPLTzugtLNTk9wtrmPySLmkAQlRPHfegPgci1Y+JDBo2uaWlkzzQo0pZ6kMPAu/0q+9pnHoIwvz+EGPO11Ir+nRMlXcFnl38y1j tyson@tyson-virtual-machine
tyson@tyson-virtual-machine:~/.ssh$ ssh [email protected]
Last login: Sun Feb 17 22:41:26 2019 from 192.168.0.109
you have been successfully process /etc/profile!
[root@Tyson'sComputer ~]# cat ~/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCe6ZQQQWrTApXSaAsiCM0W3PtRDlqYVvSSKlKBMWhXN1cs2dLyaXyV2AKzegrIPMjX/HXV3EMCPD8ucIn+FWX30agGubI7E2OVAbg8ya533N1BuGvCL86OxcjybrCHGA1jpWVS/+edKQdX1N3OLhRensD+ZRU0wXC/Y1TTmF4LG28Cs2skn/5lvonu1F/KwkT+shXO98vy6O1mGaXi9RzarHH06XgsW2GNeW6rI92InCMdl3a6TSPLTzugtLNTk9wtrmPySLmkAQlRPHfegPgci1Y+JDBo2uaWlkzzQo0pZ6kMPAu/0q+9pnHoIwvz+EGPO11Ir+nRMlXcFnl38y1j tyson@tyson-virtual-machine
[root@Tyson'sComputer ~]# exit
logout
Connection to 192.168.0.106 closed.

五、认证通过后的操作

  1. ssh 192.168.0.106形式登录
  • 远程主机分配一个伪终端,进入bash环境。
  1. ssh 192.168.0.106 'echo "haha"'形式登录
  • 服务器的fork ssh-agent会生成一个子进程来执行命令,执行完毕后子进程关闭。ssh连接段考。
  1. 客户端在~/.ssh/rc/etc/ssh/rc中指定ssh连接建立后需要首先执行的命令。

六、配置文件解析

以下的配置都不是完整配置,完整的配置可参考http://www.jinbuguo.com/openssh/sshd_config.html。

6.1 服务端配置文件
  1. /etc/ssh/sshd_config:ssh服务端守护进程sshd的配置文件。
  • 一般来说,只需要修改监听端口,以及把UseDNS设置为no以加快主机验证阶段的速度就ok。
  • 配置好后需要重新启动ssh服务:systemctl restart sshd
#Port 22                # 服务端SSH端口,可以指定多条表示监听在多个端口上
#ListenAddress 0.0.0.0  # 监听的IP地址。0.0.0.0表示监听所有IP
Protocol 2              # 使用SSH 2版本
 
#####################################
#          私钥保存位置               #
#####################################
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key      # SSH 1保存位置/etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key  # SSH 2保存RSA位置/etc/ssh/ssh_host_rsa _key
#HostKey /etc/ssh/ssh_host_dsa_key  # SSH 2保存DSA位置/etc/ssh/ssh_host_dsa _key
 
 
###################################
#           杂项配置               #
###################################
#PidFile /var/run/sshd.pid        # 服务程序sshd的PID的文件路径
#ServerKeyBits 1024               # 服务器生成的密钥长度
#SyslogFacility AUTH              # 使用哪个syslog设施记录ssh日志。日志路径默认为/var/log/secure
#LogLevel INFO                    # 记录SSH的日志级别为INFO
#LoginGraceTime 2m                # 身份验证阶段的超时时间,若在此超时期间内未完成身份验证将自动断开
 
###################################
#   以下项影响认证速度               #
###################################
#UseDNS yes                       # 指定是否将客户端主机名解析为IP,以检查此主机名是否与其IP地址真实对应。默认yes。
                                  # 由此可知该项影响的是主机验证阶段。建议在未配置DNS解析时,将其设置为no,否则主机验证阶段会很慢
 
###################################
#   以下是和安全有关的配置           #
###################################
#PermitRootLogin yes              # 是否允许root用户登录
#MaxSessions 10                   # 最大客户端连接数量
#GSSAPIAuthentication no          # 是否开启GSSAPI身份认证机制,默认为yes
#PubkeyAuthentication yes         # 是否开启基于公钥认证机制
#AuthorizedKeysFile  .ssh/authorized_keys  # 基于公钥认证机制时,来自客户端的公钥的存放位置
PasswordAuthentication yes        # 是否使用密码验证,如果使用密钥对验证可以关了它
#PermitEmptyPasswords no          # 是否允许空密码,如果上面的那项是yes,这里最好设置no
 
###################################
#   以下可以自行添加到配置文件        #
###################################
DenyGroups  hellogroup testgroup  # 表示hellogroup和testgroup组中的成员不允许使用sshd服务,即拒绝这些用户连接
DenyUsers   hello test            # 表示用户hello和test不能使用sshd服务,即拒绝这些用户连接
 
###################################
#   以下一项和远程端口转发有关        #
###################################
#GatewayPorts no                  # 设置为yes表示sshd允许被远程主机所设置的本地转发端口绑定在非环回地址上
                                  # 默认值为no,表示远程主机设置的本地转发端口只能绑定在环回地址上,见后文"远程端口转发"
  1. /etc/ssh/ssh_host_*:sshd服务启动时生成的服务端公钥和秘钥文件。
  • 其中.pub文件是进行主机验证时服务端的host id,这个文件需要写入到客户端的~/.ssh/known_hosts文件中。
  • 其中的私钥文件的权限严格要求为***600***。
  1. ~/.ssh/authorized_keys:保存的用户认证阶段基于公钥认证机制时来自客户端的公钥。
6.2 客户端配置文件
  1. /etc/ssh/ssh_config:客户端的全局配置文件
  • 客户端配置文件有很多配置项和服务端配置项名称相同。
  • 有些相同的选项含义是有区别的,例如客户端的GSSAPIAuthentication是是否在连接时直接跳过身份验证机制,而服务端的GSSAPIAuthentication则表示是否开启GSSAPI身份验证的机制。
# Host *                              # Host指令是ssh_config中最重要的指令,只有ssh连接的目标主机名能匹配此处给定模式时,
                                      # 下面一系列配置项直到出现下一个Host指令才对此次连接生效
#   ForwardAgent no
#   ForwardX11 no
#   RhostsRSAAuthentication no
#   RSAAuthentication yes
#   PasswordAuthentication yes     # 是否启用基于密码的身份认证机制
#   HostbasedAuthentication no     # 是否启用基于主机的身份认证机制
#   GSSAPIAuthentication no        # 是否启用基于GSSAPI的身份认证机制
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
#   GSSAPITrustDNS no
#   BatchMode no                   # 如果设置为"yes",将禁止passphrase/password询问。比较适用于在那些不需要询问提供密
                                   # 码的脚本或批处理任务任务中。默认为"no"。
#   CheckHostIP yes
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask        # 设置为"yes",ssh将从不自动添加host key到~/.ssh/known_hosts文件,
                                     # 且拒绝连接那些未知的主机(即未保存host key的主机或host key已改变的主机)。
                                     # 它将强制用户手动添加host key到~/.ssh/known_hosts中。
                                     # 设置为ask将询问是否保存到~/.ssh/known_hosts文件。
                                     # 设置为no将自动添加到~/.ssh/known_hosts文件。
#   IdentityFile ~/.ssh/identity     # ssh v1版使用的私钥文件
#   IdentityFile ~/.ssh/id_rsa       # ssh v2使用的rsa算法的私钥文件
#   IdentityFile ~/.ssh/id_dsa       # ssh v2使用的dsa算法的私钥文件
#   Port 22                          # 当命令行中不指定端口时,默认连接的远程主机上的端口
#   Protocol 2,1
#   Cipher 3des                      # 指定ssh v1版本中加密会话时使用的加密协议
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc  # 指定ssh v1版本中加密会话时使用的加密协议
#   MACs hmac-md5,hmac-sha1,[email protected],hmac-ripemd160
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no    # 功能等价于~/.ssh/rc,表示是否允许ssh连接成功后在本地执行LocalCommand指令指定的命令。
#   LocalCommand             # 指定连接成功后要在本地执行的命令列表,当PermitLocalCommand设置为no时将自动忽略该配置
                             # %d表本地用户家目录,%h表示远程主机名,%l表示本地主机名,%n表示命令行上提供的主机名,
                             # p%表示远程ssh端口,r%表示远程用户名,u%表示本地用户名。
#   VisualHostKey no         # 是否开启主机验证阶段时host key的图形化指纹
Host *
        GSSAPIAuthentication yes
  1. ~/.ssh/config:用户端的用户配置文件,优先级高于全局配置文件,权限严格设置为600。
  2. ~/.ssh/known_hosts:保存的是主机验证时服务的host key,来源于服务端的/etc/ssh/ssh_host_rsa_key.pub
  3. /etc/ssh/known_hosts:全局保存host key的文件。
  4. ~/.ssh/id_rsa:客户端生成的私钥,对应的公钥分发给了服务端(在服务端的~/.ssh/authorized_keys中),用于进行公钥体质的用户认证。权限严格为600.
  5. ~/.ssh/rc:保存了客户端在成功ssh连接远程主机后首先执行的命令列表。
  6. /etc/ssh/rc:作用同上。

你可能感兴趣的:(linux基础)