云计算第二阶段:----监控与服务安全SECURITY

本模块内容,主要讲述 服务器的安全防护与配置软件相关知识。分为网络防护软件介绍、配置与使用,网络安全相关知识浅度解析。

涉及软件有prometheus ,graphna,zabbix。

网络安全方面涉及基于debian linux系统的kali版本liunx的介绍与简单使用。


SECURITY DAY1

环境准备:

主机名地址
zabbixserver192.168.88.5/24
web1192.168.88.100/24
web2192.168.88.200/24

一、zabbix基础配置

监控概述

  • 对服务的管理,不能仅限于可用性。

  • 还需要服务可以安全、稳定、高效地运行。

  • 监控的目的:早发现、早治疗。

  • 被监控的资源类型:

    • 公开数据:对外开放的,不需要认证即可获取的数据
    • 私有数据:对外不开放,需要认证、权限才能获得的数据

zabbix

  • 实施监控的几个方面:

    • 数据采集:使用agent(可安装软件的系统上)、SNMP(简单网络管理协议,用于网络设备的数据采集)
    • 数据存储:使用mysql数据库
    • 数据展示:通过web页面
  • zabbix通过在远程主机上安装agent进行数据采集,存储到mysql数据库,通过web页面进行展示。

安装zabbix 6.0

# 1. 拷贝zabbix软件包到pubserver 目录的 /var/ftp/rpms  位置
# 2. 更新yum仓库配置
[root@pubserver ~]# createrepo -v /var/ftp/rpms/
# 3. 在pubserver上创建ansible工作环境
[root@pubserver ~]# mkdir -p zabbix/files
[root@pubserver ~]# cd zabbix/
[root@pubserver zabbix]# vim ansible.cfg 
[defaults]
inventory = inventory
host_key_checking = false

[root@pubserver zabbix]# vim inventory 
[zabbix]
zabbixserver ansible_host=192.168.88.5

[webservers]
web1 ansible_host=192.168.88.100
web2 ansible_host=192.168.88.200

[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a

# 4. 为各台主机配置yum
[root@pubserver zabbix]# vim files/local88.repo 
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0

[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0

[root@pubserver zabbix]# vim 01-upload-repo.yml 
---
- name: config repos.d
  hosts: all
  tasks:
    - name: delete repos.d
      file:
        path: /etc/yum.repos.d
        state: absent

    - name: create repos.d
      file:
        path: /etc/yum.repos.d
        state: directory
        mode: '0755'

    - name: upload local88
      copy:
        src: files/local88.repo
        dest: /etc/yum.repos.d/
[root@pubserver zabbix]# ansible-playbook 01-upload-repo.yml 

# 5. 在zabbixserver上安装相应软件包
[root@pubserver zabbix]# vim 02-inst-zabbix.yml
---
- name: install zabbix
  hosts: zabbix
  tasks:
    - name: install zabbix    # 安装软件包
      yum:
        name:
          - zabbix-server-mysql
          - zabbix-web-mysql
          - zabbix-nginx-conf
          - zabbix-sql-scripts
          - zabbix-selinux-policy
          - zabbix-agent
          - mysql-server
          - langpacks-zh_CN
        state: present
[root@pubserver zabbix]# ansible-playbook 02-inst-zabbix.yml

# 6. 启动mysqld服务
[root@pubserver zabbix]# vim 03-start-mysqld.yml
---
- name: config mysqld
  hosts: zabbix
  tasks:
    - name: start mysqld      # 启动mysqld服务
      service:
        name: mysqld
        state: started
        enabled: yes
[root@pubserver zabbix]# ansible-playbook 03-start-mysqld.yml 

# 7. 在zabbix上创建连接数据库的用户
[root@zabbixserver ~]# mysql
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;
# 在binlog日志开启的情况下,打开函数生成器
mysql> set global log_bin_trust_function_creators = 1;
mysql> create user zabbix@localhost identified by 'zabbix';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> quit;

# 8. 验证数据库配置,如果登陆不到数据库表示上一步配置不正确
[root@zabbixserver ~]# mysql -uzabbix -pzabbix -hlocalhost zabbix

# 9. 在数据库中创建表并导入数据
[root@zabbixserver ~]# cp /usr/share/zabbix-sql-scripts/mysql/server.sql.gz .
[root@zabbixserver ~]# gzip -d server.sql.gz 
[root@zabbixserver ~]# mysql -uzabbix -pzabbix zabbix < server.sql

# 10. 配置zabbix_server
[root@zabbixserver ~]# vim +129 /etc/zabbix/zabbix_server.conf
DBPassword=zabbix

# 11. 配置zabbix_agent
[root@zabbixserver ~]# vim /etc/zabbix/zabbix_agentd.conf 
182 Hostname=zabbixserver

# 12. 配置nginx展示zabbix
[root@zabbixserver ~]# vim /etc/nginx/conf.d/zabbix.conf
# 打开第2、3行的注释,结果如下所示:
server {
        listen          8080;
        server_name     example.com;
...以下省略...

# 13. 启动相关服务
[root@pubserver zabbix]# vim 04-start-zabbix.yml 
---
- name: config zabbix
  hosts: zabbix
  tasks:
    - name: start service    # 循环启动多个服务
      service:
        name: "{{item}}"
        state: started
        enabled: yes
      loop:
        - zabbix-server
        - zabbix-agent
        - nginx
        - php-fpm
[root@pubserver zabbix]# ansible-playbook 04-start-zabbix.yml 
访问zabbixserver的8080端口,进行初始化

密码也是:zabbix

这个用户和密码是zabbix网页的。

二、zabbix 监控服务使用

在web1上安装agent
# 1. 安装agent
[root@pubserver zabbix]# vim 05-inst-agent.yml
--- 
- name: install agent
  hosts: webservers
  tasks:
    - name: install agent    # 安装agent
      yum:
        name: zabbix-agent
        state: present
[root@pubserver zabbix]# ansible-playbook 05-inst-agent.yml 

# 2. 修改web1配置文件
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.conf 
117 Server=127.0.0.1,192.168.88.5
182 Hostname=web1

# 3. 起动服务
[root@pubserver zabbix]# vim 06-start-agent.yml 
---
- name: config agent
  hosts: web1
  tasks:
    - name: start agent      # 启动服务
      service:
        name: zabbix-agent
        state: started
        enabled: yes
[root@pubserver zabbix]# ansible-playbook 06-start-agent.yml 
在web页面中添加对web1的监控
主机:安装了agent,被监控的主机
主机组:根据需求,将多台主机加入到一个主机组中,方便管理。系统默认已经创建了一些主机组。
模板:是监控项的集合。将模板应用到主机,主机就可以直接拥有模板中的所有监控项。系统中默认已经创建了一些模板。

常用监控指标
Space utilization:以百分比显示的磁盘利用率
Used space:已用磁盘空间
Available memory:可用内存
CPU idle time:CPU空闲时间。不宜过低。
Load average (1m avg)、Load average (5m avg)、Load average (15m avg):CPU1分钟、5分钟、15分钟的平均负载。这个值不应长期大于核心数。
Interface eth0: Bits received:网卡接收到的数据量
Interface eth0: Bits sent:网卡发送的数据量
Number of processes:系统运行的进程数
Number of logged in users:已登陆的用户数
自定义监控项
实现监控web1用户数量的监控项
在被控端创建key。被控端被监控的内容叫作key,可以理解为它就是一个变量名,具体的名字自己决定。
在web页面中创建监控项。监控项对应key值。

在被控端创建key

语法
UserParameter=自定义key值,命令
# 命令的执行结果,是key的value
创建自定义配置文件。文件名自定义。
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/usercnt.conf
UserParameter=usercnt,sed -n '$=' /etc/passwd
[root@web1 ~]# systemctl restart zabbix-agent.service 
验证自定义监控项
# 1. 安装zabbix-get
[root@zabbixserver ~]# yum install -y zabbix-get
[root@web1 ~]# yum install -y zabbix-get

# 2. 获取监控项的值
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k usercnt
46
[root@zabbixserver ~]# zabbix_get -s 192.168.88.100 -k usercnt

创建模版

  • 创建监控项
  • 应用模板到主机
  • 查看结果

三、总结

zabbix配置时,需要注意配置主机的监控项和触发器。

新建动作时,类型分为Trigger 触发器类型,autoregistration 自动注册,internal 内部触发。

抽象来说:好比一个3D动画捕捉演员。


SECURITY DAY2

一、zabbix报警机制

配置告警

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

用户数超过50,发送告警邮件

  • 当web1的用户数超过50时,认为这是一个问题(Problem)
  • 当出现问题时,将会执行动作。
  • 执行的动作是给管理员发邮件。
  • 给管理员发邮件,还要配置邮件服务器的地址,以及管理员的email地址
实施
  • 创建触发器规则

  • 创建邮件类型的报警媒介

验证告警配置
在zabbixserver上配置邮件服务
# 配置postfix邮件服务和mailx邮件客户端
[root@pubserver zabbix]# vim 07-config-mail.yml
---
- name: config mail
  hosts: zabbix
  tasks:
    - name: install mail     # 安装postfix和mailx
      yum:
        name: postfix,mailx
        state: present
        
    - name: start postfix    # 启动邮件服务postfix
      service:
        name: postfix
        state: started
        enabled: yes
[root@pubserver zabbix]# ansible-playbook 07-config-mail.yml
在web1创建用户,使总用户数超过50
[root@web1 ~]# for user in user{1..5}
> do
> useradd $user
> done
在zabbix web页面中查看

在zabbixserver上查看邮件
[root@zabbixserver ~]# mail   # 查看邮件
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N  1 zzg@tedu.cn           Sat Dec 31 16:47  21/932   "Problem: usercnt_gt_50"
 N  2 zzg@tedu.cn           Sat Dec 31 16:48  21/932   "Problem: usercnt_gt_50"
& 1   # 查看1号邮件
Message  1:
From zzg@tedu.cn  Sat Dec 31 16:47:59 2022
Return-Path: <zzg@xixi.cn>
X-Original-To: root@localhost.localdomain
Delivered-To: root@localhost.localdomain
From: <zzg@xixi.cn>
To: <root@localhost.localdomain>
Date: Sat, 31 Dec 2022 16:47:59 +0800
Subject: Problem: usercnt_gt_50
Content-Type: text/plain; charset="UTF-8"
Status: R

Problem started at 16:47:56 on 2022.12.31
Problem name: usercnt_gt_50
Host: web1
Severity: Warning
Operational data: 51
Original problem ID: 102
& q   # 输入q退出

二、zabbix 进阶操作

配置自动发现

  • 在web2上配置agent
[root@web2 ~]# vim /etc/zabbix/zabbix_agentd.conf 
117 Server=127.0.0.1,192.168.88.5
182 Hostname=web2
[root@web2 ~]# systemctl enable zabbix-agent.service --now

主动监控


默认zabbix使用的是被动监控,主被动监控都是针对被监控主机而言的。
被动监控:Server向Agent发起请求,索取监控数据。此种模式常用
主动监控:Agent向Server发起连接,向Server汇报

配置web2使用主动监控
修改配置文件,只使用主动监控
[root@web2 ~]# vim /etc/zabbix/zabbix_agentd.conf 
117 # Server=127.0.0.1,192.168.88.5
142 StartAgents=0
171 ServerActive=192.168.88.5
242 RefreshActiveChecks=120

# 重启服务
[root@web2 ~]# systemctl restart zabbix-agent.service 
[root@web2 ~]# ss -tlnp | grep :10050  # 端口号消失

三、监控案例解析

配置钉钉机器人告警

创建钉钉机器人

机器人名称自己写一个,提示关键词为warn  

注意上面的Webhook地址,不要泄露,谁拥有此地址,谁就可以控制机器人说话。

编写脚本并测试
# 安装钉钉机器人脚本需要用到的模块
[root@zabbixserver ~]# yum install -y python3-requests

#windows运行不了,直接就下 python-3。说明依赖软件不太够。

# 编写钉钉机器人脚本
[root@zabbixserver ~]# vim /usr/lib/zabbix/alertscripts/dingalert.py 
#!/usr/bin/env python3   

import json
import requests
import sys

def send_msg(url, remiders, msg):
    headers = {'Content-Type': 'application/json; charset=utf-8'}
    data = {
        "msgtype": "text",
        "at": {
            "atMobiles": remiders,
            "isAtAll": False,
        },
        "text": {
            "content": msg,
        }
    }
    r = requests.post(url, data=json.dumps(data), headers=headers)
    return r.text

if __name__ == '__main__':
    msg = sys.argv[1]
    remiders = []
    url = '钉钉机器人Webhook地址'  # 注意此处需输入机器人的webhook地址
    print(send_msg(url, remiders, msg))
    
[root@zabbixserver ~]# chmod +x /usr/lib/zabbix/alertscripts/dingalert.py

[root@zabbixserver ~]# /usr/lib/zabbix/alertscripts/dingalert.py 'warn: 测试消息'    # 注意消息中要包含关键字warn
{"errcode":0,"errmsg":"ok"}

验证

创建用户,使用户数超过55 ,太大了就把条件设小点。
[root@web1 ~]# for user in user{6..10}; do useradd $user; done
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k usercnt
56

添加报警媒介类型

监控Nginx


stub_status模块
用于实时监控nginx的网络连接,这个模块是nginx官方提供的一个模块。
配置nginx
[root@pubserver zabbix]# vim 08-config-nginx.yml
---
- name: config nginx
  hosts: webservers
  tasks:
    - name: install nginx   # 安装nginx
      yum:
        name: nginx
        state: present

    - name: start nginx     # 启动nginx
      service:
        name: nginx
        state: started
        enabled: yes
[root@pubserver zabbix]# ansible-playbook 08-config-nginx.yml 

# 修改配置文件,启用stub_status功能
[root@web1 ~]# vim /etc/nginx/nginx.conf
...略...
 47         location / {
 48         }
 49 
 50         location /status {   # 在此处添加3行
 51             stub_status on;
 52         }   
 53         
 54         error_page 404 /404.html;
 55             location = /40x.html {
 56         }
 ...略...
[root@web1 ~]# systemctl restart nginx
 
# 访问监控页面
[root@zabbixserver ~]# curl http://192.168.88.100/status
Active connections: 1 
server accepts handled requests
 2 2 2 
Reading: 0 Writing: 1 Waiting: 0 
# Active connections:当前客户端与nginx之间的连接数。它等于下面Reading / Writing / Waiting之和
# accepts:自nginx启动之后,客户端访问的总量
# handled:自nginx启动之后,处理过的客户端连接总数,通常等于accepts的值。
# requests:自nginx启动之后,处理过的客户端请求总数。
# Reading:正在读取客户端的连接总数。
# Writing:正在向客户端发送响应的连接总数。
# Waiting:空闲连接。

# 使用工具向服务器发起多个请求
[root@zabbixserver ~]# yum install -y httpd-tools
# 一共发1000个请求,每次并发数200
[root@zabbixserver ~]# ab -n1000 -c200 http://192.168.88.100/
[root@zabbixserver ~]# curl http://192.168.88.100/status
Active connections: 1 
server accepts handled requests
 1097 1097 1003 
Reading: 0 Writing: 1 Waiting: 0 
编写脚本,用于获取各项数据
[root@web1 ~]# vim /usr/local/bin/nginx_status.sh
#!/bin/bash

case $1 in
active)
    curl -s http://192.168.88.100/status | awk '/Active/{print $NF}';;
waiting)
    curl -s http://192.168.88.100/status | awk '/Waiting/{print $NF}';;
accepts)
    curl -s http://192.168.88.100/status | awk 'NR==3{print $1}';;
esac

[root@web1 ~]# chmod +x /usr/local/bin/nginx_status.sh
[root@web1 ~]# nginx_status.sh active
1
[root@web1 ~]# nginx_status.sh accepts
1099
[root@web1 ~]# nginx_status.sh waiting
0
创建zabbix用到的key,获取各项数据
# key的语法格式
UserParameter=key[*],<command> $1
# key[*]中的*是参数,将会传给后面的位置变量$1

# 创建声明key的文件
[root@web1 ~]# vim /etc/zabbix/zabbix_agentd.d/nginx_status.conf
UserParameter=nginx_status[*],/usr/local/bin/nginx_status.sh $1

# 测试
[root@web1 ~]# systemctl restart zabbix-agent.service 
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[active]
1
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[waiting]
0
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k nginx_status[accepts]
1103

四、总结

监控的目的是:报告系统的运行情况,提前发现问题。O(∩_∩)O

监控类别:

公有:FTP,WEB,数据库,SSH远程连接服务等

私有:机器的CPU、内存、磁盘、网卡流量、用户、进程运行信息等

zabbix基于分布式监控。cacti 基于snmp协议。 nagios 基于agent。


SECURITY DAY3

一、prometheus监控服务器

该节内容为大家带来另外一款性价比较高的监控软件,promethueus(普罗米修斯)。

        该软件命名起源于古希腊故事,普罗米修斯盗取天火返回人间,被众神之王宙斯发现,进而被惩罚的故事,感兴趣的可以去搜一下看看。

Prometheus概述

  • Prometheus是一个开源系统监控和警报工具包,最初由 SoundCloud构建。
  • 适用于高可用集群搭建方式,不能保证数据100%的完整性,是一种时序型数据库。(即数据带时间标签的数据库)
  • 第四阶段,可以和K8s软件联动。
  • 这是网页的官网页面。
  • 也是一款监控软件,也是一个时序数据库。Prometheus 将其指标收集并存储为时间序列数据,即指标信息与记录时的时间戳以及称为标签的可选键值对一起存储。
  • 主要用在容器监控方面,也可以用于常规的主机监控。
  • 使用google公司开发的go语言编写。(一门新兴的编程语言,会成为以后的发展新热点
  • Prometheus是一个框架,可以与其他组件完美结合。

套用模版后,会非常美观专业。

与zabbix 监控的区别:

        普罗米修斯靠配置文件,来管理被控节点。zabbix靠主控制服务器,来监测脚本服务。

二、prometheeus被监控端配置

        接下来,可以跟着配置一下该监控软件,用到的测试虚拟机环境。

部署Prometheus服务器
环境说明:配置好主机名和它的对应IP
Prometheus:192.168.88.5
web1:192.168.88.100
配置时间

为什么要配置时区呢?

        因为监控软件,想要起到监控作用,必须和相应 的web服务器时区时间保持一致,不然就算安装了软件,写好了配置文件,也会因为时间地点不同步,而造成重要监控数据的丢失。

时间同步配置路径: vim /etc/chrony.conf
# 1. 查看时区
[root@prometheus ~]# timedatectl 
               Local time: Sun 2023-01-01 11:15:11 CST
           Universal time: Sun 2023-01-01 03:15:11 UTC
                 RTC time: Sun 2023-01-01 03:15:11
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

# 2. 如果时区不正确,则改为正确的时区
[root@prometheus ~]# timedatectl set-timezone Asia/Shanghai

# 3. 查看时间
[root@prometheus ~]# date

# 4. 如果时间不正确,则改为正确的时间
[root@prometheus ~]# date -s "年月日 时:分:秒"
安装Prometheus服务器
拷贝Prometheus相关软件包到服务器
解压即部署

[root@prometheus ~]# cd prometheus_soft/
[root@prometheus prometheus_soft]# tar xf prometheus-2.37.5.linux-amd64.tar.gz 
[root@prometheus prometheus_soft]# mv prometheus-2.37.5.linux-amd64 /usr/local/prometheus
#解压的软件包,移动或复制到相应的软件存放路径。

配置文件

配置文件中包含三个配置块:globalrule_files和scrape_configs。
  global块控制 Prometheus 服务器的全局配置。我们有两个选择。第一个,scrape_interval控制 Prometheus 抓取目标的频率。

        您可以为单个目标覆盖它。在这种情况下,全局设置是每 15 秒抓取一次。该evaluation_interval选项控制 Prometheus 评估规则的频率。Prometheus 使用规则来创建新的时间序列并生成警报。
rule_files块指定我们希望 Prometheus 服务器加载的任何规则的位置。现在我们还没有规则。
最后一个块,scrape_configs控制 Prometheus 监控的资源。由于 Prometheus 还将有关自身的数据公开为 HTTP 端点,因此它可以抓取和监控自身的健康状况。在默认配置中,有一个名为 的作业prometheus,用于抓取 Prometheus 服务器公开的时间序列数据。该作业包含一个单一的、静态配置的目标,即localhost的9090端口。Prometheus期望度量在/metrics路径上的目标上可用,所以这个默认作业是通过 URL 抓取的:http://localhost:9090/metrics。
          #9090是该软件的默认端口

编写服务启动文件并启动服务        #在第二阶段的,operation模块的最后一部门讲过,怎么配置一个软件的服务 配置文件。

[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

# 启动服务
[root@prometheus prometheus_soft]# systemctl daemon-reload 
[root@prometheus prometheus_soft]# systemctl enable prometheus.service --now
[root@prometheus prometheus_soft]# ss -tlnp | grep :9090
LISTEN 0      128                *:9090             *:*    users:(("prometheus",pid=4396,fd=7))   

访问web页面:http://192.168.88.5:9090/

  • 查看监控自身的数据,如分配置给Prometheus运行的内存数量

              

                       

添加被监控端
监控方式有以下几种:

拉取:pull。监控端联系被监控端,采集数据
推送:push。被监控端主动把数据发给监控端。在prometheus中,push的方式需要额外的组件pushgateway
被监控端根据自身运行的服务,可以运行不同的exporter(被监控端安装的、可以与Prometheus通信,实现数据传递的软件)

exporter列表:https://prometheus.io/docs/instrumenting/exporters/

                                部署通用的监控exporter
node-exporter用于监控硬件和系统的常用指标
exporter运行于被监控端,以服务的形式存在。每个exporter所使用的端口号都不一样。
在web1[192.168.88.100]上部署node exporter
# 1. 拷贝node_exporter到web1
[root@prometheus ~]# scp prometheus_soft/node_exporter-1.5.0.linux-amd64.tar.gz 192.168.88.100:/root/

# 2. 解压即部署(和上面添加普罗米修斯软件一样操作)
[root@web1 ~]# tar xf node_exporter-1.5.0.linux-amd64.tar.gz 
[root@web1 ~]# mv node_exporter-1.5.0.linux-amd64 /usr/local/node_exporter

# 3. 创建服务文件,并启动服务
[root@web1 ~]# 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@web1 ~]# systemctl daemon-reload 
[root@web1 ~]# systemctl enable node_exporter.service --now
[root@web1 ~]# ss -tlnp | grep :9100
LISTEN 0      128                *:9100             *:*    users:(("node_exporter",pid=7371,fd=3))   
在Prometheus服务器上添加监控节点
# 1. 修改配置文件,追加以下内容。特别
注意缩进
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml 
...略...
  - job_name: "web1"
    static_configs:
      - targets: ["192.168.88.100:9100"]
      
# 2. 重启服务
[root@prometheus ~]# systemctl restart prometheus.service

  • 查看添加结果

三、grafana监控可视化

Grafana是一款开源的、跨平台的、基于web的可视化工具

为什么 有了zabbix,普罗米修斯监控软件了,还要在费劲去弄一个grapana呢?

        一问zabbix和普罗米修斯图表展示和图形化界面都不完备,需要grafana 专门展示图表的软件来弥补功能的缺点,而它能和prometheus很好的适配。


展示方式:客户端图表、面板插件
数据源可以来自于各种源,如prometheus


部署Grafana
装包、启服务
[root@prometheus ~]# yum install -y prometheus_soft/grafana-enterprise-9.3.2-1.x86_64.rpm
[root@prometheus ~]# systemctl enable grafana-server.service --now
初始化。访问http://192.168.88.5:3000。

初始用户名和密码都是admin。第一次登陆时,要求改密码,本例中密码改为dc.com(改一个自己能记住的,简单的)。如果登陆报错,请更换其他浏览器。

这里可以设中文

  • 对接Prometheus的数据源(好比给游戏,加上社区DLC)

添加仪表盘,好做图表展示。

  • 觉得模版不好看,可以去下载其他作者的图表展示模版。
  • 下好后,可以在下面的导入里面添加应用(模版选择prometues类型)。
  • grafana模板下载:Grafana dashboards | Grafana Labs

四、总结

1.想要配置prometheus服务的发现方式,可以去配置.yml文件修改。怕写错可以备份。

2.如果你不是干开发层面的程序员,代码层面的问题与逻辑设计,交给开发工程师处理。做好个人分内工作就好。


SECURITY DAY4

友情提示:这小节的内容,只做简单的介绍和使用,具体深度功能,我也没学,老师也没教到。都是网络安全方面的知识了,但是作为云计算工程师,不了解一下是不可能的。

        其中第一章的内容,请在法律允许的范围内使用,虽然都是些初级的小操作,但是也会让你惹到麻烦。闯出祸来,别拉我下水啊,这也是老师和我们说的。


一、kali系统介绍与简单使用

使用时再次强调,遵守法律要求,有法律规定的。这是最基本的要求了,学好了别作死!^_^

kali

  • 实际上它就是一个预安装了很多安全工具的Debian Linux
  • 该软件就好比我们都在地球ONline游戏中,一同出现在新手村,但是每个人的装备一般都是功能各异的,但是kaili的出现导致了许多问题,比如它带有大量的攻击性较强的内置软件,如果使用者的不合理和无视网络安全法使用,就会带来极大的安全隐患。正常用网者只会成为相关黑客使用者的攻击对象。黑客们拿的是加特林,我们是原始冷兵器,让人防不胜防。
是基于Debian系统的linux发行版本linux系统。

  对网络安全方面感兴趣的可以去上面给的官网下载。

二、扫描与抓包

nmap扫描

系统好好的,为什么需要扫描呢?

好处是你可以找到漏洞并修护,坏处是黑客也可以用来找到你系统的漏洞。

功能简介:

具体使用看以下方法:

┌──(kali㉿kali)-[~]
└─$ nmap
# -sT: TCP扫描。
# -U: 扫描目标的UDP端口。
# -sP:ping扫描
# -A:对目标系统全面分析

# 扫描整个网段,哪机器可以ping通
┌──(kali㉿kali)-[~]
└─$ nmap -sP 192.168.88.0/24

# 扫描192.168.88.100开放了哪些TCP端口
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sT 192.168.88.100

# 扫描192.168.88.100开放了哪些UDP端口。非常耗时!
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sU 192.168.88.100

# 全面扫描192.168.88.100系统信息
┌──(kali㉿kali)-[~]
└─$ sudo nmap -A 192.168.88.100
使用脚本扫描
# 通过脚本扫描目标主机的ftp服务
# 在目标主机上安装vsftpd服务
[root@web1 ~]# yum install -y vsftpd
[root@web1 ~]# vim /etc/vsftpd/vsftpd.conf 
 12 anonymous_enable=YES
[root@web1 ~]# systemctl enable vsftpd --now

# 在kali主机上查看有哪些脚本
┌──(kali㉿kali)-[~]
└─$ ls /usr/share/nmap/scripts/

# 扫描ftp服务是否支持匿名访问。ftp控制连接端口号是21
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-anon.nse 192.168.88.100 -p 21
21/tcp open  ftp
| ftp-anon: Anonymous FTP login allowed   # 允许匿名访问

# 扫描ftp相关信息,如版本号、带宽限制等
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-syst.nse 192.168.88.100 -p 21

# 扫描ftp后门漏洞
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-vsftpd-backdoor 192.168.88.100 -p 21
扫描口令
# 通过ssh协议,使用nmap自带的密码本扫描远程主机的用户名和密码
# 在目标主机上创建名为admin的用户,密码为123456
[root@web1 ~]# useradd admin
[root@web1 ~]# echo 123456 | passwd --stdin admin

# 在kali上扫描弱密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse 192.168.88.100 -p 22

# 通过ssh协议,使用nmap以及自己的密码本扫描远程主机的密码
# 1. 创建用户名文件
┌──(kali㉿kali)-[~]
└─$ sudo echo root > /tmp/users.txt
                                                        
┌──(kali㉿kali)-[~]
└─$ cat /tmp/users.txt 
root

# 2. 生成1990-01-01到2020-12-31之间的所月日期
┌──(kali㉿kali)-[~]
└─$ 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("%s\n" % d1.strftime('%Y%m%d'))

┌──(kali㉿kali)-[~]
└─$ python3 mydate.py

# 3. 修改web1的密码
[root@web1 ~]# echo 19910101 | passwd --stdin root

# 4. 使用自己的密码本破解密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse --script-args userdb=/tmp/users.txt,passdb=/tmp/mima.txt 192.168.88.100 -p 22

# 5. 目标主机将会记录所有的登陆事件
[root@web1 ~]# vim /var/log/secure
# 查看最近的登陆失败事件
[root@web1 ~]# lastb
# 查看最近的登陆成功事件
[root@web1 ~]# last
扫描windows口令
[root@myhost ~]# cat /tmp/winuser.txt    # windows用户名
administrator
admin
# 通过samba服务扫描密码
[root@myhost ~]# nmap --script=smb-brute.nse --script-args userdb=/tmp/winuser.txt,passdb=/tmp/mima 172.40.0.151

使用john破解密码


在线破解哈希值的网站:https://cmd5.com/

哈希是算法,英文hash的音译,包括md5、sha等

哈希算法是一种单向加密的算法,也就是将原始数据生成一串“乱码”
只能通过原始数据,生成这串“乱码”,但是不能通过“乱码”回推出原始数据
相同的原始数据,生成的乱码是相同的。
kali系统提供了一个名为john的工具,可用于密码破解

[root@web1 ~]# echo 123456 | passwd --stdin root
[root@web1 ~]# useradd tom
[root@web1 ~]# echo abc123 | passwd --stdin tom
[root@web1 ~]# useradd jerry
[root@web1 ~]# echo 123123 | passwd --stdin jerry
[root@web1 ~]# scp /etc/shadow kali@192.168.88.40:/home/kali/

# 字典暴力破解,密码本是/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:::


# 字典暴力破解,指定密码本文件
┌──(kali㉿kali)-[~]
└─$ sudo john --wordlist=/tmp/mima.txt shadow

抓包

该软件是kali系统装配好的。

好比武侠电影中,被人暗算和偷袭一样,抓包过程是比较隐匿的。

网络模型中具体抓包的数据格式可以去搜索查看。

下面进入具体实例。。

实施抓包
传输的各种数据,在网络中都是一个个的数据包
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump
# -i:指定抓取哪块网卡进入的数据包
# -A:转换为ASCII码,使得可读
# -w:抓包写入文件
# -r:从文件中读取抓包信息
# 抓包时可以过滤要抓哪些包
# 使用host过滤主机,使用net过滤网段,使用port过滤端口... ...

# 1. 抓包:抓取eth0上进出的、与192.168.88.100有关的、涉及TCP21端口的数据包。以下命令执行后,打开新终端。
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A host 192.168.88.100 and tcp port 21

# 2. 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11: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.88.100 and tcp port 21
# 2. 在另一个终端访问ftp
# 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11: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
[root@myhost ~]# yum install wireshark ftp
选择抓哪块网卡进出的数据,然后点左上角的开始

抓到包后,点击左上角同样位置停止,查看数据

三、安全加固,以nginx为例


安装nginx并启服务
[root@web1 ~]# yum install -y nginx
[root@web1 ~]# systemctl enable nginx --now
命令行访问不存在的路径:
[root@web1 ~]# curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx/1.14.1       # 版本号
Date: Mon, 02 Jan 2023 02:54:45 GMT
Content-Type: text/html
Content-Length: 3429
Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
Connection: keep-alive
ETag: "60c1d6af-d65"
Accept-Ranges: bytes


隐藏版本信息


[root@web1 ~]# vim /etc/nginx/nginx.conf
... ...
 17 http {
 18     server_tokens off;
... ...
[root@web1 ~]# systemctl restart nginx.service 
再次访问不存在的路径,版本号消失
[root@web1 ~]# curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx     # 没有版本号了
Date: Mon, 02 Jan 2023 02:56:26 GMT
Content-Type: text/html
Content-Length: 3429
Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
Connection: keep-alive
ETag: "60c1d6af-d65"
Accept-Ranges: bytes
 

  防止DOS、DDOS攻击


DDOS:分布式拒绝服务
# 压力测试,每批次发送100个请求给web服务器,一共发200个
[root@myhost ~]# yum install -y httpd-tools
[root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/ 
... ...
Benchmarking 192.168.88.100 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests    # 发送200个请求完成
... ... 
Complete requests:      200   # 完成了200个请求
Failed requests:        0     # 0个失败
... ...
配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
[root@web1 ~]# vim /etc/nginx/nginx.conf
 17 http {
 18     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;   # 添加
... ...
 40     server {
 41         listen       80 default_server;
 42         listen       [::]:80 default_server;
 43         server_name  _;
 44         root         /usr/share/nginx/html;
 45         limit_req zone=one burst=5;  # 添加
[root@web1 ~]# systemctl restart nginx.service 

# 再次测试
[root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/ 
... ...
Benchmarking 192.168.88.100 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests
... ...
Complete requests:      200
Failed requests:        194   # 失败了194个
... ...


   防止缓冲区溢出


缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。
漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。
# 配置nginx缓冲区大小,防止缓冲区溢出
[root@web1 ~]# vim /etc/nginx/nginx.conf
... ...
 17 http {
 18     client_body_buffer_size     1k;
 19     client_header_buffer_size   1k;
 20     client_max_body_size        1k;
 21     large_client_header_buffers 2 1k;
... ...
[root@web1 ~]# systemctl restart nginx.service 

四、linux系统的基本防护

设置tom账号,有效期为2022-1-1
# 查看tom的账号信息
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

[root@web1 ~]# chage -E 2022-1-1 tom
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :1月 01, 2022
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

# 设置账号永不过期,注意-E后面是数字 -1,不是字母l
[root@web1 ~]# chage -E -1 tom
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

# 设置新建用户的密码策略
[root@web1 ~]# vim /etc/login.defs 
 39 PASS_MAX_DAYS   99999    # 密码永不过期,设置最长有效期
 40 PASS_MIN_DAYS   0        # 密码最短使用时间,0表示随时可改密码
 41 PASS_MIN_LEN    5        # 密码最短长度
 42 PASS_WARN_AGE   7        # 密码过期前7天发警告
 47 UID_MIN                  1000   # 新建用户最小的UID
 48 UID_MAX                 60000   # 新建用户最大的UID
用户安全设置
# 锁定tom账号
[root@web1 ~]# passwd -l tom
锁定用户 tom 的密码 。
passwd: 操作成功

[root@web1 ~]# passwd -S tom   # 查看状态
tom LK 2021-10-12 0 99999 7 -1 (密码已被锁定。)

# 解锁tom账号
[root@web1 ~]# passwd -u tom
解锁用户 tom 的密码。
passwd: 操作成功
[root@web1 ~]# passwd -S tom
tom PS 2021-10-12 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
保护文件
# 查看文件的特殊属性
[root@web1 ~]# lsattr /etc/passwd
---------------- /etc/passwd    # 没有特殊属性

# 修改属性 ----比较实用
chattr +i 文件    # 不允许对文件做任何操作,只能看
chattr -i 文件    # 去除i属性
chattr +a 文件    # 文件只允许追加
chattr -a 文件    # 去除a属性

[root@web1 ~]# chattr +i /etc/passwd
[root@web1 ~]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@web1 ~]# useradd zhangsan
useradd:无法打开 /etc/passwd
[root@web1 ~]# rm -f /etc/passwd
rm: 无法删除"/etc/passwd": 不允许的操作
[root@web1 ~]# chattr -i /etc/passwd
[root@web1 ~]# rm -f /etc/passwd   # 可以删除
[root@web1 ~]# ls /etc/passwd
ls: 无法访问/etc/passwd: 没有那个文件或目录

# 恢复passwd文件
[root@web1 ~]# cp /etc/passwd- /etc/passwd

# 追加
[root@web1 ~]# chattr +a /etc/hosts
[root@web1 ~]# echo 'hello world' >> /etc/hosts
[root@web1 ~]# rm -f /etc/hosts
rm: 无法删除"/etc/hosts": 不允许的操作


SECURITY DAY5

讲点课堂之外的题外话,iptables是由于网络发展的需要产生的,现如今表火热的两个针对网络架构方面的发展方向就有云计算和云原生。


一、iptables防火墙

什么是防火墙?

        防火墙就好比古代时,中原人民抵挡外族侵略修建的万里长城。

每一个操作系统都自带有防火墙,而linux系统的防火墙则是iptables.

iptables有多种功能,每一种功能都用一张表来实现
最常用的功能是防火墙和NAT
从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然调用iptables
安装iptables服务
# 关闭firewalld
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld

# 安装iptables
[root@node1 ~]# yum install -y iptables-services.x86_64  
iptables的表和链。我们只关心nat表和filter表。filter表是默认的表,它实现防火墙,也就是包过滤的功能。nat表实现网络地址转换。

二、filter表控制

防火墙filter表

  • 配置iptables时,不指定表,就是使用filter表
  • 配置时不指定规则链,则配置所有链
  • 可以向规则链中加入很多规则,数据包进入该链时,从上向下匹配,一旦匹配就停止,开始应用规则。如果全都不匹配,则应用默认规则
  • 命令选项、链名、目标操作使用大写字母,其他小写
filter中的三条链
  • INPUT:数据包的目标地址是自己,则进入INPUT链
  • OUTPUT:数据包的源地址是自己,则进入OUTPUT链
  • FORWARD:数据包穿过自己,则进入FORWARD链

环境准备
  • client1:eth0 -> 192.168.88.10/24 网关:192.168.88.11
  • node1:eth0 -> 192.168.88.11/24,eth1 -> 192.168.99.11/24
  • server1:eth1 -> 192.168.99.100/24 网关:192.168.99.11
iptables操作

常用选项:

-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则

通用参数:
-p 协议  例:iptables -A INPUT -p tcp
-s 源地址 例:iptables -A INPUT -s 192.168.1.1
-d 目的地址 例:iptables -A INPUT -d 192.168.12.1
--sport 源端口 例:iptables -A INPUT -p tcp --sport 22
--dport 目的端口 例:iptables -A INPUT -p tcp --dport 22
-i 指定入口网卡 例:iptables -A INPUT -i eth0
-o 指定出口网卡 例:iptables -A FORWARD -o eth0

-j 指定要进行的处理动作
常用的ACTION:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受

-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
 
通用参数:
-p 协议  例:iptables -A INPUT -p tcp
-s 源地址 例:iptables -A INPUT -s 192.168.1.1
-d 目的地址 例:iptables -A INPUT -d 192.168.12.1
--sport 源端口 例:iptables -A INPUT -p tcp --sport 22
--dport 目的端口 例:iptables -A INPUT -p tcp --dport 22
-i 指定入口网卡 例:iptables -A INPUT -i eth0
-o 指定出口网卡 例:iptables -A FORWARD -o eth0
 
-j 指定要进行的处理动作
常用的ACTION:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受

# 查看filter表中的规则。-t指定表名
[root@node1 ~]# iptables -t filter -L   # 所有规则链都是空的
Chain INPUT (policy ACCEPT)   # INPUT链默认规则是接受
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)   # FORWARD链默认规则是接受
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)   # OUTPUT链默认规则是接受
target     prot opt source               destination         

[root@node1 ~]# iptables -L   # 不指定表名,默认操作filter表
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 


# 起动服务时,iptables将会出现一些默认规则
[root@node1 ~]# systemctl start iptables.service 
[root@node1 ~]# iptables -L

# 默认规则往往不合我们的要求,可以先将所有的规则清空
[root@node1 ~]# iptables -F

  • iptables的语法

iptables [-t 表名] 选项 [链名] [条件] [-j 满足条件的操作]
  • 示例

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

# 向INPUT链追加规则,192.168.88.254发来的包全部接受
# -A是追加,-s是匹配源地址,-j为jump,采取的行为,ACCEPT是接受
[root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT

# 将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.88.254        anywhere

# 在192.168.88.10上访问node1,将会被拒绝
[root@client1 ~]# ping -c2 192.168.88.11
[root@client1 ~]# ssh 192.168.88.11

# 注意,数据通信多数是双向的。现在node1也不能与192.168.88.254以外的其他机器通信,因为数据回不来。
[root@node1 ~]# ping -c2 192.168.88.10   # 失败


# 允许192.168.88.0网络的主机ssh连接node1
# -I是插入到INPUT链的第1个位置。-p指定协议,--dport指定目标端口号。-j是执行的操作
[root@node1 ~]# iptables -I INPUT 1 -s 192.168.88.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.88.0/24       anywhere             tcp dpt:ssh
ACCEPT     all  --  192.168.88.254        anywhere            
# 查看规则,n是指用数字来表示端口号、主机等
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  192.168.88.254        0.0.0.0/0 

# 测试,192.168.88.10已经可以ssh到node1,但是ping不通,因为只允许了ssh

# 配置任何地址访问node1的80端口,即http协议,都接受
[root@node1 ~]# yum install -y httpd
[root@node1 ~]# systemctl start httpd
# 不指定源,就是任何源
[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.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  192.168.88.254        0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

# 拒绝192.168.88.254 ping node1。以下写法不会生效,因为插入到了规则尾部,在它上面已经存在允许192.168.88.254通信的规则了。
# icmp就是ping命令底层用到的协议,叫Internet控制消息协议
[root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -p icmp -j REJECT
[root@node1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  192.168.88.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.88.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.88.0/24       0.0.0.0/0            tcp dpt:22
2    ACCEPT     all  --  192.168.88.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.88.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.88.0/24       0.0.0.0/0            tcp dpt:22
2    ACCEPT     all  --  192.168.88.254        0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

# 拒绝192.168.88.254 ping node1。-I不指定位置,默认插到最上面
[root@node1 ~]# iptables -I INPUT -s 192.168.88.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.88.254        0.0.0.0/0            reject-with icmp-port-unreachable
2    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
3    ACCEPT     all  --  192.168.88.254        0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

# DROP是直接丢弃,REJECT是明确拒绝。

# 保存规则。不保存规则,重启iptables服务,自定义规则将消失
[root@node1 ~]# iptables-save > /etc/sysconfig/iptables
此时,从其他机器访问node1已放行相关协议,但是从node1访问其他机器却无法成功。原因是数据可以发出去,但是返回的数据包也会进入INPUT,但是INPUT链中没有相关放行规则。
从自身发出去,返回来的数据包属于某个连接,该连接的状态是ESTABLISHED,放行该状态的数据包即可。ESTABLISHED表示已经建立的连接,即数据包是响应一个已经建立的连接而来的。
[root@node1 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

三、扩展匹配

环境准备:配置好主机名,网卡,和  IP。

                                                  验证FORWARD链

# 在中间节点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.99.100

  • 在server1上安装httpd服务
[root@server1 ~]# yum install -y httpd
[root@server1 ~]# systemctl start httpd
# 在客户端访问web服务,可以访问
[root@client1 ~]# curl http://192.168.99.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.99.0/24,目标地址是192.168.88.0/24的包,放行
[root@node1 ~]# iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT

# 从client1到server1,允许icmp
[root@node1 ~]# iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p icmp -j ACCEPT

# client1和server1已经可以ping通了
[root@client1 ~]# ping -c2 192.168.99.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.88.0/24 -j ACCEPT

# 现在从client1到server1的ssh、http都可以放行了
[root@client1 ~]# ssh 192.168.99.100
[root@client1 ~]# curl http://192.168.99.100/

# 拒绝192.168.88.10-192.168.88.20访问192.168.99.50-192.168.99.150
# -m是引入扩展模块,src-range是源地址范围,dst-range目标地址范围
[root@node1 ~]# iptables -I FORWARD -m iprange --src-range 192.168.88.10-192.168.88.20 --dst-range 192.168.99.50-192.168.99.150 -j REJECT

四、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

  • 现在的实验环境,client1可以访问server1,server1看到的是客户端地址是client1的地址。
  • # 跟踪httpd日志的尾部
    [root@server1 ~]# tail -f /var/log/httpd/access_log 

    # 在client上访问server1的web服务
    [root@client1 ~]# curl http://192.168.99.100/

    # 查看服务器终端的日志,将会显示client1的地址192.168.88.10访问了它
    192.168.88.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.99.x再发给server1。因为数据包的源地址改变了,所以叫SNAT,S即Source。

# 向nat表中的POSTROUTING链添加规则。将源地址192.168.88.0/24转换成它外网卡地址。
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
[root@node1 ~]# iptables -t nat -nL

# client1再次访问server1时,server1上的日志将会显示node1的192.168.99.11访问
[root@server1 ~]# tail -f /var/log/httpd/access_log 
192.168.99.11 - - [13/Oct/2021:17:45:07 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"
 

五、总结


 以上就是安全模块的全部内容了,主要讲述了监控软件的使用与配置和网络安全方面,软件的使用,重点需要了解iptables表和表中链表的配置使用情形。

第三阶段数据库知识再见吧。(*^▽^*)

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值