服务器安全加固基础措施

50 阅读7分钟

前言

服务器安全加固它们的核心目的都是为了增加攻击者的成本,并减少被自动化脚本攻破的概率

  • 禁用 Root 用户登录

    • 增加暴力破解的难度(最主要原因)
    • 权限审计与责任追溯(区分团队用户)
    • 防止误操作(最小权限原则)
  • 修改 SSH 默认端口 (Port 22)

    • 规避自动化扫描脚本(主要作用)
    • 保持/var/log/secure日志干净

第一步:创建一个拥有sudo权限的普通用户

在禁用Root登录之前,你必须确保有一个普通用户可以登录并执行管理员命令(sudo)。

  1. 创建新用户 (假设用户名为 adminuser):
useradd -m adminuser
  1. 设置密码
passwd adminuser
# 输入两次新密码

使用 SSH 密钥对登录(最强推荐)

目前最主流的SSH验证方式。在你的电脑生成一对密钥(公钥和私钥),把公钥放到服务器上。

  • 配置: 在 /etc/ssh/sshd_config 中设置:
PubkeyAuthentication yes    # 开启密钥登录
PasswordAuthentication no   # 彻底关闭密码登录(!)
  • 注意:在关闭密码登录前,务必确认密钥登录已经配置成功。
  1. 授予 sudo 权限

    1. CentOS / RHEL / Fedora:
    2. usermod -aG wheel adminuser
      
    3. Ubuntu / Debian:
    4. usermod -aG sudo adminuser
      
  2. 关闭 sudo 密码:可选-取消 sudo 密码虽然方便,但降低了安全性

visudo
  • 这会打开 /etc/sudoers 文件。
  • 默认编辑器可能是 nano(下方有快捷键提示)或 vi/vim

你需要找到合适的位置(通常在文件末尾添加即可),根据你的需求选择以下 一种 方式:

方式 A:只针对特定用户(推荐)

假设你的用户名是 adminuser,在文件最后一行添加:

adminuser ALL=(ALL:ALL) NOPASSWD: ALL
  • 请将 adminuser 替换为你实际的用户名。
  • NOPASSWD: 是关键指令(注意冒号和空格)。

方式 B:针对整个用户组(例如 wheel 或 sudo 组)

如果你希望所有拥有管理员权限的用户都不需要密码:

找到类似下面这一行(以 % 开头表示组):

  • CentOS / RHEL (通常是 %wheel):
## 找到这一行
%wheel  ALL=(ALL)       ALL

## 修改为:
%wheel  ALL=(ALL)       NOPASSWD: ALL
  • Ubuntu/ Debian (通常是 %sudo):
## 找到这一行
%sudo   ALL=(ALL:ALL) ALL

## 修改为:
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL

保存并退出

  • 如果你是在 nano 编辑器中 (屏幕下方有 ^O Write Out 等提示):

    • Ctrl + O,然后按 Enter(回车)保存。
    • Ctrl + X 退出。
  • 如果你是在 vi vim 编辑器中:

    • Esc 键退出编辑模式。
    • 输入 :wq 并按回车(保存并退出)。

验证

无需重启服务,立即生效。可以输入一个 sudo 命令测试:

sudo ls /root

如果直接列出了文件而没有提示输入密码,说明配置成功。


第二步:修改用户密码

如果你需要修改当前用户(包括root)或其他用户的密码。

  • 修改当前登录用户的密码
passwd
  • 修改特定用户的密码 (需要root权限)
passwd 用户名
# 例如: passwd root 或 passwd adminuser

第三步:修改SSH配置文件 (端口与Root登录)

SSH的主配置文件通常位于 /etc/ssh/sshd_config

  1. 备份配置文件 (养成好习惯):
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
  1. 编辑配置文件: 使用你熟悉的编辑器(如 vi, vim, 或 nano):
vim /etc/ssh/sshd_config
  1. 修改 SSH ****端口: 找到 #Port 22 这一行。

    1. 去掉前面的 # 注释符号。
    2. 22 修改为你想要的端口号(建议在 1024-65535 之间,避免冲突,例如 2222)。
    3. 修改前: #Port 22
    4. 修改后: Port 2222
  2. 禁用 Root 登录: 找到 PermitRootLogin 这一行。

    1. 如果它是 yes,改为 no
    2. 修改后: PermitRootLogin no
  3. 保存并退出

    1. 如果是 vim: 按 Esc,输入 :wq,回车。
    2. 如果是 nano: 按 Ctrl+O 保存,Ctrl+X 退出。

开启 SSH 空闲超时自动登出(常搭配使用-可选)

防止你离开电脑时,已经连接的SSH窗口被他人恶意操作。

  • 做法:修改 /etc/ssh/sshd_config(或者配置 TMOUT 环境变量 )
ClientAliveInterval 300   # 服务端每300秒向客户端发送一次心跳
ClientAliveCountMax 0     # 如果客户端没响应(或空闲),允许尝试0次后断开
  • 作用:如果你去上厕所或下班忘记关终端,5分钟无操作后,连接会自动断开。

安装防暴力破解神器:Fail2Ban(可选)

Fail2Ban 是一个自动化保护工具,它会监控系统日志。

  • 原理:如果检测到某个IP在短时间内连续输错密码 N 次(例如5次),它会立即修改防火墙规则,将这个IP封禁(Ban掉)一段时间(例如1小时或永久)。

  • 安装

    • Ubuntu/Debian: sudo apt install fail2ban
    • CentOS: sudo yum install fail2ban
  • 作用:它是修改SSH端口的最佳搭档。即使你没改端口,有了Fail2Ban,暴力破解脚本试几次就被拉黑了,无法继续尝试

启用双因子认证 (可选)

给SSH登录加一把“动态锁”。

  • 做法:在服务器安装 google-authenticator 模块。登录时,除了输入密码(或密钥),还需要输入手机 App(如 Google Authenticator 或 Microsoft Authenticator)上每30秒变化的 6 位数字验证码。

第四步:配置防火墙 (至关重要)

重启 SSH 服务之前,必须放行新 端口 ,否则你会被锁在外面!

根据你的操作系统选择对应的防火墙命令:

情况 A: 如果你是 CentOS 7/8/9 / RHEL (使用 firewalld)

  1. 放行新 端口 (例如 2222):
firewall-cmd --permanent --add-port=2222/tcp
  1. 重新加载防火墙
firewall-cmd --reload
  1. SELinux 设置 (如果是 CentOS / RHEL 且开启了SELinux) : 如果修改了端口,SELinux可能会阻止SSH在非标准端口运行。
# 安装管理工具 (如果没有)
yum install -y policycoreutils-python-utils  # CentOS 8/Stream
# 或 yum install -y policycoreutils-python   # CentOS 7

# 允许SSH使用新端口
semanage port -a -t ssh_port_t -p tcp 2222

情况 B: 如果你是 Ubuntu / Debian (使用 ufw)

  1. 放行新 端口
ufw allow 2222/tcp
  1. (注意:如果你还要保留 22端口 作为备用,可以暂时不删,确认无误后再删)
  2. 重新加载防火墙
ufw reload

情况 C: 如果使用的是云服务器 (AWS, 阿里云, 腾讯云等)

  • 务必去云服务商的控制台(网页端) ,找到“安全组”或“防火墙”设置。
  • 添加一条入站规则:协议 TCP,端口 2222,源IP 0.0.0.0/0 (或指定你的IP)。
  • 如果不做这一步,即使系统内部防火墙开了,外部也被云厂商拦截了。

第五步:重启 SSH 服务并验证

  1. 重启 服务
# CentOS / RHEL / Ubuntu / Debian 通用
systemctl restart sshd
  1. 验证 (关键步骤)

    1. 绝对不要关闭当前的 SSH 窗口!
    2. 打开一个新的终端窗口(或在你的SSH客户端如PuTTY/Xshell中新建连接)。
    3. 尝试使用新用户 端口登录:
ssh -p 2222 adminuser@你的服务器IP
  1. 结果测试

    1. 如果能登录成功 -> 恭喜,配置完成。
    2. 尝试用 root 登录 -> 应该提示 "Permission denied"(被拒绝)。
    3. 如果新窗口连接不上 -> 回到原来的(未关闭的)窗口检查配置文件和防火墙,把端口改回22,重启服务以恢复访问。

历史命令记录优化(可选)

防止敏感信息泄露。

  • 背景:你在终端输入的命令会被记录在 ~/.bash_history 中。如果你在命令里带了密码(比如 mysql -u root -p123456),这非常危险。
  • 做法: 在 /etc/profile~/.bashrc 中设置:
export HISTTIMEFORMAT="%F %T "  # 给历史记录加时间戳,方便审计
export HISTCONTROL=ignoreboth   # 忽略空格开头的命令
  • 技巧:如果你要输入敏感命令,在命令最前面加一个空格,这条命令就不会被记录到历史文件中。

总结:一套标准的加固方案

对于大多数生产环境服务器,做到以下 4 点通常就能阻挡绝大部分的攻击:

  1. 非 Root + Sudo
  2. SSH 端口 + 密钥登录 + 禁用密码
  3. Fail2Ban 自动封禁
  4. 防火墙只开必要 端口