- 监控与服务安全
- Zabbix监控服务器
- 10. 启服务
- 监控端(zabbix server)和被控端使用的软件是同一个,只是启用不同的功能
- 安装编译agent需要的依赖环境
- 编译agent
- 修改配置文件
- 配置服务
- Zabbix报警机制
- Zabbix进阶
- 重启服务
- Prometheus监控服务器
- kali系统(安全工具-黑客Linux操作系统)
- 以ping的方式扫描整网段
- 使用-n选项可以不执行DNS解析
- 全面分析192.168.4.11
- 扫描192.168.4.11开放了哪些TCP服务
- 扫描192.168.4.11开放了哪些TCP服务,半开扫描方式,需要root权限
- 扫描192.168.4.11开放了哪些UDP服务
- 破解傻瓜式密码
- 字典暴力破解,密码本是/usr/share/john/password.lst
- 直接显示破解的密码,不显示其他额外信息
- linux系统自带的密码本
- 字典暴力破解,指定密码本文件
- 服务安全
- 备注说明:
- limit_req_zone语法格式如下:
- limit_req_zone key zone=name:size rate=rate;
- 上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
- 1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
- 每秒中仅接受1个请求,多余的放入漏斗
- 漏斗超过5个则报错
- 再次测试
- Linux基本防护措施
- iptables
- 跟踪httpd日志的尾部
- 在client上访问server1的web服务
- 查看服务器终端的日志,将会显示client1的地址192.168.4.10访问了它
监控与服务安全
监控概述
对服务的管理,不能能仅限于可用性。
还需要服务可以安全、稳定、高效的运行
监控的目的
- 提前发现问题
- 进行服务器性能调整前,知道调整什么
- 找出系统的瓶颈在什么地方
- 报告系统运行状况
- 每一部分必须同时监控
- 内容包括吞吐量、反应时间、使用率等
监控的资源类型
- 公开数据
- 对外开放的,不需要认证即可获得的数据
- Web、FTP、SSH、数据库等应用服务
- TCP或UDP端口
- 私有数据
# uptime可以查看系统已经运行了多久。最后的3个数字分别是CPU最近1分钟、5分钟、15分钟的平均负载。平均负载的值,不应该大于总核心数。
[root@zzgrhel8 ~]# uptime
09:28:25 up 53 days, 27 min, 0 users, load average: 0.09, 0.08, 0.03
[root@zzgrhel8 ~]# free -m # 主要用于查看内存
[root@zzgrhel8 ~]# swapon -s # 查看swap空间
[root@zzgrhel8 ~]# df -h # 查看硬盘使用情况
[root@zzgrhel8 ~]# ping -c2 www.baidu.com # 发2个包,测试网络
自动化监控系统
Cacti
- 基于SNMP协议的监控软件,强大的绘图能力
Nagios
- 基于Agent监控,强大的状态检查与报警机制
- 插件极多,自己写监控脚本嵌入到Nagios非常方便
Zabbix
Zabbix监控服务器
zabbix基础
- zabbix是一个高度集成的监控解决方案
- 可以实现企业级的开源分布式监控
- 通过C/S模式采集监控数据,B/S模式实现Web管理
- zabbix通过在远程主机上安装agent进行数据采集,存储到mysql数据库,通过web页面进行展示。
- 实施监控的几个方面:
- 数据采集:使用agent(可安装软件的系统上)、SNMP(简单网络管理协议,用于网络设备的数据采集)
- 数据存储:使用mysql数据库
- 数据展示:通过web页面
- 监控服务器(需要使用Web页面操作,因此需要先部署LNMP)
- 监控服务器可以通过SNMP或Agent采集数据
- 数据可以写入MySQL、Oracle等数据库中
- 服务器使用LNMP实现web前端的管理
- 被监控主机
- 安装LNMP环境
- 源码安装Zabbix
- 安装监控端主机,修改基本配置
- 初始化Zabbix监控Web页面
- 修改PHP配置文件,满足Zabbix需求
-
环境准备
使用1台Linux虚拟机,安装部署LNMP环境、Zabbix及相关的依赖包,配置数据库并对Zabbix监控平台进行初始化操作。使用2台Linux被监控端,源码安装Zabbix Agent。
配置好ip地址和主机名
- 关闭SELINUX和防火墙
- 配置yum。千万注意:只保留系统yum,删除mysql和pxc。
部署监控平台服务器
1)安装LNMP环境
Zabbix监控管理控制台需要通过Web页面展示出来,并且还需要使用MySQL来存储数据,因此需要先为Zabbix准备基础LNMP环境。# 3. 配置nginx,用于展示zabbix的web页面 # 3.1 安装nginx的依赖包 [root@zabbixserver ~]# yum install -y gcc make pcre-devel openssl-devel # pcre-devel支持正则 openssl-devel支持加密网站 # 3.2 安装nginx [root@zzgrhel8 ~]# scp /linux-soft/2/lnmp_soft.tar.gz 192.168.4.5:/root/ [root@zabbixserver ~]# tar xf lnmp_soft.tar.gz [root@zabbixserver ~]# cd lnmp_soft/ [root@zabbixserver lnmp_soft]# tar xf nginx-1.12.2.tar.gz [root@zabbixserver lnmp_soft]# cd nginx-1.12.2/ [root@zabbixserver nginx-1.12.2]# ./configure --with-http_ssl_module # 配置nginx支持https [root@zabbixserver nginx-1.12.2]# make && make install
2)修改Nginx配置文件
配置Nginx支持PHP动态网站,因为有大量PHP脚本需要执行,因此还需要开启Nginx的各种fastcgi缓存,加速PHP脚本的执行速度[root@zabbixserver ~]# vim /usr/local/nginx/conf/nginx.conf # 34行增加5行内容 34 fastcgi_buffers 8 16k; #缓存php生成的页面内容,8个16k 35 fastcgi_buffer_size 32k; #缓存php生产的头部信息,32k 36 fastcgi_connect_timeout 300; #连接PHP的超时时间,300秒 37 fastcgi_send_timeout 300; #发送请求的超时时间,300秒 38 fastcgi_read_timeout 300; #读取请求的超时时间,300秒 70 location ~ \.php$ { # 开放php功能模块 71 root html; 72 fastcgi_pass 127.0.0.1:9000; 73 fastcgi_index index.php; 74 # fastcgi_param SCRIPT_FILENAME /script s$fastcgi_script_name; 75 include fastcgi.conf; # 注意改成fatcgi.conf 76 }
3)启动服务
启动Nginx、PHP-FPM、MariaDB服务,关闭SELinux与防火墙。[root@zabbixserver ~]# systemctl enable mariadb --now [root@zabbixserver ~]# systemctl enable php-fpm --now [root@zabbixserver ~]# ss -tlnp |grep :9000 LISTEN 0 128 127.0.0.1:9000 [root@zabbixserver ~]# /usr/local/nginx/sbin/nginx [root@zabbixserver ~]# ss -tlnp | grep :80 LISTEN 0 128 *:80 # 写入到rc.local中的命令,开机时自动执行 [root@zabbixserver ~]# echo '/usr/local/nginx/sbin/nginx' >> /etc/rc.d/rc.local [root@zabbixserver ~]# chmod +x /etc/rc.d/rc.local
4)源码安装Zabbix Server
[root@zabbixserver lnmp_soft]# yum install -y net-snmp-devel curl-devel autoconf libevent-devel [root@zabbixserver ~]# cd lnmp_soft/ [root@zabbixserver lnmp_soft]# ls zabbix-3.4.4.tar.gz zabbix-3.4.4.tar.gz [root@zabbixserver lnmp_soft]# tar xf zabbix-3.4.4.tar.gz [root@zabbixserver lnmp_soft]# cd zabbix-3.4.4/ [root@zabbixserver zabbix-3.4.4]# ./configure --enable-server --enable-agent --with-mysql=/usr/bin/mysql_config --with-net-snmp --with-libcurl # --enable-server: 安装服务器端 # --enable-agent: 安装被控端 # --with-mysql: 指定mysql数据库配置程序 # --with-net-snmp: 配置可以通过snmp收集数据 # --with-libcurl: 启用curl库,以便zabbix可以通过curl连接web服务
5)创建并初始化数据库(root用户默认没有密码)
附:删库重导入# 1. 创建zabbix存储数据的数据库。创建名为zabbix的数据库,使用的字符集是utf8 [root@zabbixserver ~]# mysql MariaDB [(none)]> create database zabbix default charset utf8; # 2. 创建名为zabbix的用户,密码也是zabbix,可以对zabbix数据库拥有全部权限 MariaDB [(none)]> grant all on zabbix.* to zabbix@'%' identified by 'zabbix'; # 3. 导入zabbix表结构,3个sql文件按顺序导入 [root@zabbixserver ~]# cd lnmp_soft/zabbix-3.4.4/database/mysql/ [root@zabbixserver mysql]# ls data.sql images.sql schema.sql # -u指定用户名,-p指定密码,第3个zabbix是数据库 [root@zabbixserver mysql]# mysql -uzabbix -pzabbix zabbix < schema.sql [root@zabbixserver mysql]# mysql -uzabbix -pzabbix zabbix < images.sql [root@zabbixserver mysql]# mysql -uzabbix -pzabbix zabbix < data.sql
# 查看有哪些数据库 MariaDB [(none)]> show databases; MariaDB [(none)]> drop database zabbix; MariaDB [(none)]> create database zabbix default charset utf8; MariaDB [(none)]> exit
6)修改zabbix_server配置并启动监控服务
修改Zabbix_server配置文件,设置数据库相关参数,启动Zabbix_server服务
通过创建service文件管理zabbix服务。# 4. 配置zabbix_server服务 [root@zabbixserver ~]# vim /usr/local/etc/zabbix_server.conf 12 # ListenPort=10051 # 不用改,了解端口号 38 LogFile=/tmp/zabbix_server.log # 不用删除注释,日志文件位置 85 DBHost=localhost # 数据库服务器地址 95 DBName=zabbix # 不用删除注释,数据库名 111 DBUser=zabbix # 不用删除注释,连接数据库的账户 119 DBPassword=zabbix # 连接数据库的密码 [root@zabbixserver ~]# useradd -s /sbin/nologin zabbix #服务不允许以root身份启动,不创建用户无法启动服务(用户不需要登录系统) #创建zabbix用户才可以以zabbix用户的身份启动服务 #启动服务后可以通过ps aux查看进程是以什么用户的身份启动的
[root@zabbixserver ~]# vim /usr/lib/systemd/system/zabbix_server.service [Unit] Description=zabbix server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/tmp/zabbix_server.pid ExecStart=/usr/local/sbin/zabbix_server ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target [root@zabbixserver ~]# systemctl enable zabbix_server --now [root@zabbixserver ~]# ss -ntulp |grep zabbix_server #确认连接状态,端口10051 tcp LISTEN 0 128 *:10051
7)修改Zabbix_agent配置文件,启动Zabbix_agent服务
```shell [root@zabbixserver ~]# vim /usr/lib/systemd/system/zabbix_agentd.service [Unit] Description=zabbix agent After=network.target remote-fs.target nss-lookup.target
[Service] Type=forking PIDFile=/tmp/zabbix_agentd.pid ExecStart=/usr/local/sbin/zabbix_agentd ExecStop=/bin/kill $MAINPID
[Install] WantedBy=multi-user.target
10. 启服务
[root@zabbixserver ~]# systemctl daemon-reload [root@zabbixserver ~]# systemctl start zabbix_agentd.service [root@zabbixserver ~]# systemctl enable zabbix_agentd.service [root@zabbixserver ~]# ss -tlnp | grep :10050 LISTEN 0 128 *:10050
<a name="t1uSv"></a>
#### 8)上线Zabbix的Web页面
```shell
# 拷贝zabbix的web页面到nginx
[root@zabbixserver ~]# ls lnmp_soft/zabbix-3.4.4/frontends/
php
[root@zabbixserver ~]# cp -r lnmp_soft/zabbix-3.4.4/frontends/php/* /usr/local/nginx/html/
# nginx运行期间,调用php-fpm服务,php-fpm需要向web目录中修改文件。php-fpm的运行用户是apache,所以apache用户需要对该目录有写权限
[root@zabbixserver ~]# chown -R apache:apache /usr/local/nginx/html/
访问192.168.4.5/index.php,首次访问,将会自动跳转到安装页面:http://192.168.4.5/setup.php
页面无显示问题排查:
- 查看日志/var/log/php-fpm/error.log和/var/log/php-fpm/error.log
根据上面红色报错,解决zabbix web依赖的内容
# 安装依赖的软件包
[root@zabbixserver ~]# yum install -y php-gd php-xml php-bcmath php-mbstring
# 修改php.ini文件
[root@zabbixserver ~]# vim /etc/php.ini
672 post_max_size = 16M
384 max_execution_time = 300
394 max_input_time = 300
878 date.timezone = Asia/Shanghai
[root@zabbixserver ~]# systemctl restart php-fpm
刷新web页,进行配置
在登陆页面,使用用户(admin)和密码(zabbix)登陆,登陆后设置语言环境为中文
Zabbix监控服务
监控基础
- 主机:安装了agent,被监控的主机
- 主机组:根据需求,将多台主机加入到一个主机组中,方便管理。系统默认已经创建了一些主机组。
- 模板:是监控项的集合。将模板应用到主机,主机就可以直接拥有模板中的所有监控项。
配置及使用Zabbix监控系统(web1服务器)
使用Zabbix监控平台监控Linux服务器,实现以下目标:
- 修改语言
- 启用监控自身
安装编译agent需要的依赖环境
[root@web1 ~]# yum install -y gcc pcre-devel autoconf
编译agent
[root@web1 ~]# tar xf zabbix-3.4.4.tar.gz [root@web1 ~]# cd zabbix-3.4.4/ [root@web1 zabbix-3.4.4]# ./configure —enable-agent [root@web1 zabbix-3.4.4]# make && make install
修改配置文件
[root@web1 ~]# vim /usr/local/etc/zabbix_agentd.conf 30 LogFile=/tmp/zabbix_agentd.log # 日志位置,不用改 69 EnableRemoteCommands=1 # 允许监控端远程执行命令 93 Server=127.0.0.1,192.168.4.5 # 允许自己和监控端进行数据采集 134 ServerActive=127.0.0.1,192.168.4.5 # 允许自己和监控端主动监控 145 Hostname=web1 # 自己的主机名 280 UnsafeUserParameters=1 # 允许用户自定义监控项
配置服务
[root@zabbixserver ~]# scp /usr/lib/systemd/system/zabbix_agentd.service 192.168.4.100:/usr/lib/systemd/system/ [root@web1 ~]# useradd -s /sbin/nologin zabbix [root@web1 ~]# systemctl daemon-reload [root@web1 ~]# systemctl start zabbix_agentd.service [root@web1 ~]# systemctl enable zabbix_agentd.service [root@web1 ~]# ss -tlnp | grep :10050 LISTEN 0 128 *:10050
<a name="hEGCD"></a>
#### 3)添加监控主机
主机是Zabbix监控的基础,Zabbix所有监控都是基于Host主机<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636421767758-2bcbd2fc-6be9-4f57-81fe-5598328d5c73.png#clientId=ue1c5306e-ca01-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u83f0735b&name=image.png&originHeight=127&originWidth=554&originalType=url&ratio=1&rotation=0&showTitle=false&size=61323&status=done&style=stroke&taskId=ue1aafd4f-08ec-49d2-a597-9542a04bddf&title=)<br />添加被监控主机时,需要根据提示输入被监控Linux主机的主机名称(最好与电脑的主机名一致,但也允许不一致)、主机组、IP地址等参数<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636421815195-65340b72-bc2c-4b27-a110-84c2a09fc770.png#clientId=ue1c5306e-ca01-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=179&id=u41c8c026&name=image.png&originHeight=357&originWidth=812&originalType=binary&ratio=1&rotation=0&showTitle=false&size=68357&status=done&style=stroke&taskId=ufc9c2e2a-5390-4f47-a3fc-11a628f3b28&title=&width=406)
<a name="LqjqJ"></a>
#### 4)为被监控主机添加监控模板
点击<模板>,Zabbix通过监控模板来对监控对象实施具体的监控功能,根据模板来定义需要监控哪些数据,对于Linux服务器的监控,Zabbix已经内置了相关的模板(Template OS Linux),选择模板并链接到主机即可<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636421884625-bdde412d-1210-4fc0-9b8d-64bae6b59ac5.png#clientId=ue1c5306e-ca01-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=175&id=ud2202d8f&name=image.png&originHeight=350&originWidth=822&originalType=url&ratio=1&rotation=0&showTitle=false&size=32025&status=done&style=stroke&taskId=u658ed3f8-e85f-4671-be93-e104e5649e0&title=&width=411)
<a name="hIDwZ"></a>
#### 5)查看监控数据
查看监控数据,登录Zabbix Web控制台,点击Monitoring(监控中)—> Latest data(最新数据),正过滤器中填写过滤条件,根据监控组和监控主机选择需要查看哪些监控数据<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636422608068-739c94b5-51c7-4854-a6fb-dd64787d1f1b.png#clientId=ue1c5306e-ca01-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=220&id=ud7766033&name=image.png&originHeight=293&originWidth=530&originalType=url&ratio=1&rotation=0&showTitle=false&size=60331&status=done&style=stroke&taskId=ud0160435-0f37-4d31-ae6a-1db579e7a1c&title=&width=398)<br />找到需要监控的数据后,可以点击后面的Graph(图形)查看监控图形<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636422616272-a74eb2cb-e3fe-48a7-a472-0204d7a5d1de.png#clientId=ue1c5306e-ca01-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=157&id=u2b1bccb9&name=image.png&originHeight=209&originWidth=449&originalType=url&ratio=1&rotation=0&showTitle=false&size=58935&status=done&style=stroke&taskId=u89d81238-9394-45cb-a09e-ff19cca4c52&title=&width=337)
<a name="yV1QV"></a>
#### 6)常用的监控指标
- **CPU idle time**:CPU空闲时间。不宜过低。
- **Processor load(1 min average per core) / Processor load(5 min average per core) / Processor load(15 min average per core)**:每核心1分钟、5分钟、15分钟的平均负载。这个值不应长期大于1。
- **Free disk sapce on /**:根分区剩余的空间
- **Free disk sapce on /(percentage)**:根分区剩余的空间百分比
- **Available memory**:可用内存
- **Incoming network traffic on eth0**:eth0网卡进入的流量
- **Outgoing network traffic on eth0**:eth0网卡外出的流量
- **Maximum number of processes**:系统最多运行的进程数
- **Number of logged in users**:已登陆的用户数
<a name="cBxHv"></a>
#### 7)自定义Zabbix监控项目
需要使用Zabbix自定义key的方式实现自定义监控,参考如下操作步骤:
1. **在被控端创建自定义key**,被控端被监控的内容叫做key,可以理解为它就是一个变量名,名称自定义。
1. **在web页面中创建监控项目,**监控项对应key值**。**监控项存在应用集中。应用集就是相似监控项的集合。应用集存在模板中。一个模板可以包含多个应用集。
1. 创建监控图形
1. 将监控模板关联到主机
<a name="VK6nE"></a>
##### a、创建自定义key
自定义key语法格式为
- UserParameter=自定义key名称,命令
- UserParameter=key[*],<command> $1 key[*]中的*是参数,将会传给后面的位置变量$1
自定义的key文件一般存储在/usr/local/etc/zabbix_agentd.conf.d/目录,这里还需要修改zabbix_agentd.conf文件,允许自定义监控key,来读取该目录下的所有文件
```shell
[root@web1 ~]# vim /usr/local/etc/zabbix_agentd.conf
Include=/usr/local/etc/zabbix_agentd.conf.d/ #264行,加载配置文件目录
[root@web1 ~]# cd /usr/local/etc/zabbix_agentd.conf.d/
[root@web1 zabbix_agentd.conf.d]# vim count.line.passwd #文件名自定义
UserParameter=count.line.passwd,sed -n '$=' /etc/passwd
# 验证结果
[root@web1 ~]# systemctl restart zabbix_agentd.service
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k count.line.passwd
# -s指定获取哪台主机的值,-k指定key
b、创建监控模板
- 添加监控模板
登录Zabbix Web监控控制台,通过Configuration(配置)—>Template(模板)—>Create template(创建模板),填写模板名称,新建模板群组
- 创建应用集
创建完成模板后,默认模板中没有任何应用集、监控项、触发器、图形等资源。这里需要点击模板后面的Application(应用集)链接打开创建应用集的页面
点击Application(应用集)后,在该页面中点击Create application(创建应用集)按钮
设置应用集名称,名称可以任意
- 创建监控项目item(监控项)
与创建应用集一样,在模板中还需要创建监控项目,点击items(监控项),并在刷新出的新页面中选择Create items(创建监控项)创建项目。
- 将模板链接到被监控主机
将完整的监控模板制作完成后,就可以将模板链接到主机实现监控功能了。首先找到被监控主机Configuration(配置)—>Hosts(主机)
查看结果
- 注意,刚应用的模板,不会立即取得数据,需要等一会
Zabbix报警机制
- 默认情况下,监控项不会自动发送告警消息
- 需要配置触发器与告警,并且通过通知方式发送信息给联系人
- 触发器:设置条件,当条件达到时,将会执行某个动作
- 动作:触发器条件达到之后要采取的行为,比如发邮件或执行命令
实现Zabbix报警功能
沿用前面的Zabbix练习环境,使用Zabbix实现报警功能,实现以下目标:
- 监控Linux服务器系统账户数量
- 创建Media,设置邮件服务器及收件人邮箱
-
1)创建触发器规则
通过Configuration(配置)—> Templates(模板),找到我们之前创建的count.line.passwd模板,点击模板后面的triggers(触发器)
- 创建名为password_line_gt_35的触发器
创建触发器时需要定义表达式,触发器表达式(Expression)是触发异常的条件,
在如图所示的蓝色方框中编写触发器表达式,可以直接手写,也可以通过add选择表达式模板。
添加表达式之后的结果如下:
触发器表达式格式:{主机:key.函数(参数)}<表达式>常数
{count.line.passwd:count.line.passwd.last()}>35
# count.line.passwd是模板
# count.line.passwd是在被控端上定义的key
# last是函数,表示最近的一次取值
# > 是操作符
# 35 是常量
# 以上表达式的含义是:应用count.line.passwd模板的主机,它的count.line.passwd最近一次取值大于35,则状态为“问题”,即Problem
几个常见表达式的案例:
- {web1:system.cpu.load[all,avg1].last(0)}>5 #0为最新数据
- 如果web1主机最新的CPU平均负载值大于5,则触发器状态Problem
- {vfs.fs.size[/,free].max(5m)}<10G #5m为最近5分钟
- 根分区,最近5分钟的最大容量小于10G,则状态进入Problem
- {vfs.file.cksum[/etc/passwd].diff(0)}>0 #0为最新数据
- 最新一次校验/etc/passwd如果与上一次有变化,则状态进入Problem
- 大多数函数使用秒作为参数,可以使用#来表示其他含义(具体参考下表)。
avg, count, last, min and max 等函数支持额外的第二个参数time_shift(时间偏移量),这个参数允许从过去一段时间内引用数据。
2)创建邮件类型的报警媒介
创建Media(设置发件人信息)
通过Administration(管理)—>Media Type(报警媒体类型)—>选择Email(邮件)
设置邮件服务器信息,设置邮件服务器及发件人邮件账户信息
为用户添加Media(设置收件人信息)
在Administration(管理)—>Users(用户)中找到选择admin账户
点击Add(添加)后,在Meida Type(类型)中填写报警类型,收件人,时间等信息
3)创建Action动作
Action(动作)是定义当触发器被触发时的时候,执行什么行为(当出现problem时,给admin发邮件)
通过Configuration(配置)—>Actions(动作)—>Create action(创建动作),注意事件源选择触发器
配置Action动作的触发条件
配置Action动作的具体行为
4)验证测试
查看报警邮件,需要在监控服务器上面有发邮件软件postfix和收取邮件的软件mailx,启动postfix后,可以在监控服务器上使用mail命令查收报警邮件
[root@zabbixserver ~]# yum -y install postfix mailx #安装软件
[root@zabbixserver ~]# systemctl start postfix #启动服务
[root@zabbixserver ~]# systemctl enable postfix #设置开机自启动
在被监控主机(web1)创建账户(让账户数量大于35),然后登录监控端Web页面,在仪表盘中查看问题报警(需要等待一段时间)
查看邮件
# 在zabbixserver上查看邮件
[root@zabbixserver ~]# mail
>N 1 zabbix@localhost.loc Tue Nov 9 14:48 21/941
# N表示未读,1是邮件编号
# 回车默认查看最新一封邮件
& q # 退出
Zabbix进阶
Zabbix自动发现
- 当被监控的设备非常多的时候,手工添加将会变得非常不方便
- 可以使用自动批量添加一组监控主机功能
- 自动发现可以实现:
- 自动发现、添加主机,自动添加主机到组;
- 自动连接模板到主机,自动创建监控项目与图形等
自动发现流程:
- 创建自动发现规则
- 创建动作,当主机被发现之后,执行什么操作
- 通过动作,添加主机,将模板应用到发现的主机
配置自动发现
1)创建自动发现规则
通过Configuration(配置)—>Discovery(自动发现)—>Create discovery rule(创建发现规则)
2)创建动作
通过Configuration(配置)—> Actions(动作)—> Actions Event source(事件源):自动发现(Discovery)—>Create action(创建动作)
配置动作,添加动作名称,添加触发动作的条件
点击操作(触发动作后要执行的操作指令),操作细节:添加主机到组
验证结果
登陆Zabbix服务器的Web页面,查看主机列表,确认新添加的主机是否被自动加入监控主机列表。
web2是通过ssh发现的,它上面还没有配置zabbix agent,所以即使发现了,也无法监控。需要在web2上配置agent。具体步骤可参照web1服务器配置。Zabbix主动监控
默认zabbix使用的是被动监控,主被动监控都是针对被监控主机而言的。
- 被动监控:Server向Agent发起请求,索取监控数据。此种模式常用
- 主动监控:Agent向Server发起连接,向Server汇报
- 区别:Server不用每次需要数据都连接Agent,Agent会自己收集数据并处理数据,Server仅需要保存数据即可
- 当监控主机达到一定量级后,Zabbix服务器会越来越慢,此时,可以考虑使用主动监控,释放服务器的压力。
- 另外,Zabbix也支持分布式监控,也是可以考虑的方案
配置web2使用主动监控
1)修改配置文件,只使用主动监控
```shell [root@web2 ~]# vim /usr/local/etc/zabbix_agentd.conf 93 # Server=127.0.0.1,192.168.4.5 # 因为采用主动监控,所以不接受其他主机的查询 118 StartAgents=0 # 不接受被动检查,也不开启任何端口 134 ServerActive=192.168.4.5 # 只向server汇报 183 RefreshActiveChecks=120 # 120秒检查一次配置 264 Include=/usr/local/etc/zabbix_agentd.conf.d/ 280 UnsafeUserParameters=1
重启服务
[root@web2 ~]# systemctl restart zabbix_agentd.service [root@web2 ~]# ss -tlnp | grep :10050 # 端口号消失
<a name="zXgBZ"></a>
##### 2)创建主动监控的监控模板
**创建用于主动监控的模板**。可以基于现有的模板,克隆之后修改<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636447091249-069e1b89-64fc-4687-9d46-c49bda0b6954.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=172&id=uad7363c8&name=image.png&originHeight=229&originWidth=579&originalType=url&ratio=1&rotation=0&showTitle=false&size=64418&status=done&style=stroke&taskId=uf965b109-c550-467b-87da-7410e02ae90&title=&width=434)<br />**修改模板中的监控项目的监控模式**<br />将模板中的所有监控项目全部修改为主动监控模式,通过Configuration(配置)-->Templates(模板)-->选择新克隆的模板,点击后面的Items(监控项)-->点击全选,选择所有监控项目,点击<批量更新>,将类型修改为:Zabbix Agent(Active主动模式)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636447220591-362f0232-6659-4ea0-b829-78d778128f7c.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=122&id=uc5fd4081&name=image.png&originHeight=163&originWidth=554&originalType=url&ratio=1&rotation=0&showTitle=false&size=107120&status=done&style=stroke&taskId=ue7f8d22b-adfa-4c42-88a6-f9210932026&title=&width=416)<br />**禁用部分监控项目**<br />批量修改监控项的监控模式后,并非所有监控项目都支持主动模式,批量修改后,会发现有几个没有修改主动模式成功,说明,这些监控项目不支持主动模式,关闭即可。<br />可以点击类型排序,方便操作,点击状态即可关闭<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636447536142-aad681b0-e499-44bd-ab5f-0c04dc160da9.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uc61778b7&name=image.png&originHeight=113&originWidth=455&originalType=url&ratio=1&rotation=0&showTitle=false&size=50994&status=done&style=stroke&taskId=u0ad02a11-3c5d-4694-8de8-04a6b040a67&title=)
<a name="cH0Oe"></a>
##### 3)添加监控主机
在Zabbix监控服务器,添加被监控的主机(主动模式),设置主机名称:web2 (必须与被监控端的配置文件Hostname一致),将主机添加到Linux servers组,IP地址修改为0.0.0.0,端口设置为0<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636448068598-38e4e83f-d84c-47dc-b1ce-b6398ad219d3.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=163&id=ufc23a262&name=image.png&originHeight=158&originWidth=373&originalType=url&ratio=1&rotation=0&showTitle=false&size=63540&status=done&style=stroke&taskId=ua1fb2d7c-6467-4666-b758-59dd0ea2d5f&title=&width=385)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636448074808-d72cb4ae-ff68-487b-8204-7dcd7cba7ec1.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=181&id=u2dbd8400&name=image.png&originHeight=259&originWidth=552&originalType=url&ratio=1&rotation=0&showTitle=false&size=47488&status=done&style=stroke&taskId=u78c18890-948b-48b8-87c9-7ae604ac9fa&title=&width=385)<br />为主机添加监控模板,选择刚刚创建的模板(主动模式),添加链接模板到主机<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636448110867-1b2dfbd8-22c9-4bf2-adb9-a26f9569b3e6.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=134&id=u9d7ac533&name=image.png&originHeight=178&originWidth=554&originalType=url&ratio=1&rotation=0&showTitle=false&size=29360&status=done&style=stroke&taskId=u21b6f881-cc5a-4071-93a4-5483c5d799a&title=&width=416)
<a name="BPd0e"></a>
#### 验证监控效果
查看数据图表,通过Monitoring(监控中)-->Latest(最新数据)菜单,选择需要查看的主机组、主机以及图形,查看效果<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636448243462-51e53a29-e4e6-4623-b88b-0f5af8a24788.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=292&id=ud9e0b692&name=image.png&originHeight=584&originWidth=994&originalType=url&ratio=1&rotation=0&showTitle=false&size=89975&status=done&style=stroke&taskId=uef51e46e-0360-45d5-b4ca-22e3c948fba&title=&width=497)
<a name="KZlB1"></a>
### 拓扑图与聚合图形
<a name="WajoP"></a>
#### 拓扑图
<a name="SSZIe"></a>
##### 1)创建拓扑
绘制拓扑图可以快速了解服务器架构,通过Monitoring(监控中)-->Maps(拓扑图),选择默认的Local network拓扑图,编辑即可(也可以新建一个拓扑图)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636449960723-f4b78fd0-9f67-4faf-85b6-8de2ad76bb08.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u59935e73&name=image.png&originHeight=61&originWidth=554&originalType=url&ratio=1&rotation=0&showTitle=false&size=54769&status=done&style=stroke&taskId=u31dc9ac2-948f-4c69-a7f3-325cc6e4f64&title=)
<a name="YMMCW"></a>
##### 2)拓扑图图表说明
- Icon(图标),添加新的设备后可以点击图标修改属性,也可以是装饰图形
- Shape(形状),长方形、圆形
- Link(连线),先使用Ctrl选择两个图标,再选择连线
- 完成后,点击Update(更新)
<a name="nubi0"></a>
##### 3)完善拓扑图
- 添加交换机图标
![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636450703077-884ecc8b-cfc3-4620-b3ee-54b685e367df.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=255&id=u7944c665&name=image.png&originHeight=509&originWidth=738&originalType=url&ratio=1&rotation=0&showTitle=false&size=73409&status=done&style=stroke&taskId=u94b31440-797f-49c0-9819-5c981433f65&title=&width=369)
- 添加连接:圈中两台设备(或ctrl点选),点链接边上的添加
![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636450797341-47627022-77e4-4940-a20a-93f62178bca0.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=158&id=ub03d413e&name=image.png&originHeight=219&originWidth=484&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30070&status=done&style=stroke&taskId=uc3bced8a-be89-4706-8841-dcac2fb7aca&title=&width=349)
<a name="apyuq"></a>
#### 聚合图形
聚合图形可以在一个页面显示多个数据图表,方便了解多组数据
<a name="mew2g"></a>
##### 1)创建聚合图形
通过Monitoring(监控中)-->Screens(聚合图形)-->Create screen(创建聚合图形)即可创建聚合图形<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636451078145-8c8dfeb2-39e1-4e1e-b3b3-e7f8bc55d6e8.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u685f08f7&name=image.png&originHeight=71&originWidth=554&originalType=url&ratio=1&rotation=0&showTitle=false&size=50704&status=done&style=stroke&taskId=u7f7d3d55-7126-4bc5-a74e-b45f70281ab&title=)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636451446450-0e57c16b-3ca6-4cf0-9944-4eedf8c5bb5d.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=184&id=u1908899b&name=image.png&originHeight=320&originWidth=436&originalType=url&ratio=1&rotation=0&showTitle=false&size=19811&status=done&style=none&taskId=ue71c0285-d7a4-48a6-9f6a-f5413d8cdf2&title=&width=251) ![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636451455741-d2f72518-c91d-485c-944e-244e382f961b.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=189&id=uf11847ec&name=image.png&originHeight=409&originWidth=510&originalType=url&ratio=1&rotation=0&showTitle=false&size=21417&status=done&style=stroke&taskId=u563c4a2e-b0e6-4c79-a9eb-c54b3210a32&title=&width=236)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636451522434-ddaf96ed-e378-47c4-9462-8553a8ae821f.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u4477a488&name=image.png&originHeight=221&originWidth=1020&originalType=url&ratio=1&rotation=0&showTitle=false&size=16851&status=done&style=stroke&taskId=u2a3b4d72-4cfa-477d-9fbb-d4b514cae4c&title=)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636451592732-7ea0722d-a441-415b-ab8e-2991bfac705c.png#clientId=ue0ba2091-bc2e-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u3f0604d8&name=image.png&originHeight=511&originWidth=980&originalType=url&ratio=1&rotation=0&showTitle=false&size=124003&status=done&style=stroke&taskId=u6460b1f0-9cc9-4d3d-8b19-02d49ff929e&title=)
<a name="IpX05"></a>
### 监控报警案例
<a name="VcJ9y"></a>
#### 钉钉机器人告警
<a name="HH9if"></a>
#### 监控Nginx服务状态
1)准备环境,部署nginx软件<br />安装nginx软件,开启status模块
```shell
[root@web1 ~]# tar -xf nginx-1.12.2.tar.gz
[root@web1 ~]# cd nginx-1.12.2
[root@web1 nginx-1.12.2]# yum -y install gcc pcre-devel openssl-devel
[root@web1 nginx-1.12.2]# ./configure \
> --with-http_stub_status_module
[root@web1 nginx-1.12.2]# make && make install
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf #参考前面的课程内容,在server中新建一个location
location /status {
stub_status on;
}
[root@web1 ~]# /usr/local/nginx/sbin/nginx #启动服务
[root@web1 ~]# ss -tnulp | grep :80
LISTEN 0 128 *:80
[root@web1 ~]# curl http://192.168.2.100/status
Active connections: 1
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
# Active connections:当前客户端与nginx之间的连接数。它等于下面Reading / Writing / Waiting之和
# accepts:自nginx启动之后,客户端访问的总量
# handled:自nginx启动之后,处理过的客户端连接总数。
# requests:自nginx启动之后,处理过的客户端请求总数。
# Reading:正在读取HTTP请求头部的连接总数。
# Writing:正在向客户端发送响应的连接总数。
# Waiting:空闲连接。
# 使用工具向服务器发起多个请求
[root@web1 ~]# yum install -y httpd-tools
[root@web1 ~]# ab -n 1000 -c 100 http://192.168.4.100/status
[root@web1 ~]# curl http://192.168.4.100/status
Active connections: 1
server accepts handled requests
1040 1040 1004
Reading: 0 Writing: 1 Waiting: 0
2)自定义监控key
编写自定义监控脚本
[root@web1 ~]# vim /usr/local/bin/nginx_status.sh
#!/bin/bash
case $1 in
active)
curl -s http://192.168.2.100/status |awk '/Active/{print $NF}';;
waiting)
curl -s http://192.168.2.100/status |awk '/Waiting/{print $NF}';;
accepts)
curl -s http://192.168.2.100/status |awk 'NR==3{print $1}';;
esac
[root@web1 ~]# chmod +x /usr/local/bin/nginx_status.sh
创建自定义key
- UserParameter=key[*], $1
- key里的所有参数,都会传递给后面命令的位置变量
- 注意:被监控端修改配置文件,注意要允许自定义key并设置Include
3)测试效果[root@web1 ~]# vim /usr/local/etc/zabbix_agentd.conf.d/nginx.status UserParameter=nginx.status[*],/usr/local/bin/nginx_status.sh $1 [root@web1 ~]# systemctl restart zabbix_agentd #重启服务
登陆Zabbix监控Web,创建监控项目item,点击Configuration(配置)—>Hosts(主机),点击主机后面的items(监控项),点击Create item(创建监控项)。[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'nginx.status[accepts]'
备注:Type(类型)后面的Zabbix agent中文是Zabbix 客户端。
监控网络连接状态
1)查看网络连接状态
模拟多人并发连接(如果没有ab命令,则安装httpd-tools软件包),查看网络连接状态
2)创建自定义key[root@web1 ~]# ab -c 1000 -n 100000 http://192.168.2.100/ [root@web1 ~]# ss -antup #-a显示所有 #-t显示TCP连接状态 #-u显示UDP连接状态 #-n以数字形式显示端口号和IP地址 #-p显示连接对应的进程名称
编写自定义监控脚本
注意:被监控端修改配置文件,注意要允许自定义key并设置Include参数[root@web1 ~]# vim /usr/local/bin/net_status.sh #!/bin/bash case $1 in estab) ss -antp |awk 'BEGIN{x=0} /^ESTAB/{x++} END{print x}';; close_wait) ss -antp |awk 'BEGIN{x=0} /^CLOSE-WAIT/{x++} END{print x}';; time_wait) ss -antp |awk 'BEGIN{x=0} /^TIME-WAIT/{x++} END{print x}';; esac [root@web1 ~]# chmod +x /usr/local/bin/net_status.sh
3)测试效果[root@web1 ~]# vim /usr/local/etc/zabbix_agentd.conf.d/net.status UserParameter=net.status[*],/usr/local/bin/net_status.sh $1 [root@web1 ~]# systemctl restart zabbix_agentd
在监控服务器,添加监控项目item,Configuration(配置)—>Hosts(主机)点击主机后面的items(监控项)[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'net.status[time_wait]'
点击Create item(创建监控项)
Prometheus监控服务器
Prometheus概述
Prometheus是由 SoundCloud开源的监控报警解决方案。
- 采用Go语言开发
- prometheus是一款监控软件,也是一个时序数据库,存储的是时序数据
- 数据带时间标签
- 如<metric name>{
- Prometheus主要用在监控容器数据,也可以监控常规主机
- Prometheus重视高可用,如果您需要100%准确性、那么该软件不适合您,因为它所收集的数据可不会足够详细和完整。
- Prometheus是一个框架,可以与其他组件完美结合。
部署Prometheus
环境准备
所有主机系统均为CentOS7,提前配置IP、主机名、系统YUM源。
设置防火墙、SELinux。
部署监控服务器(192.168.4.10主机操作)
1)安装prometheus监控软件(默认端口9090)
需要提前将prometheus_soft.tar.gz软件拷贝到虚拟机,解压即可使用。
[root@zzgrhel8 ~]# scp /linux-soft/2/prometheus_soft.tar.gz 192.168.4.10:/root/
[root@prometheus ~]# tar xf prometheus_soft.tar.gz
[root@prometheus ~]# cd prometheus_soft/
# prometheus是经过编译后的go语言程序,相当于绿色软件,解压即用
[root@prometheus prometheus_soft]# tar xf prometheus-2.17.2.linux-386.tar.gz
[root@prometheus prometheus_soft]# mv prometheus-2.17.2.linux-386 /usr/local/prometheus
2)修改prometheus配置文件
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml
29 - targets: ['192.168.4.10:9090']
# 检查语法
[root@prometheus ~]# /usr/local/prometheus/promtool check config /usr/local/prometheus/prometheus.yml
Checking /usr/local/prometheus/prometheus.yml
SUCCESS: 0 rule files found
# 创建服务文件
[root@prometheus ~]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring System
After=network.target
[Service]
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/
[Install]
WantedBy=multi-user.target
#备注:
#--config.file和--storage.tsdb.path都是prometheus这个程序的参数
#可以通过prometheus -h查看这个程序支持哪些参数
#--config.file参数后面指定该程序使用哪个配置文件启动服务
#--storage.tsdb.path参数后面指定该程序将数据存储在哪个目录下
# 启服务
[root@prometheus ~]# systemctl daemon-reload
[root@prometheus ~]# systemctl enable prometheus.service --now
[root@prometheus ~]# ss -tlnp | grep :9090
LISTEN 0 128 :::9090
3)查看监控控制台
使用浏览器firefox或者google-chrome访问http://192.168.4.10:9090。
查看监控主机,点击《Status》—《Targets》查看主机
注意:promethues是时序监控软件,如果时间不一致,不能使用,可修改服务器时间(date -s)删除data文件重启服务。
查看具体监控数据,点击《Graph》,选择监控数据,如go_memstats_alloc_bytes,点击《Execute》
查看监控数据对应的监控图形,效果如图
部署被控端(192.168.4.11主机操作)
监控方式
- Prometheus客户端分为pull和push两种提交数据的方式
- Pull:服务端主动向客户端拉取数据,这样需要客户端上安装exporters(导出器)作为守护进程。
- Push:客户端需要安装pushgateway插件,然后运维人员用脚本把监控数据组织成键值形式提交给pushgateway,再由它提交给服务端。
被监控端根据自身运行的服务,可以运行不同的exporter(被监控端安装的、可以与Prometheus通信,实现数据传递的软件)
-
1)安装node-export软件(默认端口9100)
node-exporter用于监控硬件和系统的常用指标
- exporter运行于被监控端,以服务的形式存在。每个exporter所使用的端口号都不一样。
- 在node1[192.168.4.11]上部署node exporter ```shell [root@prometheus prometheus_soft]# scp node_exporter-1.0.0-rc.0.linux-amd64.tar.gz 192.168.4.11:/root/
[root@node1 ~]# tar xf node_exporter-1.0.0-rc.0.linux-amd64.tar.gz [root@node1 ~]# mv node_exporter-1.0.0-rc.0.linux-amd64 /usr/local/node_exporter
<a name="O8Nkt"></a>
#### 2)编写服务service文件,启动服务
```shell
[root@node1 ~]# vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable node_exporter.service --now
[root@node1 ~]# ss -tlnp | grep :9100
LISTEN 0 128 :::9100
3)修改监控服务器配置文件(4.10操作)
- 在Prometheus服务器上添加监控节点
参考配置文件最后的模板,在文件末尾添加3行新内容
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml
- job_name: 'node1'
static_configs:
- targets: ['192.168.4.11:9100']
[root@prometheus ~]# systemctl restart prometheus.service
4)查看监控主机、监控数据
使用浏览器访问http://192.168.4.10:9090,查看监控主机列表
查看主机CPU监控数据
部署grafana服务器(可视化监控数据)
grafana简介
- Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示。
- 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标,如热图、折线图、图表等。
- 数据源:Graphite,InfluxDB, OpenTSDB, Prometheus,Elasticsearch, CloudWatch和KairosDB等。
1)安装Grafana软件,启动服务(默认端口3000)
[root@prometheus ~]# cd prometheus_soft/ [root@prometheus prometheus_soft]# ls *rpm grafana-6.7.3-1.x86_64.rpm [root@prometheus prometheus_soft]# yum install -y grafana-6.7.3-1.x86_64.rpm [root@prometheus ~]# systemctl enable grafana-server.service --now
2)登录页面,重置登录密码
浏览器访问Grafana控制台,http://192.168.4.10:3000
默认用户名和密码都是:admin。
有些浏览器问题,可能无法重置密码,如果无法重置密码,则可以设置grafana允许匿名登录,具体操作如下(非必要,不要执行如下操作)[root@prometheus ~]# vim /etc/grafana/grafana.ini [auth.anonymous] enabled = true org_role = Admin [root@prometheus ~]# systemctl restart grafana-server.service
3)配置Grafana
浏览器访问Grafana控制台,http://192.168.4.10:3000
对接prometheus数据的步骤:
- 添加数据源
- 为数据展示选择展示方式(dashboard仪表盘)
- 查看结果
a.添加数据源(Add data source)
Grafana可以将数据图形化,那么数据从哪里来呢?
点击《Add data source》,选择从Prometheus获取数据
填写Prometheus基本信息
b.导入可视化模板
使用不同的可视化模板就可以将不同的数据进行图形化展示,下面导入prometheus图形化模板,选择《Prometheus 2.0 Stats》
查看监控效果
4)查看被监控主机的系统信息
a.导入主机监控的可视化模板(node_exporter模板)
- grafana模板下载:https://grafana.com/grafana/dashboards/
模板文件在在第二阶段素材prometheus_soft.tar.gz中有提供
b.选择数据源
导入监控主机的可视化模板后,我们就可以查看主机的监控图形了,但是这个图形的数据从哪里获取呢,需要设置prometheus为数据源
返回Grafana首页,查看监控图形(dashboards)
prometheus监控数据库案例
使用prometheus监控MariaDB数据库
- 安装数据库
- 安装数据库exporter
- 配置数据库账户和密码
- 导入监控模板
1)安装MariaDB(被监控主机192.168.4.11操作)
[root@node1 ~]# yum install -y mariadb-server [root@node1 ~]# systemctl enable mariadb --now
2)创建数据库账户,配置密码
- mysql exporter需要访问数据库,所以需要在数据库中为exporter创建授权用户
[root@node1 ~]# mysql MariaDB [(none)]> grant all on *.* to jerry@'localhost' identified by '123'; # 创建用户jerry,该用户可以从本机127.0.0.1登录服务器,该用户的密码为123 MariaDB [(none)]> exit
3)安装mysqld_exporter(默认端口为9104)
创建数据库配置文件.my.cnf,到时mysqld_exporter自动读取配置文件,使用配置文件用的账户和密码信息访问数据库,获取数据库监控信息[root@node1 prometheus_soft]# tar -xf mysqld_exporter-0.12.1.linux-amd64.tar.gz [root@node1 prometheus_soft]# mv mysqld_exporter-0.12.1.linux-amd64 /usr/local/mysqld_exporter [root@node1 prometheus_soft]# vim /usr/local/mysqld_exporter/.my.cnf [client] host=127.0.0.1 port=3306 user=jerry password=123
4)编写服务service文件
[root@node1~]# vim /usr/lib/systemd/system/mysqld_exporter.service [Unit] Description=node_exporter After=network.target [Service] ExecStart=/usr/local/mysqld_exporter/mysqld_exporter \ --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf [Install] WantedBy=multi-user.target #--config.my-cnf是mysqld_exporter程序的参数,该参数后面指定数据库的配置文件 #可以使用mysqld_exporter -h查看该程序支持哪些参数 [root@node1~]# systemctl enable mysqld_exporter --now [root@node1 ~]# ss -tlnp | grep :9104 LISTEN 0 128 :::9104
5)修改监控服务器配置文件(192.168.4.10主机操作)
# 修改配置文件,追加以下内容: [root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml - job_name: 'mysql' static_configs: - targets: ['192.168.4.11:9104'] [root@prometheus ~]# systemctl restart prometheus.service
6)配置Grafana可视化
a.查看监控主机(浏览器访问http://192.168.4.10:9090)。
查看prometheus是否已经识别到MariaDB数据库主机
b.访问Grafana导入数据库可视化模板(浏览器访问http://192.168.4.10:3000)。
导入数据库可视化模板
设置数据源,数据来源于Prometheus
如果离开监控图形时提示保存监控图形,可以任意输入名称即可
kali系统(安全工具-黑客Linux操作系统)
- kali是基于Debian的Linux发行版
- kali linux包含上百个安全相关工具
- 渗透测试、安全检测、密码安全、反向工程等
官网:kali.org
[root@zzgrhel8 ~]# kali reset kali reset OK. # 该虚拟机系统用户名为:kali,密码为:kali
基础配置
$ ip a s # 查看网络 $ nmcli connection show # 查看到网络连名为"Wired connection 1" $ nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.address 192.168.4.40/24 autoconnect yes $ systemctl start ssh # 启ssh服务,弹出的窗口输入密码kali [root@zzgrhel8 ~]# ssh kali@192.168.4.40 kali@192.168.4.40's password: kali ┌──(kali㉿kali)-[~] └─$
扫描与抓包
安全分析概述
为什么需要扫描
以获取一些公开/非公开信息为目的
检测潜在的风险
- 查找可攻击目标
- 收集设备/主机/系统/软件信息
- 发现可利用的安全漏洞
通常扫描是攻击的前奏。比如扫描到目标是什么系统、开放了哪些服务,这些服务是用何种软件的哪个版本实现的。
扫描方式及工具
典型的扫描方式
- Scan,主动探测
- Sniff,被动监听/嗅探
- Capture,数据包捕获(抓包)
常见的安全分析工具
- 扫描器:NMAP
- 协议分析:tcpdump、WireShark
windows下,扫描windows系统的工具可以用xscan / superscan
常用的黑客网站:
- 吾爱破解:https://www.52pojie.cn/
中国黑客团队论坛:https://www.cnhackteam.org/
NMAP扫描
一款强大的网络探测利器工具
- 最著名的网络渗透工具之一
支持多种探测技术
-sS,TCP SYN扫描(半开-两次握手)速度快
- -sT,TCP 连接扫描(全开)
- -sU,UDP扫描
- -sP,ICMP(Internet Control Message Protocol)扫描,查看看是否能ping通
- -A,目标系统全面分析
- -p,扫描指定端口和端口范围
```shell
以ping的方式扫描整网段
┌──(kali㉿kali)-[~] └─$ nmap -sP 192.168.4.0/24使用-n选项可以不执行DNS解析
[kali@kali ~]$ sudo nmap -n -sP 192.168.4.0/24
全面分析192.168.4.11
┌──(kali㉿kali)-[~] └─$ nmap -A 192.168.4.11
扫描192.168.4.11开放了哪些TCP服务
┌──(kali㉿kali)-[~] └─$ nmap -sT 192.168.4.11
扫描192.168.4.11开放了哪些TCP服务,半开扫描方式,需要root权限
┌──(kali㉿kali)-[~] └─$ sudo nmap -sS 192.168.4.11
扫描192.168.4.11开放了哪些UDP服务
┌──(kali㉿kali)-[~] └─$ sudo nmap -sU 192.168.4.11
<a name="j0dTu"></a>
#### 执行脚本扫描
相关脚本存放目录:/usr/share/nmap/scripts/<br />准备一台Vsftpd服务器
```shell
[root@proxy ~]# yum -y install vsftpd
[root@proxy ~]# systemctl restart vsftpd
[root@proxy ~]# useradd tom
[root@proxy ~]# echo 123 | passwd --stdin tom
FTP相关扫描脚本
[kali@kali ~]$ sudo nmap --script=ftp-anon.nse 192.168.4.5 -p 21 #匿名访问扫描 [kali@kali ~]$ sudo nmap --script=ftp-syst.nse 192.168.4.5 -p 21 #扫描ftp软件相关信息(如版本号,是否有带宽限制,超时时间等) [kali@kali ~]$ sudo nmap --script=ftp-vsftpd-backdoor.nse 192.168.4.5 -p 21 #后门扫描 [kali@kali ~]$ sudo nmap --script=ftp-brute.nse 192.168.4.5 -p 21 #暴力破解密码
SSH相关扫描
通过ssh协议,使用nmap自带的密码本扫描远程主机的用户名和密码
# 通过ssh协议,使用nmap自带的密码本扫描远程主机的用户名和密码
# 在目标主机上创建名为admin的用户,密码为123456
[root@prometheus ~]# useradd admin
[root@prometheus ~]# echo 123456 | passwd --stdin admin
# 在kali上扫描弱密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse 192.168.4.10 -p 22
通过ssh协议,使用nmap以及自己的密码本扫描远程主机的密码
# 1. 创建用户名文件
┌──(kali㉿kali)-[~]
└─$ sudo echo healer > /tmp/users.txt
┌──(kali㉿kali)-[~]
└─$ cat /tmp/users.txt
healer
[root@node1 ~]# echo 20010322 | passwd --stdin root
# 2. 生成1990-01-01到2020-12-31之间的所月日期
[root@zzgrhel8 ~]# vim mydate.py
from datetime import datetime, timedelta
d1 = datetime(1989, 12, 31)
d2 = datetime(2021, 1, 1)
dt = timedelta(days=1)
with open('/tmp/mima.txt', 'w') as f:
while d1 < d2:
d1 += dt
f.write(f"{d1.strftime('%Y%m%d')}\n")
[root@zzgrhel8 ~]# python3 mydate.py # 将会生成/tmp/mima.txt
[root@zzgrhel8 ~]# scp /tmp/mima.txt kali@192.168.4.40:/tmp/
# 3. 使用自己的密码本破解密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse --script-args userdb=/tmp/users.txt,passdb=/tmp/mima.txt 192.168.4.11 -p 22
# 4. 目标主机将会记录所有的登陆事件
[root@node1 ~]# vim /var/log/secure
# 查看最近的登陆失败事件
[root@node1 ~]# lastb
# 查看最近的登陆成功事件
[root@node1 ~]# last
扫描windows口令
[root@zzgrhel8 ~]# cat /tmp/winuser.txt # windows用户名
administrator
admin
# 通过samba服务扫描密码
[root@zzgrhel8 ~]# nmap --script=smb-brute.nse --script-args userdb=/tmp/winuser.txt,passdb=/tmp/mima 172.40.0.151
手工扫描
[root@node1 ~]# yum install -y telnet
# 查看目标主机80端口是否开放
[root@node1 ~]# telnet 192.168.4.10 80
Trying 192.168.4.10...
telnet: connect to address 192.168.4.10: Connection refused
- HTTP相关扫描
这里假设192.168.4.5有http服务。
[kali@kali ~]$ sudo nmap --script=http-methods.nse 192.168.4.5 -p 80
#请求方法扫描(如get,post,header等)
[kali@kali ~]$ sudo nmap --script=http-sql-injection.nse 192.168.4.5 -p 80
#SQL注入扫描
- 备注:SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
- SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。
- SMB相关扫描
这里假设有一台windows主机192.168.137.4
[kali@kali ~]$ sudo nmap --script=smb-brute.nse 192.168.137.4
[kali@kali ~]$ sudo nmap --script=smb-brute.nse \
--script-args=userdb=/密码本,passdb=/密码本 192.168.137.4
- 暴力破解密码
$ sudo john --single /etc/shadow #破解傻瓜式密码 $ sudo john /etc/shadow #字典暴力破解(随时ctrl+c终止) $ sudo john --wordlist=密码本 /etc/shadow #使用自定义密码本破解 $ sudo john --show /etc/shadow #显示破解的密码
使用john破解密码
根据已知的密文反向求明文数据
- 在线破解哈值的网站:https://cmd5.com/
- kali系统提供了一个名为john的工具,可用于密码破解 ```shell [root@node1 ~]# echo 123456 | passwd —stdin root [root@node1 ~]# useradd tom [root@node1 ~]# echo abc123 | passwd —stdin tom [root@node1 ~]# useradd jerry [root@node1 ~]# echo 123123 | passwd —stdin jerry [root@node1 ~]# scp /etc/shadow kali@192.168.4.40:/home/kali/
破解傻瓜式密码
┌──(kali㉿kali)-[~] └─$ sudo john —single shadow
字典暴力破解,密码本是/usr/share/john/password.lst
┌──(kali㉿kali)-[~] └─$ sudo john shadow
直接显示破解的密码,不显示其他额外信息
┌──(kali㉿kali)-[~]
└─$ sudo john —show shadow
root:123456:18912:0:99999:7:::
tom:abc123:18912:0:99999:7:::
jerry:123123:18912:0:99999:7:::
linux系统自带的密码本
[root@node1 ~]# yum install -y words [root@node1 ~]# ls /usr/share/dict/ linux.words words [root@node1 ~]# wc -l /usr/share/dict/words 479828 /usr/share/dict/words
字典暴力破解,指定密码本文件
[root@node1 ~]# scp /usr/share/dict/linux.words kali@192.168.4.40:/home/kali/ ┌──(kali㉿kali)-[~] └─$ sudo john —wordlist=linux.words shadow
<a name="HYAGb"></a>
### tcpdump抓包
- 传输的各种数据,在网络中都是一个个的数据包
<a name="EyU9X"></a>
#### 基本用法
tcpdump
- -i:指定网络
- -A:转换为ASCII码,使得可读
- -w:抓包写入文件
- -r:从文件中读取抓包信息
- -c:定义抓包的个数(默认无限抓包ctrl+c结束)
- -n:不把主机的网络地址转换成名字
**tcpdump的过滤条件**:
- 类型:host(主机)、net(网段)、port(端口)、portrange(端口范围)
- 方向:src(源地址)、dst(目标地址)
- 协议:tcp、udp、ip、wlan、arp、……
- 多个条件组合:and、or、not
```shell
# 1. 抓包:抓取eth0上进出的、与192.168.4.10有关的、涉及TCP21端口的软件包。以下命令执行后,打开新终端。
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A host 192.168.4.10 and tcp port 21
# 2. 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.4.10
Connected to 192.168.4.10.
220 (vsFTPd 3.0.2)
Name (192.168.4.10:kali): tom # 用户名
331 Please specify the password.
Password:abc123 # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit # 退出
221 Goodbye.
# 3.在tcpdump终端可以看到明文的用户名和密码
可以将抓到的包写入文件中
# 1. 将抓到的包存入文件ftp.cap
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A -w ftp.cap host 192.168.4.10 and tcp port 21
# 2. 在另一个终端访问ftp
# 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.4.10
Connected to 192.168.4.10.
220 (vsFTPd 3.0.2)
Name (192.168.4.10:kali): tom # 用户名
331 Please specify the password.
Password:abc123 # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit # 退出
221 Goodbye.
# 3. 在抓包终端ctrl+c停止
# 4. 读取抓到的包,并过滤
┌──(kali㉿kali)-[~]
└─$ tcpdump -A -r ftp.cap | egrep 'USER|PASS'
WireShark协议分析器
一款与tcpdump累死的抓包工具,需要图形环境[root@zzgrhel8 ~]# yum install wireshark ftp
选择抓哪块网卡进出的数据,然后点左上角的开始
抓到包后,点击左上角同样位置停止,查看数据
服务安全
nginx安全优化
Nginx安全优化包括:修改版本信息、限制并发、拒绝非法请求、防止buffer溢出
修改版本信息
安装起服务
[root@node1 lnmp_soft]# yum install -y gcc pcre-devel zlib-devel [root@node1 lnmp_soft]# tar xf nginx-1.12.2.tar.gz [root@node1 lnmp_soft]# cd nginx-1.12.2/ [root@node1 nginx-1.12.2]# ./configure && make && make install [root@node1 ~]# /usr/local/nginx/sbin/nginx
访问不存在的路径
- 默认Nginx会显示版本信息以及具体的版本号,这些信息给攻击者带来了便利性,便于他们找到具体版本的漏洞。
如果需要屏蔽版本号信息,执行如下操作,可以隐藏版本号
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
17 http {
18 server_tokens off;
... ...
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
- 再次访问不存在的路径,版本号消失
限制并发
- DDOS(Distributed Denial of Service):分布式拒绝服务
- DDOS攻击者会发送大量的并发连接,占用服务器资源(包括连接数、带宽等),这样会导致正常用户处于等待或无法访问服务器的状态。
Nginx提供了一个ngx_http_limit_req_module模块,可以有效降低DDOS攻击的风险,操作方法如下:
- 配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
```shell
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
17 http {
18 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 添加
… …
37 server {
… …
40 limit_req zone=one burst=5; # 添加
备注说明:
limit_req_zone语法格式如下:
limit_req_zone key zone=name:size rate=rate;
上面案例中是将客户端IP信息存储名称为one的共享内存,内存空间为10M
1M可以存储8千个IP信息,10M可以存储8万个主机连接的状态,容量可以根据需要任意调整
每秒中仅接受1个请求,多余的放入漏斗
漏斗超过5个则报错
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
再次测试
[root@zzgrhel8 ~]# ab -c 100 -n 200 http://192.168.4.10/ … … Benchmarking 192.168.4.10 (be patient) Completed 100 requests Completed 200 requests Finished 200 requests … … Complete requests: 200 Failed requests: 194 # 失败了194个 … …
<a name="SDgC3"></a>
### 拒绝非法的请求
网站使用的是HTTP协议,该协议中定义了很多方法,可以让用户连接服务器,获得需要的资源。但实际应用中一般仅需要get和post。
- 最常用的HTTP方法
- GET:在浏览器中输入网址、在页面中点击超链接、搜索表单。
- POST:常用于登陆、提交数据的表单
- 其他HTTP方法不常用,如:
- HEAD:获得报文首部。HEAD 方法和 GET 方法一样,只是不返回报文主体部分。
- PUT:传输文件。要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
- DELETE:删除文件。DELETE 方法按请求 URI 删除指定的资源。
```shell
# 使用GET和HEAD方法访问nginx。两种方法都可以访问
[root@zzgrhel8 ~]# curl -i -X GET http://192.168.4.10/
[root@zzgrhel8 ~]# curl -i -X HEAD http://192.168.4.10/
# 配置nginx只接受GET和POST方法
[root@node1 ~]# vim /usr/local/nginx/conf/nginx.conf
... ...
37 server {
38 listen 80;
39 if ($request_method !~ ^(GET|POST)$ ) {
40 return 444;
41 }
... ...
# $request_method是内置变量,表示请求方法。~表示正则匹配,!表示取反。^表示开头,$表示结尾,|表示或
[root@node1 ~]# /usr/local/nginx/sbin/nginx -s reload
# 使用GET和HEAD方法访问nginx。只有GET可以工作
[root@zzgrhel8 ~]# curl -i -X GET http://192.168.4.10/
[root@zzgrhel8 ~]# curl -i -X HEAD http://192.168.4.10/
附:取出nginx.conf中注释和空行以外的行
# -v是取反。^ *#表示开头有0到多个空格,然后是#。^$表示空行
[root@node1 ~]# egrep -v '^ *#|^$' /usr/local/nginx/conf/nginx.conf
防止缓冲区(buffer)溢出
- 缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。
- 漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。
当客户端连接服务器时,服务器会启用各种缓存,用来存放连接的状态信息。
如果攻击者发送大量的连接请求,而服务器不对缓存做限制的话,内存数据就有可能溢出(空间不足)。
修改Nginx配置文件,调整各种buffer参数,可以有效降低溢出风险
Linux基本防护措施
用户账号安全
设置账号有效期
chage命令的语法格式:
- chage -l 账户名称 #查看账户信息
- chage -E 时间 账户名称 #修改账户有效期
1)失效的用户将无法登录
使用chage命令将用户zhangsan的账户设为当前已失效(比如已经过去的某个时间)
[root@proxy ~]# useradd zhangsan #创建账户
[root@proxy ~]# passwd zhangsan #设置密码
[root@proxy ~]# chage -E 2017-12-31 zhangsan #设置账户过期时间
尝试以用户zhangsan重新登录,输入正确的用户名、密码后直接闪退,返回登录页,说明此帐号已失效。
2)重设用户zhangsan的属性,将失效时间设为2021-11-11
[root@proxy ~]# chage -E 2021-11-11 zhangsan #修改失效日期
[root@proxy ~]# chage -l zhangsan #查看账户年龄信息
Last password change : May 15, 2017
Password expires : never
Password inactive : never
Account expires : Dec 31, 2019
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
3)重设用户zhangsan的属性,将失效时间设为永不过期
[root@proxy ~]# chage -E -1 zhangsan #设置账户永不过期
4)定义默认有效期
/etc/login.defs这个配置文件,决定了账户密码的默认有效期,对新建用户生效
[root@proxy ~]# cat /etc/login.defs
PASS_MAX_DAYS 99999 #密码最长有效期
PASS_MIN_DAYS 0 #密码最短有效期
PASS_MIN_LEN 5 #密码最短长度
PASS_WARN_AGE 7 #密码过期前几天提示警告信息
UID_MIN 1000 #UID最小值
UID_MAX 60000 #UID最大值
账号的锁定/解锁
passwd命令:
- -l:锁定
- -u:解锁
-s:查看状态
# 锁定tom账号 [root@node1 ~]# passwd -l tom 锁定用户 tom 的密码 。 passwd: 操作成功 [root@node1 ~]# passwd -S tom # 查看状态 tom LK 2021-10-12 0 99999 7 -1 (密码已被锁定。) # 输入正确的用户名、密码,始终提示“Login incorrect”,无法登录 # 解锁tom账号 [root@node1 ~]# passwd -u tom 解锁用户 tom 的密码。 passwd: 操作成功 [root@node1 ~]# passwd -S tom tom PS 2021-10-12 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
伪装登陆提示
账户在登录Linux系统时,默认会显示登陆信息(包括操作系统内核信息)
/etc/issue这个配置文件里保存的就是这些登陆信息,修改该文件防止内核信息泄露。 ```shell [root@proxy ~]# cat /etc/issue #确认原始文件 Red Hat Enterprise Linux Server release 7.5 Kernel \r on an \m
[root@proxy ~]# cp /etc/issue /etc/issue.origin #备份文件 [root@proxy ~]# vim /etc/issue #修改文件内容 Windows Server 2012 Enterprise R2 NT 6.2 Hybrid
退出已登录的tty终端,或者重启Linux系统,刷新后的终端提示信息会变成自定义的文本内容<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/23057113/1636681653493-7b7684e8-38ad-4a03-977b-b16fb76ae239.png#clientId=uee18bb18-938a-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=u44ac7da0&name=image.png&originHeight=63&originWidth=401&originalType=url&ratio=1&rotation=0&showTitle=false&size=8388&status=done&style=none&taskId=u26042b11-bbbc-45e4-8eb6-bd7b567dee3&title=)
<a name="OGlR3"></a>
### 文件系统安全
<a name="GWCcI"></a>
#### 锁定/解锁保护文件
1)语法格式:<br />chattr +i 文件名 #锁定文件(无法修改、删除、追加等) <br />chattr -i 文件名 #解锁文件 <br />chattr +a 文件名 #锁定后文件仅可追加 <br />chattr -a 文件名 #解锁文件 <br />lsattr 文件名 #查看文件特殊属性
```shell
# 查看文件的特殊属性
[root@node1 ~]# lsattr /etc/passwd
---------------- /etc/passwd # 没有特殊属性
[root@node1 ~]# chattr +i /etc/passwd
[root@node1 ~]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@node1 ~]# useradd zhangsan
useradd:无法打开 /etc/passwd
[root@node1 ~]# rm -f /etc/passwd
rm: 无法删除"/etc/passwd": 不允许的操作
[root@node1 ~]# chattr -i /etc/passwd
[root@node1 ~]# rm -f /etc/passwd # 可以删除
[root@node1 ~]# ls /etc/passwd
ls: 无法访问/etc/passwd: 没有那个文件或目录
备注:系统会自动备份passwd文件,名为passwd-,不是实时备份。
iptables
- iptables有多种功能,每一种功能都用一张表来实现
- 最常用的功能是防火墙和NAT
从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然调用iptables
iptables防火墙
iptables的表链结构
iptables的4个表(区分大小写)
nat表(地址转换表)
- filter表(数据过滤表)
- raw表(状态跟踪表)
- mangle表(包标记表)
iptables的5个链(区分大小写)
- INPUT链(入站规则)
- OUTPUT链(出站规则)
- FORWARD链(转发规则)
- PREROUTING链(路由前规则)
-
防火墙filter表
filter表中的三条链 INPUT:数据包的目标地址是自己,则进入INPUT链
- OUTPUT:数据包的源地址是自己,则进入OUTPUT链
-
包过滤匹配流程
规则链内的匹配顺序
表 | 说明 | 支持的链 |
---|---|---|
raw | 一般是为了不再让iptables对数据包进行跟踪,提高性能 | PREROUTING、OUTPUT |
mangle | 对数据包进行修改 | 五个链都可以 |
nat | 进行地址转换 | PREROUTING、OUTPUT、POSTROUTING |
filter(默认) | 对包进行过滤 | INPUT、FORWARD、OUTPUT |
常用操作命令 | 说明 |
---|---|
-A | 在指定链尾部添加规则 |
-D | 删除匹配的规则 |
-R | 替换匹配的规则 |
-I | 在指定位置插入规则(例:iptables -I INPUT 1 —dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上) |
-L/S | 列出指定链或所有链的规则 |
-F | 删除指定链或所有链的规则 |
-N | 创建用户自定义链[例:iptables -N allowed |
-X | 删除指定的用户自定义链 |
-P | 为指定链设置默认规则策略,对自定义链不起作用 |
-Z | 将指定链或所有链的计数器清零 |
-E | 更改自定义链的名称[例:iptables -E allowed disallowed |
-n | ip地址和端口号以数字方式显示[例:iptables -nL |
iptables 命令常用匹配参数及各自的功能如表,可以使用!表示取反
常用规则匹配器 | 说明 |
---|---|
-p tcp/udp/icmp/all | 匹配协议,all会匹配所有协议 |
-s addr[/mask] | 匹配源地址 |
-d addr[/mask] | 匹配目标地址 |
—sport port1[:port2] | 匹配源端口(可指定连续的端口) |
—dport port1[:port2] | 匹配目的端口(可指定连续的端口) |
-o interface | 匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT(例:iptables -A FORWARD -o eth0) |
-i interface | 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。 |
—icmp-type | 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型) |
—tcp-flags mask comp | 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。(例:iptables -A FORWARD -p tcp —tcp-flags ALL SYN,ACK -j ACCEPT 表示匹配SYN和ACK标记的数据包) |
—src-range | 匹配源地址范围 |
—dst-range | 匹配目标地址范围 |
—limit | 四配数据表速率 |
—mac-source | 匹配源MAC地址 |
—stste | 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) |
—string | 匹配应用层字串 |
目标动作 | 说明 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包 |
REJECT | 丢弃数据包,并且将拒绝信息发送给发送方 |
SNAT | 源地址转换(在nat表上)例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT —to 192.168.0.1 |
DNAT | 目标地址转换(在nat表上)例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT —to-destination 192.168.0.102 |
REDIRECT | 目标端口转换(在nat表上)例:iptables -t nat -D PREROUTING -p tcp —dport 8080 -i eth2.2 -j REDIRECT —to 80 |
MARK | 将数据包打上标记;例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK —set-mark 60 |
LOG | 将数据包信息记录 syslog 曰志 |
MASQUERADE | 地址欺骗 |
保存和恢复iptables规则
使用iptables-save可以保存到特定文件中
- iptables-save >/etc/sysconfig/iptables_save
使用iptables-restore可以恢复规则
- iptables-restore</etc/sysconfig/iptables_save
注意事项与规律:
- 配置iptables时,不指定表,就是使用filter表
- 配置时不指定规则链,则配置所有链
- 可以向规则链中加入很多规则,数据包进入该链时,从上向下匹配,一旦匹配就停止,开始应用规则。如果全都不匹配,则应用默认规则
- 命令选项、链名、目标操作使用大写字母,其他小写
目标操作:
ACCEPT:允许通过/放行
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志,然后传给下一条规则(不会匹配即停止)
常用选项:
规则管理示例
- 可以设置默认拒绝,然后明确允许
- 也可以设置默认允许,然后明确拒绝
1)向INPUT链追加规则,192.168.4.254发来的包全部接受
[root@node1 ~]# iptables -A INPUT -s 192.168.4.254 -j ACCEPT
# -A是追加,-s是匹配源地址
# 将INPUT链的默认规则改为DROP丢弃。-P设置默认规则
[root@node1 ~]# iptables -P INPUT DROP
# 查看INPUT链的规则
[root@node1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 192.168.4.254 anywhere
# 在192.168.4.10上访问node1,将会被拒绝
[root@prometheus ~]# ping -c2 192.168.4.11
[root@prometheus ~]# ssh 192.168.4.11
# 注意,数据通信多数是多向的。现在node1也不能与192.168.4.254以外的其他机器通信,因为数据回不来。
[root@node1 ~]# ping -c2 192.168.4.10 # 失败
2)允许192.168.4.0网络的主机ssh连接node1
# -I是插入到INPUT链的第1个位置。-p指定协议,--dport指定目标端口号。-j是执行的操作
[root@node1 ~]# iptables -I INPUT 1 -s 192.168.4.0/24 -p tcp --dport 22 -j ACCEPT
# 查看规则
[root@node1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.4.0/24 anywhere tcp dpt:ssh
ACCEPT all -- 192.168.4.254 anywhere
# 查看规则,n是指用数字来表示端口号、主机等
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.4.254 0.0.0.0/0
# 测试,192.168.4.10已经可以ssh到node1,但是ping不通,因为只允许了ssh
3)配置任何地址访问node1的80端口,即http协议,都接受
# 不指定源,就是任何源
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.4.254 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4)拒绝192.168.4.254 ping node1
# 以下写法不会生效,因为插入到了规则尾部,在它上面已经存在允许192.168.4.254通信的规则了
[root@node1 ~]# iptables -A INPUT -s 192.168.4.254 -p icmp -j REJECT
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 192.168.4.254 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
REJECT icmp -- 192.168.4.254 0.0.0.0/0 reject-with icmp-port-unreachable
# 查看规则的行号
[root@node1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
2 ACCEPT all -- 192.168.4.254 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4 REJECT icmp -- 192.168.4.254 0.0.0.0/0 reject-with icmp-port-unreachable
# 删除第4条规则
[root@node1 ~]# iptables -D INPUT 4
[root@node1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
2 ACCEPT all -- 192.168.4.254 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
# 拒绝192.168.4.254 ping node1。-I不指定位置,默认插到最上面
[root@node1 ~]# iptables -I INPUT -s 192.168.4.254 -p icmp -j REJECT
[root@node1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 REJECT icmp -- 192.168.4.254 0.0.0.0/0 reject-with icmp-port-unreachable
2 ACCEPT tcp -- 192.168.4.0/24 0.0.0.0/0 tcp dpt:22
3 ACCEPT all -- 192.168.4.254 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5)保存规则
# 保存规则。不保存规则,重启iptables服务,自定义规则将消失
[root@node1 ~]# service iptables save
filter过滤和转发控制
主机型防火墙,主要保护的是服务器本机(过滤威胁本机的数据包)。
网络防火墙,主要保护的是防火墙后面的其他服务器,如web服务器、FTP服务器等
iptables防火墙可以根据很多规则进行过滤行为
环境准备
配置各自机器的ip地址
# 为node1的eth1配置ip地址,同理eth0ip地址4.10
[root@node1 ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.2.11/24
[root@node1 ~]# nmcli connection down eth1
[root@node1 ~]# nmcli connection up eth1
为192.168.4.10和192.168.2.100配置网关
[root@client1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.11
[root@client1 ~]# ifdown eth0; ifup eth0
[root@server1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.2.11
[root@server1 ~]# ifdown eth1; ifup eth1
在中间节点node1上打开路由转发功能
[root@node1 ~]# sysctl -a | grep ip_forward
[root@node1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@node1 ~]# sysctl -p
# client和server已经可以通信
[root@client1 ~]# ping -c2 192.168.2.100
在server1上安装httpd服务
[root@server1 ~]# yum install -y httpd
[root@server1 ~]# systemctl start httpd
# 在客户端访问web服务,可以访问
[root@client1 ~]# curl http://192.168.2.100/
配置FORWARD链
要求:在node1上配置防火墙,保护server1
- 默认拒绝所有数据包通过
- 从server1发往client1的包全部允许
- 从client1到server1,允许icmp,允许22、80、443端口通过
# 默认拒绝所有数据包通过,此时client1和server1完全不通 [root@node1 ~]# iptables -P FORWARD DROP # 源地址是192.168.2.0/24,目标地址是192.168.4.0/24的包,放行 [root@node1 ~]# iptables -A FORWARD -s 192.168.2.0/24 -d 192.168.4.0/24 -j ACCEPT # 从client1到server1,允许icmp [root@node1 ~]# iptables -A FORWARD -s 192.168.4.0/24 -d 192.168.2.0/24 -p icmp -j ACCEPT # client1和server1已经可以ping通了 [root@client1 ~]# ping -c2 192.168.2.100 # 允许从client1访问server1的22、80、443,100-120端口范围 # -m是引入扩展模块,multiport多端口 [root@node1 ~]# iptables -A FORWARD -p tcp -m multiport --dport 22,80,443,100:120 -s 192.168.4.0/24 -j ACCEPT # 现在从client1到server1的ssh、http都可以放行了 [root@client1 ~]# ssh 192.168.2.100 [root@client1 ~]# curl http://192.168.2.100/
拓展匹配
前提条件
- 有对应的防火墙模块支持
基本用法
- -m 拓展模块 —拓展条件 条件值
拒绝192.168.2.100-192.168.2.200访问192.168.4.50-192.168.4.60
# -m是引入扩展模块,src-range是源地址范围,dst-range目标地址范围
[root@node1 ~]# iptables -A FORWARD -m iprange --src-range 192.168.2.100-192.168.2.200 --dst-range 192.168.4.50-192.168.4.60 -j REJECT
nat表典型应用
NAT转换原理
- NAT:网络地址翻译、网络地址转换
- NAT技术产生,主要是解决IPV4地址不够用。
- NAT一般用于将私有地址转成全球唯一的公有地址。
- 私有地址:
- A类:10.x.x.x
- B类:172.16.x.x-172.31.x.x
- C类:192.168.x.x
- 私有地址,如果需要访问互联网中的公有地址,进行上网,可以通过NAT技术,将私有地址转成公有地址,再访问外界
从局域网访问互联网的时候
- 源地址为私有地址
- 需要SNAT源地址转换(Source Network Address Translation)才能访问外网
- 修改数据包的源地址
- 仅用于nat表的POSTROUTING链
SNAT策略应用
- 现在的实验环境,client1可以访问server1,server1看到的是客户端地址是client1的地址。
```shell
跟踪httpd日志的尾部
[root@server1 ~]# tail -f /var/log/httpd/access_log
在client上访问server1的web服务
[root@client1 ~]# curl http://192.168.2.100/
查看服务器终端的日志,将会显示client1的地址192.168.4.10访问了它
192.168.4.10 - - [13/Oct/2021:17:31:35 +0800] “GET / HTTP/1.1” 403 4897 “-“ “curl/7.29.0”
- 互联网环境下,运营商不允许私有地址出现在互联网上,发现有这样的数据,就直接丢弃。所以,私有地址发往互联网时,需要用NAT转换成公有地址,也叫合法地址。
- 在我们的练习环境下,在node1上配置NAT,当client1访问server1时,将client1的地址转换成server1的192.168.2.x再发给server1。因为数据包的源地址改变了,所以叫SNAT,S即Source。
```shell
# 向nat表中的POSTROUTING链添加规则。将源地址192.168.4.0/24转换成它外网卡地址。
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
[root@node1 ~]# iptables -t nat -nL
# client1再次访问server1时,server1上的日志将会显示node1的192.168.2.11访问
[root@server1 ~]# tail -f /var/log/httpd/access_log
192.168.2.11 - - [13/Oct/2021:17:45:07 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"