如何用ELK和Wazuh搭建 PCI-DSS(支付卡行业安全标准)


支付卡行业数据安全标准(PCI-DSS)是一种常见的IT行业的规范,主要用于电子信用卡业务例如Visa信用卡和万事达卡。该标准的建立是为了增加对持卡人数据的控制,减少信用卡的欺骗事件。

PCI-DSS主要有二十多条规定(PDF链接: https://www.pcisecuritystandards.org/documents/PCI_DSS_v3.pdf )以及以下专门针对日志管理提出的要求:

跟踪和监视所有访问网络资源和持卡人数据。 日志机制和跟踪用户活动的能力可以大大预防危险事件的发生,检测并且将数据的影响降到最小化。日志中发现威胁信息的时候要告警并且分析。没有系统的活动日志的话,确定一个威胁的原因是非常困难的。

本篇文章中,我们将向大家介绍如何用ELK(Elasticsearch, Logstash, Kibana)日志管理平台搭建搭建一个符合标准的PCI标准仪表盘。

为了方便部署,我们选择使用Logz.io-hosted ELK-as-a-Service(链接: http://logz.io/product/ ),不过要说明的是,以下所有的搭建方案都可以直接用ELK搭建。在文章末尾还有其他两种附加的方法代替ELK。分别是:使用OSSEC Docker镜像和Logstask。

部署OSSEC Wazuh

OSSEC是一个可扩展的,可移植的开源入侵检测系统(HIDS)。OSSEC负责给PCI-DSS提供的服务包括日志分析,文件完整性检查,监控策略,入侵检测,实时报警和及时响应。日常情况下,该系统作为日志分析工具,实时监控并分析网络的活跃情况,服务器和用户身份认证。OSSEC是由两部分组成,一个是中央管理部分(manager),用于接收并监控传入的日志数据; 另一个是采集器(agents)用于采集数据,并将信息发送给中央管理器(manager)。

Wazuh为OSSEC的日志管理平台集成开发了一个模块。为了使OSSEC入侵检测系统可以支持ELK,我们将用Wazuh HIDS模块(模块地址:

http://wazuh-documentation.readthedocs.io/en/latest/wazuh_installation.html#wazuh-installation)。 建立一个PCI仪表盘,因为该模块提供了管理功能

接下来,我们将使用两台机器,一台作为管理节点(manager),另一台用来做简单的采集节点(agent)。当然,如果只是为了测试下功能,大家也可以把这两部分集中装在同一台服务器上。

OSSEC是一个跨平台系统,为了简单起见,我们直接选择用Ubuntu Servers。

好的,我们可以开始了。

首先,我们从Github上下载OSSEC Wazuh并且安装开发工具和编译器(链接地址: http://documentation.wazuh.com/en/latest/installation.html

Ubuntu命令如下,先安装git:

sudo apt-get update
sudo apt-get install gcc make git

以下的命令是从Github上下载并安装:

mkdir wazuh_ossec && cd wazuh_ossec
git clone https://github.com/wazuh/ossec-wazuh.git
cd wazuh-_ossec 
sudo ./install.sh

如下图,是Wazuh HIDS安装的截图。这个时候我们想要安装中央管理器,就直接安装提示输入server值。

接下来,我们需要设置其他需要的服务。其中包括email通知服务和文件完整性检测服务,该服务可以检测服务器上的文件,计算出检验和,实时记录下文件的变化信息。这一步可以有效的检测到系统中的未授权文件修改。(PCI要求 # 11.5 )

安装完成后,你就可以用以下命令启动OSSEC管理器:

sudo /var/ossec/bin/ossec-control start

以下命令可以检测整个系统是否正常运行:

$ ps aux | grep ossec
     
    root     1017  0.0  0.1  15024 1524 ?        S    23:01   0:00 /var/ossec/bin/ossec-execd
    ossec    1021  0.1  0.4  20248  4236 ?        S    23:01   0:00 /var/ossec/bin/ossec-analysisd
    root     1025 0.0  0.1  31604   1624 ?        S    23:01   0:00 /var/ossec/bin/ossec-logcollector
    root     1037  0.0  0.1  7380   2732 ?        S    23:01   0:00 /var/ossec/bin/ossec-syscheckd
    ossec    1040  0.0  0.1  18312   1708 ?        S    23:01   0:00 /var/ossec/bin/ossec-monitord
     
    $ sudo lsof /var/ossec/logs/alerts/alerts.json
    COMMAND     PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
    Ossec-ana    1021    ossec    11w    REG    252,1        7388    402765    /var/ossec/logs/alerts/alerts.json
     
    $ sudo cat /var/ossec/logs/alerts/alerts.json
    {“rule”: {“level”: 3, “comment”: “Login session opened.”, “sidid”: 5501, “firedtimes”: 2, “groups”: [“pam”, “syslog”, “authentication_success”], “PCI_DSS”:[“10.2.5”]....}}

接下来这部分是在我们的第二台机器上安装采集节点(agent)。Ubuntu Server系统的话(这里用的是Wily版本的,其他的版本可以查看这个链接: http://documentation.wazuh.com/en/latest/ossec_installation_deb.html#ubuntu-repositories ),可以直接用一下命令添加Ubuntu的源:

echo -e "deb http://ossec.wazuh.com/repos/apt/ubuntu wily main" >> /etc/apt/sources.list.d/ossec.list

添加完成后,更新并且用apt-get命令安装OSSEC agent :

 $ apt-get update 
$ apt-get install ossec-hids-agent

安装过程中,采集器会提示输入管理节点的IP地址,输入管理器的IP地址或者直接用127.0.0.1即可。

接下来,通过以下命令,在你的OSSEC管理服务器上配置管理器和采集器:

$ sudo /var/ossec/bin/manage_agents

选择“A”来添加一个采集器:

 (A)dd an agent (A).
    (E)xtract key for an agent (E).
    (L)ist already added agents (L).
    (R)emove an agent (R).
    (Q)uit.
Choose your action: A,E,L,R or Q: A

然后你需要输入采集器A的名字,IP地址和ID。

在我们的情况中,我们输入agent-001(如果你的ID是空的,系统将会为你自动生成)。

第二步我们需要取出这个采集器的密钥,因为我们需要用这个密钥来从采集器上导数据。现在,我们输入“E”,然后输入采集器的ID。

注意:配置文件/var/ossec/etc/ossec.conf包含了部分客户端,如果你是第一次启动,可以直接输入管理器的IP地址:

<ossec_config>
      <client>
        <server-ip>MANAGER_IP_ADDRESS</server-ip>
      </client>

在采集节点上,运行程序/var/ossec/bin/manage_agents,选择“I”导入刚刚的密钥(这个我们要用来做监听):     

(I)mport key from the server (I).
       (Q)uit.
    Choose your action: I or Q: I
     
    * Provide the Key generated by the server.
    * The best approach is to cut and paste it.
    *** OBS: Do not include spaces or new lines.
     
    Paste it here (or '\q' to quit): <KEY FROM SERVER>
     
    Agent information:
       ID:<ID>
       Name:<agent name>
       IP Address:<agent IP address>
     
Confirm adding it?(y/n): y

这样的话,你的采集节点就添加上了,使用如下命令重启节点:

$ /var/ossec/bin/ossec-control restart

在Wazuh中集成ELK

现在你已经安装了Wazuh,下一步我们需要将他整合进ELK中,通过Logz.io可以直接整合(地址: http://logz.io/product/ )。如果你没有Logz.io账号,你可以在这里免费注册(地址: http://logz.io/signup/freetrial.html

S3数据同步与配对

要将Wazuh的数据导入到Logz.io的ELK中,我们需要使用亚马逊简单存储服务(Amazon S3)。使用S3提供的空间同步OSSEC文件夹包括你的日志文件(本次例子中,我们成这个为ossec-logs),然后建立起从S3到Logz.io的一个数据流管道。

首先使用AWS客户端同步命令把OSSEC服务器上的所有信息拷贝并更新到S3存储器中。在OSSEC的管理服务器上,我们运行以下命令:

$ aws s3 sync /var/ossec/logs/alerts/ s3://ossec-logs/$(date +"%Y-%m-%d-%H")

其中,命令中的$(date + “%Y-%m-%d-%H)部分用于对S3上的日志进行汇总,可以将每个小时的日志都存放在一起。

然后我们构建从S3到Logz.io的数据流,选择在Logz.io仪表盘顶部的Log Shipping选项,打开Log Shipping页面右边菜单的AWS选项,点击S3 Bucket选项。

如上图所示,输入要访问的S3存储空间的名字和S3的访问密钥,Logz.io就会将我们所有的添加的分组都导入到存储器中。

接下来,选择存储器所在的区域。最后一步,选择其他的日志类型,并输入json格式。保存一下就完成了。这样的话,我们就准备好了S3到ELK的数据流。

创建一个支持PCI标准的接口

现在,我们可以在Kidana上分析我们的日志了。接下来我们需要根据PCI标准建立一个可视化仪表盘,可以动态显示这些数据,并且预测数据的趋势。

根据我们的例子,我们准备创建一个折线图来分析PCI标准。

打开Kibana的可视化选项面板,选择则线图可视化选项。把折线图的X轴配置成总时间,用rule.PCI_DSS 字段作为Field值,如下图:

点击预览按钮看些效果,如下图:

这是一个Wazuh数据存入Elasticsearch后的可视化的效果。我们创建了一个符合PCI标准的可视化仪表盘,其中包含该了好几个符合PCI的可视化图,这些都是可以用ELK画出来的。

接下来要按着仪表盘,可以在ELK界面的应用选项卡中查找“PCI Compliance”。然后点击安装按钮即可。

使用Wazuh的PCI仪表盘

Wazuh提供了一个更简单的方式把PCI仪表盘添加到Kibana中。

在Kibana的设置面板中,点击Import按钮加载仪表盘。选择要导入的文件,然后刷新Kibana页面,就能看到我们导入的仪表盘了:

现在,你就可以返回仪表盘部分,选择符合的PCI仪表盘,如下图:

AWS上的PCI-DSS仪表盘

亚马逊的基础设施其实已经符合PCI-DSS,但你还是需要实时监控你的环境,找出配置错误和可能存在的漏洞。这样的话,你就需要把你的日志和网络活动发送出来。在本节,我们将会介绍如何创建一些告警以及建立一个可视化仪表盘。

现实环境中,建议安装一个漏洞扫描器。例如,rootsh和Snort都可以防止入侵,让你能监控到整个网络的数据流量以及黑客的攻击信息。

在本例中,我们将通过监控CloudTrail或者VPC Flow的日志中的一些特殊事件实现一个自动报警功能。我们将会创建两类的告警:一类是使用CloudTrail的日志检测AWS终端的登录信息,检测多次登录失败的信息;另一类是使用VPC流量日志检测连接端口。

第一个告警满足PCI-DSS规范中的#10条规定:“跟踪和监视所有访问网络资源和持卡人数据”。这里是,从CloudTrail中跟踪登录失败的用户。

通过 responseElements.ConsoleLogin:”Failure” 查询语句,查询出所有登录失败的记录:

接下来的告警是标记出于PCI要求1、5两条符合的。本例中,我们通过检测VPC连接端口。如下图:

接下来,我们创建好了几个由登录失败、漏洞和用户变更日志构成的图,我们把这些东西展示在同一个面板上,得到如下图:

结语

我们希望这篇文章能在PCI-DSS的实施上帮助到大家,以下是一些要解释的地方。

Logz.io是一个基于云的用于建立趋势模型的日志管理平台,是基于开源平台ELK Stack搭建起来了,这个链接你可以免费的使用这个软件: http://logz.io/signup/freetrial.html

另外,还可以有一些其他的比较好的方案:

附加方法1:使用OSSEC Docker

另一种代替Wazuh和ELK的方案是使用OSSEC Docker镜像。

Essec-elk容器里面包含了OSSEC管理器和ELK stack

运行以下命令,开启ossec-elk容器:

$ docker run -d -p 55000:55000 -p 1514:1514/udp -p 1515:1515 -p 514:514/udp -p 5601:5601 -v ~/mnt/ossec:/var/ossec/data --name ossec wazuh/ossec-elk

把目录 /var/ossec/data 配置成容器的交换空间,这样可以防止数据丢失。

接下来和文章开头提到的步骤一样,安装manage_agent,安装完后,输入以下命令添加节点:

$ docker exec -it ossec /var/ossec/bin/manage_agent

添加完后,用以下命令重启OSSEC管理节点:

$ docker exec -it ossec /var/ossec/bin/ossec-control restart

管理节点和采集节点都准备好后,我们通过以下URL访问Kibana: http://<your_docker_ip>:5601 ,创建一个仪表盘。

首先需要选择索引。只要我们在索引框中直接输入我们需要的索引的名字,Kibana就会自动连接上我们需要的索引,选择“Use event times to create index names” 选项,然后在索引间隔中选择Daily选项(如下图)。索引名字这一项我们可以设置为 [ossec-]YYYY.MM.DD

Time-field name 选项中,Kibana会默认的选择 @timestamp ,点Create创建就行了。

回到Discover选项中,可以发现已经导入数据了:

附加方法2:使用Logstash

最后,还有一种方式可以将Wazuh数据导入到我们自己的Logz.io的ELK Stack中,就是使用Logstash。

首先,我们需要在OSSEC管理服务器上安装Logstash,然后配置Logstash将日志信息导入到Logz.io中。如下图,我们需要使用mutate过滤插件来添加字段:

最后,建立Logstash配置文件,将 OSSEC告警信息导入到Logz.io,配置如下:

 input {
      file {
        type => "ossec-alerts"
        path => "/var/ossec/logs/alerts/alerts.json"
        codec => "json"
      }
    }
    filter {
        geoip {
          source => "srcip"
          target => "geoip"
          database => "/etc/logstash/GeoLiteCity.dat"
          add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
          add_field => [ "[geoip][location]", "%{[geoip][latitude]}"  ]
        }
        date {
            match => ["timestamp", "YYYY MMM dd HH:mm:ss"]
            target => "@timestamp"
        }
        mutate {
          convert => [ "[geoip][location]", "float"]
          rename => [ "hostname", "AgentName" ]
          rename => [ "geoip", "GeoLocation" ]
          rename => [ "file", "AlertsFile" ]
          rename => [ "agentip", "AgentIP" ]
          rename => [ "[rule][comment]", "[rule][description]" ]
          rename => [ "[rule][level]", "[rule][AlertLevel]" ]
          remove_field => [ "timestamp" ]
          add_field => { "token" => <TOKEN> }
        }
    }
    output {
    tcp {
        host => "listener.logz.io"
        port => 5050
        codec => json_lines
    }
}

以上配置将会把日志信息从OSSEC告警文件中传入Logz.io服务中,并且把这些信息自动存储到Elasticsearch中,Wazuh建立的仪表盘也能实时查看到这些信息的变化。配置中最重要的部分是添加了一个token字段,如果没有这个字段,Logz.io会讲告警信息直接丢弃掉。

*参考来源: logz.io ,FB小编东二门陈冠希编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章