使用 SSH 远程管理 Linux
查看【Linux】专题可浏览更多内容
SSH(Secure Shell)解决了与远程主机进行安全通信的两个基本问题:
- 认证远程主机的身份是否属实 (避免了「中间人」攻击);
- 加密本地主机与远程主机之间的所有通信;
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 root@1.1.1.1
# 指定用户名加端口
ssh -p 22 root@1.1.1.1
在第一次连接到 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.
「服务器指纹」用于防范恶意冒充远程主机,所以出现该消息的原因一般有两种:
- 攻击者可能试图发起中间人攻击,这种情况很少见;
- 更可能的原因是远程主机出现了变动。例如,重新安装了系统或 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
查看下一个搜索结果,按N
(N
键加上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.conf
与 fail2ban.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