内容纲要

🗂 | 查看 Linux 专题可浏览更多内容


SSH(Secure Shell) 解决了与远程主机进行安全通信的两个基本问题:

  1. 认证远程主机的身份是否属实(避免了「中间人」攻击);
  2. 加密本地主机与远程主机之间的所有通信;

SSH 由两部分组成:SSH 服务器和 SSH 客户端。前者在远程主机中运行,负责在端口 22 (默认)上监听接入的连接;后者在本地主机中运行,用于同远程 SSH 服务器通信。

安装

大多数 Linux 发行版预装了来自 OpenBSD 项目的 OpenSSH,但有的可能安装了其中的客户端,如果想要在只安装了 SSH 客户端的系统上接受远程连接,就需要安装服务端并配置,并允许 TCP 端口 22 接受接入的网络连接。

# 使用 APT 安装
# openssh-server 为服务端
# openssh-client 为客户端
sudo apt update && sudo apt install openssh-server openssh-client

# 使用 DNF 安装
# openssh-server 为服务端
# openssh-clients 为客户端
sudo dnf install openssh-server openssh-clients

# 运行 SSH 服务
sudo systemctl start sshd
# 设置 SSH 开机启动
sudo systemctl enable sshd

通过 Systemd 检查 SSH 服务是否处于运行状态:

systemctl status sshd
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-05-01 00:00:00 CST; 1min ago
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 430 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 433 (sshd)
      Tasks: 1 (limit: 1091)
     Memory: 7.4M
        CPU: 163ms
     CGroup: /system.slice/ssh.service
             └─433 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups

可以看到「active (running)」

连接

在本地连接远程 SSH 服务端:

# ssh <远程系统用户名>@<远程服务器地址> [-p <端口>]
# 如果不是默认的 22 端口,可以使用 -p 选项指定
ssh toor@192.168.1.3

在第一次连接到 SSH 服务端时,会看到这样的信息:

The authenticity of host '192.168.1.3 (192.168.1.3)' can't be established.
ECDSA key fingerprint is SHA256:Wg4Fgm7xjLpOcLKYSg4WQMWu+ayZeucKBFjBP/jkNjw.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

输入 yes 确认,接着会要求输入正在登录的用户的密码。

想要中断连接,可以输入 exit 或按 Ctrl + D

主机密钥(Wg4Fgm7xjLpOcLKYSg4WQMWu+ayZeucKBFjBP/jkNjw)是在设置 SSH 服务端时随机生成的,用于识别服务器,并可用于防止可能的中间人攻击。主机密钥会保存在客户端名为 know_hosts 的文件中,一般来说位于用户主目录下的 .ssh 目录里。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:Q2tUbgjQjiDKqI5vTZi/w73tipV72MtgMvT47/GF5ao.
Please contact your system administrator.
Add correct host key in /home/toor/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/toor/.ssh/known_hosts:1
  remove with:
  ssh-keygen -f "/home/toor/.ssh/known_hosts" -R "192.168.1.3"
ECDSA host key for 192.168.1.3 has changed and you have requested strict checking.
Host key verification failed.

出现该消息的原因有两种:

  1. 攻击者可能试图发起中间人攻击,这种情况很少见;
  2. 更可能的原因是远程主机出现了变动。例如,重新安装了系统或 SSH 服务器、变更了 IP 或 MAC 地址等等;

解决方法倒也简单,从上述信息可以看到 /home/toor/.ssh/known_hosts:1 这就表示问题出在 known_hosts 的第一行,使用编辑器编辑 known_hosts 将第一行删除即可:

vim ~/.ssh/known_hosts

VIM 编辑器操作如下:

  1. 将光标移动到要删除的行数上;
  2. 不用按 I 键进入「插入模式」手动删除,按两下 D 键就会删除整行了;
  3. Ctrl + C,左下角会出现冒号,输入 wq 并按回车键即可;

保护服务端

SSH 服务端的配置文件位于 /etc/ssh/sshd_configssh_config 为 SSH 客户端配置文件)

在对配置文件进行修改前最好备份一下,然后再进行编辑:

# 备份 SSH 服务端配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑 SSH 服务端配置文件
sudo vim /etc/ssh/sshd_config

配置文件中以 # 开头的便是注释信息,一般来说就是阐述功能作用的,除此之外还会对一些默认不启用的功能文本进行注释,让其不生效,若要生效就去掉其开头的 #

在 VIM 中要修改文本,需要按 I 进入「插入模式」

「插入模式」返回「命令模式」可按 esc,然后使用其他功能,如查找功能:

  • 查找功能按 / 自上而下搜索,按 ?/ 键加上 Shift )进行自下而上搜索;
  • /? 后面跟上关键词,如 /Port 然后按回车键;
  • 在按回车键后会查找相应关键词,按 n 查看下一个搜索结果,按 NN 键加上 Shift 就是大写)查看上一个搜索结果;

修改默认端口

sshd_config 输入 /Port 并回车查找:

# Port 22
Port 2783

# Port 22 前的 # 移除并修改 22 到其他随机端口

⚠️ 注意:有防火墙或者安全组的记得进行相应修改

禁止 root 帐户直接登陆

允许 root 帐户登录 SSH 是不妥当的,但一般云服务器商给安装的系统默认都是 root 帐户登录,可以在拿到手后新建一个非特权帐户,日常使用非特权帐户登录 SSH,并禁用 root 帐户登录 SSH。

sshd_config 输入 /PermitRootLogin 并回车查找:

PermitRootLogin yes

如果是 yes 表明允许 root 帐户登录,将其修改为 no 也就是 PermitRootLogin no 即可

仅允许特定用户

sshd_config 末尾另起一行:

# AllowUsers <用户名>
# 如仅允许 ops 和 dev 用户登录
AllowUsers ops dev

使用 Fail2Ban

Fail2ban 扫描日志文件(例如 /var/log/apache/error_log)并禁止显示恶意迹象的 IP,如自动化脚本尝试暴力破解 SSH 帐户密码的予以封禁

# 使用 APT 安装
sudo apt update && sudo apt install fail2ban

# 使用 DNF 安装
sudo dnf install epel-release # 如果没有安装
sudo dnf install fail2ban

# 启动 Fail2Ban
sudo systemctl start fail2ban
# 开机运行
sudo systemctl enable fail2ban

若要对 Fail2Ban 进行配置文件修改,不应该直接改动 jail.conffail2ban.conf

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local

jail.local 中使用 /sshd 查找:

sudo vim /etc/fail2ban/jail.local

首先会找到关于 [sshd] 的注释内容,按 N 键往下翻会找到开头没有 #[sshd],在其下添加内容 enabled = true 并做一些修改:

[sshd]
enabled = true
port    = 2783 # 修改为自定义 SSH 端口,如果你修改了默认 SSH 端口
maxretry = 5 # 最大尝试次数
findtime = 300 # 在该时间段内超过 maxretry 次数则封禁,单位为秒
bantime = 86400 # 封禁时间,单位为秒

修改好配置文件后重启服务让其生效:

sudo systemctl restart fail2ban