1 SSH远程管理概述
1.1 概述
SSH(Secure Shell)是一种安全通道协议,通过加密和认证机制实现安全的远程访问和文件传输等业务,主要用来实现字符界面的远程登录、远程复制等功能。
SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。
传统的远程登录和文件传输方式(如Telnet、FTP)使用明文传输数据,存在安全隐患。
与早期的 Telent(远程登录)、RSH(RemoteShell,远程执行命令)、RCP(Remote FileCopy,远程文件复制)等应用相比,SSH协议提供了更好的安全性。
SSH通过对网络数据进行加密和验证,在不安全的网络环境中提供安全的网络服务。
1.2 SSH的组成
- 传输层协议 [SSH-TRANS]
- 提供了服务器认证,保密性及完整性。此外它有时还提供压缩功能。
- SSH-TRANS 通常运行在TCP/IP连接上,也可能用于其它可靠数据流上。
- SSH-TRANS 提供了强力的加密技术、密码主机认证及完整性保护。
- 该协议中的认证基于主机,并且该协议不执行用户认证。更高层的用户认证协议可以设计为在此协议之上。
- 用户认证协议 [SSH-USERAUTH]
- 用于向服务器提供客户端用户鉴别功能。它运行在传输层协议 SSH-TRANS 上面。
- 当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H)。会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。
- SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。
- 连接协议 [SSH-CONNECT]
- 将多个加密隧道分成逻辑通道。它运行在用户认证协议上。
- 它提供了交互式登录话路、远程命令执行、转发TCP/IP连接和转发 X11 连接。
1.3 SSH工作原理
连接建立:SSH依赖端口进行通信,默认端口号为22。SSH服务器在指定端口侦听连接请求,客户端发起连接请求后,双方建立TCP连接。
版本协商:SSH协议有SSH1.X和SSH2.0版本,双方通过协商确定最终使用的版本号。
算法协商:SSH服务器和客户端协商确定使用的密钥交换算法、对称加密算法、公钥算法和HMAC算法。
密钥交换:双方通过密钥交换算法动态生成共享的会话密钥和会话ID,建立加密通道。
用户认证:SSH客户端向服务器发起认证请求,支持密码认证、密钥认证和password-publickey认证等方式。
1.4 监听
监听(侦听)是指在特定的网络地址和端口上等待并接受来自其他主机的数据流的过程。通常用于网络服务的实现,比如Web服务器、FTP服务器等等。
当一个服务器进程启动时,它需要监听一个或多个端口,以等待客户端的请求。客户端向服务器发送请求时,服务器进程接收到请求后会创建一个新的套接字来处理该请求,从而与客户端进行交互。
监听是建立服务与客户端之间连接的关键步骤之一。
1.5 应用场景
远程登录:安全地远程登录到服务器或网络设备,执行命令和管理操作。
文件传输:通过SFTP(SSH File Transfer Protocol)在客户端和服务器之间安全传输文件。
端口转发:通过SSH建立安全的隧道,将本地端口转发到远程服务器,实现安全访问内网资源等功能。
1.6 安全性
加密通信:使用强大的加密算法保护数据传输,防止信息泄露和被窃听。
身份认证:支持多种认证方式,确保只有授权用户才能访问系统。
完整性保护:使用HMAC算法保护数据的完整性,防止数据在传输过程中被篡改。
1.7 常用工具
OpenSSH:开源的SSH实现,广泛应用于各种操作系统。
PuTTY:Windows平台上的SSH和Telnet客户端,支持多种认证方式和端口转发等功能。
2 构建SSH远程登录服务
2.1 OpenSSH
OpenSSH软件分为两个部分:client-客户端、server-服务端
OpenSSH 服务端主要提供远程登录和文件传输等功能,可以被其他用户或系统通过SSH协议连接并访问。通过 SSH 连接到 OpenSSH服务端后,用户可以在服务器上执行命令、上传或下载文件等操作。
使用OpenSSH控制远程机器,需要对方安装了OpenSSH服务端。
大部分的Linux发行版,比如Debian、Ubuntu、CentOS等都默认安装好OpenSSH,相当于系统软件。
# Red系
yum install openssh-clients openssh-server
# Debian系
apt install openssh-client openssh-server
# 查看安装版本
ssh -V
# 查看服务状态
systemctl status sshd
# 启动服务
systemctl start sshd
- OpenSSH
- 服务名称:sshd
- 服务端主程序:/usr/sbin/sshd
- 服务端配置文件:/etc/ssh/sshd_config
2.2 服务监听选项
sshd 服务使用的默认端口号为22,必要时建议修改此端口号,并指定监听服务的具体IP地址,以提高在网络中的隐蔽性。
SSH 协议的版本选用V2比V1的安全性要更好,禁用 DNS 反向解析可以提高服务器的响应速度。
参数 | 说明 |
---|---|
Port 22 | 监听端口为22,默认为22 |
ListenAddress 192.168.40.131 | 监听地址 |
Protocol 2 | 使用SSH V2协议 |
UserDNS no | 禁用DNS反向解析 |
2.3 用户登录控制
sshd 服务允许 root 用户登录,但在Internet中使用时是非常不安全的。普遍的做法如下:先以普通用户远程登入,进入安全Shell 环境后,根据实际需要使用su命令切换为 root 用户。
通常应禁止root用户或密码为空的用户登录。
可以限制登录验证的时间(默认为2分钟)及最大重试次数,若超过限制后仍未能登录则断开连接。
参数 | 说明 |
---|---|
LoginGraceTime 2m | 登录时间验证为2分钟 |
PermitRootLogin yes | 允许root用户登录 |
StrictModes yes | SSH服务器对用户文件权限严格检查 |
MaxAuthTries 6 | 最大重试次数6次 |
MaxSessions 10 | 最大会话数10个子回话 |
PermitEmptyPasswords no | 禁止空密码登录 |
当希望只允许或禁止某些用户登录时,可以使用AllowUsers 或 DenyUsers配置,两者用法类似(注意不要同时使用)。
# 允许tom、jerry用户登录
AllowUsers tom jerry
# admin用户只能从33.33.33.33地址登录
AllowUsers admin@33.33.33.33
2.4 登录验证方式
对于服务器的远程管理,除了用户账号的安全控制以外,登录验证的方式也非常重要。
sshd 服务支持两种验证方式------密码验证、密钥对验证,可以设置只使用其中一种方式,也可以两种方式都启用。
-
密码验证
- 对服务器中本地系统用户的登录名称、密码进行验证。
- 这种方式使用最为简便,但从客户端角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。
-
密钥对验证
- 要求提供相匹配的密钥信息才能通过验证。
- 通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证,大大增强了远程管理的安全性。
- 该方式不易被假冒,且可以免交互登录,在Shell中被广泛使用。
-
总结
- 密码验证:核对用户名、密码是否匹配
- 密钥对验证:核对客户的私钥、服务端公钥是否匹配
- 当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。
对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对验证方式;若没有特殊要求,则两种方式都可启用。
参数 | 说明 |
---|---|
PubkeyAuthentication yes | 允许公钥验证登录 |
AuthorizedKeysFile | 指定公钥文件路径,默认为.ssh/authorized_keys |
AuthorizedKeysCommand yes | 允许通过自定义脚本生成公钥列表,需SSH6.1+ |
PubkeyAcceptedKeyTypes | 限制支持的密钥类型,如rsa-sha2-256 |
2.5 密码登录配置
参数 | 说明 |
---|---|
PasswordAuthentication yes | 允许密码验证登录 |
PermitEmptyPasswords no | 禁止空密码登录 |
2.6 使用SSH客户端程序
OpenSSH 客户端由openssh-clients 软件包提供(默认已安装),其中包括ssh远程登录命令,以及scp、sftp远程复制和文件传输命令等。
任何支持SSH 协议的客户端程序都可以与OpenSSH 服务器进行通信,如Windows平台中的Xshell、SecureCRT、Putty 等图形工具。
2.7 ssh 远程登录
基本连接:ssh username@hostname_or_ip
指定端口:ssh -p 2222 username@hostname_or_ip
# 使用131登录132
ssh zzh@192.168.40.132
当用户第一次登录SSH 服务器时,必须接受服务器发来的 ECDSA 密钥(根据提示输入"yes")后才能继续验证。接收的密钥信息将保存到~/.ssh/known_hosts文件中。
# 退出
exit
# 或按 Ctrl+D
2.8 ssh免密登录实例
主机 | 作用 |
---|---|
192.168.40.131 | 服务端 |
192.168.40.132 | 客户端 |
2.8.1 客户端配置
-
生成SSH密钥对:
ssh-keygen -t rsa -b 4096
-
-t rsa:指定RSA算法(推荐使用ed25519更安全,但需服务器支持)
-
-b 4096:密钥长度(默认2048,4096更安全)
-
-C "注释":添加注释(如邮箱,便于管理多台服务器密钥)
-
密钥默认位置
- ~/.ssh/id_rsa:私钥
- ~/.ssh/id_rsa.pub:公钥
-
-
将公钥复制到目标服务器
-
使用 ssh-copy-id命令
ssh-copy-id root@192.168.40.131
-
公钥会自动添加到~/.ssh/authorized_keys文件中
-
~/.ssh目录权限为700,authorized_keys文件为600
-
-
手动复制公钥
# 查看本地公钥内容 cat ~/.ssh/id_rsa.pub
# 将内容粘贴到服务器的authorized_keys文件末尾 vim ~/.ssh/authorized_keys
-
2.8.2 服务端配置
-
vim /etc/ssh/sshd_config
启动公钥认证
PubkeyAuthentication yes
指定公钥位置
AuthorizedKeysFile .ssh/authorized_keys
禁止密码认证(可选)
PasswordAuthentication no
其它安全建议
禁止root登录
PermitRootLogin no
修改默认端口
Port 2222
-
重启SSH服务
systemctl restart sshd
2.8.3 验证
在客户端使用生成密钥的账号,服务器接收公钥的账号
ssh root@192.168.40.131
2.9 scp 远程文件传输
通过 scp 命令可以利用SSH安全连接与远程主机相互复制文件。
使用 scp 命令时,除了必须指定复制源、目标之外,还应指定目标主机地址、登录用户,执行后根据提示输入验证口令即可。
- 语法:scp [选项] 源文件 目标路径
- -r:递归复制目录
- -P:指定SSH端口(大写,非默认端口)
- -i:指定密钥文件路径(如非默认位置)
- -C:启用压缩传输(减少带宽,提升速度)
- -p:保留文件属性(修改时间、权限等)
- -v:显示详细传输信息(调试用)
- -l:限制带宽(单位:Kbit/s)
2.9.1 上传
# 上传单个文件
scp /test/1.txt root@192.168.40.132:/test
# 上传多个文件
scp /test/1.txt /test/2.txt root@192.168.40.132:/test
scp /test/*.txt root@192.168.40.132:/test
# 上传目录
scp -r /test/a root@192.168.40.132:/test
2.9.2 下载
# 下载单个文件
scp root@192.168.40.132:/test/1.txt /test
# 下载目录
scp -r root@192.168.40.132:/test/a /test
2.10 协议SFTP
SFTP(SSH File Transfer Protocol,SSH文件传输协议)是一种基于SSH(Secure Shell)的文件传输协议,用于在客户端和服务器之间安全地传输文件。
与传统的 FTP 不同,SFTP 通过加密通信保护数据传输,适合传输敏感信息。
2.10.1 sftp命令
通过 sftp 命令可以利用SSH安全连接与远程主机上传、下载文件,采用了与FTP 类似的登录过程和交互式环境,便于目录资源管理。
语法:sftp user@hostname_or_ip
2.10.2 下载
语法:get /remote/file /local/path
# 连接到目标机
sftp sftp root@192.168.40.132
# 下载文件
get /test/1.txt /test/
get /test/*.txt /test/
# 下载目录中的所有文件及子目录
get -r /test/a/* /test/
# 退出
exit
2.10.3 上传
语法:put /local/file /remote/path
# 连接到目标机
sftp sftp root@192.168.40.132
# 上传文件
get /test/1.num /test/
get /test/*.num /test/
# 上传目录中的所有文件及子目录
put -r /test/1/* /test/
# 退出
exit
3 TCP Wrappers访问策略
3.1 概述
TCP_Wrappers是Linux中的一个安全机制【TCPWrappers防火墙】也可以成为访问控制,一定程度上达到了保护系统的目的,相当于手机的黑名单和白名单,对访问服务器的用户进行设置和管理。
TCP_Wrappers是一个工作在第4层(传输层)的安全工具,对有状态及特定服务进行安全检测并实现访问控制,凡是包含有libwrao.so库文件的程序就可以受tcpwrappers的管理。它的主要功能就是控制谁可以访问。
TCP_Wrappers(tcp封套),以作为应用服务与网络之间的一道特殊防线提供额外的安全保障,TCP_Wrappers将TCP服务程序"包裹"起来,代为监听TCP服务的程序,增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得允许后才能访问真正的服务程序。
常见的程序有:rpcbind、vsftpd、sshd、telnet
对于大多数 Linux 发行版,TCP Wrappers是默认提供的功能。
执行程序 tcpd 和共享链接库文件libwrap.so.*,对应TCP Wrapper 保护机制的两种实现方式:
直接使用 tcpd 程序对其他服务程序进行保护,需要运行tcpd
由其他网络服务程序调用libwrap.so.*链接库,不需要运行 tcpd 程序
通常,链接库方式的应用要更加广泛,也更有效率。例如,vsftpd、sshd 及超级服务器xinetd等,都调用了libwrap 共享库(使用ldd 命令可以查看程序的共享库)。
ldd /usr/sbin/sshd | grep "libwrap"
TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。
对应的两个策略文件为==/etc/hosts.allow和/etc/hosts.deny==,分别用来设置允许和拒绝的策略。
TCP Wrappers 机制的基本原则:
首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问
否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问
如果检查上述两个文件都找不到相匹配的策略,则允许访问。
黑名单:
允许所有,拒绝个别
只需在/etc/hosts.deny文件中添加相应的拒绝策略
白名单:
允许个别,拒绝所有
除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置"ALL:ALL"的拒绝策略。
语法:<服务程序列表>:<客户端地址列表>
服务程序列表、客户端地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔。
3.2 服务程序列表
服务程序列表可分为以下几类:
ALL:代表所有的服务
单个服务程序:vsftpd
多个服务程序组成的列表:vsftpd,sshd
3.3 客户端地址列表
客户端地址列表可分为以下几类:
ALL:代表任何客户端地址
LOCAL:代表本机地址
单个 IP 地址:192.168.40.131
网络段地址:192.168.40.0/255.255.255.0
以"."开始的域名:如".bdqn.com"匹配 bdqn.com域中的所有主机以"."结束的网络地址:如"192.168.4."匹配整个192.168.4.0/24网段
嵌入通配符"""?":前者代表任意长度字符,后者仅代表一个字符,如"10.0.8.2" 匹配以 10.0.8.2 开头的所有 IP 地址。不可与以"."开始或结束的模式混用
多个客户端地址组成的列表:如"192.168.1.,172.16.16.,.bdqn.com"
3.4 实例1:黑名单
vim /etc/hosts.deny
# 拒绝192.168.40.132使用sshd程序登录本机
ssh:192.168.40.132
3.5 实例2:白名单
-
vim /etc/hosts.deny
拒绝所有地址使用sshd程序登录本机
sshd:ALL
-
vim /etc/hosts.allow
只允许192.168.40.132使用sshd程序登录本机
ssh:192.168.40.132
3.6 实例3:网段
-
vim /etc/hosts.deny
拒绝所有地址使用sshd程序登录本机
sshd:ALL
-
vim /etc/hosts.allow
只允许192.168.40.0/24网段和1.2.3.4使用sshd程序登录本机
ssh:1.2.3.4,192.168.40.*