对于刚接触云服务器的新手来说,拿到一台全新的云服务器后,面对黑乎乎的终端窗口往往会感到无从下手。很多教程要么过于简略,要么直接跳过关键的安全配置,导致服务器上线后成为黑客的“肉鸡”。本教程将手把手带你完成从零开始的服务器初始化设置,并建立一套基础但有效的安全防护体系。无论你用的是阿里云、腾讯云、华为云还是AWS,操作逻辑完全通用。
## 前言介绍
云服务器本质上是一台永远在线的远程电脑。初次搭建时,系统默认处于“裸奔”状态:默认管理员账户、弱密码、开放所有端口。这就像把新家的钥匙挂在门外。本教程的核心目标有三个:第一,切断所有不安全的默认入口;第二,建立只有你能进入的专用通道;第三,安装必要的监控与防护工具。完成这些设置后,你的服务器将具备抵御常见网络攻击的基础能力,同时为后续部署网站、应用或数据库打下安全基础。
## 前置准备
1. **云服务器一台**:操作系统建议选择CentOS 7.9或Ubuntu 20.04 LTS(本教程以CentOS 7为例,Ubuntu命令稍有差异)。配置至少1核2GB内存,带宽1Mbps以上。
2. **本地电脑**:Windows系统需安装Xshell或Putty(SSH客户端工具);Mac或Linux系统直接使用终端即可。
3. **云平台控制台权限**:确保你能登录云服务商的管理后台,找到“实例管理”或“云服务器”页面。
4. **记录关键信息**:将服务器的公网IP地址、初始密码(如果购买时设置过)或重置密码功能准备好。
## 分步操作步骤
### 1. 首次登录与root账户安全强化
拿到服务器后,第一件事不是安装软件,而是加固管理员账户。
**1.1 通过SSH登录服务器**
打开Xshell或终端,输入以下命令(将IP替换为你的服务器公网IP):
```bash
ssh root@你的服务器IP
```
如果提示“是否继续连接”,输入yes并回车。接着输入初始密码(输入时不会显示字符,这是正常现象),回车后你会看到类似 `[root@你的主机名 ~]#` 的提示符,表示登录成功。
**1.2 创建普通管理员用户(禁用root直接登录)**
root账户权限过大,一旦密码泄露服务器将完全失控。我们需要创建一个具有sudo权限的普通用户:
```bash
useradd adminuser # 创建用户,名称可自定义
passwd adminuser # 设置密码,要求8位以上包含大小写字母和数字
```
输入密码时两次确认即可。接着给这个用户添加sudo权限:
```bash
visudo # 打开sudo配置文件
```
在文件中找到 `root ALL=(ALL) ALL` 这一行,在其下方添加:
```bash
adminuser ALL=(ALL) ALL
```
按 `Ctrl+X` 退出,按 `Y` 保存,按回车确认。
**1.3 配置SSH密钥登录(彻底告别密码)**
密码登录容易被暴力破解,密钥登录更安全。在本地电脑上生成密钥对:
- **Windows用户**:打开Xshell,点击菜单栏“工具” -> “新建用户密钥生成向导”,选择RSA算法,密钥长度2048位,生成后将公钥保存为`authorized_keys`文件(注意文件名不能错)。
- **Mac/Linux用户**:在终端执行 `ssh-keygen -t rsa -b 2048`,一路回车即可。生成的公钥在 `~/.ssh/id_rsa.pub`。
将公钥上传到服务器:
```bash
mkdir -p /home/adminuser/.ssh
echo "你的公钥内容" > /home/adminuser/.ssh/authorized_keys
chmod 600 /home/adminuser/.ssh/authorized_keys
chmod 700 /home/adminuser/.ssh
chown -R adminuser:adminuser /home/adminuser/.ssh
```
注意:公钥内容是一整段以`ssh-rsa`开头的字符串,复制时不要遗漏任何字符。
**1.4 测试新用户登录并禁用root密码登录**
退出当前SSH会话(输入exit),然后用新用户登录:
```bash
ssh adminuser@你的服务器IP
```
如果能够无密码登录(或提示输入密钥密码),说明配置成功。接下来彻底禁用root密码登录:
```bash
sudo vim /etc/ssh/sshd_config
```
找到以下两行并修改:
- `PermitRootLogin yes` 改为 `PermitRootLogin prohibit-password`(禁止root密码登录,但允许密钥)
- `PasswordAuthentication yes` 改为 `PasswordAuthentication no`(禁止所有密码登录)
保存退出后重启SSH服务:
```bash
sudo systemctl restart sshd
```
**重要提示**:在关闭当前SSH窗口前,请另开一个终端测试能否用密钥登录。如果无法登录,说明配置有误,当前窗口不要关闭,立即检查配置并修正。
### 2. 防火墙配置(只开放必要端口)
服务器默认可能开放了所有端口(或者仅关闭了部分),我们需要精确控制进出流量。
**2.1 安装并启动firewalld(CentOS默认防火墙)**
```bash
sudo yum install firewalld -y # 安装
sudo systemctl start firewalld # 启动
sudo systemctl enable firewalld # 设置开机自启
```
**2.2 清理默认规则并开放必要端口**
首先查看当前规则:
```bash
sudo firewall-cmd --list-all
```
如果看到大量开放端口,先重置为默认状态:
```bash
sudo firewall-cmd --set-default-zone=drop # 默认丢弃所有流量
sudo firewall-cmd --reload
```
然后逐一开放你真正需要的端口。对于一台Web服务器,通常只需要SSH、HTTP、HTTPS:
```bash
sudo firewall-cmd --permanent --add-service=ssh # 22端口,SSH连接
sudo firewall-cmd --permanent --add-service=http # 80端口,网页访问
sudo firewall-cmd --permanent --add-service=https # 443端口,加密网页
```
如果你需要其他服务(如MySQL的3306端口、Redis的6379端口),**强烈建议不要直接对外开放**。如果确实需要远程访问,请使用后续步骤中的SSH隧道或VPN。万一必须开放,请限制来源IP:
```bash
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的本地公网IP" port port="3306" protocol="tcp" accept'
```
最后重新加载防火墙并验证:
```bash
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
```
你应该只看到ssh、http、https三个服务被允许。
**2.3 额外安全:关闭ping响应**
黑客常用ping扫描寻找在线服务器。我们可以让服务器对ping无响应:
```bash
echo "net.ipv4.icmp_echo_ignore_all=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```
之后从外部ping你的服务器IP将显示超时,但正常网络访问不受影响。
### 3. 系统更新与安全加固
很多攻击利用的是已知漏洞,及时更新系统是成本最低的防御手段。
**3.1 一键更新所有软件包**
```bash
sudo yum update -y # CentOS/RHEL系统
# 如果是Ubuntu系统,使用:sudo apt update && sudo apt upgrade -y
```
这个过程可能需要几分钟,取决于网络速度。更新完成后建议重启服务器使内核更新生效:
```bash
sudo reboot
```
重启后重新用SSH登录。
**3.2 安装Fail2ban(防暴力破解)**
即使禁用了密码登录,SSH密钥登录也可能被尝试。Fail2ban能自动封禁多次登录失败的IP:
```bash
sudo yum install epel-release -y # 先安装EPEL源
sudo yum install fail2ban -y
sudo systemctl enable fail2ban
```
创建自定义配置文件:
```bash
sudo vim /etc/fail2ban/jail.local
```
写入以下内容:
```ini
[DEFAULT]
bantime = 3600 # 封禁1小时
findtime = 600 # 检测时间窗口10分钟
maxretry = 3 # 最大尝试次数3次
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
```
保存后启动服务:
```bash
sudo systemctl start fail2ban
sudo fail2ban-client status sshd # 查看SSH防护状态
```
如果看到`Status: OK`,说明已生效。你可以尝试用错误密码登录几次,之后你的IP会被临时封禁。
**3.3 修改SSH默认端口(可选但推荐)**
将SSH端口从默认的22改为高位端口(如2222),能大幅减少扫描攻击:
```bash
sudo vim /etc/ssh/sshd_config
```
找到 `#Port 22`,去掉注释并改为:
```
Port 2222
```
保存后重启SSH服务:
```bash
sudo systemctl restart sshd
```
**关键步骤**:在退出当前SSH会话前,务必在防火墙中开放新端口:
```bash
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
```
然后新开一个终端,用 `ssh -p 2222 adminuser@你的服务器IP` 测试连接。确认新端口能登录后,再删除防火墙中的22端口规则:
```bash
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
```
现在你的SSH服务已经隐藏到非标准端口,普通扫描器很难发现。
### 4. 基础监控与日志审计
服务器运行状态需要持续关注,但新手不需要复杂监控系统,几个轻量级工具足矣。
**4.1 安装并配置自动安全更新**
让系统自动安装重要安全补丁,避免遗漏:
```bash
sudo yum install yum-cron -y
sudo vim /etc/yum/yum-cron.conf
```
修改以下两行:
- `apply_updates = yes`(从no改为yes)
- `download_updates = yes`(确认是yes)
启动服务:
```bash
sudo systemctl enable yum-cron
sudo systemctl start yum-cron
```
**4.2 启用系统日志审计**
查看登录记录和异常活动:
```bash
sudo journalctl -xe # 查看系统日志
sudo last # 查看最近登录记录
sudo cat /var/log/secure | grep "Failed password" # 查看密码失败记录
```
建议每周执行一次这些命令,检查是否有异常IP尝试登录。
**4.3 安装简单的资源监控工具**
```bash
sudo yum install htop -y # 交互式进程查看器
sudo yum install iotop -y # 磁盘IO监控
sudo yum install iftop -y # 网络流量监控
```
运行 `htop` 可以直观看到CPU、内存使用情况;运行 `iftop` 可以看到实时网络连接。这些工具不会自动运行,需要时手动执行即可。
**4.4 配置自动备份(关键数据)**
至少备份 `/etc` 配置目录和你的网站数据。使用crontab实现定时备份:
```bash
sudo crontab -e
```
添加以下内容(每天凌晨3点备份到 `/backup` 目录):
```bash
0 3 * * * tar -czf /backup/etc-$(date +\%Y\%m\%d).tar.gz /etc
0 4 * * * tar -czf /backup/www-$(date +\%Y\%m\%d).tar.gz /var/www
```
注意:备份文件应定期下载到本地或上传到对象存储,不要留在服务器上。
## 常见问题
**Q1:修改SSH端口后无法连接怎么办?**
A:如果忘记在防火墙开放新端口,或者配置错误导致SSH无法启动,可以通过云服务商的控制台“远程连接”功能(VNC或管理终端)登录服务器。登录后检查 `/etc/ssh/sshd_config` 配置是否正确,并确认防火墙规则。如果实在无法修复,可以重置服务器系统盘(注意数据会丢失)。
**Q2:Fail2ban误封了合法用户怎么办?**
A:使用 `sudo fail2ban-client set sshd unbanip 被封IP` 解封。如果想永久白名单,在 `/etc/fail2ban/jail.local` 的`[DEFAULT]`段添加 `ignoreip = 你的IP`。
**Q3:更新系统后网站无法访问了?**
A:通常是因为更新了Web服务器软件(如Nginx、Apache)但未重启。执行 `sudo systemctl restart nginx`(或httpd)即可。如果问题依旧,检查防火墙是否误关了80/443端口。
**Q4:如何确认服务器没有被入侵?**
A:执行以下快速检查:1)`last` 查看是否有异常IP登录;2)`ps aux | grep -i miner` 检查是否有挖矿进程;3)`cat /var/log/secure | grep "Accepted"` 查看成功登录记录。如果发现可疑进程,用 `kill -9 进程ID` 终止,并检查启动项(`systemctl list-unit-files`)。
**Q5:普通用户忘记sudo密码怎么办?**
A:只能通过root用户重置。如果你禁用了root登录,可以通过云控制台的VNC功能以root身份登录,然后执行 `passwd adminuser` 重置密码。
## 收尾总结
至此,你的云服务器已经完成从“裸机”到“初步堡垒”的转变。回顾一下我们完成的关键操作:创建了具有sudo权限的普通用户并配置了密钥登录,用防火墙严格限制了开放端口,安装了Fail2ban防御暴力破解,修改了SSH默认端口,并建立了自动更新和备份机制。这些设置看似繁琐,但能阻挡90%以上的自动化攻击。
后续当你需要部署具体应用(如WordPress、Node.js、Docker)时,请记住一个原则:**只开放应用需要的端口,只给应用分配必要权限**。例如,数据库只允许本地连接,文件上传目录禁止执行脚本。安全不是一次性工作,而是持续的习惯。建议每季度检查一次服务器日志,关注安全公告,及时更新软件。现在,你的服务器已经准备好承载你的第一个线上项目了。