Linux 远程访问及控制 OpenSSH 服务

116 篇文章 15 订阅
23 篇文章 7 订阅


前言

  传统的网络服务程序如 FTP、POP 和 TELNET 在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有弱点的, 很容易受到 “中间人”(man-in-the-middle)这种方式的攻击。所谓 “中间人” 的攻击方式, 就是 “中间人” 冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被 “中间人” 一转手做了手脚之后,就会出现很严重的问题。通过使用 SSH,你可以把所有传输的数据进行加密,这样 “中间人” 这种攻击方式就不可能实现了,而且 SSH 也能够防止 DNS 欺骗和 IP 欺骗。使用 SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH 有很多功能,它既可以代替 TELNET,又可以为 FTP、POP、甚至 PPP 提供一个安全的 “通道” 。

1. SSH 远程管理

1.1 SSH 概述

  SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。相对于传统的网络服务,SSH 协议有更高的安全性。
SSH 客户端通过网络与 SSH 服务端建立连接,其具有以下两个特点:

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

SSH 协议有两个版本:

v1:基于 CRC-32 做 MAC,不安全(一般用于实现主机认证)
v2:基于协议协商选择双方都支持的最安全的 MAC 机制
    基于 DH 做密钥交换,基于 RSA 或 DSA 实现身份认证,从而实现无需输入账号密码
    客户端通过检查服务器端的主机秘钥来判断是否能够继续通信

  常用的 SSH 客户端工具有 Putty、Xshell、Secure CRT 等,SSH 服务端工具为 OpenSSH。

1.2 OpenSSH 概述

  OpenSSH 是实现 SSH 协议的开源软件项目,适用于各种 UNIX、Linux 操作系统。CentOS 7 系统默认已安装 OpenSSH 相关软件包,并已将 SSHD 服务添加为开机自启动。执行 “systemctl start sshd” 命令即可启动 SSHD 服务。
  SSHD 服务使用的默认端口号为 22,SSHD 服务的默认配置文件位于 /etc/ssh/ 目录下,ssh_config 和 sshd_config 都是 ssh 服务器的配置文件,二者的区别在于前者是针对客户端的配置文件,后者是针对服务端的配置文件。
OpenSSH 相关配置文件:

[root@c7-1 ~]#rpm -qc openssh-server
/etc/pam.d/sshd
/etc/ssh/sshd_config
/etc/sysconfig/sshd
[root@c7-1 ~]#rpm -qc openssh-clients
/etc/ssh/ssh_config

SSL,SSH,OpenSSL,OpenSSH之间的关系参考:
SSL,SSH,OpenSSL,OpenSSH

1.3 配置 OpenSSH 服务端

查看服务是否已经安装:

[root@c7-1 ~]#yum list openssh
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.ustc.edu.cn
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.ustc.edu.cn
已安装的软件包
openssh.x86_64                                                                    7.4p1-21.el7                                                                    @anaconda

sshd_config 配置文件的常用选项设置:

vim /etc/ssh/sshd_config	 #在文件中注释掉的意思为默认
Port 22                      #监听端口默认为 22,可对其进行修改,增强服务器安全性
ListenAddress 0.0.0.0        #监听地址为默认为任意网段,也可以指定 OpenSSH 服务器的具体 IP
LoginGraceTime 2m            #登录验证时间为 2 分钟
PermitRootLogin no           #禁止 root 用户登录,禁止该选项可避免 root 用户被暴力破解导致的安全隐患
MaxAuthTries 6               #最大重试次数为 6
PermitEmptyPasswords no      #禁止空密码用户登录
UseDNS no                    #禁用DNS反向解析,可提高服务器的响应速度
AllowUsers aa bb cc@192.168.10.20   #只允许 aa、bb、cc 用户登录,并且 cc 用户仅能够从 IP 地址为 192.168.10.20 的主机远程登录,多个用户以空格分隔
DenyUsers dd                 #禁止 dd 用户登录,用法与 AllowUsers 类似
#注:AllowUsers 与 DenyUsers 不要同时对同一用户使用

sshd 服务支持两种验证方式:

  • 密码验证
      对服务器中本地系统用户的登录名称,密码进行验证。使用简便,同时也容易被暴力破解,生产环境中常常关闭该功能以确保服务器的登录安全。

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

可在 sshd_config 文件中对验证方式进行设置:

vim /etc/ssh/sshd_config
PasswordAuthentication yes                 #启用密码验证
PubkeyAuthentication yes                   #启用密钥对验证
AuthorizedKeysFile ./ssh/suthorized_keys   #指定公钥库文件位置

1.4 SSH 客户端使用

(1) ssh 远程登录

  任何支持 SSH 协议的客户端程序都可以与 OpenSSH 服务器进行通信,如 Windows 平台中的 Putty、Xshell、Secure CRT 等工具。

SSH 命令使用:

#默认利用当前宿主用户的用户名登录
ssh 192.168.10.20
#使用 root 用户登录
ssh root@192.168.10.20	或	ssh -l root 192.168.10.20
#指定使用 88 端口登录,没有修改过登录端口默认 22 
ssh -p 88 root@192.168.10.20
#登录远程主机并执行 ls -l 命令,执行完成后退回原主机,同样的也可以执行脚本
ssh root@192.168.10.20 ls -l
#指定源 IP 登录,通常在客户端有多 IP 的情况下使用
ssh -b 192.168.10.30 root@192.168.10.20

(2) scp 远程复制

  scp(secure copy)是 Linux 系统下基于 ssh 协议工作的远程文件拷贝命令。相较于 rcp,scp 数据传输经过加密,而 rcp 是不加密的,因此 scp 可视为 rcp 的加强版。

命令格式:

scp [选项] [源文件] [目标文件]

选项:

-1	使用ssh1协议
-2	使用ssh2协议
-4	使用IPv4寻址
-6	使用IPv6寻址
-B	使用批处理模式,传输过程中不询问传输口令或短语
-C	允许压缩
-p	保留源文件的修改时间,访问时间以及访问权限等
-r	递归复制整个目录
-v	显示详细输出
-q	不显示传输进度条
-l	限制传输带宽,单位为Kbit/s
-P	指定传输端口号

示例:

#复制本机当前目录下的 test.txt 文件到 192.168.10.30 的 /home 目录下
scp ./test.txt root@192.168.10.30:/home
#复制目录的时候需要加上递归参数 -r
scp -r ./test root@192.168.10.30:/home
#从远程主机复制文件到本机
scp root@192.168.10.30:/home/test.txt /home 
#从远程主机递归复制目录到本机
scp -r root@192.168.10.30:/home/test.dir /home

(3) sftp 安全文件传送协议

  在 ssh 软件包中,已经包含了一个叫作 sftp 的安全文件信息传输子系统,sftp 本身没有单独的守护进程,它必须使用 sshd 守护进程来完成相应的连接和答复操作。所以从某种意义上来说,sftp 并不像一个服务器程序,而更像是一个客户端程序。sftp 同样是使用加密传输认证信息和传输数据,所以 sftp 是非常安全的。但是,由于这种传输方式使用了 加密/解密 技术,所以传输效率比普通的 ftp 要低得多,如果对网络安全性要求更高时,可以使用 sftp 代替 ftp。

用法:

#连接远程服务器
sftp username@ip
#将文件上传到服务器上
put [本地文件的地址] [服务器上文件存储的位置]
#将服务器上的文件下载到本地
get [服务器上文件存储的位置] [本地要存储的位置]

示例:

#在本机执行下载推送操作
[root@c7-1 ~]#sftp root@192.168.10.30
root@192.168.10.30's password: 
Connected to 192.168.10.30.
sftp> ls
sftp> mkdir test	#在 192.168.10.30 root 家目录创建 test 目录
sftp> ls
test  
sftp> get -r test	#下载到本机 -r 代表递归
Fetching /root/test/ to test
Retrieving /root/test
sftp> quit
[root@c7-1 ~]#ls
test
[root@c7-1 ~]#mkdir test1
[root@c7-1 ~]#sftp root@192.168.10.30
root@192.168.10.30's password: 
Connected to 192.168.10.30.
sftp> put -r test1	#推送 test1 目录到 192.168.10.30 root 家目录
Uploading test1/ to /root/test1
Entering test1/
sftp> quit

#在 192.168.10.30 主机上查看
[root@c7-2 ~]#ls
test  test1

sftp 详细使用方法参考:
sftp 详细使用

1.5 构建密钥对验证的 SSH 体系

密钥形式登录的原理是:利用密钥生成器制作一对密钥,一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。

(1) 在客户端创建密钥对

  通过 ssh-keygen 工具为当前用户创建密钥对文件。可用的加密算法为 RSA、ECDSA、DSA 等(ssh-keygen 命令的 “-t” 选项用于指定算法类型)。

#生成密钥对,指定 ecdsa 加密算法
[root@c7-1 ~]#ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):	#指定私钥位置,回车将使用默认位置 
Created directory '/root/.ssh'.	#生成的私钥、公钥文件默认放在宿主目录中的隐藏目录 .ssh/ 下
Enter passphrase (empty for no passphrase):	#设置私钥密码 
Enter same passphrase again:	#再次确认私钥密码 	
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:p/0DGcGQS3Ad548Ri4oUeE7F3wDX+m7EagcCzES2PeI root@c7-1
The key's randomart image is:
.........
#确认一下
[root@c7-1 ~]#ls -a
.   .bash_history  .bash_profile  .cshrc  .tcshrc
..  .bash_logout   .bashrc        .ssh    .viminfo
[root@c7-1 ~]#cd .ssh/
[root@c7-1 ~/.ssh]#ls
id_ecdsa  id_ecdsa.pub
#id_ecdsa 是私钥文件,权限默认为 600,id_ecdsa.pub 是公钥文件,用来提供给 SSH 服务器

(2) 将公钥文件上传至 SSH 服务器

方法一:
scp ~/.ssh/id_ecdsa.pub root@192.168.10.30
方法二:
cd ~/.ssh/
ssh-copy-id -i id_ecdsa.pub root@192.168.10.30

(3) 服务端查看公钥文件

[root@c7-2 ~]#ls -a
.   .bash_history  .bash_profile  .cache   .cshrc  .ssh     .viminfo
..  .bash_logout   .bashrc        .config  .dbus   .tcshrc  .Xauthority
[root@c7-2 ~]#cd .ssh/
[root@c7-2 ~/.ssh]#ll
total 4
-rw------- 1 root root 171 Aug 31 23:14 authorized_keys

(4) 在客户端使用密钥对验证

[root@c7-1 ~]#ssh root@192.168.10.30
Last login: Tue Aug 31 23:02:34 2021 from 192.168.10.1

(5) 在客户机设置 ssh 代理功能,实现免交互登录

ssh-agent bash	#开启 ssh 代理
ssh-add			#添加密钥信息到 ssh-agent 高速缓存中

2. TCP Wrappers 访问控制

2.1 TCP Wrappers 概述

(1) TCP Wrappers 的作用

  TCP Wrappers 将 TCP 服务程序 “包裹” 起来,代为监听 TCP 服务程序的端口,增加了一个安全监测过程,外来的连接请求必须先通过这层安全监测,获得许可后才能访问真正的服务程序。TCP Wrappers 作为应用服务与网络之间的一道特殊防线,提供了额外的安全保障。
  大多数 Linux 发行版,TCP Wrappers 都是默认提供的功能,可使用命令 “rpm -q tcp_wrappers” 查看是否已安装,如果没有,执行以下命令安装:

yum -y install telnet-server

(2) TCP Wrappers 保护机制的实现方式

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

使用 ldd 命令可以查看程序的 libwrap.so.* 链接库

ldd $(which ssh vsftpd)

2.2 TCP Wrapper 访问策略

(1) TCP Wrappers 的策略文件

  • TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。
  • 对应的两个策略文件为 /etc/hosts.allow 和 /etc/hosts.deny ,分别用来设置允许和拒绝的策略。

(2) 策略文件的配置格式

<服务程序列表>:<客户端地址列表>

服务程序列表:

ALL:代表所有的服务
单个服务程序:如 "vsftpd"
多个服务程序组成的列表:如 "vsftpd,sshd"

客户端地址列表:

ALL:代表任何客户端地址
LOCAL:代表本机地址
网段地址:如 192.168.10. 或者 192.168.10.0/255.255.255.0
允许使用通配符 "?""*" ,前者代表任意长度字符,后者仅代表一个字符
多个地址以逗号分隔

2.3 访问控制机制的基本原理

  • 首先检查 /etc/hosts.allow 文件,如果找到相匹配的策略,则允许访问
  • 否则继续检查 /etc/hosts.deny 文件,如果找到相匹配的策略,则拒绝访问
  • 如果检查上述两个文件都找不到相匹配的策略,则允许访问
访问需求具体操作
允许所有,拒绝个别只需在 /etc/hosts.deny 文件中添加相应的拒绝策略
允许个别,拒绝所有除了在 /etc/hosts.allow 中添加允许策略之外,还需在 /etc/hosts.deny 文件中设置 “ALL:ALL” 的拒绝策略

在这里插入图片描述

2.4 配置实例

只允许 IP 地址为 10.0.0.1 的主机或者位于 192.168.10.0/24 网段的主机访问 sshd 服务,其它地址全部拒绝:

vim /etc/hosts.allow
sshd:10.0.0.1,192.168.10.*

vim /etc/hosts.deny
sshd:ALL
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值