SSH 远程访问与TCP Wrapper 访问控制
一:SSH 远程管理概述
1.1.ssh远程管理的定义
SSH (Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。
SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此ssH协议具有很好的安全性。
## 1.2 ssh 远程管理的 优点
ssh 客户端 和 ssh 服务端通过网络连接,他们之间的数据传输是加密,压缩的,可以防止信息泄露,提高传输速度
1.2提供 ssh 服务的软软件包
SSH 客户端软件:Putty,XShell , CRTSSH
SSH服务端软件:Openssh
二:ssh服务端配置
2.1 下载Openssh 软件,并启动
关于openssh 及sshd 服务:
- OpenssH是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux操作系统。
- Centos 7系统默认已安装openssh相关软件包,并已将sshd服务添加为开机自启动。
- 执行"systemctl start sshd"命令即可启动sshd服务(centos 7版本)
- sshd服务使用的默认端口是TCP 22端口
如果没有,可以使用 yum -y install openssh 安装
2.2 sshd服务的配置文件
在 /etc/ssh 目录下,有两个文件,一个是 ssh_config 文件,还有一个是sshd_config 文件
- ssh_config 这个是用户配置文件,是针对于客户端的配置文件
- ssh_config 这个是系统配置文件,是针对于服务端的配置文件
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 的设置也是 临时的, 如果重启操作系统,会失效
2.4 通过系统配置文件,配置登录白名单/黑名单
sshd 服务系统配置文件 : /etc/ssh/sshd_config
### 2.4.1 配置用户登录白名单/黑名单
shd 的系统配置文件 /etc/ssh/sshd_config 最后添加如下任意一行,然后重启sshd服务
AllowUsers 用户远程登录白名单(仅在该配置里的用户可以远程登录,不与 黑名单一起用)
DenyUsers 用户远程登录黑名单(在该配置里的用户禁止远程登,不与白名单一起用
(黑名单设置方法与白名单类似,故,只举例白名单)
服务端设置:
复制[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 #重启服务
客户端验证:
2.4.2 配置IP 登录限制
在系统配置文件 /etc/ssh/sshd_config 文件中 设置,禁止全局密码登录,并且在最后设置允许匹配网段密码登录
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
客户端验证:
三: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
复制[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 ~]#
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
复制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
注意,远程复制时,要注意远程用户的权限。
复制[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]#
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
关于 sftp服务 与 ssh 服务
(1)先使用命令 pstree
查看进程树
(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
命令查看进程树
注:
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
配置文件里注明,公钥库文件默认在用户家目录的隐藏目录 .ssh
目录下,叫 authorized_keys
4.3客户端创建密钥对
使用 ssh-keygen
命令,为当前用户创建密钥对
格式:
ssh-keygen [-t 算法类型]
使用-t 选项,指定算法类型。缺省使用 rsa 类型
算法类型参数有: dsa ,ecdsa , ed25519 , rsa,rsa1 。
公钥和私钥保存在用户家目录的隐藏目录 .ssh
目录下
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 ~]#
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 ~]#
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 端口时(这是我随便设的)
这时候就需要加上 -p
选项,指定端口
4.5 方法二,手动传递公钥,导入到公钥库文件中
当命令 ssh-copy-id 无法使用时,我们可以通过传递公钥到远程主机,然后改名的方式来完成。
但是,要注意如果传递给普通用户,要注意普通用户的权限。并且,要修改修改目录 .ssh 的权限为 700 ,修改 公钥库文件 authorized_keys 权限为 600
4.5.1 生成密钥对
复制[root@host10 ~]# ssh-keygen -t dsa #生成 dsa 类型的密钥对
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 ~]#
普通用户在自己的家目录中拥有完全权限。上传的远程主机目录,zhangsan 用户没有写入权限,则会报错。
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 ~]$
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 ~]$
4.6 ssh 实现免交互登录
4.6.1 ssh 密码验证的免交互
当ssh开启“允许空密码用户登录” 项时,则可以远程登录空密码账号。此时,因为是空密码,所以可以直接登录
服务端:
先设置允许空密码用户登录
复制[root@host13 ~]$ vim /etc/ssh/sshd_config
PermitEmptyPasswords yes
[root@host13 ~]# systemctl restart sshd
在清空某个系统用户密码
复制[root@host13 ~]# passwd -d lisi
清除用户的密码 lisi。
passwd: 操作成功
客户端测试:
4.6.2 ssh 密钥对验证免密登录
在创建密钥对时,如果在输入密钥对密码 项时,直接回车,创建空密码密钥对,则可以实现在使用密钥对验证登录时,免密登录
创建密钥对
复制[root@host10 ~]# ssh-keygen -t ecdsa
上传公
钥
登录验证
4.7使用 ssh-agent 密钥管理器,实现免密登录
前面用户设置空密码登录,对于服务器来说是极其危险的。空密码密钥对,也是不安全的。
所以,我们可以设置ssh 代理功能,用ssh-agent 来实现面交互登录.
4.7.1 ssh-agent :密钥管理器概述**
- ssh-agent命令是一种控制用来保存公钥身份验证所使用的私钥的程序
- ssh-agent在X会话或登录会话之初启动,所有其他窗口或程序则以客户端程序的身份启动并加入到ssh-agent程序中。
- 通过使用环境变量,可定位代理并在登录到其他使用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 ~]#
注意: ssh-agent 代理,如果退出当前bash 环境,则失效
4.7.3 关于 ssh-agent
ssh-agent 命令,是在当前shell 环境中,新开一个 子shell环境,然后,其进程是运行在子shell环境中的。
一旦退出新的子shell 环境,ssh-agent 进程结束
(1) 先使用 pstree
命令查看进程树
[root@host10 ~]# pstree
(2) 我们在当前 shell 环境 中,创建一个长时间存在的后台进程,并用pstree 查看
复制[root@host10 ~]# sleep 10000 &
[1] 2037
[root@host10 ~]# pstree
(2) 使用 ssh-agent sh
开启代理 ,在使用 pstree 查看进程
复制[root@host10 ~]# ssh-agent sh
sh-4.2# pstree
其实,我们已经可以通过命令行的提示符,发现shell 环境已经改变。由之前的 /bin/bash 变为了/bin/sh
(3) 退出当前的 shell 环境,再查看进程树
复制sh-4.2# exit
exit
[root@host10 ~]# pstree
五,TCP Wrapper 访问控制
5.1 保护原理
"包裹"在TCP服务程序外,代为监听TCP 服务程序的端口,增加了一个安全检测的过程。外来的连接请求必须先通过安全检测,获得许可后,才能访问真正的服务程序
软件包:tcp_wrappers
5.2 保护机制的两种方式
(1) 直接使用tcpd 程序对其他程序进行保护,需要运行tcpd 程序
(2) 由其他网络服务程序调用 libwrap.so.* 链接库,不需要运行tcpd 程序。此方式的应用更加广泛,也更加有效率
使用 ldd
命令,可以查看程序的 libwrap.so.* 链接库
ldd 加 服务程序绝对路径
复制[root@host10 ~]# ldd $(which httpd)
5.3 TCP Wrappers 的访问策略
TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。
对应的两个策略文件为 /etc/hosts.allow 和 /etc/hosts.deny,分别用来设置允许和拒绝的策略。
格式:
服务程序:客户端地址列表
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
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
再在 /etc/hosts.deny 中拒绝所有
复制[root@host10 ~]# vim /etc/hosts.deny
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现