CentOS 6 远程连接配置权限管理详解
把服务器想象成你家的房子,SSH就是大门钥匙,防火墙就是门锁和防盗网,权限管理就是告诉谁能进哪个房间。今天咱们把这整套”安全防护体系”从头到尾拆开来唠唠,保证你看完能上手就干。
一、SSH基础设置:先让你能连上,再让你安全地连上
1. 确认SSH服务安装
大多数 CentOS 6 默认就装了 OpenSSH 服务端,但万一你没装或者装漏了,先用这条命令看看:
rpm -qa | grep openssh-server
有输出就说明装了,比如:
openssh-server-5.3p1-123.el6.x86_64
没装的话,一条命令搞定:
yum install -y openssh-server
装完之后,启动它并设成开机自启:
chkconfig sshd on
service sshd start
用 ps 和 netstat 验一下:
ps -ef | grep sshd
netstat -tlnp | grep 22
能看到 sshd 进程在跑,且 0.0.0.0:22 在监听,就说明 SSH 已经活蹦乱跳了。
2. 核心配置文件 /etc/ssh/sshd_config
这个文件是 SSH 的总控台,改完必须 service sshd reload 才能生效。别慌,我逐个讲最常用的参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
Port |
22 | SSH 监听端口 |
ListenAddress |
0.0.0.0 | 监听哪些网卡IP |
Protocol |
2 | 只用 SSHv2,别碰v1 |
PermitRootLogin |
yes | 是否允许root直接登录 |
PasswordAuthentication |
yes | 是否允许密码登录 |
PubkeyAuthentication |
no(旧版) | 是否允许公钥登录 |
PermitEmptyPasswords |
no | 绝对不允许空密码 |
MaxAuthTries |
6 | 最大认证尝试次数 |
ClientAliveInterval |
0 | 心跳间隔(秒) |
ClientAliveCountMax |
3 | 心跳超时次数 |
AllowUsers / DenyUsers |
— | 白名单/黑名单 |
AllowGroups / DenyGroups |
— | 按组控制 |
X11Forwarding |
yes | 是否允许X11转发 |
UseDNS |
no | 是否反向DNS解析 |
LoginGraceTime |
120 | 登录超时秒数 |
Banner |
— | 登录前显示的公告 |
一个安全基线配置长这样:
Port 22
ListenAddress 0.0.0.0
Protocol 2
# 认证方式
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
# 禁止root直接登录
PermitRootLogin no
# 只允许特定用户
AllowUsers deploy admin zhangsan
# 连接控制
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 60
ClientAliveCountMax 2
# 关闭无用功能
X11Forwarding no
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
Compression yes
UseDNS no
# 记录日志
LogLevel INFO
改完记得重启:
service sshd restart
重要提醒:改 SSH 配置之前,永远保留一个已登录的终端别关,或者让另一个人在线。万一改坏了把自己锁外面,你就真哭了。
二、公钥认证:彻底告别”密码被爆破”的噩梦
密码登录最大的问题就是—— brute force(暴力破解)防不胜防。换公钥认证,黑客就算知道你用户名,没有你的私钥也进不来。
1. 生成密钥对(在客户端机器上操作)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
一路回车就行,密码可以设也可以不设(不设的话方便但安全性略低)。
生成的文件在 ~/.ssh/ 目录下:
ls -la ~/.ssh/
id_rsa ← 私钥(绝对不能给别人看)
id_rsa.pub ← 公钥(这个贴到服务器)
2. 把公钥传到服务器
最简单的办法是 ssh-copy-id:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@服务器IP
输入一次密码就搞定。
如果服务器上没有这个命令,手动贴:
cat ~/.ssh/id_rsa.pub
把输出整行复制,到服务器上用 vi 编辑:
vi ~/.ssh/authorized_keys
把公钥内容粘贴进去,保存退出。
3. 权限检查(关键!)
SSH 对权限要求非常苛刻,权限不对会直接拒绝登录:
# 在服务器端执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R 用户名:用户名 ~/.ssh
很多老手改完了配置还是登不上,99% 是权限问题,先看这里。
4. 验证并禁用密码登录
先保持 root 终端在线,用新密钥登录测试:
ssh user@服务器IP
能进来就说明密钥生效了。然后回原来的 root 终端,把密码登录关掉:
vi /etc/ssh/sshd_config
PasswordAuthentication no
service sshd restart
三、用户与权限管理:精细控制谁能干什么
1. 创建专用运维账号
永远不要用 root 直接日常登录,创建普通用户:
useradd -m -s /bin/bash deploy
passwd deploy
-m 是创建家目录,-s 指定 shell。
2. 配置 sudo 权限
编辑 sudoers 文件(必须用 visudo 命令,否则语法错误连 sudo 都废了):
visudo
添加:
deploy ALL=(ALL) ALL
或者更精细的控制:
deploy ALL=(ALL) NOPASSWD: /bin/systemctl, /bin/ls, /usr/bin/tail
NOPASSWD 表示执行这些命令不需要输密码,适合自动化脚本场景。
3. 限制用户登录的其他方式
PAM 认证控制:
编辑 /etc/pam.d/sshd,可以限制某些用户在非工作时间登录:
# 只允许 deploy 用户在工作日 9-18 点登录
auth required pam_time.so
然后在 /etc/security/time.conf 里配置规则:
sshd;!*;!deploy;Wk0900-1800
chroot 监狱(把用户限制在某个目录里):
在 /etc/ssh/sshd_config 里加:
Match User deploy
ChrootDirectory /home/deploy
ForceCommand internal-sftp
这样 deploy 用户登录后只能看到自己家目录,连 ls / 都不行。
4. 用户账号的生命周期管理
# 查看当前登录用户
who
w
last
# 查看账号状态
passwd -S deploy
# 锁定账号(禁止登录)
passwd -l deploy
# 解锁
passwd -u deploy
# 强制修改密码
chage -M 90 deploy # 90天后密码过期
# 删除账号(保留家目录)
userdel deploy
# 删除账号(同时删除家目录)
userdel -r deploy
四、防火墙策略:iptables 是 CentOS 6 的王牌
CentOS 6 用的是 iptables,不是 firewalld(那是 CentOS 7 才有的)。很多人从 7 迁到 6 会一脸懵,别急,iptables 其实更直观。
1. 查看当前防火墙规则
iptables -L -n -v
iptables -L -n -v --line-numbers
加 --line-numbers 可以给每条规则编号,删除的时候直接用编号,比匹配内容方便多了。
2. 基础规则架构
iptables 的规则组织方式是:
表(tables)→ 链(chains)→ 规则(rules)
默认有四张表:
| 表名 | 用途 |
|---|---|
| filter | 默认表,包过滤(允许/拒绝) |
| nat | 地址转换(端口映射、SNAT、DNAT) |
| mangle | 包标记和修改 |
| raw | 连接追踪优化 |
常用的链:
| 链名 | 用途 |
|---|---|
| INPUT | 进入本机的包 |
| OUTPUT | 从本机出去的包 |
| FORWARD | 转发给其他机器的包 |
| POSTROUTING | 出去之前改源地址 |
| PREROUTING | 进来之前改目标地址 |
3. 核心命令语法
iptables -t 表名 -A 链名 -匹配条件 -j 动作
举几个最常用的:
允许已建立的连接回来(状态检测,最重要的一条):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许本机回环:
iptables -A INPUT -i lo -j ACCEPT
允许 SSH(22端口):
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许 HTTP/HTTPS:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
只允许特定IP访问SSH(白名单模式,安全系数拉满):
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
禁止某个IP:
iptables -A INPUT -s 1.2.3.4 -j DROP
禁止某个网段:
iptables -A INPUT -s 10.0.0.0/8 -j DROP
4. 完整的防火墙配置脚本
把这套东西写进脚本,一键部署:
#!/bin/bash
# firewall-setup.sh — CentOS 6 iptables 安全配置
# 先备份现有规则
iptables-save > /etc/sysconfig/iptables.bak.$(date +%Y%m%d%H%M%S)
# 清空所有规则
iptables -F
iptables -X
iptables -Z
# 默认策略:全部拒绝
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立和相关连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(只允许办公网段)
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许ICMP(ping,可选)
iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
# 防止常见攻击: syn flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
echo "防火墙配置完成"
echo "当前规则:"
iptables -L -n -v --line-numbers
保存后给执行权限:
chmod +x firewall-setup.sh
./firewall-setup.sh
5. 保存规则(开机持久化)
CentOS 6 的规则重启后会清空,必须保存:
iptables-save > /etc/sysconfig/iptables
或者直接:
service iptables save
查一下开机是否自动加载:
chkconfig --list iptables
如果没有 on,执行:
chkconfig iptables on
五、Fail2Ban:自动封禁暴力破解的守门员
光靠防火墙手动封 IP 太累了,Fail2Ban 帮你盯着日志,发现扫密码的自动丢进黑名单。
1. 安装
# CentOS 6 默认仓库可能没有,用 EPEL
yum install -y epel-release
yum install -y fail2ban
2. 配置
主配置在 /etc/fail2ban/jail.conf,但建议别直接改这个(升级会被覆盖),创建覆盖文件:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
一个实用的配置:
[DEFAULT]
# 忽略自己的IP(别把自己锁外面)
ignoreip = 127.0.0.1 192.168.1.0/24
# 封禁5分钟
bantime = 300
# 6次失败就封
maxretry = 6
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 3600
3. 启动和监控
chkconfig fail2ban on
service fail2ban start
# 查看状态
fail2ban-client status
fail2ban-client status sshd
# 手动解封某个IP
fail2ban-client del sshd 1.2.3.4
# 手动封禁
fail2ban-client add sshd 1.2.3.4
4. 查看拦截日志
tail -f /var/log/fail2ban.log
你会看到类似这样的记录:
2025-01-15 10:23:45,123 fail2ban.actions: WARNING [sshd] Ban 1.2.3.4
2025-01-15 10:28:45,456 fail2ban.actions: WARNING [sshd] Unban 1.2.3.4
六、安全加固组合拳:把上面这些都串起来
光有 SSH 还不够,配合这些习惯才能真的安全:
1. 变更 SSH 默认端口
22 端口是全网扫描器最先探测的目标。改成高位端口可以减少被扫到的概率:
vi /etc/ssh/sshd_config
Port 2222
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
service sshd restart
注意:改端口后要重新保存防火墙规则,否则你自己也连不上。
2. 禁用不需要的服务
CentOS 6 默认开启了很多你可能用不到的服务,关掉它们减少攻击面:
# 查看哪些服务在跑
chkconfig --list | grep ":on"
# 关掉不需要的
chkconfig cups off # 打印服务
chkconfig bluetooth off # 蓝牙(服务器根本用不到)
chkconfig iptables on # 防火墙必须开
chkconfig sshd on # SSH必须开
3. 系统更新和补丁
yum update -y
CentOS 6 在 2020 年底已经 EOL(停止支持),官方不再提供安全补丁。如果你还在用,建议:
- 尽快升级到 CentOS 7⁄8 或 Rocky Linux / AlmaLinux
- 如果暂时不能升级,至少在内网环境下使用,不要暴露到公网
- 用 VPN 或跳板机访问,不要直接开 SSH 到公网
4. 启用审计日志
yum install -y audit
chkconfig auditd on
service auditd start
审计关键文件变化:
# 监听SSH配置文件变化
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config
# 监听用户登录
auditctl -w /var/log/secure -p wa -k auth_log
七、故障排查指南:连不上了怎么办
这是运维最抓狂的时刻——你自己都
