本文介绍了如何使用Python Program将Web应用防火墙(WAF)的日志集成到Syslog日志系统中,以实现合规、审计等要求,也方便您在安全操作中心统一管理所有相关日志。

背景信息

该方案的整体集成架构如下图所示:架构图

阿里云日志服务为日志数据提供一站式服务,被广泛应用于阿里巴巴集团的许多大数据场景中。日志服务在无需开发介入的前提下,帮助您快速完成数据采集、消费、投递、查询和分析,提高运维运营效率,建立DT时代海量数据的处理能力。Web应用防火墙集成了日志服务的能力,通过WAF日志服务功能提供网站访问日志的采集、查询、分析等服务。更多信息,请参见WAF日志服务概述

Python Program是运行在ECS上的一段日志投递程序,帮助您将WAF日志投递到Syslog服务器。消费库(Consumer Library)是对LogHub消费者提供的高级模式,它使用消费组(Consumer Group)统一处理消费端问题。相比于直接使用SDK读取数据,消费库让您只关注业务逻辑,而无需在意日志服务的实施细节或多消费者间的容错问题。更多信息,请参见消费组消费

Syslog服务器是一个集中的日志消息管理服务器,它可以从多个Syslog源接收数据。

前提条件

  • 您已开通WAF日志服务并为网站域名开启日志采集。更多信息,请参见以下文档:
  • 您拥有一个Linux ECS服务器,该服务器满足以下推荐配置:
    • Ubuntu操作系统
    • 8核处理器,2.0 Ghz以上主频率
    • 32 GB内存
    • 可用磁盘空间大于2 GB(建议在10 GB以上)
  • 您拥有一个Syslog服务器,并开放UDP协议514端口用来接收Syslog数据。

操作步骤

您需要先在ECS实例中安装日志服务的Python SDK,然后配置Python Program,投递WAF日志到Syslog服务器。具体操作步骤如下:

  1. 通过SSH或ECS控制台远程连接ECS实例。具体操作请参见连接ECS实例
  2. 安装Python3、pip和aliyun-log-python-sdk。关于日志服务Python SDK的介绍,请参见用户指南
    apt-get update
    apt-get install -y python3-pip python3-dev
    cd /usr/local/bin
    ln -s /usr/bin/python3 python
    pip3 install --upgrade pip
    pip install aliyun-log-python-sdk
  3. 执行以下命令,从GitHub下载最新的集成示例代码。
    wget https://raw.githubusercontent.com/aliyun/aliyun-log-python-sdk/master/tests/consumer_group_examples/sync_data_to_syslog.py
  4. 替换示例代码Python Program中与日志服务(SLS)、Syslog相关的配置参数,具体包括:
    参数 释义 描述
    SLS Project 日志项目名称 日志项目(Porject)是日志服务的资源管理单元,用来划分和操作资源。

    您可以登录阿里云日志服务控制台查看WAF日志服务项目。

    WAF日志服务项目的名称以waf-project开头。华东1(杭州)地域的项目表示中国内地WAF实例的日志项目,新加坡地域的项目表示海外地区WAF实例的日志项目。

    日志项目
    SLS Endpoint 日志服务入口 日志服务入口是访问一个日志项目及其内部日志数据的URL。它和项目所在的阿里云地域及日志项目名称相关。要查看日志服务的入口URL,请参见服务入口
    SLS Logstore 日志库 日志库(Logstore)是日志服务用来采集、存储和查询日志数据的单元。每个日志库归属在一个项目下,每个项目可以拥有多个日志库。

    您可以登录阿里云日志服务控制台,单击WAF日志服务项目后,在WAF日志服务项目中查看日志库的名称。

    日志库
    SLS accessKeyId和accessKey 访问密钥 访问密钥是您在使用API(而非控制台)访问云资源时的密码。您需要使用AccessKey为API请求内容签名,使其能够通过日志服务的安全认证。具体请参见访问密钥

    您可以登录用户信息管理控制台查看您的AccessKey信息。

    AccessKey
    Syslog Host Syslog主机 Syslog服务器的IP地址或主机名称。
    Syslog Port Syslog端口 接收Syslog的端口。UDP协议使用514,TCP协议使用1468。
    Syslog protocol Syslog协议 指定使用UDP或TCP协议来接收Syslog数据,具体取决于Syslog服务器的配置。
    Syslog separator Syslog分隔符 指定用于分隔Syslog键值对的分隔符。
    以下是Python Program的配置示例。
    • 日志服务配置
      endpoint = os.environ.get('SLS_ENDPOINT', 'http://ap-southeast-1.log.aliyuncs.com')
      accessKeyId = os.environ.get('SLS_AK_ID', '替换成您自己的AccessKey ID')
      accessKey = os.environ.get('SLS_AK_KEY', '替换成您自己的AccessKey Secret')
      project = os.environ.get('SLS_PROJECT', 'waf-project-548613414276****-ap-southeast-1')
      logstore = os.environ.get('SLS_LOGSTORE', 'waf-logstore')
      consumer_group = os.environ.get('SLS_CG', 'WAF-SLS')
    • Syslog配置
      settings = {
                      "host": "1.2.3.4",
                      "port": 514,       
                      "protocol": "udp", 
                      "sep": ",",       
                      "cert_path": None, 
                      "timeout": 120,    
                      "facility": syslogclient.FAC_USER,  
                      "severity": syslogclient.SEV_INFO,  
                      "hostname": None,  
                      "tag": None        
                  }
  5. 启用Python Program。假设Python program被保存为sync_data_to_syslog.py,您可以使用以下命令启用它:
    python sync_data_to_syslog.py
    启用Python Program后,会显示成功投递日志到Syslog服务器。
    *** start to consume data...
    consumer worker "WAF-SLS-1" start 
    heart beat start
    heart beat result: [] get: [0, 1]
    Get data from shard 0, log count: 6
    Complete send data to remote
    Get data from shard 0, log count: 2
    Complete send data to remote
    heart beat result: [0, 1] get: [0, 1]

完成以上操作后,您可以在Syslog服务器中查询WAF日志。