运维 · 2020年9月19日

SSH 入门指南:如何远程连接与管理 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

` 将会以当前用户名连接主机名上的 22 端口: “`bash # 指定用户名: ssh root@1.1.1.1 # 指定用户名加端口 ssh -p 22 root@1.1.1.1 “` 在第一次连接到 SSH 服务端时,会看到这样的信息: “`bash 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! “`bash @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 地址等等; 在确认是你的操作(如重装服务器系统)导致的,就可以使用命令移除掉本机上关于该服务器的「服务器指纹」: “`bash # ssh-keygen -R ssh-keygen -R 192.168.1.3 “` 然后再次连接即可 ## 服务器 ### 安装 大多数 Linux 发行版预装了来自 OpenBSD 项目的 OpenSSH,但有的可能安装了其中的客户端,如果想要在只安装了 SSH 客户端的系统上接受远程连接,就需要安装服务端并配置,并允许 TCP 端口 22 接受接入的网络连接: “`bash # 使用 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 服务是否处于运行状态: “`bash systemctl status sshd “` “`bash ● 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 客户端配置文件) 在对配置文件进行修改前最好备份一下,然后再进行编辑: “`bash # 备份 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` 查看下一个搜索结果,按 `N`(`N` 键加上 `Shift` 就是大写)查看上一个搜索结果; #### 修改默认端口 在 `sshd_config` 输入 `/Port` 并回车查找: “`bash # Port 22 Port 2783 “` 将 `# Port 22` 前的 `#` 移除并修改 `22` 到其他随机端口 ⚠️ 注意:有防火墙或者安全组的记得进行相应修改 #### 禁止 root 帐户直接登陆 允许 root 帐户登录 SSH 是不妥当的,但一般云服务器商给安装的系统默认都是 root 帐户登录,可以在拿到手后新建一个非特权帐户,日常使用非特权帐户登录 SSH,并禁用 root 帐户登录 SSH。 在 `sshd_config` 输入 `/PermitRootLogin` 并回车查找: “`bash PermitRootLogin yes “` 如果是 `yes` 表明允许 root 帐户登录,将其修改为 `no` 也就是 `PermitRootLogin no` 即可 #### 仅允许特定用户 在 `sshd_config` 末尾另起一行: “`bash # AllowUsers <用户名> # 如仅允许 ops 和 dev 用户登录 AllowUsers ops dev “` ### 使用 Fail2Ban Fail2ban 扫描日志文件(例如 `/var/log/apache/error_log`)并禁止显示恶意迹象的 IP,如自动化脚本尝试暴力破解 SSH 帐户密码的予以封禁 “`bash # 使用 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.conf` 与 `fail2ban.conf`: “`bash sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/fail2ban.local “` 在 `jail.local` 中使用 `/sshd` 查找: “`bash sudo vim /etc/fail2ban/jail.local “` 首先会找到关于 `[sshd]` 的注释内容,按 `N` 键往下翻会找到开头没有 `#` 的 `[sshd]`,在其下添加内容 `enabled = true` 并做一些修改: “`bash [sshd] enabled = true port = 2783 # 修改为自定义 SSH 端口,如果你修改了默认 SSH 端口 maxretry = 5 # 最大尝试次数 findtime = 300 # 在该时间段内超过 maxretry 次数则封禁,单位为秒 bantime = 86400 # 封禁时间,单位为秒 “` 修改好配置文件后重启服务让其生效: “`bash sudo systemctl restart fail2ban “` – – – – – – **浏览「[Linux 专题](/more/special/linux/)」可查看更多内容**