SSH 远程访问与TCP Wrapper 访问控制

一:SSH 远程管理概述

1.1.ssh远程管理的定义

SSH (Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。

SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此ssH协议具有很好的安全性。


## 1.2 ssh 远程管理的 优点

ssh 客户端 和 ssh 服务端通过网络连接,他们之间的数据传输是加密,压缩的,可以防止信息泄露,提高传输速度

Snipaste_2021-07-02_23-41-47

1.2提供 ssh 服务的软软件包

SSH 客户端软件:Putty,XShell , CRTSSH

SSH服务端软件:Openssh



二:ssh服务端配置



2.1 下载Openssh 软件,并启动

关于openssh 及sshd 服务:

  1. OpenssH是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux操作系统。
  2. Centos 7系统默认已安装openssh相关软件包,并已将sshd服务添加为开机自启动。
  3. 执行"systemctl start sshd"命令即可启动sshd服务(centos 7版本)
  4. sshd服务使用的默认端口是TCP 22端口

image-20210703103316255

如果没有,可以使用 yum -y install openssh 安装

image-20210703103437461

image-20210703104155995



2.2 sshd服务的配置文件

在 /etc/ssh 目录下,有两个文件,一个是 ssh_config 文件,还有一个是sshd_config 文件

  • ssh_config 这个是用户配置文件,是针对于客户端的配置文件
  • ssh_config 这个是系统配置文件,是针对于服务端的配置文件

image-20210703105458777



2.3 sshd 配置文件/etc/ssh/sshd_config 的常用选项设置

Port 22 监听端口 22
ListenAddress 0.0.0.0 监听地址为任意网段,也可以指定OpenssH服务器的具体Ip
LoginGraceTime 2m 登录验证时间为2分钟
PermitRootLogin yes 允许远程登录root 账号 (默认yes 允许, no 表示禁止)
MaxAuthTries 6 最大重试次数为 6 (每次账号登录时,允许输入6次账号和密码)
MaxSessions 10 每次连接,最大会话数为10
PermitEmptyPasswords no 禁止空密码登录(默认no 禁止, yes 表示 允许)
PasswordAuthentication yes 启用密码验证 (默认yes 开启, no表示关闭)
UseDNS no 禁用DNS反向解析,以提高服务器的响应速度(no 表示禁止, yes 表示开启)
PidFile /var/run/sshd.pid 保存sshd 服务进程pid 号文件

注 : 修改完配置文件需要 重新加载配置文件, 或者 重启sshd 服务。 如果设置了某些selinux 或者 防护墙 策略中不允许的 ,需要修改selinux 和防火墙策略

[root@host13 ssh]# systemctl reload sshd       #重新加载 sshd 配置文件
[root@host13 ssh]# systemctl restart sshd      #重启 sshd 服务

[root@host13 ssh]# systemctl stop firewalld    #关闭 firewalld 防火墙
[root@host13 ssh]# setenforce 0                # 设置selinux 等级为permissive 
# 防火墙系统默认开机自启, selinux 的设置也是 临时的, 如果重启操作系统,会失效

image-20210703113247322

image-20210703113730645

image-20210703113941719

image-20210703114502102



2.4 通过系统配置文件,配置登录白名单/黑名单

sshd 服务系统配置文件 : /etc/ssh/sshd_config


### 2.4.1 配置用户登录白名单/黑名单

shd 的系统配置文件 /etc/ssh/sshd_config 最后添加如下任意一行,然后重启sshd服务

AllowUsers 用户远程登录白名单(仅在该配置里的用户可以远程登录,不与 黑名单一起用)

DenyUsers 用户远程登录黑名单(在该配置里的用户禁止远程登,不与白名单一起用

image-20210703214237543

(黑名单设置方法与白名单类似,故,只举例白名单)

服务端设置:

[root@host13 ~]# vim /etc/ssh/sshd_config    #修改sshd 系统配置文件
AllowUsers  zhangsan  lisi@192.168.23.10  wangwu@192.168.23.0/24  zhaoliu@192.168.23.*  
#在配置文件最后添加白名单

[root@host13 ~]# systemctl restart sshd      #重启服务

客户端验证:

image-20210703215007982

image-20210703224358090

image-20210703225537385



2.4.2 配置IP 登录限制

在系统配置文件 /etc/ssh/sshd_config 文件中 设置,禁止全局密码登录,并且在最后设置允许匹配网段密码登录

image-20210703230417297

image-20210703231140720

Match Address 可以匹配单个ip地址,多个ip地址,也可以配置网段,还支持通配符设置

服务端配置:

[root@host13 ~]# systemctl stop firewalld 
[root@host13 ~]# setenforce 0
[root@host13 ~]# vim /etc/ssh/sshd_config 
PasswordAuthentication no
......
Match Address  192.168.23.12
  PasswordAuthentication yes 
[root@host13 ~]# systemctl restart sshd

客户端验证:

image-20210703231932284



三:ssh 客户端配置及功能



3.1 ssh 客户端远程登录格式

ssh [-p 端口号] [-l 登录名] [登录名@]**ip/主机名** [command]

选项 参数 释义
-p 端口号 指定端口号登录 。缺省则默认 22
-l 登录名 指定远程登录名,也可以用 "登录名@" 的格式。 缺省默认与当前主机用户同名的 远程账号
ip/主机名 可以直接是 ip 地址,也可以是主机名。如果是主机名,需要有主机名映射,可以在 DNS 服务器中 或者 /etc/hosts 文件中 做IP地址,主机名映射
commad 执行的命令。可以不登录过去,将服务端主机命令的输出结果显示到当前主机
[root@host10 ~]# ssh -p 22 -l root 192.168.23.13 ps aux | grep sshd
root@192.168.23.13's password: 
root       1399  0.0  0.2 147788  5228 ?        Ss   22:14   0:00 sshd: root@pts/0
root       2962  0.0  0.2 147784  5368 ?        Ss   23:16   0:00 sshd: root@pts/1
root       3069  0.0  0.2 105996  4120 ?        Ss   23:20   0:00 /usr/sbin/sshd -D
root       3546  3.0  0.2 147784  5284 ?        Ss   23:43   0:00 sshd: root@notty

image-20210703234440406

[root@host10 ~]# echo " 192.168.23.13   host13"  >> /etc/hosts
[root@host10 ~]# ssh host13
root@host13's password: 
Last login: Sat Jul  3 23:46:09 2021 from 192.168.23.10
[root@host13 ~]# 

image-20210703234900436


3.2 scp 远程复制

格式:

下行复制

scp [-r] 远程用户名@远程主机ip:远程目录或文件 本地目录

上行复制

scp [-r] 本地目录或文件 远程用户名@远程主机ip:远程目录

-r : 复制目录时,需要加上 -r 选项

scp 复制时,如果目标地址由和源文件 相同的文件名,则会直接覆盖

[root@host10 opt]# scp root@192.168.23.13:/etc/shadow  /opt/
root@192.168.23.13's password: 
shadow                                                                           100% 1719     2.2MB/s   00:00    
[root@host10 opt]# pwd
/opt
[root@host10 opt]# ls
rh  shadow

image-20210704001636076

root@192.168.23.13's password: 
passwd                                                                           100% 2104     1.6MB/s   00:00    
[root@host10 opt]# ssh -l root 192.168.23.13 ls /opt
root@192.168.23.13's password: 
passwd
rh

image-20210704001423604

注意,远程复制时,要注意远程用户的权限。

[root@host10 opt]# scp /var/log/messages  zhangsan@192.168.23.13:/opt
zhangsan@192.168.23.13's password: 
Permission denied, please try again.
zhangsan@192.168.23.13's password: 
Permission denied, please try again.
zhangsan@192.168.23.13's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
lost connection
[root@host10 opt]# ssh -l root 192.168.23.13 ls -ld /opt
root@192.168.23.13's password: 
drwxr-xr-x. 3 root root 30 7月   3 23:21 /opt
[root@host10 opt]# 

image-20210704002311763



3.3. sftp 安全文件传输协议

sttp 协议可以远程进行文件获取,文件内容传输,文件管理登录操作。由于使用了加密/解密 技术,传输效率比普通FTP 要低,但是安全性更高,操作语法与FTP 几乎一样。SFTP使用ssh的数据通道传输,使用的端口是 tcp 22 端口。sftp 登录时,默认登录到远程用户的家目录中

[root@host10 ~]# sftp root@192.168.23.13
root@192.168.23.13's password: 
Connected to 192.168.23.13.
sftp> pwd
Remote working directory: /root
sftp> cd /opt/
sftp> ls
passwd  rh      
sftp> get /opt/passwd  /opt/
Fetching /opt/passwd to /opt/passwd
/opt/passwd                                                                      100% 2104     1.4MB/s   00:00    
sftp> put /var/log/messages /opt/
Uploading /var/log/messages to /opt/messages
/var/log/messages                                                                100%  737KB 105.8MB/s   00:00    
sftp> ls
messages  passwd    rh        
sftp> rm passwd 
Removing /opt/passwd
sftp> ls
messages  rh        
sftp> quit

image-20210704005909322

关于 sftp服务 与 ssh 服务

(1)先使用命令 pstree 查看进程树

image-20210704004034160

(2)然后再使用sftp服务,并将服务放入后台

[root@host13 ~]# sftp root@192.168.23.13
root@192.168.23.13's password: 
Connected to 192.168.23.13.
sftp> 
[1]+  已停止               sftp root@192.168.23.13

(3)在使用pstree 命令查看进程树

image-20210704010051307

注:

ssh 服务: openssh 的客户端

sshd 服务: openssh 的服务端



四: 使用ssh 密钥对验证登录

4.1 ssh 的登录方式

ssh 有两种登录方式,一种是密码验证登录,另一种是密钥对验证登录。

密码验证登录:使用服务端的系统用户名称,密码进行验证登录。简便,但是可能会被暴力破解

密钥对验证登录:服务端开启密钥对验证登录的方式,客户端创建密钥对,客户端自己保留私钥,将公钥传给服务端的指定位置。远程登录时,系统使用公钥,私钥进行加密/界面验证。

当密码验证,密钥对验证同时开启时,服务端优先使用密钥对验证



4.2 服务端开启密钥对登录

[root@host13 ~]# vim /etc/ssh/sshd_config   #sshd 系统配置文件
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

[root@host13 ~]# systemctl restart sshd

image-20210704011711995

配置文件里注明,公钥库文件默认在用户家目录的隐藏目录 .ssh 目录下,叫 authorized_keys



4.3客户端创建密钥对

使用 ssh-keygen 命令,为当前用户创建密钥对

格式:

ssh-keygen [-t 算法类型]

使用-t 选项,指定算法类型。缺省使用 rsa 类型

算法类型参数有: dsa ,ecdsa , ed25519 , rsa,rsa1 。

image-20210704013618102

公钥和私钥保存在用户家目录的隐藏目录 .ssh 目录下

image-20210704015717189

image-20210704015820304



4.4 将公钥文件上传给服务端,密钥登录

使用ssh-copy-id 命令,快速将公钥上传给服务端

ssh-copy-id [-i 公钥] [-p 端口] 远程用户@远程主机

选项:

-i :指定公钥文件。当只有一个公钥时,可以省略。如果有多个公钥,可以使用 -i 指定

4.4.1上传密钥

[root@host10 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub  root@192.168.23.13
/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.23.13's password:     #远程主机root 密码

Number of key(s) added: 1

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

[root@host10 ~]# 

image-20210704014416422

4.4.2密钥验证登录

[root@host10 ~]# ssh root@192.168.23.13
Enter passphrase for key '/root/.ssh/id_rsa':         #输入密钥对密码
Last login: Sat Jul  3 23:47:07 2021 from 192.168.23.10
[root@host13 ~]# 

image-20210704015226528

4.4.3 关于 ssh-copy-id 命令

Linux 系统 缺省包含了 ssh-copy-id工具,这其实是一个shell 脚本

(1) 首先,使用 which 命令,查看ssh-copy-id 命令的 文件路径

/usr/bin/ssh-copy-id

[root@host10 ~]# which ssh-copy-id
/usr/bin/ssh-copy-id

(2) 使用vim或者cat 等 查看文件的命令 打开 脚本文件/lusr/bin/ssh-copy-id

[root@host10 ~]# vim /usr/bin/ssh-copy-id

发现这是用 一个shell 脚本。

ssh-copy-id 使用的端口

ssh-copy-id 默认使用22 端口,但是,如果服务端的sshd 使用的不是 默认的22 端口,则 ssh-copy-id 命令报错。比如说,当目标主机sshd使用220 端口时(这是我随便设的)

image-20210704023212475

这时候就需要加上 -p 选项,指定端口

image-20210704023334593



4.5 方法二,手动传递公钥,导入到公钥库文件中

当命令 ssh-copy-id 无法使用时,我们可以通过传递公钥到远程主机,然后改名的方式来完成。

但是,要注意如果传递给普通用户,要注意普通用户的权限。并且,要修改修改目录 .ssh 的权限为 700 ,修改 公钥库文件 authorized_keys 权限为 600

4.5.1 生成密钥对

[root@host10 ~]# ssh-keygen -t dsa   #生成  dsa 类型的密钥对

image-20210704105728493



4.5.2 传递密钥给服务端

[root@host10 ~]# scp /root/.ssh/id_dsa.pub  zhangsan@192.168.23.13:/home/zhangsan/
zhangsan@192.168.23.13's password: 
id_dsa.pub                                                           100%  601   214.5KB/s   00:00    
[root@host10 ~]# 

image-20210704110104151

普通用户在自己的家目录中拥有完全权限。上传的远程主机目录,zhangsan 用户没有写入权限,则会报错。

image-20210704110633499


4.5.3 服务端将公钥导入到公钥库文件中

因为是传给普通用户zhangsan,所以需要修改 .ssh 目录权限为 700, 修改公钥库文件 authorized_key 权限为600。如果不修改权限,将会被拒绝访问

[zhangsan@host13 ~]$  ls id_dsa.pub 
id_dsa.pub
[zhangsan@host13 ~]$ mkdir .ssh
[zhangsan@host13 ~]$ chmod 700 .ssh
[zhangsan@host13 ~]$ cat id_dsa.pub >> .ssh/authorized_keys
[zhangsan@host13 ~]$ chmod 600 .ssh/authorized_keys 
[zhangsan@host13 ~]$ ls -ld .ssh/
drwx------. 2 zhangsan zhangsan 29 7月   4 11:10 .ssh/
[zhangsan@host13 ~]$ ll .ssh/
总用量 4
-rw-------. 1 zhangsan zhangsan 601 7月   4 11:10 authorized_keys
[zhangsan@host13 ~]$ 

image-20210704111440112

4.5.4 客户端密钥对登录测试

[root@host10 ~]# ssh zhangsan@192.168.23.13
Enter passphrase for key '/root/.ssh/id_dsa': 
Last login: Sun Jul  4 11:09:39 2021
[zhangsan@host13 ~]$ 

image-20210704111820329



4.6 ssh 实现免交互登录

4.6.1 ssh 密码验证的免交互

当ssh开启“允许空密码用户登录” 项时,则可以远程登录空密码账号。此时,因为是空密码,所以可以直接登录

服务端:

先设置允许空密码用户登录

[root@host13 ~]$ vim /etc/ssh/sshd_config
PermitEmptyPasswords yes

[root@host13 ~]# systemctl restart sshd

image-20210704155709747

在清空某个系统用户密码

[root@host13 ~]# passwd  -d  lisi
清除用户的密码 lisi。
passwd: 操作成功

image-20210704155949410

客户端测试:

image-20210704160140988



4.6.2 ssh 密钥对验证免密登录

在创建密钥对时,如果在输入密钥对密码 项时,直接回车,创建空密码密钥对,则可以实现在使用密钥对验证登录时,免密登录

创建密钥对

[root@host10 ~]# ssh-keygen  -t ecdsa

image-20210704160629376

上传公

image-20210704160906165

登录验证

image-20210704161039968



4.7使用 ssh-agent 密钥管理器,实现免密登录

前面用户设置空密码登录,对于服务器来说是极其危险的。空密码密钥对,也是不安全的。

所以,我们可以设置ssh 代理功能,用ssh-agent 来实现面交互登录.


4.7.1 ssh-agent :密钥管理器概述**

  1. ssh-agent命令是一种控制用来保存公钥身份验证所使用的私钥的程序
  2. ssh-agent在X会话或登录会话之初启动,所有其他窗口或程序则以客户端程序的身份启动并加入到ssh-agent程序中。
  3. 通过使用环境变量,可定位代理并在登录到其他使用ssh机器上时使用代理自动进行身份验证。



4.7.2 开启 ssh 代理

先使用 ssh-agent命令 来开启ssh代理,然后,再用 ssh-add 命令将密钥添加到ssh-agent的高速缓存中

格式:

ssh-agent shell环境(bash,sh 等)

ssh-add [选项] [密钥]

ssh-add 常用选项:

-D 删除ssh-agent中的所有密钥
-d 从ssh-agent中的删除密钥
-l 显示ssh-agent中的密钥
-L 显示ssh-agent中的公钥
-X 对ssh-agent进行解锁
-x 对ssh-agent进行加锁

为了防止干扰测试,已经提前清空 .ssh 目录下,之前创建的其他密钥

[root@host10 ~]# ssh root@192.168.23.13
Enter passphrase for key '/root/.ssh/id_rsa': 
Last login: Sun Jul  4 16:27:44 2021 from 192.168.23.10
[root@host13 ~]# exit
登出
Connection to 192.168.23.13 closed.
[root@host10 ~]# ssh-agent bash
[root@host10 ~]# ssh-add /root/.ssh/id_rsa
Enter passphrase for /root/.ssh/id_rsa: 
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@host10 ~]# ssh root@192.168.23.13
Last login: Sun Jul  4 16:32:45 2021 from 192.168.23.10
[root@host13 ~]#

image-20210704163651742

注意: ssh-agent 代理,如果退出当前bash 环境,则失效



4.7.3 关于 ssh-agent

ssh-agent 命令,是在当前shell 环境中,新开一个 子shell环境,然后,其进程是运行在子shell环境中的。

一旦退出新的子shell 环境,ssh-agent 进程结束

(1) 先使用 pstree 命令查看进程树

[root@host10 ~]# pstree

image-20210704164535591

(2) 我们在当前 shell 环境 中,创建一个长时间存在的后台进程,并用pstree 查看

[root@host10 ~]# sleep 10000 &
[1] 2037
[root@host10 ~]# pstree

image-20210704165634125

(2) 使用 ssh-agent sh 开启代理 ,在使用 pstree 查看进程

[root@host10 ~]# ssh-agent sh
sh-4.2# pstree

其实,我们已经可以通过命令行的提示符,发现shell 环境已经改变。由之前的 /bin/bash 变为了/bin/sh

image-20210704165723825

image-20210704170148098

(3) 退出当前的 shell 环境,再查看进程树

sh-4.2# exit
exit
[root@host10 ~]# pstree

image-20210704170455858



五,TCP Wrapper 访问控制

5.1 保护原理

"包裹"在TCP服务程序外,代为监听TCP 服务程序的端口,增加了一个安全检测的过程。外来的连接请求必须先通过安全检测,获得许可后,才能访问真正的服务程序

软件包:tcp_wrappers

image-20210704193810749


5.2 保护机制的两种方式

(1) 直接使用tcpd 程序对其他程序进行保护,需要运行tcpd 程序

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

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

ldd 加 服务程序绝对路径

[root@host10 ~]# ldd $(which httpd)

image-20210704183139097



5.3 TCP Wrappers 的访问策略

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

格式:

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

image-20210704193530198



5.4 TCP Wrappers 机制 基本原则

TCP Wrappers 的匹配原则是 自上向下匹配,匹配即停止。

首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;

否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;

如果检查上述两个文件都找不到相匹配的策略,则允许访问。



5.4.1 "允许所有,拒绝个别"(黑名单)

​ 在/etc/hosts.deny文件中添加相应拒绝策略

如:允许192.168.23.0/24网段主机访问sshd服务

[root@host10 ~]# vim /etc/hosts.deny

image-20210704194816675



5.4.2"允许个别,拒绝所有"(白名单)

​ 在/etc/hosts.allow 中添加允许策略,然后在 /etc/hosts.deny文件中设置 拒绝所有

如:只允许192.168.23.0/24 网段访问sshd 服务

先在/etc/hosts.allow 中放通 192.168.23.0/24 网段主机

[root@host10 ~]# vim /etc/hosts.allow 

image-20210704195016182

再在 /etc/hosts.deny 中拒绝所有

[root@host10 ~]# vim /etc/hosts.deny

image-20210704195148760

posted @ 2021-07-04 20:06  知己一语  阅读(507)  评论(0编辑  收藏  举报