SSH讲解(重点:CentOS7)

news2024/12/23 8:18:28

第一章:SSH服务

1.1 SSH是什么?

        SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。SSH 为建立在应用层和传输层基础上的安全协议。

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

1.2 SSH客户端和服务端

  • SSH客户端: 常见的SSH客户端软件有Putty、Xshell、CRT、MobaXterm、FinalShell。

  • SSH服务端: OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、Linux 操作系统。

1.3 CentOS 7中的SSH

CentOS 7系统默认已安装openssh相关软件包,并将sshd服务添加为开机自启动。执行以下命令即可启动sshd服务:

systemctl start sshd
  • 默认端口: sshd 服务默认使用的是TCP的22端口。

  • 安全协议版本: 默认使用的是sshv2,sshv1 存在漏洞。

  • 配置文件: sshd服务的默认配置文件是/etc/ssh/sshd_config

1.4 SSH配置文件

  • ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。

  • sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。

# 客户端配置文件路径
/etc/ssh/ssh_config
​
# 服务端配置文件路径
/etc/ssh/sshd_config

1.5 SSH服务功能

SSH服务端主要包括两个服务功能:SSH远程连接和SFTP服务。

1.6 SSH的作用

        SSHD 服务使用 SSH 协议可以用来进行远程控制,或在计算机之间传送文件。相比于Telnet,SSH更加安全,因为Telnet使用明文传输,SSH则是加密传输。

1.7 远程管理的重要性

        远程管理Linux系统基本上都要使用到SSH,原因很简单:Telnet、FTP等传输方式使用明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

1.8 OpenSSH常用配置文件

OpenSSH 常用配置文件有两个:

  • ssh_config: 为客户端配置文件,设置与客户端相关的应用可通过此文件实现。

  • sshd_config: 为服务器端配置文件,设置与服务端相关的应用可通过此文件实现。

# 客户端配置文件路径
/etc/ssh/ssh_config
​
# 服务端配置文件路径
/etc/ssh/sshd_config

1.9 常用命令和路径

  • 查看SSH版本:

    ssh -V
  • 服务名称: sshd

  • 服务端主程序: /usr/sbin/sshd

  • 服务端配置文件: /etc/ssh/sshd_config

二、SSH远程登录方式

2.1 登录方法一

使用以下命令通过SSH远程登录到另一台Linux主机:

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

        如果当前登录用户是 root,并且连接到另一台主机时也是使用 root 用户,可以直接使用 ssh IP,默认端口即可。如果端口不是默认的,需要使用 -p 指定端口。

例如,使用默认端口:

ssh root@192.168.1.100

使用自定义端口:

ssh root@192.168.1.100 -p 2222
RSA算法

        RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

2.2 登录方法二

使用 -l 选项指定登录名称和端口:

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

例如:

ssh -l root 192.168.1.100 -p 2222

选项说明
-l:指定登录名称。

-p:指定登录端口(当服务端的端口非默认时,需要使用 -p 指定端口进行登录)。

2.3 初次登录提示

        第一次登录服务器时,系统没有保存远程主机的信息。为了确认该主机身份,系统会提示用户是否继续连接。输入 yes 后登录,系统会将远程服务器信息写入用户主目录下的 $HOME/.ssh/known_hosts 文件中。下次再进行登录时,因为保存有该主机信息,就不会再提示了。

2.4 故障集

        在平时工作中,有时候需要SSH登录到别的Linux主机上,但有时候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.

2.5 扩展命令

        SSH 会把每个访问过的计算机的公钥(public key)记录在 ~/.ssh/known_hosts 文件中。当下次访问相同计算机时,OpenSSH 会核对公钥。如果公钥不同,OpenSSH 会发出警告,避免受到DNS劫持之类的攻击。

解决办法
  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

原因

        一台主机上有多个Linux系统,会经常切换,这些系统使用同一IP。登录过一次后会把SSH信息记录在本地的 ~/.ssh/known_hosts 文件中,切换系统后再用SSH访问这台主机就会出现冲突警告,需要手动删除或修改 known_hosts 文件中的内容。

2.6 安装OpenSSH服务包

        OpenSSH软件包提供了服务端后台程序和客户端工具,用来加密远程控制和文件传输过程中的数据,替代原来的Telnet或FTP等服务。

安装包

OpenSSH服务需要4个软件包:

  1. openssh-5.3p1-114.el6_7.x86_64:包含OpenSSH服务器及客户端需要的核心文件。

  2. openssh-clients-5.3p1-114.el6_7.x86_64:OpenSSH客户端软件包。

  3. openssh-server-5.3p1-114.el6_7.x86_64:OpenSSH服务器软件包。

  4. openssh-askpass-5.3p1-114.el6_7.x86_64:支持对话框窗口的显示,是一个基于X系统的组件。

2.7 演示远程登录的方法

编译安装OpenSSH

        在进行升级或编译安装OpenSSH之前,可能存在风险,建议先安装Telnet并且测试用户登录无问题后再进行升级。

编译RPM包OpenSSH

可以通过以下命令编译并安装OpenSSH的RPM包:

rpmbuild -tb openssh-<version>.tar.gz
sudo rpm -ivh /path/to/openssh-<version>.rpm

2.8 安全机制

  1. PAM(可插入认证模块):用于集中管理系统的各种认证方式。

  2. 用户安全:通过限制用户权限和使用强密码来增强安全性。

  3. SSHD安全:通过配置SSHD服务的安全选项来保护服务器。

  4. Shell脚本编辑配置安全:编写安全的Shell脚本,避免潜在的安全漏洞。

第三章:SSH 服务配置与管理

3.1 服务配置

3.1.1 修改监听端口

SSH 预设使用 22 这个端口,你可以通过在 SSH 服务器的配置文件 /etc/ssh/sshd_config 中修改或添加多个端口来改变默认端口。例如,想要开放 SSHD 端口为 22 和 222,则在配置文件中添加如下行:

# /etc/ssh/sshd_config
Port 22
Port 222

然后重新启动 SSHD 服务以应用更改:

sudo systemctl restart sshd

建议修改默认端口号以防止被恶意破解。

3.1.2 配置监听地址

在配置文件 /etc/ssh/sshd_config 中设置 SSHD 服务器绑定的 IP 地址,0.0.0.0 表示侦听所有地址:

# /etc/ssh/sshd_config
ListenAddress 0.0.0.0

安全建议:如果主机不需要从公网 SSH 访问,可以把监听地址改为内网地址。

3.1.3 设置协议版本

在配置文件 /etc/ssh/sshd_config 中设置协议版本为 SSH2,SSH1 存在漏洞与缺陷:

# /etc/ssh/sshd_config
Protocol 2
3.1.4 禁用 DNS 反向解析

在配置文件 /etc/ssh/sshd_config 中禁用 DNS 反向解析可以提高服务器的响应速度:

# /etc/ssh/sshd_config
UseDNS no
3.1.5 日志配置

在配置文件 /etc/ssh/sshd_config 中设置日志记录信息类型为 AUTHPRIV

# /etc/ssh/sshd_config
SyslogFacility AUTHPRIV

SSHD 服务日志存放在:/var/log/secure

3.2 安全调优

3.2.1 登录宽限时间

在配置文件 /etc/ssh/sshd_config 中设置登录宽限时间(默认 2 分钟),系统将在此时间内未成功登录则强制断线:

# /etc/ssh/sshd_config
LoginGraceTime 2m
3.2.2 是否允许 root 登录

在真实的生产环境中,不允许 root 用户直接登录,只允许普通用户登录后再切换到 root 用户:

# /etc/ssh/sshd_config
PermitRootLogin no

创建用户 zhangsanlisi,并将 zhangsan 用户加入 wheel 组以获取 sudo 权限:

sudo useradd zhangsan
sudo useradd lisi
sudo passwd zhangsan
sudo passwd lisi
sudo usermod -aG wheel zhangsan
3.2.3 密码验证

在配置文件 /etc/ssh/sshd_config 中配置密码验证:

# /etc/ssh/sshd_config
PasswordAuthentication yes

禁止空密码登录:

# /etc/ssh/sshd_config
PermitEmptyPasswords no
3.2.4 显示上次登录信息

在配置文件 /etc/ssh/sshd_config 中显示上次登录的信息:

# /etc/ssh/sshd_config
PrintLastLog yes
3.2.5 最大认证尝试次数

在配置文件 /etc/ssh/sshd_config 中设置每个连接最大允许的认证次数(默认值为 6):

# /etc/ssh/sshd_config
MaxAuthTries 6
3.2.6 允许用户

在配置文件 /etc/ssh/sshd_config 中使用 AllowUsers 只允许特定用户登录:

# /etc/ssh/sshd_config
AllowUsers zhangsan@192.168.10.10 wangwu

3.3 扩展命令参数

使用 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

3.4 安全检查与加固

3.4.1 对未经过安全认证的 RPM 包进行安全检查

在使用非官方 RPM 包时,可以通过以下命令进行检查:

rpm --checksig package-name.rpm
3.4.2 用户密码策略

设定密码策略和强度: 编辑 /etc/security/pwquality.conf 文件,设置密码强度规则,例如:

minlen=12
minclass=4

对用户的登录次数进行限制: 编辑 /etc/pam.d/sshd 文件,添加以下内容:

auth required pam_tally2.so onerr=fail deny=5 unlock_time=900

禁止 ROOT 用户远程登录:

# /etc/ssh/sshd_config
PermitRootLogin no

设置历史命令保存条数和账户超时时间: 编辑 /etc/profile 文件,添加以下内容:

HISTSIZE=1000
TMOUT=300

设置只有指定用户组才能使用 su 命令切换到 root 用户: 编辑 /etc/pam.d/su 文件,添加以下内容:

auth required pam_wheel.so use_uid

对重要文件进行锁定,即使 ROOT 用户也无法删除:

chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow

建立日志服务器: 设置集中日志服务器,编辑 /etc/rsyslog.conf 文件,添加远程日志服务器配置:

*.* @@remote-log-server:514

然后重启 rsyslog 服务:

sudo systemctl restart rsyslog

3.5 SSHD 服务支持的验证方式

3.5.1 密码验证

对服务器中本地系统用户的登录名称、密码进行验证。使用方便,但安全性较低,容易被假冒。

3.5.2 密钥对验证

要求提供匹配的密钥信息才能通过验证。建议将密码验证方式禁用,只允许启用密钥对验证方式。在 /etc/ssh/sshd_config 中进行配置:

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes

3.6 免密登录

在客户端使用 ssh-agentssh-add 管理公钥以实现免密登录:

在客户端生成密钥对:

ssh-keygen -t rsa

将公钥复制到服务器:

ssh-copy-id user@server

启动 ssh-agent 并添加私钥:

ssh-agent bash
ssh-add

四、SSH 密钥对验证

SSH(Secure Shell)是一种网络协议,用于在不安全的网络上建立安全的通信通道。密钥对验证是SSH的一种重要特性,它提供了一种安全且便捷的身份验证方式。本章将详细介绍如何构建和使用SSH密钥对验证。

4.1 公钥和私钥的关系

在非对称加密技术中,有两种密钥,分别是公钥和私钥。私钥由密钥对所有者持有,不可公布;公钥由密钥对持有者公布给他人。

  • 公钥用于加密数据:用公钥加密的数据只能使用私钥解密。

  • 私钥用于解密数据:只有持有私钥的用户才能解密数据,从而保证了数据的安全性。

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

  1. 生成密钥对:SSH客户端通过加密算法生成一对密钥(公钥和私钥)。

  2. 分发公钥:公钥发送给服务器端,客户端保留私钥。

  3. 连接过程

    • 客户端向SSH服务器发出请求,用联机的用户密钥进行验证。

    • 服务器检查公钥是否匹配,如果匹配则用公钥加密"质询"(challenge)并发送给客户端。

    • 客户端用私钥解密"质询",完成身份验证。

4.3 SSH 配置文件

修改SSH服务器的配置文件 /etc/ssh/sshd_config 以启用密钥对验证,并禁用密码验证:

vim /etc/ssh/sshd_config
​
PasswordAuthentication no      # 禁用密码验证
PubkeyAuthentication yes       # 启用密钥对验证
AuthorizedKeysFile .ssh/authorized_keys  # 指定公钥库文件

4.4 生成密钥对

在客户端生成密钥对:

ssh-keygen -t rsa

根据提示完成密钥对生成,默认存放在 ~/.ssh 目录下。

4.5 上传公钥到服务器

将生成的公钥文件上传到服务器:

scp ~/.ssh/id_rsa.pub user@server:/home/user/.ssh/authorized_keys

或者使用 ssh-copy-id 命令:

ssh-copy-id -i ~/.ssh/id_rsa.pub user@server

4.6 测试连接

在客户端使用密钥对验证连接到服务器:

ssh user@server

如果设置正确,将无需输入密码即可登录。

五、安全传输文件

在日常运维中,安全地传输文件是非常重要的。本章将介绍两种安全的文件传输方法:scpsftp

5.1 使用 scp 进行文件传输

scp(Secure Copy)用于在Linux下进行远程拷贝文件,传输过程是加密的。

5.1.1 本地文件复制到服务器

scp localfile user@server:/remote/path

5.1.2 服务器文件复制到本地

scp user@server:/remote/file /local/path

5.1.3 本地目录复制到服务器

scp -r localdir user@server:/remote/path

5.2 使用 sftp 进行文件传输

sftp(Secure File Transfer Protocol)是SSH的一部分,用于安全地传输文件。

5.2.1 登录到服务器

sftp user@server

5.2.2 查看可用命令

sftp> help

5.2.3 下载文件

sftp> get remote_file /local/path

5.2.4 上传文件

sftp> put local_file /remote/path

5.2.5 切换目录和查看文件

sftp> cd remote_dir
sftp> ls

六、TCP Wrappers 访问控制

TCP Wrappers 提供了一种对TCP服务进行访问控制的机制。

6.1 安装和检查

TCP Wrappers 通常是默认安装的,可以使用以下命令检查:

rpm -q tcp_wrappers

6.2 配置访问控制

6.2.1 配置文件

  • /etc/hosts.allow:允许访问的策略。

  • /etc/hosts.deny:拒绝访问的策略。

6.2.2 实例

允许从 192.168.80.0/24 网段和 12.0.0.1 IP 地址访问 sshd 服务:

# /etc/hosts.allow
sshd: 192.168.80.*, 12.0.0.1
​
# /etc/hosts.deny
sshd: ALL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931808.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DP(5) | 完全背包 | Java | 卡码52, LeetCode 518, 377, 70 做题总结

完全背包 感觉越写越糊涂了&#xff0c;初始化怎么做的&#xff1f;递推公式怎么来的&#xff1f; 状态变量 初始化 f[0][0] 0代码 这里的 f[i][j] f[i][j-w[i]]&#xff0c;就是和0-1背包最大的不同 for(int i1; i<n; i) { //物品ifor(int j1; j<m; j) {if(j<w[…

Kotlin中Unit、Any和Nothing

Unit Unit是一个特殊的类型&#xff0c;它表示“没有意义的值”的单元类型。在Kotlin中&#xff0c;当你不需要函数返回任何具体值时&#xff0c;可以使用Unit类型。 和Java 中 void一样。 Any 所有非空类的父类 Any?所有类的父类 类似Java中Object Nothing 表示一个函数或…

python的日期和时间

时间与日期 基础知识&#xff08;python的时间表示方法&#xff09; 时间戳 时间戳是一个用于表示特定时间点的方式&#xff0c;它表示自1970年1月1日00:00:00 UTC&#xff08;协调世界时&#xff09;以来经过的秒数。时间戳通常用于编程中&#xff0c;因为它提供了一种简单的方…

运维-Docker-黑马

运维-Docker-黑马 编辑时间&#xff1a;2024/7/15 来源&#xff1a;黑马程序员 docker&#xff1a;快速构建&#xff0c;运行&#xff0c;管理应用的工具 Docker安装 部署mysql 命令解读

【JavaScript 算法】贪心算法:局部最优解的构建

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、贪心算法的基本概念贪心算法的适用场景 二、经典问题及其 JavaScript 实现1. 零钱兑换问题2. 活动选择问题3. 分配问题 三、贪心算法的应用四、总结 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种逐步构建解…

ReAct 大模型提示框架

你可能不熟悉 ReAct&#xff0c;这是一个旨在增强语言模型 (LLM) 决策能力的尖端框架。 通过使用新的观察结果更新 LLM 的上下文窗口并提示其重新评估信息&#xff0c;ReAct 促进了类似于人类思维过程的推理水平&#xff0c;超越了诸如思维链提示之类的旧技术。 在本文中&…

RocketMQ~架构与工作流程了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

C++笔试强训4

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 %o就是输出八进制的无符号数&#xff0c;0123&#xff0c;&#xff0c;以0开头&#xff0c;本来就是八进制&#xff0c;所以输出为123&#xff0c;123是十进制&#xff0c;转化为八进制就是173. 故选…

Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

tensorflow1基础函数学习

学习准备&#xff1a; 所需的库&#xff1a; tensorflow 1.12.0 numpy 1.19.5基本初始化函数 1.1 理解张量 tensor&#xff1a; 多维数组&#xff08;列表&#xff09;&#xff0c; 阶&#xff1a;张量的维数 维数名字栗子0标量s 1, 2, 31向量v [1, 2, 3]2矩阵m [[1, …

uniapp 微信默认地图选点功能实现

效果图 配置项 微信公众平台-小程序配置 uniapp配置 上代码 <template><view class"content"><button click"toMap">请选择位置</button></view> </template><script setup lang"ts">function toMa…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时&#xff0c;每个小部件都被视为具有四个同心矩形的框&#xff1a;边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式&#xff1a; 边距超出边框。边框绘制在边…

【源码剖析】ThreadLocal 源码剖析

源码类注释 /*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {code get} or {code set} method) has its own, independently initialized* copy of the variab…

鼠标录制工具怎么挑选?9款电脑鼠标录制工具分享(2024)

你知道鼠标录制工具吗&#xff1f;鼠标录制工具通过记录和回放用户的操作&#xff0c;帮助自动化重复性任务&#xff0c;提高工作效率和精确性。它可以帮助用户简化很多繁琐的操作步骤&#xff0c;非常适合运用在电脑自动化任务、游戏自动化中&#xff0c;给大家整理了2024年9款…

使用assembly插件来将外部文件夹打进jar包

目录&#xff1a; 1、pom文件的配置2、新建assembly的描述文件3、maven打包 1、pom文件的配置 <!--maven构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar…

代理模式(静态代理,动态代理,cglib代理)

文章目录 代理模式代理模式的角色静态代理案例代码抽象父类接口目标对象代理对象客户端使用输出结果 动态代理案例代码抽象父类与实现类代理工厂客户端 cglib代理引入依赖目标对象代理工厂客户端 代理模式 代理模式属于结构型的模式&#xff0c;通过代理对象来访问目标对象&am…

malloc底层实现

xv6实现的动态内存分配虽然只有不到100行代码&#xff0c;但却体现了动态内存分配的精髓&#xff0c;非常值得学习 xv6的内存布局 一谈到C语言的动态内存分配&#xff0c;就会想到堆以及malloc()和free()这两个函数。先来回顾一下XV6中的内存布局是怎样的&#xff0c;我们动态…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期&#xff1a;2024 年 7 月 10 日 星期三 姓名&#xff1a;XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位&#xff0c;参加部门早会&#xff0c;了解了今天的实习任务和目标&#xff0c;即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

数据结构(5.2_1)——二叉树的基本定义和术语

二叉树的基本概念 二叉树是n(n>0)个结点的有限集合: 或者为空二叉树&#xff0c;即n0&#xff1b;或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。 特点:每个结点至多只有两颗字数&#xff1b;左子树不能颠倒(二叉树…