等保二级-CentOS-安全审计

背景说明

在等保二级要求中,关于CentOS,有一条“安全审计”,支付宝如下:

  1. 应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计;操作系统层面要求审计范围应覆盖到服务器上的每个操作系统用户,系统不支持该要求的,采用第三方安全审计产品实现审计要求,同时审计内容应包括重要用户行为、系统资源的异常使用和重要系统命令的使用等系统内重要的安全相关事件。审计内容至少包括:用户的添加和删除、审计功能的启动和关闭、审计策略的调整、权限变更、系统资源的异常使用、重要的系统操作(如用户登录、退出)等。
  2. 审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息;
  3. 应对审计记录进行保护,避免受到未预期的删除、修改或覆盖等;
  4. 审计记录的留存时间应符合法律法规要求(网络安全法要求保存6个月及以上);

为满足该要求,需要对CentOS的日志进行备份,且是异常备份,就需要日志服务器。

rsyslog

在CentOS7中,默认的日志系统是rsyslog,它是一个类Unix计算机系统上使用的开源工具,用于在IP网络中转发日志信息。rsyslog采用模块化设计,是syslog的替代品。

rsyslog具有以下特点:

  1. 实现了基本的syslog协议。
  2. 直接兼容syslogd的syslog.conf配置文件。
  3. 在同一台机器上支持多个rsyslogd进程。
  4. 丰富的过滤功能,可将消息过滤后再转发。
  5. 灵活的配置选项,配置文件中可以写简单的逻辑判断。
  6. 增加了重要的功能,如使用TCP进行消息传输。
  7. 有现成的前端Web展示程序。

rsyslog不在这里详细介绍。上面特点中的第6点,为我们满足等保二级要求提供了可能。

Graylog

  1. Graylog使您能够在一个地方组合、丰富、关联、查询和可视化所有日志数据,从而为您的团队的安全、应用程序和IT基础架构问题提供答案。官网地址:Graylog: Industry Leading Log Management & SIEM
  2. 我们可以使用Graylog搭建日志服务器,接收CentOS的日志,并可视化查看。

安装

  1. Graylog提供了多种安装方式,可参见官网。这里我们介绍使用Docker安装。Docker的安装和使用,可参看我的Docker专栏。
  2. 使用docker compose方案,docker-compose.yml文件如下:
version: '3'
services:
  mongo:
    image: mongo:5.0.13
    environment: 
      - TZ=Asia/Shanghai
    networks:
      - graylog_network
    volumes:
      - graylog_mongo_data:/data/db
    restart: always
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - TZ=Asia/Shanghai
      - "ES_JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true -Xms512m -Xmx512m"
    networks:
      - graylog_network
    volumes:
      - graylog_es_data:/usr/share/elasticsearch/data
    restart: always
  graylog:
    image: graylog/graylog:5.0
    environment:
	  # 长度至少16位 
      - GRAYLOG_PASSWORD_SECRET=chriswang@163.com
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
      - TZ=Asia/Shanghai
    entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    networks:
      - graylog_network
    restart: always
    volumes:
      - graylog_data:/usr/share/graylog/data
    depends_on:
      - mongo
      - elasticsearch
    ports:
# Graylog web interface and REST API
      - 9000:9000
# Syslog TCP
      - 1514:1514
# Syslog UDP
      - 1514:1514/udp
# GELF TCP
      - 12201:12201
# GELF UDP
      - 12201:12201/udp
# RAW/Plaintext TCP
      - 55555:5555
# RAW/Plaintext UDP
      - 55555:5555/udp
networks:
  graylog_network:
volumes:
  graylog_mongo_data:
  graylog_es_data:
  graylog_data:
  1. 使用命令docker compose up -d启动,截图如下,由于需要下载相关镜像,所以需要等待若干分钟。
  2. elk 安全审计 安全审计的内容_linux

  3. 看到如下结果,说明已完成安装
  4. elk 安全审计 安全审计的内容_安全_02

  5. 打开浏览器,输入地址:http://ip:9000,ip为自己服务器ip,即可看到登陆页面,默认的用户名和密码均为admin:
  6. elk 安全审计 安全审计的内容_TCP_03

日志接收配置

  1. 登陆Graylog后,在system>Input中设置日志输入,如下图:

elk 安全审计 安全审计的内容_elk 安全审计_04

  1. 选择“Syslog TCP”:
  2. elk 安全审计 安全审计的内容_安全_05

  3. elk 安全审计 安全审计的内容_elk 安全审计_06

  4. elk 安全审计 安全审计的内容_elk 安全审计_07

  5. 创建好了之后,点击“Show received messages”,查看接收到的日志,当前,前提是配置了客户端,下面介绍如何配置。
  6. elk 安全审计 安全审计的内容_安全_08

客户端配置

客户端,即需要满足等保二级的CentOS服务器。需要在客户端配置Graylog服务器的地址信息,以将客户端日志发送到Graylog。可以通过UDP或TCP方式发送。我们上面在Graylog中配置的Input为TCP。有两种配置方式:

  1. 修改/etc/rsyslog.conf,在最后添加如下内容(UDP和TCP二选一):
#将yourgraylog.example.org换成Graylog服务器所在ip,1514和docker-compose-yaml中配置的要一样。
# UDP:
*.*@yourgraylog.example.org:1514;RSYSLOG_SyslogProtocol23Format

# TCP:
*.*@@yourgraylog.example.org:514;RSYSLOG_SyslogProtocol23Format
  1. 若按照上述方式修改/etc/rsyslog.conf不起作用,则在 /etc/rsyslog.d/graylog.conf中添加上述配置(UDP和TCP二选一)
  2. 配置完成后,重启客户端的rsyslog服务
systemctl restart rsyslog

测试

在客户端测试日志发送:

logger "This is a log message"

查看Graylog的日志接收情况:

elk 安全审计 安全审计的内容_elk 安全审计_09

elk 安全审计 安全审计的内容_centos_10

注意

对于Graylog接收日志的端口,有一定的要求,之前在测试过程中发现,若过大,则无法接收到日志,会触发Linux的安全规则,会提示让关闭SELinux 。参见:https://nagiosenterprises.my.site.com/support/s/article/Troubleshooting-SELinux-and-rsyslog-0e96d785#:~:text=In%20the%20blank%20space%20below%20the%20code%20you,In%20the%20%22Block%20Name%22%20field%20type%20Syslog%20%28SELinux%29