Bootstrap

SSH讲解(重点:CentOS7)

第一章: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 [email protected]

使用自定义端口:

ssh [email protected] -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 [email protected] 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 [email protected]

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

;