Разбор глубоких журналов безопасности - AWS Lambda 'splunk-logger' node.js - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь изменить функцию Node.js под названием «splunk-logger».Проблема в том, что когда в функцию входит Сообщение SNS, события из консоли Антивируса (Trend Micro DeepSecurity) группируются вместе.Я уже связался с их поддержкой, и они сказали, что это просто способ отправки событий, и они не могут помочь.

Пример: {Message {Event_1} {Event_2} {Event_3}}

Сейчасфункция JavaScript прекрасно работает, а события перенаправляются в Splunk.Тем не менее, поскольку они сгруппированы до того, как они попадут в функцию Lambda, Splunk видит их как одно событие вместо 3.

Я думаю, что нужно взять переменную 'event' (так как она содержит сообщение sns ').') и проанализируйте это, чтобы отделить каждое событие (возможно, используя регулярное выражение или что-то в этом роде).Затем я могу либо создать другую функцию для немедленной отправки каждого события, либо просто вызвать функцию «logger.flushAsync» для их отправки.

Ссылка на splunk-dev, объясняющую функцию: http://dev.splunk.com/view/event-collector/SP-CAAAE6Y#create.

Вот код из index.js:

const loggerConfig = {
    url: process.env.SPLUNK_HEC_URL,
    token: process.env.SPLUNK_HEC_TOKEN,
};
const SplunkLogger = require('./lib/mysplunklogger');
const logger = new SplunkLogger(loggerConfig);
exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
// Log JSON objects to Splunk
    logger.log(event);
// Send all the events in a single batch to Splunk
    logger.flushAsync((error, response) => {
        if (error) {
            callback(error);
        } else {
            console.log(`Response from Splunk:\n${response}`);
            callback(null, event.key1); // Echo back the first key value
        }
    });
};

Вот код из файла mysplunklogger.js.

'use strict';

const url = require('url');

const Logger = function Logger(config) {
    this.url = config.url;
    this.token = config.token;

    this.addMetadata = true;
    this.setSource = true;

    this.parsedUrl = url.parse(this.url);
    // eslint-disable-next-line import/no-dynamic-require
    this.requester = require(this.parsedUrl.protocol.substring(0, this.parsedUrl.protocol.length - 1));
    // Initialize request options which can be overridden & extended by consumer as needed
    this.requestOptions = {
        hostname: this.parsedUrl.hostname,
        path: this.parsedUrl.path,
        port: this.parsedUrl.port,
        method: 'POST',
        headers: {
            Authorization: `Splunk ${this.token}`,
        },
        rejectUnauthorized: false,
    };

    this.payloads = [];
};

// Simple logging API for Lambda functions
Logger.prototype.log = function log(message, context) {
    this.logWithTime(Date.now(), message, context);
};

Logger.prototype.logWithTime = function logWithTime(time, message, context) {
    const payload = {};

    if (Object.prototype.toString.call(message) === '[object Array]') {
        throw new Error('message argument must be a string or a JSON object.');
    }
    payload.event = message;

    // Add Lambda metadata
    if (typeof context !== 'undefined') {
        if (this.addMetadata) {
            // Enrich event only if it is an object
            if (message === Object(message)) {
                payload.event = JSON.parse(JSON.stringify(message)); // deep copy
                payload.event.awsRequestId = context.awsRequestId;
            }
        }
        if (this.setSource) {
            payload.source = `lambda:${context.functionName}`;
        }
    }

    payload.time = new Date(time).getTime() / 1000;

    this.logEvent(payload);
};

Logger.prototype.logEvent = function logEvent(payload) {
    this.payloads.push(JSON.stringify(payload));
};

Logger.prototype.flushAsync = function flushAsync(callback) {
    callback = callback || (() => {}); // eslint-disable-line no-param-reassign

    console.log('Sending event(s)');
    const req = this.requester.request(this.requestOptions, (res) => {
        res.setEncoding('utf8');

        console.log('Response received');
        res.on('data', (data) => {
            let error = null;
            if (res.statusCode !== 200) {
                error = new Error(`error: statusCode=${res.statusCode}\n\n${data}`);
                console.error(error);
            }
            this.payloads.length = 0;
            callback(error, data);
        });
    });

    req.on('error', (error) => {
        callback(error);
    });

    req.end(this.payloads.join(''), 'utf8');
};

module.exports = Logger;

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018
import requests
import re
import json
import os

def lambda_handler(event, context):

    data = json.dumps(event)

    EventIds = re.findall(r'{\\\".+?\\\"}', data)
    EventLength = len(EventIds)

    headers = {'Authorization': 'Splunk ' + os.environ['SPLUNK_HEC_TOKEN']}

    i = 0
    while i < EventLength:
        response = requests.post(os.environ['SPLUNK_HEC_URL'], headers=headers, json={"event":EventIds[i]}, verify=True)
    i+=1
0 голосов
/ 29 ноября 2018

Массивы - это тип данных, используемый, когда Deep Security 10.0 или более поздняя версия отправляет события в Amazon SNS. Но Splunk хочет одно событие на сообщение. Так что не отправляйте массив напрямую.

Вместо этого используйте Splunk logger или Lambda для перебора массива, отправляя каждый элемент как отдельное сообщение. Вы можете изменить этот пример лямбда-скрипта для Node.js:

https://github.com/deep-security/amazon-sns/blob/master/lambda-save-ds-event-to-s3.js

Он отправляет события на S3 индивидуально (это то, что вам нужно). Просто измените его для отправки в Splunk.

Раскрытие информации: я работаю на Trend Micro.

...