一、为什么你需要 SSH 免密登录
说实话,每次登录服务器都要输入密码,既慢又容易泄露。配置免密登录(公钥认证)后,SSH 客户端会用你的私钥自动完成身份验证,不仅方便,还能防止暴力破解。更重要的是,配合正确的权限管理,你的服务器安全等级会直接上一个台阶。
二、配置前的准备
两台机器:
- 本地机器:你的电脑(执行 SSH 命令)
- 远程机器:CentOS 6 服务器(你要登录的目标)
确保你知道:
- 远程机器的 IP 地址或域名
- 有权限的账户(通常是 root 或有 sudo 权限的用户)
- 两个机器之间网络连通(可以用
ping测试)
三、检查 SSH 服务是否运行
先登录到 CentOS 6 机器,执行以下命令检查 SSH 服务状态:
# 检查 sshd 服务是否运行
service sshd status
# 如果没有运行,启动它
service sshd start
# 设置开机自启动
chkconfig sshd on
如果提示服务不存在,可能需要先安装:
yum install openssh-server -y
四、生成 SSH 密钥对(在本地机器上执行)
这是最关键的一步。在你的本地机器上打开终端,执行:
# 生成 RSA 密钥对,推荐使用 4096 位
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 或者生成 ED25519 密钥(更安全,推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
执行后会提示你:
Enter file in which to save the key (/home/yourname/.ssh/id_rsa):
直接按回车使用默认路径即可。
Enter passphrase (empty for no passphrase):
如果你想加密码保护私钥,就输入密码;如果不想加,直接按两次回车。
生成完成后,你的公钥会保存在:
~/.ssh/id_rsa.pub # 或 id_ed25519.pub
五、把公钥复制到远程机器
有几种方法,推荐第一种:
方法一:使用 ssh-copy-id(最简单)
ssh-copy-id user@remote_host
例如:
ssh-copy-id root@192.168.1.100
系统会提示你输入远程机器的密码,输入后公钥会自动添加到远程机器的 ~/.ssh/authorized_keys 文件中。
方法二:手动复制
如果 ssh-copy-id 不可用,可以手动复制:
# 1. 读取本地公钥内容
cat ~/.ssh/id_rsa.pub
# 2. 复制输出内容,然后登录到远程机器
ssh user@remote_host
# 3. 在远程机器上执行以下命令
mkdir -p ~/.ssh
echo "复制的公钥内容" >> ~/.ssh/authorized_keys
# 4. 设置正确的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
方法三:使用 scp
scp ~/.ssh/id_rsa.pub user@remote_host:~/.ssh/authorized_keys
然后登录到远程机器设置权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
六、测试免密登录
配置完成后,回到本地机器测试:
ssh user@remote_host
如果一切正常,你应该无需输入密码就能直接登录。
七、SSH 配置文件详解
SSH 配置文件位于 /etc/ssh/sshd_config(服务器端)和 ~/.ssh/config(客户端)。
服务器端配置(CentOS 6)
编辑 /etc/ssh/sshd_config:
vi /etc/ssh/sshd_config
关键配置项:
# 启用公钥认证
PubkeyAuthentication yes
# 禁用密码认证(推荐,更安全)
PasswordAuthentication no
# 允许 root 登录(生产环境建议改为 no)
PermitRootLogin yes
# 禁用空密码
PermitEmptyPasswords no
# 设置最大认证尝试次数
MaxAuthTries 3
# 设置登录超时时间
LoginGraceTime 60
# 启用日志记录
LogLevel VERBOSE
修改配置后重启 SSH 服务:
service sshd restart
客户端配置(本地机器)
编辑 ~/.ssh/config:
vi ~/.ssh/config
示例配置:
Host myserver
HostName 192.168.1.100
User root
IdentityFile ~/.ssh/id_rsa
Port 22
ServerAliveInterval 60
ServerAliveCountMax 3
这样你可以直接用 ssh myserver 登录。
八、权限管理最佳实践
文件和目录权限
SSH 对权限非常敏感,错误的权限会导致登录失败。
本地机器(客户端):
# 私钥权限必须是 600
chmod 600 ~/.ssh/id_rsa
# 公钥权限可以是 644
chmod 644 ~/.ssh/id_rsa.pub
# .ssh 目录权限必须是 700
chmod 700 ~/.ssh
远程机器(服务器):
# .ssh 目录权限必须是 700
chmod 700 ~/.ssh
# authorized_keys 权限必须是 600
chmod 600 ~/.ssh/authorized_keys
# 主目录权限不能是 777
chmod 755 ~
用户权限管理
创建专用用户:
# 创建用户
useradd deployuser
# 设置密码
passwd deployuser
# 添加到 sudo 组(CentOS 6)
usermod -aG wheel deployuser
限制用户登录:
编辑 /etc/ssh/sshd_config:
# 只允许特定用户登录
AllowUsers root deployuser
# 或禁止特定用户登录
DenyUsers nobody
九、解决常见问题
问题一:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
原因:公钥未正确配置或权限错误。
解决:
- 检查公钥是否添加到
authorized_keys:
cat ~/.ssh/authorized_keys
- 检查权限:
ls -la ~/.ssh/
- 检查 SELinux 状态(CentOS 6 默认启用):
getenforce
如果是 Enforcing,执行:
# 恢复 SSH 密钥的上下文
restorecon -Rv ~/.ssh
问题二:Connection refused
原因:SSH 服务未运行或端口被防火墙阻止。
解决:
- 检查 SSH 服务:
service sshd status
- 检查防火墙规则:
# 查看防火墙状态
iptables -L -n | grep 22
# 如果需要,添加规则允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
service iptables save
问题三:Too many authentication failures
原因:尝试次数过多被临时阻止。
解决:
- 等待几分钟后再试
- 检查
/var/log/secure日志:
tail -f /var/log/secure
问题四:Host key verification failed
原因:远程机器的 SSH 主机密钥发生变化。
解决:
# 删除旧的密钥
ssh-keygen -R remote_host
# 重新连接
ssh user@remote_host
十、安全加固建议
1. 更改默认端口
编辑 /etc/ssh/sshd_config:
Port 2222
然后更新防火墙规则:
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
service iptables save
2. 禁用 root 登录
PermitRootLogin no
创建普通用户并使用 sudo 提权。
3. 使用 fail2ban 防止暴力破解
# 安装 fail2ban
yum install epel-release -y
yum install fail2ban -y
# 启动并设置开机自启
service fail2ban start
chkconfig fail2ban on
# 配置规则
vi /etc/fail2ban/jail.local
配置内容:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
4. 定期更新 SSH 版本
yum update openssh -y
service sshd restart
十一、日志监控
查看 SSH 登录日志
# 实时查看
tail -f /var/log/secure
# 查看失败的登录尝试
grep "Failed password" /var/log/secure
# 查看成功的登录
grep "Accepted publickey" /var/log/secure
设置日志告警
可以编写脚本监控异常登录:
#!/bin/bash
# monitor_ssh.sh
LOGFILE="/var/log/secure"
ALERT_EMAIL="admin@example.com"
# 检查过去 5 分钟的失败登录
FAILED_COUNT=$(grep "Failed password" $LOGFILE | tail -n 100 | wc -l)
if [ $FAILED_COUNT -gt 10 ]; then
echo "大量 SSH 登录失败!" | mail -s "SSH 安全告警" $ALERT_EMAIL
fi
十二、完整配置脚本
如果你需要批量配置多台机器,可以使用以下脚本:
#!/bin/bash
# setup_ssh_key.sh
REMOTE_HOST=$1
REMOTE_USER=${2:-root}
echo "正在配置到 $REMOTE_USER@$REMOTE_HOST 的免密登录..."
# 检查本地密钥是否存在
if [ ! -f ~/.ssh/id_rsa.pub ]; then
echo "生成新密钥..."
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
fi
# 复制公钥
ssh-copy-id -o StrictHostKeyChecking=no $REMOTE_USER@$REMOTE_HOST
if [ $? -eq 0 ]; then
echo "配置成功!测试登录..."
ssh -o BatchMode=yes $REMOTE_USER@$REMOTE_HOST "echo 免密登录成功"
else
echo "配置失败,请检查网络和权限设置"
fi
使用方法:
chmod +x setup_ssh_key.sh
./setup_ssh_key.sh 192.168.1.100
总结
配置 SSH 免密登录并不复杂,关键是要注意权限设置和 SELinux 上下文。通过以上步骤,你应该能够:
- 成功配置免密登录
- 解决常见的登录问题
- 理解 SSH 安全配置的最佳实践
- 建立基本的监控和告警机制
记住,安全是一个持续的过程。定期审查日志、更新软件、调整策略,才能确保你的服务器长期处于安全状态。
如果有其他问题,欢迎继续交流!
