当前位置: 首页 > news >正文

理解SSH服务

深入理解SSH服务:从基础到安全配置与实战

在当今的网络世界中,远程管理服务器已成为常态,而SSH(Secure Shell)作为一种安全的网络协议,凭借其加密传输的特性,成为远程登录和文件传输的首选工具。本文将从SSH的基本概念出发,详细介绍其工作原理、登录方式、安全配置以及相关实用技巧,帮助你全面掌握SSH服务的使用与管理。

一、SSH是什么?

SSH(Secure Shell)是一种建立在应用层和传输层基础上的安全通道协议,主要用于实现字符界面的远程登录、远程复制等功能。与传统的Telnet、FTP等协议不同,SSH协议对通信双方的数据传输进行了加密处理,包括用户登录时输入的用户口令,有效防止了信息泄露。

同时,SSH协议还对数据传输进行压缩,提高了传输速度,其工作模式如下:

SSH客户端 <------------------------------> SSH服务端网络
数据传输是加密的,可以防止信息泄漏
数据传输是压缩的,可以提高传输速度

1.1 SSH客户端与服务端

  • SSH客户端:常见的有Putty、Xshell、CRT、MobaXterm、FinalShell等,用于发起对SSH服务端的连接请求。
  • SSH服务端:主要通过OpenSSH实现,这是一个实现SSH协议的开源软件项目,适用于各种UNIX、Linux操作系统。

在Centos 7系统中,默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。执行systemctl start sshd命令即可启动sshd服务。

1.2 SSH服务的基本信息

  • 默认端口:sshd服务默认使用TCP的22端口。
  • 安全协议版本:默认使用sshv2,sshv1存在漏洞,不建议使用。
  • 配置文件
    • 服务端配置文件:/etc/ssh/sshd_config
    • 客户端配置文件:/etc/ssh/ssh_config
  • 服务名称:sshd
  • 服务端主程序/usr/sbin/sshd

1.3 SSH的作用

SSHD服务使用SSH协议可以进行远程控制,或在计算机之间传送文件。相比Telnet、FTP等明文传输方式,SSH的加密传输更为安全,能有效防止远程管理过程中的信息泄露,还能防止DNS欺骗和IP欺骗。

二、SSH远程登录方式

2.1 登录方法一

ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port

当在Linux主机上远程连接另一台Linux主机时,若当前登录用户与远程登录用户均为root,且端口为默认时,可直接使用ssh IP。若端口非默认,则需要用-p指定端口。

示例:

ssh zhangsan@192.168.10.22
ssh zhangsan@benet37

2.2 登录方法二

ssh -l [远程主机用户名] [远程服务器主机名或IP地址] -p port
  • -l:指定登录名称。
  • -p:指定登录端口(当服务端端口非默认时使用)。

2.3 首次登录提示

第一次登录服务器时,系统因未保存远程主机信息,会提示用户确认主机身份,输入yes后登录,远程服务器信息会被写入用户主目录下的$HOME/.ssh/known_hosts文件中,下次登录则不会再提示。

三、SSH故障及解决办法

在使用SSH登陆时,可能会遇到类似以下的提示:

The authenticity of host '192.168.10.9 (192.168.10.9)' can't be established.
ECDSA key fingerprint is SHA256:AaGpHeEiRuXMy96oezzV6TOej5nJJmZIe/djqR7qCVk.
ECDSA key fingerprint is MD5:78:a1:b1:1c:36:76:c7:34:54:87:cc:ea:51:3f:0c:24.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.9' (ECDSA) to the list of known hosts.
Authentication failed.

3.1 原因

一台主机上有多个Linux系统且经常切换,这些系统使用同一IP,登录过一次后,ssh信息会记录在本地的~/.ssh/known_hosts文件中,切换系统后再用ssh访问该主机就会出现冲突警告。

3.2 解决办法

  1. 连接时加上-o StrictHostKeyChecking=no选项:

    ssh -o StrictHostKeyChecking=no 192.168.xxx.xxx
    
  2. 修改配置文件彻底去掉提示,在/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中添加:

    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    

四、OpenSSH服务包及安装

OpenSSH软件包提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,以替代Telnet或Ftp等服务。安装OpenSSH需要以下4个软件包:

  • openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH服务器及客户端需要的核心文件。
  • openssh-clients-5.3p1-114.el6_7.x86_64:OpenSSH客户端软件包。
  • openssh-server-5.3p1-114.el6_7.x86_64:OpenSSH服务器软件包。
  • openssh-askpass-5.3p1-114.el6_7.x86_64:支持对话框窗口的显示,基于X系统。

注意:编译安装openssh升级可能存在风险,必须先安装telnet并测试用户登录无问题后再进行升级。

五、SSH服务配置与管理

5.1 服务配置

监听端口修改
  • SSH预设使用22端口,也可使用多个端口,只需重复使用port设定项。例如开放22和222端口,可添加Port 222,然后重新启动SSHD。
  • 建议修改端口号为其他端口,防止暴力破解。
监听地址(ListenAddress)

ListenAddress 0.0.0.0表示侦听所有地址。安全建议:若主机不需要从公网ssh访问,可将监听地址改为内网地址。

协议版本(Protocol)

设置为Protocol 2,因SSH1存在漏洞与缺陷,选择SSH2。

DNS反向解析(UseDNS)

一般在内网互连时,建议设置为no,可提高联机速度。

日志记录(SyslogFacility)

SyslogFacility AUTHPRIV表示当有人使用SSH登入系统时,SSH会将信息记录为AUTHPRIV类型,sshd服务日志存放在/var/log/secure

5.2 安全调优

登录宽限时间(LoginGraceTime)

LoginGraceTime 2m表示系统给予2分钟时间进行登录(0表示无限制)。若在指定时间内未成功登录,将被强迫断线。

允许root登录(PermitRootLogin)

默认允许root登入,建议设定为no。真实生产环境服务器通常不允许root账号直接登陆,仅允许普通用户登录,需使用root用户时再切换。

示例:

# 创建用户
useradd zhangsan、lisi 
# 查询组
grep "wheel" /etc/group
# 将zhangsan加入wheel组
gpasswd -a zhangsan wheel
# 开启pam模块
密码验证(PasswordAuthentication)

默认yes,表示需要密码验证。在安全级别要求高的服务器上,可设置为no,通过认证的秘钥来登陆。

允许空密码登录(PermitEmptyPasswords)

默认为no,不允许空密码登录。

显示上次登入信息(PrintLastLog)

默认为yes,显示上次登入的信息。

最大认证次数(MaxAuthTries)

默认值是6。如果失败认证的次数超过这个数值的一半,连接将被强制断开,且会生成额外的失败日志消息(默认3次)。

可通过以下命令验证:

ssh -o NumberOfPasswordPrompts=8 lisi@192.168.10.9
用户登录限制(AllowUsers/DenyUsers)

当希望只允许或禁止某些用户登录时,可使用AllowUsersDenyUsers配置,两者用法类似(注意不要同时使用)。

例如,只允许zhangsan、wangwu用户登录:

AllowUsers zhangsan@192.168.10.10 wangwu

六、SSH扩展命令参数

ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip "command"
  • ConnectTimeout=3:连接超时时间,3秒。
  • ConnectionAttempts=5:连接失败后重试次数,5次。
  • PasswordAuthentication=no:不使用密码认证,没有互信直接退出。
  • StrictHostKeyChecking=no:自动信任主机并添加到known_hosts文件。

示例:

ssh -o StrictHostKeyChecking=no root@192.168.10.0

七、SSHD服务的验证方式

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

7.1 密码验证

对服务器中本地系统用户的登录名称、密码进行验证。这种方式简便,但存在被假冒和遭遇密码穷举攻击的风险。建议使用18位复杂密码(包含大写、小写、字符、数字),并修改端口(1023以上高位端口,如1922)以提高安全性。

7.2 密钥对验证

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

当两种验证方式都启用时,服务器优先使用密钥对验证。对安全性要求高的服务器,建议禁用密码验证,只允许密钥对验证;若无特殊要求,两种方式均可启用。

八、构建密钥对验证的SSH

8.1 公钥和私钥的关系

在非对称加密技术中,私钥由密钥对所有者持有,不可公布;公钥由密钥对持有者公布给他人。公钥用于加密数据,用公钥加密的数据只能使用私钥解密。

8.2 构建密钥对验证的SSH原理

  1. ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,客户端保留私钥。
  2. 客户端请求连接带有公钥的SSH服务器时,SSH服务器在该用户的家目录下寻找事先存放的对应公钥,与客户端发送的公钥比较。
  3. 若一致,SSH服务器用公钥加密“质询”并发送给SSH客户端。
  4. 客户端用私钥解密“质询”并返回,验证通过则登录成功。

8.3 配置密钥对验证的步骤

  1. 修改配置文件

    vim /etc/ssh/sshd_config
    PasswordAuthentication no  # 禁用密码验证
    PubkeyAuthentication yes     # 启用密钥对验证
    AuthorizedKeysFile .ssh/authorized_keys       # 指定公钥库文件
    
  2. 在客户端创建密钥对

    useradd admin
    echo "123123" | passwd --stdin admin
    su - admin
    ssh-keygen -t ecdsa   
    # 按提示操作,生成的私钥、公钥文件默认存放在宿主目录的.ssh/下
    # id_ecdsa是私钥文件,权限默认为600;id_ecdsa.pub是公钥文件
    
  3. 将公钥文件上传至服务器

    scp ~/.ssh/id_ecdsa.pub root@192.168.80.10:/opt
    # 或使用ssh-copy-id直接导入
    cd ~/.ssh/
    ssh-copy-id -i id_ecdsa.pub zhangsan@192.168.80.10
    
  4. 在服务器中导入公钥文本

    mkdir /home/zhangsan/.ssh/
    cat /opt/id_ecdsa.pub >> /home/zhangsan/.ssh/authorized_keys
    
  5. 在客户端使用密钥对验证

    ssh zhangsan@192.168.80.10
    # 输入私钥的密码
    
  6. 设置ssh代理功能,实现免交互登录

    ssh-agent bash       # 开启ssh代理功能
    ssh-add            # 添加私钥到ssh-agent缓存 
    # 输入私钥的密码
    ssh zhangsan@192.168.80.10  # 无需再输入密码
    

九、TCP Wrappers访问控制

TCP Wrappers(TCP封套)将TCP服务程序“包裹”起来,代为监听端口,增加安全检测过程,外来连接请求必须通过检测才能访问真正的服务程序。

9.1 基本信息

  • 一般系统默认安装,可通过rpm -q tcp_wrappers查看。
  • 提供执行程序tcpd和共享链接库文件libwrap.so.*。
  • 多数网络服务通过调用libwrap.so.*链接库实现保护,如sshd,可通过ldd /usr/sbin/sshd | grep "libwrap"查看。

9.2 语法格式

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

    • ALL:代表所有的服务。
    • 单个服务程序:如“vsftpd”。
    • 多个服务程序组成的列表:如“vsftpd,sshd”。
  • 客户端地址列表

    • ALL:代表任何客户端地址。
    • LOCAL:代表本机地址。
    • 多个地址以逗号分隔。
    • 允许使用通配符“*”(任意长度字符)和“?”(一个字符)。
    • 网段地址:如“192.168.80.”或192.168.80.0/255.255.255.0。
    • 区域地址:如“.benet.com”匹配benet.com域中的所有主机。

9.3 访问控制的基本原则

  1. 首先检查/etc/hosts.allow文件,找到相匹配的策略则允许访问。
  2. 否则检查/etc/hosts.deny文件,找到相匹配的策略则拒绝访问。
  3. 若两个文件都无匹配策略,则允许访问。

9.4 实例

若只希望从IP地址为12.0.0.1的主机或192.168.80.0/24网段的主机访问sshd服务,其他地址被拒绝:

vi /etc/hosts.allow
sshd,vsftpd:12.0.0.1,192.168.80.*vi /etc/hosts.deny
sshd:ALL

十、总结

SSH作为一种安全的网络协议,为客户端与远程主机的安全连接和交互提供了可靠保障。其安全连接过程如下:

  1. 远程主机端收到客户端的登陆请求时,先发送自己的公钥给客户端。
  2. 客户端用拿到的公钥加密用户名和密码,发送给远程主机。
  3. 远程主机用自己的密钥解密收到的用户名和密码,校验正确则登陆成功。

而公钥登录(免密登陆)流程为:

  1. 客户端在本地生成一对公钥密钥文件,将公钥存储在远程主机上。
  2. 客户端登陆时,远程主机会随机生成一串字符串发送给客户端。
  3. 客户端用自己的密钥将收到的字符串加密,并返回给远程主机。
  4. 远程主机利用公钥解密收到的加密字符串,若解密成功且与发送的一致,则直接免密登陆。

通过掌握SSH的基本概念、登录方式、安全配置及密钥对验证等知识,你可以更安全、高效地进行远程服务器管理。在实际应用中,还需根据具体需求进行合理配置,不断加强SSH服务的安全性,以应对各种潜在的网络威胁。

http://www.dtcms.com/a/351106.html

相关文章:

  • onnx入门教程(七)——如何添加 TensorRT 自定义算子
  • 深度剖析初始化vue项目文件结构!!【前端】
  • 【分布式技术】Kafka 数据积压全面解析:原因、诊断与解决方案
  • 前沿技术借鉴研讨-2025.8.26(多任务分类/预测)
  • 极简 useState:手写 20 行,支持多次 setState 合并
  • 常用Nginx正则匹配规则
  • HTML的form表单
  • 状态模式与几个经典的C++例子
  • 《分布式任务调度中“任务重复执行”的隐性诱因与根治方案》
  • 记一次clickhouse查询优化之惰性物化
  • 手机移动代理IP:使用、配置、维护的10问10答
  • 通义灵码插件——AI 重构表单开发!半小时搭建可视化拖拽系统,效率碾压传统模式
  • 如何了解云手机的兼容性?
  • TikTok广告投放革命:指纹云手机如何实现智能群控与降本增效
  • 云手机和模拟器之间的区别
  • Windows下的异步IO通知模型
  • Tomcat下载历史版本
  • 深入浅出理解支持向量机(SVM):从原理到实践
  • 支持向量机(SVM)核心笔记
  • 人类记忆如何启发AI?LLM记忆机制综述解读
  • Vue中的props方式
  • SELinux存在于过去的Linux安全增强模块
  • 可解释的多尺度深度学习在胸腔积液细胞块与细胞学涂片恶性肿瘤检测及侵袭性子宫内膜癌识别中的应用|文献速递-深度学习人工智能医疗图像
  • 6年前抄写的某品牌集成灶-蒸汽炉
  • UCIE Specification详解(七)
  • Linux文件系统深入解析:从原理到实践
  • 校园跑腿小程序源码 | 跑腿便利店小程序(源码下载)
  • Nginx访问限制学习笔记
  • 智慧AI消防通道占用检测在危险区域的应用
  • 数据结构青铜到王者第五话---LinkedList与链表(2)