4、安全与监控:配置防火墙与Fail2ban、部署Prometheus+Grafana监控栈、配置日志收集(ELK)
说实话,运维平台搭好了,服务跑起来了,这时候最怕什么?
怕被人黑,怕半夜磁盘满了报警没人管,怕出问题后连日志都找不到。
这一章,我就把这三件事揉在一起讲。安全、监控、日志,说白了就是让你睡得着觉的三件套。我自己的习惯是:先封门(防火墙+Fail2ban),再装摄像头(Prometheus+Grafana),最后装个黑匣子(ELK)。顺序别搞反了。
本章核心逻辑: 安全是底线,监控是眼睛,日志是证据。三者缺一不可。
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 数据源与面板
- 浏览器打开
http://你的IP:3000 - 登录后,点击左侧齿轮 → Data Sources → Add data source
- 选择 Prometheus,URL 填
http://localhost:9090,点击 Save & Test - 点击左侧 + 号 → Import,输入模板 ID 1860(Node Exporter 全功能面板)
- 选择数据源为 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 里搜一下日志就行。
嗯,运维的幸福感,就是这么来的。