监控与服务安全

监控概述

对服务的管理,不能能仅限于可用性。
还需要服务可以安全、稳定、高效的运行
监控的目的

  • 提前发现问题
    • 进行服务器性能调整前,知道调整什么
    • 找出系统的瓶颈在什么地方
  • 报告系统运行状况
    • 每一部分必须同时监控
    • 内容包括吞吐量、反应时间、使用率等

监控的资源类型

  • 公开数据
    • 对外开放的,不需要认证即可获得的数据
    • Web、FTP、SSH、数据库等应用服务
    • TCP或UDP端口
  • 私有数据
    • 对外不开放,需要认证、权限才可获得的数据
    • CPU、内存、磁盘、网卡流量等使用信息
    • 用户、进程等运行信息

      系统监控命令

      | ps | free | df -h | netstat或ss | traceroute | | —- | —- | —- | —- | —- | | uptime | swapon -s | ifconfig | ping | iostat |
  1. # uptime可以查看系统已经运行了多久。最后的3个数字分别是CPU最近1分钟、5分钟、15分钟的平均负载。平均负载的值,不应该大于总核心数。
  2. [root@zzgrhel8 ~]# uptime
  3. 09:28:25 up 53 days, 27 min, 0 users, load average: 0.09, 0.08, 0.03
  4. [root@zzgrhel8 ~]# free -m # 主要用于查看内存
  5. [root@zzgrhel8 ~]# swapon -s # 查看swap空间
  6. [root@zzgrhel8 ~]# df -h # 查看硬盘使用情况
  7. [root@zzgrhel8 ~]# ping -c2 www.baidu.com # 发2个包,测试网络

自动化监控系统

Cacti

  • 基于SNMP协议的监控软件,强大的绘图能力

Nagios

  • 基于Agent监控,强大的状态检查与报警机制
  • 插件极多,自己写监控脚本嵌入到Nagios非常方便

Zabbix

  • 基于多种监控机制,支持分布式监控

    Centos7之Systemd(Service文件)详解


Zabbix监控服务器

zabbix基础

  • zabbix是一个高度集成的监控解决方案
    • 可以实现企业级的开源分布式监控
    • 通过C/S模式采集监控数据,B/S模式实现Web管理
  • zabbix通过在远程主机上安装agent进行数据采集,存储到mysql数据库,通过web页面进行展示。
  • 实施监控的几个方面:
    • 数据采集:使用agent(可安装软件的系统上)、SNMP(简单网络管理协议,用于网络设备的数据采集)
    • 数据存储:使用mysql数据库
    • 数据展示:通过web页面
  • 监控服务器(需要使用Web页面操作,因此需要先部署LNMP)
    • 监控服务器可以通过SNMP或Agent采集数据
    • 数据可以写入MySQL、Oracle等数据库中
    • 服务器使用LNMP实现web前端的管理
  • 被监控主机
    • 被监控主机需要安装Agent
    • 常见的网络设备一般支持SNMP

      zabbix安装image.png

      zabbix server、zabbix agent、zabbix proxy 配置文件

      部署Zabbix监控平台步骤

  1. 安装LNMP环境
  2. 源码安装Zabbix
  3. 安装监控端主机,修改基本配置
  4. 初始化Zabbix监控Web页面
  5. 修改PHP配置文件,满足Zabbix需求
  6. 安装被监控端主机,修改基本配置

    环境准备

    使用1台Linux虚拟机,安装部署LNMP环境、Zabbix及相关的依赖包,配置数据库并对Zabbix监控平台进行初始化操作。使用2台Linux被监控端,源码安装Zabbix Agent。
    image.png

  7. 配置好ip地址和主机名

  8. 关闭SELINUX和防火墙
  9. 配置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服务
    # 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查看进程是以什么用户的身份启动的
    
    通过创建service文件管理zabbix服务。
    [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

image.pngimage.png
根据上面红色报错,解决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页,进行配置
image.png
image.pngimage.png
image.png
在登陆页面,使用用户(admin)和密码(zabbix)登陆,登陆后设置语言环境为中文
image.png

Zabbix监控服务

image.png

监控基础

  • 主机:安装了agent,被监控的主机
  • 主机组:根据需求,将多台主机加入到一个主机组中,方便管理。系统默认已经创建了一些主机组。
  • 模板:是监控项的集合。将模板应用到主机,主机就可以直接拥有模板中的所有监控项。

    配置及使用Zabbix监控系统(web1服务器)

    使用Zabbix监控平台监控Linux服务器,实现以下目标:
  1. 监控CPU
  2. 监控内存
  3. 监控进程
  4. 监控网络流量
  5. 监控硬盘

    1)修改zabbix客户端配置

  • 修改语言
    • image.pngimage.png
  • 启用监控自身
    • image.png

      2)配置zabbix监控web1服务器

      ```shell

      监控端(zabbix server)和被控端使用的软件是同一个,只是启用不同的功能

      [root@zabbixserver ~]# scp lnmp_soft/zabbix-3.4.4.tar.gz 192.168.4.100:/root

安装编译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(创建模板),填写模板名称,新建模板群组
image.png

  • 创建应用集

创建完成模板后,默认模板中没有任何应用集、监控项、触发器、图形等资源。这里需要点击模板后面的Application(应用集)链接打开创建应用集的页面
image.png
点击Application(应用集)后,在该页面中点击Create application(创建应用集)按钮
image.png
设置应用集名称,名称可以任意
image.png

  • 创建监控项目item(监控项)

与创建应用集一样,在模板中还需要创建监控项目,点击items(监控项),并在刷新出的新页面中选择Create items(创建监控项)创建项目。
image.png

  • 将模板链接到被监控主机

将完整的监控模板制作完成后,就可以将模板链接到主机实现监控功能了。首先找到被监控主机Configuration(配置)—>Hosts(主机)
image.png
查看结果

  • 注意,刚应用的模板,不会立即取得数据,需要等一会

image.png

Zabbix报警机制

  • 默认情况下,监控项不会自动发送告警消息
  • 需要配置触发器与告警,并且通过通知方式发送信息给联系人
  • 触发器:设置条件,当条件达到时,将会执行某个动作
  • 动作:触发器条件达到之后要采取的行为,比如发邮件或执行命令

    实现Zabbix报警功能

    沿用前面的Zabbix练习环境,使用Zabbix实现报警功能,实现以下目标:
  1. 监控Linux服务器系统账户数量
  2. 创建Media,设置邮件服务器及收件人邮箱
  3. 当系统账户数量超过35人时发送报警邮件

    1)创建触发器规则

    通过Configuration(配置)—> Templates(模板),找到我们之前创建的count.line.passwd模板,点击模板后面的triggers(触发器)
    image.png
    image.png

    • 创建名为password_line_gt_35的触发器

image.png
创建触发器时需要定义表达式,触发器表达式(Expression)是触发异常的条件,
在如图所示的蓝色方框中编写触发器表达式,可以直接手写,也可以通过add选择表达式模板。
image.png
添加表达式之后的结果如下:
image.png
触发器表达式格式:{主机: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(邮件)
    image.png
    设置邮件服务器信息,设置邮件服务器及发件人邮件账户信息
    image.png
    为用户添加Media(设置收件人信息)
    在Administration(管理)—>Users(用户)中找到选择admin账户
    image.png
    image.png
    点击Add(添加)后,在Meida Type(类型)中填写报警类型,收件人,时间等信息
    image.png

    3)创建Action动作

  • Action(动作)是定义当触发器被触发时的时候,执行什么行为(当出现problem时,给admin发邮件)

通过Configuration(配置)—>Actions(动作)—>Create action(创建动作),注意事件源选择触发器
image.png
配置Action动作的触发条件
image.png
配置Action动作的具体行为
image.png image.png

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页面,在仪表盘中查看问题报警(需要等待一段时间)
image.png
image.png image.png
查看邮件

# 在zabbixserver上查看邮件
[root@zabbixserver ~]# mail
>N  1 zabbix@localhost.loc  Tue Nov  9 14:48  21/941   
# N表示未读,1是邮件编号
# 回车默认查看最新一封邮件
& q      # 退出

Zabbix进阶

Zabbix自动发现

  • 当被监控的设备非常多的时候,手工添加将会变得非常不方便
  • 可以使用自动批量添加一组监控主机功能
  • 自动发现可以实现:
    • 自动发现、添加主机,自动添加主机到组;
    • 自动连接模板到主机,自动创建监控项目与图形等
  • 自动发现流程:

    1. 创建自动发现规则
    2. 创建动作,当主机被发现之后,执行什么操作
    3. 通过动作,添加主机,将模板应用到发现的主机

      配置自动发现

      1)创建自动发现规则
      通过Configuration(配置)—>Discovery(自动发现)—>Create discovery rule(创建发现规则)
      image.png
      image.png
      2)创建动作
      通过Configuration(配置)—> Actions(动作)—> Actions Event source(事件源):自动发现(Discovery)—>Create action(创建动作)
      image.png
      配置动作,添加动作名称,添加触发动作的条件
      image.png
      点击操作(触发动作后要执行的操作指令),操作细节:添加主机到组
      image.png

      验证结果

      登陆Zabbix服务器的Web页面,查看主机列表,确认新添加的主机是否被自动加入监控主机列表。
      web2是通过ssh发现的,它上面还没有配置zabbix agent,所以即使发现了,也无法监控。需要在web2上配置agent。具体步骤可参照web1服务器配置。

      Zabbix主动监控

  • 默认zabbix使用的是被动监控,主被动监控都是针对被监控主机而言的。

  • 被动监控:Server向Agent发起请求,索取监控数据。此种模式常用
  • 主动监控:Agent向Server发起连接,向Server汇报
    • 区别:Server不用每次需要数据都连接Agent,Agent会自己收集数据并处理数据,Server仅需要保存数据即可
  • image.pngimage.png
  • 当监控主机达到一定量级后,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
    [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            #重启服务
    
    3)测试效果
    [root@web1 ~]# zabbix_get  -s 127.0.0.1 -k 'nginx.status[accepts]'
    
    登陆Zabbix监控Web,创建监控项目item,点击Configuration(配置)—>Hosts(主机),点击主机后面的items(监控项),点击Create item(创建监控项)。
    备注:Type(类型)后面的Zabbix agent中文是Zabbix 客户端。
    image.png

    监控网络连接状态

    1)查看网络连接状态
    模拟多人并发连接(如果没有ab命令,则安装httpd-tools软件包),查看网络连接状态
    [root@web1 ~]# ab -c 1000 -n 100000 http://192.168.2.100/
    [root@web1 ~]# ss -antup
    #-a显示所有
    #-t显示TCP连接状态
    #-u显示UDP连接状态
    #-n以数字形式显示端口号和IP地址
    #-p显示连接对应的进程名称
    
    2)创建自定义key
    编写自定义监控脚本
    [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
    
    注意:被监控端修改配置文件,注意要允许自定义key并设置Include参数
    [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
    
    3)测试效果
    [root@web1 ~]# zabbix_get  -s 127.0.0.1 -k 'net.status[time_wait]'
    
    在监控服务器,添加监控项目item,Configuration(配置)—>Hosts(主机)点击主机后面的items(监控项)
    点击Create item(创建监控项)
    image.png

Prometheus监控服务器

Prometheus概述

Prometheus是由 SoundCloud开源的监控报警解决方案。

  • 采用Go语言开发
  • prometheus是一款监控软件,也是一个时序数据库,存储的是时序数据
  • 数据带时间标签
  • 如<metric name>{
  • Prometheus主要用在监控容器数据,也可以监控常规主机
  • Prometheus重视高可用,如果您需要100%准确性、那么该软件不适合您,因为它所收集的数据可不会足够详细和完整
  • Prometheus是一个框架,可以与其他组件完美结合。

image.png

部署Prometheus

环境准备

所有主机系统均为CentOS7,提前配置IP、主机名、系统YUM源。
设置防火墙、SELinux。
image.png

部署监控服务器(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》查看主机
image.png
注意:promethues是时序监控软件,如果时间不一致,不能使用,可修改服务器时间(date -s)删除data文件重启服务。
查看具体监控数据,点击《Graph》,选择监控数据,如go_memstats_alloc_bytes,点击《Execute》
image.png
查看监控数据对应的监控图形,效果如图
image.png

部署被控端(192.168.4.11主机操作)

监控方式

  • Prometheus客户端分为pull和push两种提交数据的方式
  • Pull:服务端主动向客户端拉取数据,这样需要客户端上安装exporters(导出器)作为守护进程。
  • Push:客户端需要安装pushgateway插件,然后运维人员用脚本把监控数据组织成键值形式提交给pushgateway,再由它提交给服务端。

被监控端根据自身运行的服务,可以运行不同的exporter(被监控端安装的、可以与Prometheus通信,实现数据传递的软件)

  • exporter列表:

    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,查看监控主机列表
image.png
查看主机CPU监控数据
image.png

部署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。
      image.png
      有些浏览器问题,可能无法重置密码,如果无法重置密码,则可以设置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数据的步骤:
  1. 添加数据源
  2. 为数据展示选择展示方式(dashboard仪表盘)
  3. 查看结果

a.添加数据源(Add data source)
Grafana可以将数据图形化,那么数据从哪里来呢?
点击《Add data source》,选择从Prometheus获取数据
image.png
填写Prometheus基本信息
image.png
b.导入可视化模板
使用不同的可视化模板就可以将不同的数据进行图形化展示,下面导入prometheus图形化模板,选择《Prometheus 2.0 Stats》
image.png
image.png
查看监控效果
image.png

4)查看被监控主机的系统信息

a.导入主机监控的可视化模板(node_exporter模板)

模板文件在在第二阶段素材prometheus_soft.tar.gz中有提供
image.png
b.选择数据源
导入监控主机的可视化模板后,我们就可以查看主机的监控图形了,但是这个图形的数据从哪里获取呢,需要设置prometheus为数据源
image.png
返回Grafana首页,查看监控图形(dashboards)
image.png

prometheus监控数据库案例

使用prometheus监控MariaDB数据库

  1. 安装数据库
  2. 安装数据库exporter
  3. 配置数据库账户和密码
  4. 导入监控模板

    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数据库主机
    image.png
    b.访问Grafana导入数据库可视化模板(浏览器访问http://192.168.4.10:3000)。
    导入数据库可视化模板
    image.png
    设置数据源,数据来源于Prometheus
    image.png
    如果离开监控图形时提示保存监控图形,可以任意输入名称即可
    image.png

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)-[~]
    └─$
    

    扫描与抓包image.png

    安全分析概述

    image.png

    为什么需要扫描

    以获取一些公开/非公开信息为目的

  • 检测潜在的风险

  • 查找可攻击目标
  • 收集设备/主机/系统/软件信息
  • 发现可利用的安全漏洞

通常扫描是攻击的前奏。比如扫描到目标是什么系统、开放了哪些服务,这些服务是用何种软件的哪个版本实现的。

扫描方式及工具

典型的扫描方式

  • Scan,主动探测
  • Sniff,被动监听/嗅探
  • Capture,数据包捕获(抓包)

常见的安全分析工具

  • 扫描器:NMAP
  • 协议分析:tcpdump、WireShark

windows下,扫描windows系统的工具可以用xscan / superscan
常用的黑客网站:

  • 吾爱破解:https://www.52pojie.cn/
  • 中国黑客团队论坛:https://www.cnhackteam.org/

    NMAP扫描

  • 一款强大的网络探测利器工具

  • 最著名的网络渗透工具之一
  • 支持多种探测技术

    • ping 扫描
    • 多端口扫描、
    • TCP/IP指纹校验

      基本用法

      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
  1. 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
    #暴力破解密码
    
  2. 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
  1. 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服务器,进而传给数据库服务器以执行数据库命令。
  1. 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
  1. 暴力破解密码
    $ 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
选择抓哪块网卡进出的数据,然后点左上角的开始
image.png
抓到包后,点击左上角同样位置停止,查看数据
image.png


服务安全

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
    
  • 访问不存在的路径

image.png

  • 默认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
  • 再次访问不存在的路径,版本号消失

image.png

限制并发

  • 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

image.png

  • iptables有多种功能,每一种功能都用一张表来实现
  • 最常用的功能是防火墙和NAT
  • 从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然调用iptables

    iptables防火墙

    iptables基础知识详解

    iptables的表链结构

    iptables的4个表(区分大小写)

  • nat表(地址转换表)

  • filter表(数据过滤表)
  • raw表(状态跟踪表)
  • mangle表(包标记表)

image.png

iptables的5个链(区分大小写)

  • INPUT链(入站规则)
  • OUTPUT链(出站规则)
  • FORWARD链(转发规则)
  • PREROUTING链(路由前规则)
  • POSTROUTING链(路由后规则)

    防火墙filter表

    image.png
    filter表中的三条链

  • INPUT:数据包的目标地址是自己,则进入INPUT链

  • OUTPUT:数据包的源地址是自己,则进入OUTPUT链
  • FORWARD:数据包穿过自己,则进入FORWARD链

    包过滤匹配流程

  • 规则链内的匹配顺序

    • 顺序比对,匹配即停止(LOG除外)
    • 若无任何匹配,则按该链的默认策略处理

      iptables用法解析

      iptables基本用法

      iptables [-t 表名] 选项 [链名] [条件] [-j 目标操作]
说明 支持的链
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:记录日志,然后传给下一条规则(不会匹配即停止)
常用选项:
image.png

规则管理示例

  • 可以设置默认拒绝,然后明确允许
  • 也可以设置默认允许,然后明确拒绝

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服务器等
image.png
iptables防火墙可以根据很多规则进行过滤行为
image.png

环境准备

image.png
配置各自机器的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

  1. 默认拒绝所有数据包通过
  2. 从server1发往client1的包全部允许
  3. 从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 拓展模块 —拓展条件 条件值

image.png
拒绝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链

image.pngimage.png

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"