本模块内容,主要讲述 服务器的安全防护与配置软件相关知识。分为网络防护软件介绍、配置与使用用,网络安全相关知识浅度解析。
涉及软件有prometheus ,graphna,zabbix。
网络安全方面涉及基于debian linux系统的kali版本liunx的介绍与简单使用。
SECURITY DAY1
环境准备:
主机名 | 地址 |
---|---|
zabbixserver | 192.168.88.5/24 |
web1 | 192.168.88.100/24 |
web2 | 192.168.88.200/24 |
一、zabbix基础配置
监控概述
-
对服务的管理,不能仅限于可用性。
-
还需要服务可以安全、稳定、高效地运行。
-
监控的目的:早发现、早治疗。
-
被监控的资源类型:
- 公开数据:对外开放的,不需要认证即可获取的数据
- 私有数据:对外不开放,需要认证、权限才能获得的数据
zabbix
-
实施监控的几个方面:
- 数据采集:使用agent(可安装软件的系统上)、SNMP(简单网络管理协议,用于网络设备的数据采集)
- 数据存储:使用mysql数据库
- 数据展示:通过web页面
-
zabbix通过在远程主机上安装agent进行数据采集,存储到mysql数据库,通过web页面进行展示。
安装zabbix 6.0
- 安装说明:https://www.zabbix.com/download?zabbix=6.0&os_distribution=rocky_linux&os_version=8&components=server_frontend_agent&db=mysql&ws=nginx
- 中文手册:https://www.zabbix.com/documentation/6.0/zh
1. 拷贝zabbix软件包到pubserver 目录的 /var/ftp/rpms 位置
2. 更新yum仓库配置
[root@pubserver ~]# createrepo -v /var/ftp/rpms/
3. 在pubserver上创建ansible工作环境
[root@pubserver ~]# mkdir -p zabbix/files
[root@pubserver ~]# cd zabbix/
[root@pubserver zabbix]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false
[root@pubserver zabbix]# vim inventory
[zabbix]
zabbixserver ansible_host=192.168.88.5
[webservers]
web1 ansible_host=192.168.88.100
web2 ansible_host=192.168.88.200
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
4. 为各台主机配置yum
[root@pubserver zabbix]# vim files/local88.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0
[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0
[root@pubserver zabbix]# vim 01-upload-repo.yml
- name: config repos.d
hosts: all
tasks:
- name: delete repos.d
file:
path: /etc/yum.repos.d
state: absent
- name: create repos.d
file:
path: /etc/yum.repos.d
state: directory
mode: '0755'
- name: upload local88
copy:
src: files/local88.repo
dest: /etc/yum.repos.d/
[root@pubserver zabbix]# ansible-playbook 01-upload-repo.yml
5. 在zabbixserver上安装相应软件包
[root@pubserver zabbix]# vim 02-inst-zabbix.yml
- name: install zabbix
hosts: zabbix
tasks:
- name: install zabbix # 安装软件包
yum:
name:
-
zabbix-server-mysql
-
zabbix-web-mysql
-
zabbix-nginx-conf
-
zabbix-sql-scripts
-
zabbix-selinux-policy
-
zabbix-agent
-
mysql-server
-
langpacks-zh_CN
state: present
[root@pubserver zabbix]# ansible-playbook 02-inst-zabbix.yml
6. 启动mysqld服务
[root@pubserver zabbix]# vim 03-start-mysqld.yml
- name: config mysqld
hosts: zabbix
tasks:
- name: start mysqld # 启动mysqld服务
service:
name: mysqld
state: started
enabled: yes
[root@pubserver zabbix]# ansible-playbook 03-start-mysqld.yml
7. 在zabbix上创建连接数据库的用户
[root@zabbixserver ~]# mysql
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
在binlog日志开启的情况下,打开函数生成器
mysql> set global log_bin_trust_function_creators = 1;
mysql> create user zabbix@localhost identified by 'zabbix';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;
8. 验证数据库配置,如果登陆不到数据库表示上一步配置不正确
[root@zabbixserver ~]# mysql -uzabbix -pzabbix -hlocalhost zabbix
9. 在数据库中创建表并导入数据
[root@zabbixserver ~]# cp /usr/share/zabbix-sql-scripts/mysql/server.sql.gz .
[root@zabbixserver ~]# gzip -d server.sql.gz
[root@zabbixserver ~]# mysql -uzabbix -pzabbix zabbix < server.sql
10. 配置zabbix_server
[root@zabbixserver ~]# vim +129 /etc/zabbix/zabbix_server.conf
DBPassword=zabbix
11. 配置zabbix_agent
[root@zabbixserver ~]# vim /etc/zabbix/zabbix_agentd.conf
182 Hostname=zabbixserver
12. 配置nginx展示zabbix
[root@zabbixserver ~]# vim /etc/nginx/conf.d/zabbix.conf
打开第2、3行的注释,结果如下所示:
server {
listen 8080;
server_name example.com;
...以下省略...
13. 启动相关服务
[root@pubserver zabbix]# vim 04-start-zabbix.yml
- name: config zabbix
hosts: zabbix
tasks:
- name: start service # 循环启动多个服务
service:
name: "{{item}}"
state: started
enabled: yes
loop:
-
zabbix-server
-
zabbix-agent
-
nginx
-
php-fpm
[root@pubserver zabbix]# ansible-playbook 04-start-zabbix.yml
访问zabbixserver的8080端口,进行初始化
密码也是:zabbix
这个用户和密码是zabbix网页的。
二、zabbix 监控服务使用
在web1上安装agent
1. 安装agent
[root@pubserver zabbix]# vim 05-inst-agent.yml
- name: install agent
hosts: webservers
tasks:
- name: install agent # 安装agent
yum:
name: zabbix-agent
state: present
[root@pubserver zabbix]# ansible-playbook 05-inst-agent.yml
2. 修改web1配置文件
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf
117 Server=127.0.0.1,192.168.88.5
182 Hostname=web1
3. 起动服务
[root@pubserver zabbix]# vim 06-start-agent.yml
- name: config agent
hosts: web1
tasks:
- name: start agent # 启动服务
service:
name: zabbix-agent
state: started
enabled: yes
[root@pubserver zabbix]# ansible-playbook 06-start-agent.yml
在web页面中添加对web1的监控
主机:安装了agent,被监控的主机
主机组:根据需求,将多台主机加入到一个主机组中,方便管理。系统默认已经创建了一些主机组。
模板:是监控项的集合。将模板应用到主机,主机就可以直接拥有模板中的所有监控项。系统中默认已经创建了一些模板。
常用监控指标
Space utilization:以百分比显示的磁盘利用率
Used space:已用磁盘空间
Available memory:可用内存
CPU idle time:CPU空闲时间。不宜过低。
Load average (1m avg)、Load average (5m avg)、Load average (15m avg):CPU1分钟、5分钟、15分钟的平均负载。这个值不应长期大于核心数。
Interface eth0: Bits received:网卡接收到的数据量
Interface eth0: Bits sent:网卡发送的数据量
Number of processes:系统运行的进程数
Number of logged in users:已登陆的用户数
自定义监控项
实现监控web1用户数量的监控项
在被控端创建key。被控端被监控的内容叫作key,可以理解为它就是一个变量名,具体的名字自己决定。
在web页面中创建监控项。监控项对应key值。
在被控端创建key
语法
++UserParameter=自定义key值,命令++
命令的执行结果,是key的value
创建自定义配置文件。文件名自定义。
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/usercnt.conf
UserParameter=usercnt,sed -n '$=' /etc/passwd
[root@web1 ~]# systemctl restart zabbix-agent.service
验证自定义监控项
1. 安装zabbix-get
[root@zabbixserver ~]# yum install -y zabbix-get
[root@web1 ~]# yum install -y zabbix-get
2. 获取监控项的值
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k usercnt
46
[root@zabbixserver ~]# zabbix_get -s 192.168.88.100 -k usercnt
创建模版
- 创建监控项
- 应用模板到主机
- 查看结果
三、总结
zabbix配置时,需要注意配置主机的监控项和触发器。
新建动作时,类型分为Trigger 触发器类型,autoregistration 自动注册,internal 内部触发。
抽象来说:好比一个3D动画捕捉演员。
SECURITY DAY2
一、zabbix报警机制
配置告警
- 默认情况下,监控项不会自动发送告警消息
- 需要配置触发器与告警,并且通过通知方式发送信息给联系人
- 触发器:设置条件,当条件达到时,将会执行某个动作
- 动作:触发器条件达到之后要采取的行为,比如发邮件或执行命令
用户数超过50,发送告警邮件
- 当web1的用户数超过50时,认为这是一个问题(Problem)
- 当出现问题时,将会执行动作。
- 执行的动作是给管理员发邮件。
- 给管理员发邮件,还要配置邮件服务器的地址,以及管理员的email地址
实施
- 创建触发器规则
- 创建邮件类型的报警媒介
验证告警配置
在zabbixserver上配置邮件服务
配置postfix邮件服务和mailx邮件客户端
[root@pubserver zabbix]# vim 07-config-mail.yml
- name: config mail
hosts: zabbix
tasks:
- name: install mail # 安装postfix和mailx
yum:
name: postfix,mailx
state: present
- name: start postfix # 启动邮件服务postfix
service:
name: postfix
state: started
enabled: yes
[root@pubserver zabbix]# ansible-playbook 07-config-mail.yml
在web1创建用户,使总用户数超过50
[root@web1 ~]# for user in user{1..5}
> do
> useradd $user
> done
在zabbix web页面中查看
在zabbixserver上查看邮件
[root@zabbixserver ~]# mail # 查看邮件
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N 1 zzg@tedu.cn Sat Dec 31 16:47 21/932 "Problem: usercnt_gt_50"
N 2 zzg@tedu.cn Sat Dec 31 16:48 21/932 "Problem: usercnt_gt_50"
& 1 # 查看1号邮件
Message 1:
From zzg@tedu.cn Sat Dec 31 16:47:59 2022
Return-Path: <zzg@xixi.cn>
X-Original-To: root@localhost.localdomain
Delivered-To: root@localhost.localdomain
From: <zzg@xixi.cn>
To: <root@localhost.localdomain>
Date: Sat, 31 Dec 2022 16:47:59 +0800
Subject: Problem: usercnt_gt_50
Content-Type: text/plain; charset="UTF-8"
Status: R
Problem started at 16:47:56 on 2022.12.31
Problem name: usercnt_gt_50
Host: web1
Severity: Warning
Operational data: 51
Original problem ID: 102
& q # 输入q退出
二、zabbix 进阶操作
配置自动发现
- 在web2上配置agent
[root@web2 ~]# vim /etc/zabbix/zabbix_agentd.conf
117 Server=127.0.0.1,192.168.88.5
182 Hostname=web2
[root@web2 ~]# systemctl enable zabbix-agent.service --now
主动监控
默认zabbix使用的是被动监控,主被动监控都是针对被监控主机而言的。
被动监控:Server向Agent发起请求,索取监控数据。此种模式常用
主动监控:Agent向Server发起连接,向Server汇报
配置web2使用主动监控
修改配置文件,只使用主动监控
[root@web2 ~]# vim /etc/zabbix/zabbix_agentd.conf
117 # Server=127.0.0.1,192.168.88.5
142 StartAgents=0
171 ServerActive=192.168.88.5
242 RefreshActiveChecks=120
重启服务
[root@web2 ~]# systemctl restart zabbix-agent.service
[root@web2 ~]# ss -tlnp | grep :10050 # 端口号消失
三、监控案例解析
配置钉钉机器人告警
创建钉钉机器人
- 登陆钉钉网页版:阿里巴巴-钉钉,是一个工作方式!超过1000w家企业正在使用钉钉! (或者在windows系统上下载电脑版钉钉)
- 下面以钉钉电脑版为例,配置钉钉群聊机器人
- 在群聊中点击设置,以新建机器人
- 自己创建一个公司企业群测试。
机器人名称自己写一个,提示关键词为warn
注意上面的Webhook地址,不要泄露,谁拥有此地址,谁就可以控制机器人说话。
编写脚本并测试
安装钉钉机器人脚本需要用到的模块
[root@zabbixserver ~]# yum install -y python3-requests
#windows运行不了,直接就下 python-3。说明依赖软件不太够。
编写钉钉机器人脚本
[root@zabbixserver ~]# vim /usr/lib/zabbix/alertscripts/dingalert.py
#!/usr/bin/env python3
import json
import requests
import sys
def send_msg(url, remiders, msg):
headers = {'Content-Type': 'application/json; charset=utf-8'}
data = {
"msgtype": "text",
"at": {
"atMobiles": remiders,
"isAtAll": False,
},
"text": {
"content": msg,
}
}
r = requests.post(url, data=json.dumps(data), headers=headers)
return r.text
if name == 'main':
msg = sys.argv[1]
remiders = []
url = '++钉钉机器人Webhook地址++ ' # 注意此处需输入机器人的webhook地址
print(send_msg(url, remiders, msg))
[root@zabbixserver ~]# chmod +x /usr/lib/zabbix/alertscripts/dingalert.py
[root@zabbixserver ~]# /usr/lib/zabbix/alertscripts/dingalert.py 'warn: 测试消息' # 注意消息中要包含关键字warn
{"errcode":0,"errmsg":"ok"}
验证
创建用户,使用户数超过55 ,太大了就把条件设小点。
[root@web1 ~]# for user in user{6..10}; do useradd $user; done
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k usercnt
56
添加报警媒介类型
监控Nginx
stub_status模块
用于实时监控nginx的网络连接,这个模块是nginx官方提供的一个模块。
配置nginx
[root@pubserver zabbix]# vim 08-config-nginx.yml
- name: config nginx
hosts: webservers
tasks:
- name: install nginx # 安装nginx
yum:
name: nginx
state: present
- name: start nginx # 启动nginx
service:
name: nginx
state: started
enabled: yes
[root@pubserver zabbix]# ansible-playbook 08-config-nginx.yml
修改配置文件,启用stub_status功能
[root@web1 ~]# vim /etc/nginx/nginx.conf
...略...
47 location / {
48 }
49
50 location /status { # 在此处添加3行
51 stub_status on;
52 }
53
54 error_page 404 /404.html;
55 location = /40x.html {
56 }
...略...
[root@web1 ~]# systemctl restart nginx
访问监控页面
[root@zabbixserver ~]# curl http://192.168.88.100/status
Active connections: 1
server accepts handled requests
2 2 2
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前客户端与nginx之间的连接数。它等于下面Reading / Writing / Waiting之和
accepts:自nginx启动之后,客户端访问的总量
handled:自nginx启动之后,处理过的客户端连接总数,通常等于accepts的值。
requests:自nginx启动之后,处理过的客户端请求总数。
Reading:正在读取客户端的连接总数。
Writing:正在向客户端发送响应的连接总数。
Waiting:空闲连接。
使用工具向服务器发起多个请求
[root@zabbixserver ~]# yum install -y httpd-tools
一共发1000个请求,每次并发数200
[root@zabbixserver ~]# ab -n1000 -c200 http://192.168.88.100/
[root@zabbixserver ~]# curl http://192.168.88.100/status
Active connections: 1
server accepts handled requests
1097 1097 1003
Reading: 0 Writing: 1 Waiting: 0
编写脚本,用于获取各项数据
[root@web1 ~]# vim /usr/local/bin/nginx_status.sh
#!/bin/bash
case $1 in
active)
curl -s http://192.168.88.100/status | awk '/Active/{print $NF}';;
waiting)
curl -s http://192.168.88.100/status | awk '/Waiting/{print $NF}';;
accepts)
curl -s http://192.168.88.100/status | awk 'NR==3{print $1}';;
esac
[root@web1 ~]# chmod +x /usr/local/bin/nginx_status.sh
[root@web1 ~]# nginx_status.sh active
1
[root@web1 ~]# nginx_status.sh accepts
1099
[root@web1 ~]# nginx_status.sh waiting
0
创建zabbix用到的key,获取各项数据
key的语法格式
UserParameter=key[*],<command> $1
key[*]中的*是参数,将会传给后面的位置变量$1
创建声明key的文件
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/nginx_status.conf
UserParameter=nginx_status[*],/usr/local/bin/nginx_status.sh $1
测试
[root@web1 ~]# systemctl restart zabbix-agent.service
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[active]
1
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[waiting]
0
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[accepts]
1103
四、总结
监控的目的是:报告系统的运行情况,提前发现问题。O(∩_∩)O
监控类别:
公有:FTP,WEB,数据库,SSH远程连接服务等
私有:机器的CPU、内存、磁盘、网卡流量、用户、进程运行信息等
zabbix基于分布式监控。cacti 基于snmp协议。 nagios 基于agent。