ssh-keygen 命令详解
这个命令是用于生成 SSH 密钥对的。下面详细解释每个参数和整个命令的作用:
命令分解
bash
ssh-keygen -t ed25519 -f /root/.ssh/mysql_backup_key -N "" -C "mysql_backup_$(hostname)_$(date +%Y%m%d)"
1. ssh-keygen
- SSH 密钥生成工具
- 用于创建、管理和转换 SSH 认证密钥
2. -t ed25519
-t: 指定密钥类型(type)ed25519: 一种现代的、安全的椭圆曲线加密算法- ✅ 更安全: 比传统的 RSA 算法更安全
- ✅ 更快: 生成和验证速度更快
- ✅ 更小: 密钥文件更小(公钥只有 68 个字符)
- ✅ 更现代: 推荐用于新系统
3. -f /root/.ssh/mysql_backup_key
-f: 指定密钥文件保存路径(filename)/root/.ssh/mysql_backup_key: 密钥文件的完整路径- 会生成两个文件:
/root/.ssh/mysql_backup_key→ 私钥(保密!)/root/.ssh/mysql_backup_key.pub→ 公钥(可公开)
- 会生成两个文件:
4. -N ""
-N: 设置密钥的密码(passphrase)"": 空字符串,表示不设置密码- 🔸 优点: 无需交互输入密码,适合自动化脚本
- 🔸 缺点: 如果私钥泄露,他人可直接使用
- 🔸 建议 :
- 内网环境可以用空密码
- 公网环境建议设置强密码
5. -C "mysql_backup_$(hostname)_$(date +%Y%m%d)"
-C: 添加注释(comment)mysql_backup_$(hostname)_$(date +%Y%m%d): 注释内容$(hostname): 获取当前主机名$(date +%Y%m%d): 获取当前日期(YYYYMMDD格式)- 示例 :
mysql_backup_server01_20240125
执行后的结果
1. 生成的文件
bash
/root/.ssh/mysql_backup_key # 私钥(绝不要分享)
/root/.ssh/mysql_backup_key.pub # 公钥(可以分享给B服务器)
2. 文件内容示例
私钥文件 (mysql_backup_key):
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACB3+4VbtX8Y4zvUxO5R9Q7Kq7l8mG6F1iR5W8tX7fQAAAAAKAAAAAQAAAAE
...
-----END OPENSSH PRIVATE KEY-----
公钥文件 (mysql_backup_key.pub):
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICD... mysql_backup_server01_20240125
实际应用示例
场景:为 MySQL 备份创建专用密钥
bash
# 1. 执行命令
ssh-keygen -t ed25519 -f /root/.ssh/mysql_backup_key -N "" -C "mysql_backup_$(hostname)_$(date +%Y%m%d)"
# 2. 输出示例
Generating public/private ed25519 key pair.
Your identification has been saved in /root/.ssh/mysql_backup_key
Your public key has been saved in /root/.ssh/mysql_backup_key.pub
The key fingerprint is:
SHA256:U6s4j7F8gH5d3s2a1Q9w8e7R6t5Y4u3I2o1P9l8K7n6M5v4C3x2Z1a9S8d7F6g5H4j3K2l1
The key's randomart image is:
+--[ED25519 256]--+
| .o+ |
| . o.o |
| . . o . |
| . o o |
| S o . . |
| . = . . . |
| . o o . .|
| . o + . |
| .E+ o |
+----[SHA256]-----+
3. 设置正确的权限
bash
# 非常重要!不正确的权限会导致 SSH 拒绝使用密钥
chmod 600 /root/.ssh/mysql_backup_key # 私钥:只有所有者可读写
chmod 644 /root/.ssh/mysql_backup_key.pub # 公钥:所有者读写,其他人只读
chmod 700 /root/.ssh # .ssh目录:只有所有者可访问
为什么要这样配置?
1. 使用 ed25519 而不是 rsa
bash
# 传统方式(旧)
ssh-keygen -t rsa -b 4096
# 现代方式(推荐)
ssh-keygen -t ed25519
| 算法 | 密钥长度 | 安全性 | 性能 | 密钥大小 |
|---|---|---|---|---|
| RSA 4096 | 4096位 | 高 | 慢 | 大 |
| ed25519 | 256位 | 更高 | 快 | 小 |
2. 使用空密码 -N ""
- 自动化脚本需要: cron 任务无法交互输入密码
- 内网环境: 相对安全,可以接受
- 替代方案 : 如果担心安全,可以用
ssh-agent管理密码
3. 添加有意义的注释 -C
- 便于管理: 知道这个密钥是做什么用的
- 标识来源: 知道来自哪台服务器、什么时候创建的
- 便于撤销: 如果需要撤销密钥,容易识别
如何使用这个密钥?
1. 在 A 服务器(备份源)
bash
# 生成密钥(已执行)
# 现在可以使用私钥连接其他服务器
# 使用私钥连接B服务器
ssh -i /root/.ssh/mysql_backup_key backup_user@B服务器IP
2. 在 B 服务器(备份目标)
bash
# 将A服务器的公钥添加到授权列表
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICD... mysql_backup_server01_20240125" >> /home/backup_user/.ssh/authorized_keys
# 设置权限
chmod 600 /home/backup_user/.ssh/authorized_keys
chmod 700 /home/backup_user/.ssh
3. 在脚本中使用
bash
# 备份脚本中使用密钥
scp -i /root/.ssh/mysql_backup_key backup_file.tar.gz backup_user@B服务器IP:/backup/
# 或
rsync -avz -e "ssh -i /root/.ssh/mysql_backup_key" backup_file backup_user@B服务器IP:/backup/
常用变体和选项
1. 设置密码的版本
bash
# 交互式输入密码
ssh-keygen -t ed25519 -f /root/.ssh/mysql_backup_key -C "mysql_backup_key"
# 或命令行指定密码(不推荐,密码会留在历史记录)
ssh-keygen -t ed25519 -f /root/.ssh/mysql_backup_key -N "MyStrongPassword123!" -C "mysql_backup_key"
2. 传统 RSA 密钥(兼容旧系统)
bash
# 2048位(最低安全要求)
ssh-keygen -t rsa -b 2048 -f /root/.ssh/backup_key -N "" -C "backup_key"
# 4096位(推荐)
ssh-keygen -t rsa -b 4096 -f /root/.ssh/backup_key -N "" -C "backup_key"
3. 更简洁的版本(用于自动化脚本)
bash
# 使用默认路径 (~/.ssh/id_ed25519)
ssh-keygen -t ed25519 -N "" -C "auto_backup_$(date +%Y%m%d)"
安全注意事项
✅ 该做的
- 保护私钥 :
chmod 600私钥文件 - 定期更换: 每3-6个月更换一次密钥
- 限制使用: 在B服务器上限制密钥的用途
- 监控日志: 监控SSH登录尝试
❌ 不该做的
- 不要分享私钥: 永远不要通过邮件、聊天发送私钥
- 不要使用弱注释: 注释应该能清楚标识用途
- 不要忽略权限: 错误的权限SSH会拒绝使用密钥
- 不要长期不换: 密钥应该定期更换
总结
您使用的命令创建了一个:
- 类型: ed25519(现代、安全、快速)
- 位置 :
/root/.ssh/mysql_backup_key - 密码: 无(适合自动化)
- 注释: 包含主机名和日期(便于管理)
这是为MySQL备份任务创建专用SSH密钥的标准做法,既安全又便于自动化执行。