SSH 远程登录与安全管理
SSH 远程登录与安全管理
目录
- 安装 OpenSSH 工具
- SSH 是什么与基本原理
- SSH 远程登录:ssh 基本用法
- 密钥认证:ssh-keygen 免密登录
- 远程传文件:scp / sftp
- 多主机管理:~/.ssh/config
- SSH 安全加固
- 总结与练习
〇、安装 OpenSSH 工具
SSH 相关的命令由 OpenSSH 软件包提供。Rocky/RHEL 完整安装一般自带,但 Minimal(最小化)安装可能没有,使用前先确认并安装。
相关软件包
| 包 | 提供 | 作用 |
|---|---|---|
openssh-clients |
ssh、scp、sftp、ssh-keygen、ssh-copy-id |
客户端工具(登录、传文件、生成密钥) |
openssh-server |
sshd |
服务端守护进程(让本机可以被远程登录) |
openssh |
公共文件与配置 | OpenSSH 基础包 |
检查是否已安装
which ssh scp sftp ssh-keygen # 看客户端工具是否存在
which sshd # 看服务端是否存在
rpm -q openssh openssh-clients openssh-server # 查看已安装的包
- 若能找到
ssh、scp、ssh-keygen,说明客户端已装。 - 若
sshd存在,说明服务端已装。
安装命令(Rocky/RHEL 用 dnf)
# 安装客户端工具(ssh/scp/sftp/ssh-keygen)
sudo dnf install -y openssh-clients
# 安装服务端(sshd,若需要本机被远程登录)
sudo dnf install -y openssh-server
# 也可一次性装全
sudo dnf install -y openssh openssh-clients openssh-server
其他发行版:Ubuntu/Debian 用
sudo apt install openssh-client和sudo apt install openssh-server。
安装后启动服务端(sshd)
# 启动 sshd 并设置开机自启
sudo systemctl start sshd
sudo systemctl enable sshd
# 查看状态与确认端口
sudo systemctl status sshd
ss -tlnp | grep 22
- 若防火墙开启,需放行 SSH 端口(默认 22):
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
- 安装并启动成功后,本机即可被
ssh远程登录,也可用ssh/scp/sftp访问其他机器。
一、SSH 是什么与基本原理
SSH(Secure Shell,安全外壳)是加密的远程登录协议,用于安全地远程登录服务器、执行命令、传输文件。相比 telnet/FTP 的明文传输,SSH 全程加密,是 Linux 远程管理的标准方式。
关键原理:
- 加密通信:所有数据(含密码)加密传输,防窃听。
- 端口:默认 22/TCP。
- 客户端/服务端:
ssh/scp/sftp是客户端;sshd(sshd_config)是服务端守护进程。 - 两种认证:密码认证 和 密钥认证(更安全,见第三章)。
相关文件:
| 文件 | 作用 |
|---|---|
~/.ssh/id_rsa、~/.ssh/id_ed25519 |
客户端私钥(绝不外传) |
~/.ssh/id_rsa.pub 等 |
客户端公钥(可放到服务器) |
~/.ssh/known_hosts |
记录连接过的服务器主机指纹(防中间人) |
~/.ssh/authorized_keys |
服务器上存允许登录的公钥 |
/etc/ssh/sshd_config |
服务端配置 |
/etc/ssh/ssh_config |
客户端配置 |
二、SSH 远程登录:ssh 基本用法
2.1 基本登录
ssh 用户名@主机地址
ssh root@192.168.1.100
ssh alice@example.com
# 默认用当前用户名(若同名用户存在)
ssh 192.168.1.100
2.2 常用选项
ssh -p 2222 root@192.168.1.100 # -p 指定端口(默认 22)
ssh -l alice 192.168.1.100 # -l 指定登录用户名
ssh -i ~/.ssh/mykey root@host # -i 指定私钥文件
ssh -v root@host # -v 详细模式(调试用,-vvv 更详细)
ssh -X root@host # 启用 X11 转发
ssh root@host "命令" # 直接执行远程命令,不进入交互
直接执行远程命令(无需登录进去):
ssh root@192.168.1.100 "hostname"
ssh root@192.168.1.100 "uptime; df -h"
ssh root@192.168.1.100 "systemctl status httpd"
2.3 首次连接的主机指纹确认
首次连接某主机时,会提示确认主机指纹(防中间人攻击):
The authenticity of host ... can't be established.
ECDSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
- 输入
yes确认后,指纹会存入~/.ssh/known_hosts。 - 若主机重装系统/换密钥后指纹变化,会报
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED,此时需删除 known_hosts 里对应行。
ssh-keygen -R 192.168.1.100 # 从 known_hosts 删除某主机记录
2.4 退出远程会话
exit # 或 Ctrl+D 退出 SSH 会话
logout
参考:
man 1 ssh、菜鸟教程 - Linux SSH 远程登录
三、密钥认证:ssh-keygen 免密登录
密钥认证用"一对密钥"代替密码:私钥留在本地(相当于"钥匙"),公钥放到服务器(相当于"锁")。登录时服务器验证私钥,无需输入密码,比密码认证更安全(私钥难以暴力破解)。
3.1 生成密钥对:ssh-keygen
# 生成密钥对(默认 RSA 3072 位,存放 ~/.ssh/id_rsa 和 id_rsa.pub)
ssh-keygen -t rsa -b 4096
# 推荐用更现代的 ed25519 算法
ssh-keygen -t ed25519
# 指定文件名和注释
ssh-keygen -t ed25519 -f ~/.ssh/mykey -C "my-email@example.com"
生成时系统会问:
- Enter file to save the key:私钥保存位置(回车用默认)。
- Enter passphrase:给私钥加口令(可回车留空,留空则免密更便捷但私钥泄露即风险)。
生成后产生两个文件:
- 私钥
id_ed25519:绝不能泄露/外传。 - 公钥
id_ed25519.pub:可以放到服务器。
ls -l ~/.ssh/
cat ~/.ssh/id_ed25519.pub # 查看公钥内容
3.2 把公钥放到服务器(免密登录关键)
方法一:用 ssh-copy-id 自动复制(推荐)
ssh-copy-id root@192.168.1.100
# 首次会要密码,之后公钥自动追加到服务器 ~/.ssh/authorized_keys
# 指定端口和私钥
ssh-copy-id -p 2222 -i ~/.ssh/mykey.pub root@192.168.1.100
方法二:手动复制公钥
# 把公钥内容追加到服务器的 authorized_keys
cat ~/.ssh/id_ed25519.pub | ssh root@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3.3 密钥与目录权限
SSH 对权限敏感,权限不对会拒绝用密钥登录:
# 服务器端
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# 客户端(私钥需 600)
chmod 600 ~/.ssh/id_ed25519
authorized_keys必须 600(属主可读写)。.ssh目录必须 700(属主可读写执行)。- 私钥必须 600(不能有其他用户可读)。
3.4 测试免密登录
ssh root@192.168.1.100 # 若无需输入密码即成功 = 密钥认证生效
ssh -v root@192.168.1.100 # 用 -v 看认证过程(Offering public key / Authenticated)
若免密失败:检查公钥是否在 authorized_keys、权限是否 600/700、服务端是否开启 PubkeyAuthentication、以及是否配置了 PasswordAuthentication 优先级。
参考:
man 1 ssh-keygen、man 1 ssh-copy-id、Red Hat - 配置 SSH 密钥认证
四、远程传文件:scp / sftp
在本地与服务器之间传文件是运维刚需,主要有 scp(一次性命令)和 sftp(交互式)。
4.1 scp —— 基于 SSH 的安全复制
# 本地 → 远程(上传)
scp file.txt root@192.168.1.100:/root/
scp file.txt root@192.168.1.100:/root/file.txt # 指定目标文件名
# 远程 → 本地(下载)
scp root@192.168.1.100:/root/file.txt .
# 递归复制目录(-r)
scp -r /local/dir root@192.168.1.100:/root/
# 指定端口(-P 大写)
scp -P 2222 file.txt root@192.168.1.100:/root/
# 保留文件时间/权限(-p 小写)
scp -p file.txt root@192.168.1.100:/root/
scp语法类似cp,只是加了用户名@主机:路径。- 注意端口选项:
scp/sftp用-P(大写)指定端口,而ssh登录是-p(小写),别搞混。
4.2 sftp —— 交互式安全文件传输
sftp root@192.168.1.100 # 进入交互式
sftp -P 2222 root@192.168.1.100 # 指定端口
进入 sftp 后常用命令:
| 命令 | 作用 |
|---|---|
put 本地文件 |
上传 |
get 远程文件 |
下载 |
ls / lls |
查看远程 / 本地目录 |
cd / lcd |
切换远程 / 本地目录 |
pwd / lpwd |
显示远程 / 本地路径 |
mkdir |
远程建目录 |
bye / exit |
退出 |
sftp> put local.txt
sftp> get remote.txt
sftp> exit
- scp vs sftp:单次传文件用
scp;需要浏览、多次操作、断点续传(sftp 更友好)用sftp。 - 都基于 SSH,同样支持密钥免密。
参考:
man 1 scp、man 1 sftp、菜鸟教程 - Linux scp/sftp
五、多主机管理:~/.ssh/config
当要连很多台服务器时,可在 ~/.ssh/config 里为每台主机配置快捷方式,之后用别名登录,省去记 IP/端口/用户名/私钥。
5.1 配置示例
# ~/.ssh/config
Host web1
HostName 192.168.1.100
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
Host db1
HostName 192.168.1.101
User alice
Port 2222
IdentityFile ~/.ssh/mydbkey
Host *
ServerAliveInterval 60
常用配置项:
| 配置项 | 作用 |
|---|---|
Host |
别名(可用 * 匹配多个) |
HostName |
实际主机地址/IP |
User |
登录用户名 |
Port |
端口(默认 22) |
IdentityFile |
指定私钥文件 |
ServerAliveInterval |
保持心跳,防止连接超时断开 |
StrictHostKeyChecking |
是否严格校验主机指纹 |
ProxyJump |
跳板机(通过它连内网主机) |
5.2 用别名登录
chmod 600 ~/.ssh/config # config 权限建议 600
ssh web1 # 等价 ssh root@192.168.1.100 -p 22
scp file.txt web1:/root/ # scp 也能用别名
sftp db1 # sftp 也能用
跳板机(ProxyJump)示例:本机通过跳板机连内网主机
Host bastion
HostName 跳板机IP
User root
Host internal
HostName 192.168.10.5
User root
ProxyJump bastion
ssh internal # 自动先连跳板机,再连内网主机
参考:
man 5 ssh_config、OpenSSH - config 文档
六、SSH 安全加固
SSH 是暴力破解和攻击的首要目标,生产服务器务必加固。下面是最常用、最有效的几项。
6.1 修改默认端口
改掉默认 22 端口,能减少大量针对性扫描。
sudo vim /etc/ssh/sshd_config
# 找到 #Port 22,改成:
Port 2222
# 语法检查 + 重启生效
sudo sshd -t # 检查配置语法
sudo systemctl restart sshd
# 确认新端口监听
ss -tlnp | grep 2222
改端口后:防火墙放行新端口,且客户端登录要用
ssh -p 2222。
6.2 禁止 root 直接登录
禁止 root 直接 SSH,强制用普通用户登录后再提权(sudo),更安全可审计。
# /etc/ssh/sshd_config
PermitRootLogin no
sudo systemctl restart sshd
- 修改后 root 无法直接 SSH,需先登录普通用户再用
su -或sudo。 - 一定要确保已有可用的普通用户能登录,否则会把自己锁在外面!
6.3 推荐的安全配置组合
# /etc/ssh/sshd_config 安全加固片段
Port 2222 # 改端口
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 关闭密码登录(仅密钥),最安全
PubkeyAuthentication yes # 开启密钥认证
MaxAuthTries 3 # 最多允许 3 次认证失败
LoginGraceTime 30 # 认证超时 30 秒
AllowUsers alice bob # 只允许指定用户登录
Protocol 2 # 只用 SSHv2
# 修改后务必先验证再重启
sudo sshd -t # 语法检查
sudo systemctl restart sshd
强烈提醒:关闭密码登录、改端口前,务必先配置好密钥认证并测试能免密登录,否则可能把自己锁在服务器外!建议用另一个会话测试通过后再重启 sshd。
6.4 其他加固建议
- 防火墙:只放行需要的端口,限制来源 IP。
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
- fail2ban:对多次失败登录自动封 IP(可选安装)。
- 定期检查日志:
journalctl -u sshd或/var/log/secure看登录尝试,发现暴力破解及时处理。 - 保持更新:及时升级 openssh 修复漏洞。
参考:
man 5 sshd_config、Red Hat - 加固 OpenSSH、CIS Benchmarks
七、总结与练习
7.1 核心速查
| 需求 | 命令 |
|---|---|
| 登录服务器 | ssh 用户@主机 |
| 指定端口登录 | ssh -p 2222 用户@主机 |
| 远程执行命令 | ssh 用户@主机 "命令" |
| 生成密钥对 | ssh-keygen -t ed25519 |
| 复制公钥到服务器 | ssh-copy-id 用户@主机 |
| 上传文件 | scp 本地文件 用户@主机:/路径/ |
| 下载文件 | scp 用户@主机:/路径/文件 . |
| 交互传文件 | sftp 用户@主机 |
| 多主机配置 | 编辑 ~/.ssh/config |
| 改 SSH 端口 | 编辑 /etc/ssh/sshd_config 的 Port |
| 禁 root 登录 | sshd_config 设 PermitRootLogin no |
| 检查 sshd 配置 | sudo sshd -t |
| 重启 sshd | sudo systemctl restart sshd |
7.2 动手练习建议
# 1. 生成密钥对并免密登录
ssh-keygen -t ed25519
ssh-copy-id root@127.0.0.1
ssh root@127.0.0.1 hostname # 应无需密码
# 2. 传文件练习
echo hello > test.txt
scp test.txt root@127.0.0.1:/tmp/
scp root@127.0.0.1:/tmp/test.txt ./down.txt
cat down.txt
# 3. 配置别名
cat >> ~/.ssh/config << EOF
Host local
HostName 127.0.0.1
User root
IdentityFile ~/.ssh/id_ed25519
EOF
ssh local hostname
# 4. 查看 SSH 登录日志
sudo journalctl -u sshd --since today | tail -20
提示:改
/etc/ssh/sshd_config的端口、关密码登录等危险操作务必在虚拟机上练习,并保留一个可用会话,避免把自己锁在服务器外。
参考资料
- man 手册:
man 1 ssh、man 1 ssh-keygen、man 1 ssh-copy-id、man 1 scp、man 1 sftp、man 5 ssh_config、man 5 sshd_config - OpenSSH 官网:https://www.openssh.com/
- Red Hat 官方文档 - OpenSSH:https://docs.redhat.com/
- Rocky Linux 官方文档:https://docs.rockylinux.org/
- 菜鸟教程 - Linux 远程登录:https://www.runoob.com/linux/linux-remote.html
