4、安全与监控:配置防火墙与Fail2ban、部署Prometheus+Grafana监控栈、配置日志收集(ELK)

说实话,运维平台搭好了,服务跑起来了,这时候最怕什么?

怕被人黑,怕半夜磁盘满了报警没人管,怕出问题后连日志都找不到。

这一章,我就把这三件事揉在一起讲。安全、监控、日志,说白了就是让你睡得着觉的三件套。我自己的习惯是:先封门(防火墙+Fail2ban),再装摄像头(Prometheus+Grafana),最后装个黑匣子(ELK)。顺序别搞反了。

本章核心逻辑: 安全是底线,监控是眼睛,日志是证据。三者缺一不可。

远程运维平台安全与监控 安全防护 防火墙 (iptables/ufw) Fail2ban 暴力破解防御 监控栈 Prometheus 指标采集 Grafana 可视化面板 日志收集 Elasticsearch 存储 Logstash/Kibana 分析 目标:封门 + 监控 + 留证 = 睡得着觉

4.1 配置防火墙:先把门锁好

我见过太多人,服务跑起来了,防火墙没开。结果被人扫到端口,直接提权。嗯,这种事一次就够你长记性了。

Linux 下防火墙工具很多,我个人习惯用 ufw,简单直观。但如果你管理的是几十台机器,建议直接用 iptables 或者 firewalld。这里我以 ufw 为例,因为最不容易出错。

我的习惯: 先拒绝所有入站,再按需放行。别搞反了,反了你连 SSH 都连不上。

# 安装 ufw(Ubuntu/Debian)
sudo apt install ufw -y

# 设置默认策略:拒绝入站,允许出站
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 放行 SSH(务必先做这一步!)
sudo ufw allow ssh

# 放行 Web 服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# 放行 Prometheus 和 Grafana(仅限内网)
sudo ufw allow from 192.168.1.0/24 to any port 9090
sudo ufw allow from 192.168.1.0/24 to any port 3000

# 放行 Elasticsearch(仅限内网)
sudo ufw allow from 192.168.1.0/24 to any port 9200

# 启用防火墙
sudo ufw enable
sudo ufw status verbose

警告: 远程操作防火墙时,千万别关掉当前 SSH 会话窗口。我曾经手滑把 SSH 端口也 deny 了,结果只能让机房同事帮忙重启机器。那叫一个尴尬。

4.2 Fail2ban:防暴力破解的守门员

防火墙挡了端口,但挡不住密码试错。你想想看,SSH 端口暴露在公网上,每分钟都有脚本在试密码。这时候就需要 Fail2ban 了。

Fail2ban 的原理很简单:监控日志文件,发现某个 IP 连续失败 N 次,就把它拉进防火墙黑名单。说白了,就是个自动封 IP 的机器人。

# 安装 Fail2ban
sudo apt install fail2ban -y

# 创建本地配置文件(不要直接改 jail.conf)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑 jail.local
sudo vim /etc/fail2ban/jail.local

# 关键配置如下:
[DEFAULT]
# 封禁时间:1小时
bantime = 3600
# 检测窗口:10分钟
findtime = 600
# 失败次数:5次
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3  # SSH 更严格一点

# 重启服务
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

# 查看封禁状态
sudo fail2ban-client status sshd

避坑指南: 我曾经把 maxretry 设成 2,结果自己输错两次密码就被封了。建议 SSH 设 3 次,其他服务设 5 次。另外,别忘了把你自己办公网的 IP 加入白名单。

# 将办公网 IP 加入白名单
sudo fail2ban-client set sshd addignoreip 你的办公网IP

4.3 部署 Prometheus + Grafana 监控栈

安全搞定了,接下来装监控。Prometheus 负责采集数据,Grafana 负责展示。这俩是黄金搭档,我几乎每个项目都会用。

4.3.1 部署 Prometheus

# 下载 Prometheus(以 2.45.0 为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xzf prometheus-2.45.0.linux-amd64.tar.gz
sudo mv prometheus-2.45.0.linux-amd64 /opt/prometheus

# 创建 systemd 服务
sudo vim /etc/systemd/system/prometheus.service

[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/prometheus/prometheus \
  --config.file=/opt/prometheus/prometheus.yml \
  --storage.tsdb.path=/opt/prometheus/data
Restart=always

[Install]
WantedBy=multi-user.target

# 启动
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus

4.3.2 部署 Grafana

# 安装 Grafana(官方源)
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana -y

# 启动
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

我的习惯: Grafana 默认端口 3000,初始账号密码都是 admin。第一次登录会让你改密码。我一般会配一个只读的 Viewer 账号给团队其他人看,避免误操作。

4.3.3 配置 Grafana 数据源与面板

  1. 浏览器打开 http://你的IP:3000
  2. 登录后,点击左侧齿轮 → Data Sources → Add data source
  3. 选择 Prometheus,URL 填 http://localhost:9090,点击 Save & Test
  4. 点击左侧 + 号 → Import,输入模板 ID 1860(Node Exporter 全功能面板)
  5. 选择数据源为 Prometheus,导入即可

你想想看,一个面板上能看到 CPU、内存、磁盘、网络流量,是不是比敲命令爽多了?

4.4 配置日志收集(ELK Stack)

监控看的是实时指标,日志看的是历史记录。出问题的时候,日志就是你的破案工具。ELK 三件套:Elasticsearch(存)、Logstash(收)、Kibana(看)。

注意: ELK 比较吃内存,建议至少 4GB 内存的机器。如果资源紧张,可以用 Filebeat 替代 Logstash,轻量很多。

4.4.1 部署 Elasticsearch

# 导入 GPG 密钥
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

# 添加源
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

# 安装
sudo apt update
sudo apt install elasticsearch -y

# 配置(允许外网访问需谨慎)
sudo vim /etc/elasticsearch/elasticsearch.yml
# 修改以下内容:
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

# 启动
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

4.4.2 部署 Logstash

sudo apt install logstash -y

# 创建配置文件
sudo vim /etc/logstash/conf.d/syslog.conf

input {
  beats {
    port => 5044
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}(?:\[%{POSINT:pid}\])?: %{GREEDYDATA:message}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslog-%{+YYYY.MM.dd}"
  }
}

# 启动
sudo systemctl start logstash
sudo systemctl enable logstash

4.4.3 部署 Kibana

sudo apt install kibana -y

# 配置
sudo vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

# 启动
sudo systemctl start kibana
sudo systemctl enable kibana

4.4.4 部署 Filebeat(客户端采集)

# 在被监控的机器上安装 Filebeat
sudo apt install filebeat -y

# 配置
sudo vim /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/syslog
    - /var/log/auth.log

output.logstash:
  hosts: ["你的ELK服务器IP:5044"]

# 启动
sudo systemctl start filebeat
sudo systemctl enable filebeat

避坑指南: 我曾经忘了开 Logstash 的 5044 端口,结果 Filebeat 一直连不上,日志全丢了。记得检查防火墙。另外,Elasticsearch 的索引如果太多,记得配个 Curator 定时清理,不然磁盘会爆。

4.5 本章小结

这一章内容不少,但都是实打实的干货。我帮你捋一下:

  • 防火墙:先拒绝所有,再放行需要的。别忘了 SSH。
  • Fail2ban:自动封禁暴力破解 IP,设好白名单别把自己封了。
  • Prometheus + Grafana:指标采集 + 可视化,推荐模板 ID 1860。
  • ELK Stack:日志收集、存储、分析一条龙。资源不够就用 Filebeat。

这些东西配好之后,你基本可以安心睡觉了。半夜报警?那是 Grafana 的事。被人扫端口?Fail2ban 会帮你挡着。出问题查原因?Kibana 里搜一下日志就行。

嗯,运维的幸福感,就是这么来的。


专注资料整理