Jak zbudować złącza API usługi Push Push dla standardu CEF

Przegląd Integracji

CEF (Common Event Format (Wspólny Format Zdarzeń)) jest rozciągliwym, bazującym na tekście formatem używanym przez zarządzanie dziennikiem. Bitdefender GravityZone jest teraz w stanie dostarczać alerty używając standardu CEF poprzez integrację z Twoim ESM.

W tym przykładzie standardowej integracji z CEF, komunikacja pomiędzy GravityZone i ESM jest zrobiona przez Node.js Connector. Złącze to używa metody POST, aby odbierać uwierzytelnione żądania z GravityZone Event Push Service API. Żądania są analizowane, a następnie przekazywane dalej do lokalnego, zdalnego serwera Syslog.

Warunki wstępne

– Serwer Ubuntu 16.04

– Zainstalowany Node.js w wersji 8.1.x lub nowszy

Wiadomość HTTP

Event Push Service Request Header

Authorization: {authorization_string}

Event Push Service Payload

{
"cef": "0",
"events": [
"CEF:0|Bitdefender|GravityZone|6.4.0-8|70000|Registration"3"BitdefenderGZModule=registration
dvchost=TEST_ENDPOINTasdad BitdefenderGZComputerFQDN=testendpoint.dsd.ro dvc=10.10.18.227 ",
"CEF:0|Bitdefender|GravityZone|6.4.0-8|35|Product Modules
Status|5|BitdefenderGZModule=modules dvchost=TEST_ENDPOINTasdad
BitdefenderGZComputerFQDN-test-endpoint.dsd.ro dvc=10.10.18.227
",
"CEF:0|Bitdefender|GravityZone|6.4.0-8|35|Product Modules
Status|5|BitdefenderGZModule=modules dvchost=TEST_ENDPOINTasdad
BitdefenderGZComputerFQDN=test-endpoint.dsd.ro dvc=10.10.18.227 "
]
}

Tworzenie Złącza Node.js

Aby zbudować Złącze Node.js, podążaj za tymi krokami:

Krok 1: Utwórz folder dla złącza.

Utwórz katalog na swoim serwerze, na którym chciałbyś umieścić aplikację.

Krok 2: Utwórz plik package.json

Utwórz nowy plik nazwany package.json w następujący sposób:

{
"name": "app-name",
"version": "1.0.0",
"description": "client that will be able to receive authenticated POST
request and write each row in the local or remote syslog",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "MIT",
"dependencies": {
}
}

Krok 3: Sprowadź zależności

– Express framework

Express jest minimalną i elastyczną strukturą aplikacji WWW Node.js, która zapewnia solidny zestaw funkcji dla aplikacji internetowych, oraz mobilnych.

Użyj Express, aby utworzyć serwer http, a następnie wprowadź następujące polecenie, aby umieścić go w pliku package.json:

$ npm install express --save

– Analizator składniowy body

Postępuj zgodnie z instrukcjami oprogramowania pośredniego analizowania treści body Node.js, aby przeanalizować przychodzące żądania body w oprogramowaniu pośrednim przed procedurami obsługi dostępnymi pod właściwością req.body.

$ npm install body-parser --save

– Klient Syslog

Postępuj zgodnie z instrukcjami modułu klienta Syslog, aby wysyłać powiadomienia o zdarzeniach w sieciach.

$ npm install syslog-client --save

Krok 4: Utwórz plik config.json

Plik ten zawiera informacje konfiguracyjne używane podczas uruchamiania server.js. Użyj następującej ścieżki w celu konfiguracji pliku:

APP_ROUTE/api/config

Zmienne plików:

authentication_string : używane w server.js w celu sprawdzania poprawności wartości z req.headers.autgorization

target : adres IP Twojego klienta syslog.

transport : poprawne wartości dla transportu (TCP/UDP), używane również do konfigurowania klienta syslog.

syslog_port ​: port TCP, lub UDP do wysyłania wiadomości.

port 3200 : Start serwera na porcie 3200

Przykład:

{
"port": 3200,
"syslog_port": 515,
"transport": "Tcp",
"target": "10.17.23.68",
"authentication_string": "Basic dGVzdDp0ZXN0"
}

Krok 5: Utwórz plik server.js

Wymagane zależności aplikacji:

server.js
// Wymaga express'a i utworzenia jego instancji
const express = require('express');
const app = express();
Require node File System module
const fs = require('fs');
// Wymaga analizatora body i utworzenia instancji json analizatora tekstu
const bodyParser = require('body-parser');
const textParser = bodyParser.json();
// Wymaga epsSyslogHelper -> ta część będzie wyjaśniona poniżej
const epsSyslogHelper = require('./api/epsSyslogHelper');

 

1. Wczytaj plik konfiguracyjny. Ścieżka pliku konfiguracyjnego jest odbierana jako parametr na uruchomionym serwerze węzłowym.

node server.js {ścieżka dla pliku konfiguracji}

server.js
if (!process.argv[2]) {
 throw "Missing input file parameter";
}
let configPath = process.argv[2];
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));

2. Sprawdź req.header.authorization

Jeśli autoryzacyjny łańcuch znaków jest taki sam jak z twojego pliku konfiguracyjnego, kontynuuj. W przeciwnym razie wpisz not return, aby zatrzymać wykonywanie

3.

server.js
// użyj podstawowej autoryzacji HTTP do zabezpieczenia interfejsu api
app.use('/api', (req, res, next) => {
 console.log(req.headers.authorization);
 // sprawdź podstawowy nagłówek autoryzacji
 if (!req.headers.authorization) {
 return res.status(401).json({ message: 'Missing Authorization
Header' });
 }
 // zweryfikuj poświadczenia autoryzacji
 const authorizationString = req.headers.authorization;
 if (config.authentication_string !== authorizationString) {
 return res.status(401).json({ message: 'Invalid Authentication
Credentials' });
 }
 next();
});

4. Dodaj trasę, która odpowiada na żądanie przychodzące z inrfejsu Event Push Service API. Zaktualizuj body i zaloguj się za pomocą epsSyslogHelper.js

server.js
// url: http://{server_url}:{port}/api/
app.post('/api', textParser, (request, response) => {
 const body = request.body;
 let syslogHelper = new epsSyslogHelper(config);
 syslogHelper.log(body);
 response.sendStatus(200);
});

5. Ustaw serwer w tryb nasłuchiwania na porcie skonfigurowanym w pliku config.json:

app.listen(config.port, () => console.log(`Listening on port
${config.port}`));

Krok 6: Stwórz plik epsSyslogHelpers.js

Wymagane zależności aplikacji:

1. Włącz serwer Klienta bazujący na pliku konfiguracyjnym.

epsSyslogHelper.js
/**
* EventConverter class
*/
EpsSyslogHelper = function (config) {
 let hostName = os.hostname();
 if (!hostName) {
 hostName = 'localhost';
 }
 let dot = hostName.indexOf('.');
 if (dot > 0) {
 hostName = hostName.substring(0, dot);
 }
 console.log('Logging using host name %s', hostName);
 this._client = syslog.createClient(config.target, {
 syslogHostname: hostName,
 port: config.syslog_port,
 transport: syslog.Transport[config.transport],
 });
 this._client.on('error', function(err) {
 console.error('Error from syslog network: %s', err);
 });
};

2. Zaktualizuj wiadomość, oraz dziennik zdarzeń.

epsSyslogHelper.js
EpsSyslogHelper.prototype.log = function _log(msg) {
 let options = {
 facility: syslog.Facility.Local0,
 severity: syslog.Severity.Informational
 };
 let events;
 if(msg.hasOwnProperty('cef')){
 //events = msg.params.events;
 events = msg.events;
 }
 if(events){
 for(let eventKey in events) {
 let syslogMessage = events[eventKey];
 if(typeof syslogMessage !== 'string') {
 syslogMessage = JSON.stringify(syslogMessage);
 }
 console.log("Event key = " + eventKey + " is = " +
syslogMessage);
 this._client.log(syslogMessage, options, function (err) {
 if (err) {
 console.log(err);
 } else {
 console.log('Sent to syslog')
 }
 });
 }
 }
};

Krok 7: Włącz serwer węzłowy

Aby włączyć używając pliku konfiguracyjnego wpisz następujące polecenie:

node server.js {ścieżka_do_pilku_konfiguracyjnego} (w tym wypadku
api/config/config.json)

Źródło: https://www.bitdefender.com/support/building-an-event-push-service-api-connector-for-cef-standard-2373.html