远程访问及控制——SSH

SSH远程管理

  • 配置Openssh服务端
  • 使用SSH客户端程序
  • 密钥对验证的SSH体系

SSH定义

  • SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。

1. SSH的端口号

SSH 默认使用的端口号是 22。. 大多现代的 Linux 系统 22 端口都是开放的。. 如果你运行 ssh 程序而没有指定端口号,它直接就是通过 22 端口发送请求的。. 如果我们不想通过 22 端口登录,那么我们可以使用 -p 选项来指定端口。

SSH的优点

  • 数据传输是加密的,可以防止信息泄漏
  • 数据传输是压缩的,可以提高传输速度

2. OpenSSH服务器

  • SSH(Secure Shell)协议
    • 是一种安全通道协议
    • 对通信数据进行了加密处理,用于远程管理,远程复制等功能
    • SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性。

OpenSSH 是实现 SSH 协议的开源软件项目,适用于各种 UNIX、Linux 操作系统,CentOS 7 系统默认安装并启动sshd服务

SSH客户端:Putty、Xshell、CRT
SSH服务端:OpenSSH
服务名称: sshd
默认端口号:tcp的22端口
服务端主程序: /usr/sbin/sshd
服务端配置文件: /etc/ssh/sshd_config
客户端配置文件: /etc/ssh/ssh_config

SSH服务端

  • ssh服务端主要包括两个服务功能:ssh远程连接和sftp服务.
  • 作用:SSHD服务使用SSH协议可以用来远程控制,或在计算机之间传送文件
  • 相比较之前用Telent方式传输文件要安全很多,因为Telent是明文件传输,SSH是加密传输

1. 查询当前的版本

命令格式
ssh -V
在这里插入图片描述

2. 用ssh实现远程登录

格式
ssh [远程主机用户名] @[远程服务器主机名或IP地址] -p port
需要先进vim /etc/ssh/sshd_config
ssh’的默认端口是22
将其改为2233,这边是随便改的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 设置黑白名单

进入/etc/ssh/sshd_config文件怎加黑名单和名单即可实现
AllowUsers ip地址 #白名单允许登录
DenyUsers ip地址 #黑名单禁止登录
在这里插入图片描述

4. 远程复制

scp -P 2233 root@IP地址:远程操控主机的文件绝对路径 复制目的地的主机的绝对路径地址
在这里插入图片描述

6.安全性传输

在这里插入图片描述

SSH工作原理

  • SSH的安全性比较好,其对数据进行加密的方式主要有两种:对称加密(密钥加密)和非对称加密(公钥加密)。

    对称加密指加密解密使用的是同一套秘钥。Client端把密钥加密后发送给Server端,Server用同一套密钥解密。对称加密的加密强度比较高,很难破解。但是,Client数量庞大,很难保证密钥不泄漏。如果有一个Client端的密钥泄漏,那么整个系统的安全性就存在严重的漏洞。为了解决对称加密的漏洞,于是就产生了非对称加密。非对称加密有两个密钥:“公钥”和“私钥”。公钥加密后的密文,只能通过对应的私钥进行解密。想从公钥推理出私钥几乎不可能,所以非对称加密的安全性比较高。

SSH的加密原理中,使用了RSA非对称加密算法。
整个过程是这样的:

  1. 远程主机收到用户的登录请求,把自己的公钥发给用户。
  2. 用户使用这个公钥,将登录密码加密后,发送回来。
  3. 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录

SSH服务的两种验证方式

  • 当密码验证和密钥验证同时开启时,服务器会优先使用密钥对验证

密码验证
对服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能会被假冒;从服务器角度来看,当遭遇密码暴力破解攻击时防御能力较弱。

密钥对验证
要求提供相匹配的密钥才能进行验证通过,通常先在客户端中创建一对密钥文件(公钥和私钥),然后将公钥文件放到服务器中指定位置,远程登录时,系统会使用公钥和私钥进行加密/解密关联验证,增加安全性,且可以免密交互登录。

 公钥与私钥的关系
 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密
 不能根据一个密钥来推算另一个密钥
 公钥对外公开,私钥只有私钥持有人才知道

实验
在客户端创建密钥对
在这里插入图片描述
在这里插入图片描述

注:创建密钥的时候不需要设置密码
免交互验证
在这里插入图片描述
在这里插入图片描述

ssh文件配置

vim /etc/ssh/sshd_config

# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER    ##在开启selinux的系统上,修改ssh端口的要修改selinux规则,用此命令修改
#Port 22                                               ##默认ssh端口,生产环境中建议改成五位数的端口 
#AddressFamily any                                     ##地址家族,any表示同时监听ipv4和ipv6地址
#ListenAddress 0.0.0.0                                 ##监听本机所有ipv4地址
#ListenAddress ::                                      ##监听本机所有ipv6地址
HostKey /etc/ssh/ssh_host_rsa_key                      ##ssh所使用的RSA私钥路径
HostKey /etc/ssh/ssh_host_ecdsa_key                    ##ssh所使用的ECDSA私钥路径
HostKey /etc/ssh/ssh_host_ed25519_key                  ##ssh所使用的ED25519私钥路径
SyslogFacility AUTHPRIV                                ##设定在记录来自sshd的消息的时候,是否给出“facility code”
#LogLevel INFO                                         ##日志记录级别,默认为info 
#LoginGraceTime 2m                                     ##限定用户认证时间为2min
#PermitRootLogin yes                                   ##是否允许root账户ssh登录,生产环境中建议改成no,使用普通账户ssh登录
#StrictModes yes                                       ##设置ssh在接收登录请求之前是否检查用户根目录和rhosts文件的权限和所有权,建议开启
#MaxAuthTries 6                                        ##指定每个连接最大允许的认证次数。默认值是 6
#MaxSessions 10                                        ##最大允许保持多少个连接。默认值是 10 
#PubkeyAuthentication yes                              ##是否开启公钥验证
AuthorizedKeysFile      .ssh/authorized_keys           ##公钥验证文件路径
# HostbasedAuthentication                              ##指定服务器在使用 ~/.shosts ~/.rhosts /etc/hosts.equiv 进行远程主机名匹配时,是否进行反向域名查询
#IgnoreUserKnownHosts no                               ##是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件
#IgnoreRhosts yes                                      ##是否在 RhostsRSAAuthentication 或 HostbasedAuthentication 过程中忽略 .rhosts 和 .shosts 文件
#PermitEmptyPasswords no                               ##是否允许空密码
PasswordAuthentication yes                             ##是否允许密码验证,生产环境中建议改成no,只用密钥登录
ChallengeResponseAuthentication no                     ##是否允许质疑-应答(challenge-response)认证
#KerberosAuthentication no                             ##是否使用Kerberos认证
#KerberosOrLocalPasswd yes                             ##如果 Kerberos 密码认证失败,那么该密码还将要通过其它的认证机制(比如 /etc/passwd)
#KerberosTicketCleanup yes                             ##是否在用户退出登录后自动销毁用户的 ticket
#KerberosGetAFSToken no                                ##如果使用了AFS并且该用户有一个 Kerberos 5 TGT,那么开启该指令后,将会在访问用户的家目录前尝试获取一个AFS token
GSSAPIAuthentication yes                               ##是否允许基于GSSAPI的用户认证
GSSAPICleanupCredentials no                            ##是否在用户退出登录后自动销毁用户凭证缓存
UsePAM yes                                             ##是否通过PAM验证
#GatewayPorts no                                       ##是否允许远程主机连接本地的转发端口
X11Forwarding yes                                      ##是否允许X11转发
#X11DisplayOffset 10                                   ##指定sshd(8)X11转发的第一个可用的显示区(display)数字。默认值是10
#X11UseLocalhost yes                                   ##是否应当将X11转发服务器绑定到本地loopback地址
#PrintMotd yes                                         ##指定sshd(8)是否在每一次交互式登录时打印 /etc/motd 文件的内容
#PrintLastLog yes                                      ##指定sshd(8)是否在每一次交互式登录时打印最后一位用户的登录时间
#TCPKeepAlive yes                                      ##指定系统是否向客户端发送 TCP keepalive 消息
#UseLogin no                                           ##是否在交互式会话的登录过程中使用 login(1
#UsePrivilegeSeparation sandbox                        ##是否让 sshd(8) 通过创建非特权子进程处理接入请求的方法来进行权限分离
#PermitUserEnvironment no                              ##指定是否允许sshd(8)处理~/.ssh/environment以及 ~/.ssh/authorized_keys中的 environment= 选项
#Compression delayed                                   ##是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密
#ClientAliveInterval 0                                 ##sshd(8)长时间没有收到客户端的任何数据,不发送"alive"消息 
#ClientAliveCountMax 3                                 ##sshd(8)在未收到任何客户端回应前最多允许发送多个"alive"消息,默认值是 3 
#UseDNS no                                             ##是否使用dns反向解析
#PidFile /var/run/sshd.pid                             ##指定存放SSH守护进程的进程号的路径
#MaxStartups 10:30:100                                 ##最大允许保持多少个未认证的连接
#PermitTunnel no                                       ##是否允许tun(4)设备转发
#Banner none                                           ##将这个指令指定的文件中的内容在用户进行认证前显示给远程用户,默认什么内容也不显示,"none"表示禁用这个特性
Subsystem    sftp    /usr/libexec/openssh/sftp-server  ##配置一个外部子系统sftp及其路径
#Match User anoncvs                                    ##引入一个条件块。块的结尾标志是另一个 Match 指令或者文件结尾     
AllowUsers                                             ##设置白名单,需手动添加
DenyUsers                                              ##设置黑名单,需手动添加

TCP Wrappers访问控制

  • TCP Wrappers概述
    TCP Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受TCP_Wrappers的安全控制。它的主要功能就是控制谁可以访问,常见的程序有rpcbind、vsftpd、sshd,telnet。
  • TCP Wrappers工作原理

TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;
如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。

在这里插入图片描述

TCP Wrappers 保护机制的实现方式

  1. 直接使用tcpd程序对其他服务程序进行保护,需要运行tcpd程序。
  2. 由其他网络服务程序调用libwrap.so.*链接库,不需要运行tcpd程序。此方式的应用更加广泛,也更有效率。

ldd可以直接查看程序的libwrap.so.*链接库
在这里插入图片描述