SSH 远程登录与安全管理

Administrator 1

SSH 远程登录与安全管理


目录

  1. 安装 OpenSSH 工具
  2. SSH 是什么与基本原理
  3. SSH 远程登录:ssh 基本用法
  4. 密钥认证:ssh-keygen 免密登录
  5. 远程传文件:scp / sftp
  6. 多主机管理:~/.ssh/config
  7. SSH 安全加固
  8. 总结与练习

〇、安装 OpenSSH 工具

SSH 相关的命令由 OpenSSH 软件包提供。Rocky/RHEL 完整安装一般自带,但 Minimal(最小化)安装可能没有,使用前先确认并安装。

相关软件包

提供 作用
openssh-clients sshscpsftpssh-keygenssh-copy-id 客户端工具(登录、传文件、生成密钥)
openssh-server sshd 服务端守护进程(让本机可以被远程登录)
openssh 公共文件与配置 OpenSSH 基础包

检查是否已安装

which ssh scp sftp ssh-keygen     # 看客户端工具是否存在
which sshd                        # 看服务端是否存在
rpm -q openssh openssh-clients openssh-server   # 查看已安装的包
  • 若能找到 sshscpssh-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-clientsudo 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 客户端配置

参考:OpenSSH 官网Red Hat - 配置 OpenSSH菜鸟教程 - Linux SSH


二、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-keygenman 1 ssh-copy-idRed 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 scpman 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_configOpenSSH - 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_configRed Hat - 加固 OpenSSHCIS 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_configPermitRootLogin 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 的端口、关密码登录等危险操作务必在虚拟机上练习,并保留一个可用会话,避免把自己锁在服务器外。


参考资料