使用 SSH 远程管理 Linux

内容纲要

查看【Linux】专题可浏览更多内容

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

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

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

客户端

安装

在 Linux 上使用 APT 或 DNF 这样的包管理器安装方法如下:

# 使用 APT 安装
sudo apt update && sudo apt install openssh-client

# 使用 DNF 安装
sudo dnf install openssh-clients

连接

使用 ssh <hostname> 将会以当前用户名连接主机名上的 22 端口:

# 指定用户名:
ssh [email protected]

# 指定用户名加端口
ssh -p 22 [email protected]

在第一次连接到 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])?

一般来说与某台服务器的第一次连接时就会看到该提示,SSH 在提示这是一台陌生的服务器,你确定要连接吗?

  • 输入 yes 确认,接着会要求输入正在登录的用户的密码;
  • 想要中断连接,可以输入 exit 或按 Ctrl + D

在输入 yes 确认后,会将当前服务器的指纹储存在本机的 ~/.ssh/known_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 地址等等;

在确认是你的操作(如重装服务器系统)导致的,就可以使用命令移除掉本机上关于该服务器的「服务器指纹」:

# ssh-keygen -R <hostname>
ssh-keygen -R 192.168.1.3

然后再次连接即可

服务器

安装

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

# 使用 APT 安装
sudo apt update && sudo apt install openssh-server

# 使用 DNF 安装
sudo dnf install openssh-server

# 运行 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 服务端的配置文件位于 /etc/ssh/sshd_config (ssh_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