Есть ли способ извлечь значение из поля json, используя процессор в apache nifi, и подставить это значение в другой файл json? - PullRequest
0 голосов
/ 03 июля 2019

Итак, я создал рабочий процесс в apache nifi, который извлекает вложения csv из gmail и преобразует их в json. То, на чем я застрял, - это извлечение 3 значений (клиент, страна, пользовательский агент) из имеющегося у меня json и замена этих значений внутри другого json, который у меня будет использоваться для запуска предупреждений в другой программе. Я не уверен, какие процессоры будут использоваться для достижения этой цели. Любые советы будут с благодарностью.

Я попытался поиграться с атрибутами извлечения и JoltTransformJson, но я не могу заставить ни один из них работать так, как задумано.

Первый json, полученный при конвертировании CSV-файла:

{
  "clientip" : "116.255.157.126",
  "Country" : "China",
  "host" : "teachinglaw-prod.uis.georgetown.edu",
  "useragent" : "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)",
  "uri" : "//Config_Shell.php"
}

Второй json, который я написал, который должен иметь значения ("data", "message", "data"), обновленные первым json:

    {
"title": "cat7-SQL Injection",
"description": "alert description",
"type": "Internal ",
"source": "Splunk ",
"sourceRef": "Splunk alert ",
"severity": 2,
"tlp": 2,
"artifacts": [{
"dataType": "ip",
"data": "176.121.14.180",
"message": "Belize",
"tags": ["SQL Injection"]
},
{
"dataType": "user - agent",
"data": "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.53 Safari/525.19",
"tags": ["SQL Injection"]
}
],
"caseTemplate": "SQL Injection"
}

Мне нужно найти процессор (ы), который даст мне этот результат после слияния / замены значений:

    {
"title": "cat7-SQL Injection",
"description": "alert description",
"type": "Internal ",
"source": "Splunk ",
"sourceRef": "Splunk alert ",
"severity": 2,
"tlp": 2,
"artifacts": [{
"dataType": "ip",
"data": "116.255.157.126",
"message": "China",
"tags": ["SQL Injection"]
},
{
"dataType": "user - agent",
"data": "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)",
"tags": ["SQL Injection"]
}
],
"caseTemplate": "SQL Injection"
}

1 Ответ

0 голосов
/ 04 июля 2019

Я бы предложил использовать процессор EvaluateJSONPath для извлечения желаемых значений JSON для атрибутов потокового файла, а затем направить на ReplaceText и использовать язык выражений для замены токенов шаблона на значения атрибута. Например, учитывая этот «входной JSON»:

{
  "clientip" : "116.255.157.126",
  "Country" : "China",
  "host" : "teachinglaw-prod.uis.georgetown.edu",
  "useragent" : "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)",
  "uri" : "//Config_Shell.php"
}

Ваш EvaluateJsonPath процессор должен иметь следующую конфигурацию (любое свойство, не указанное в списке, сохраняется по умолчанию, а последние 3 являются «Динамическими свойствами», добавленными с помощью кнопки « + » в правом верхнем углу). таблицы):

  • Направление : flowfile-attribute
  • ip : $.clientip
  • сообщение : $.Country
  • user_agent : $.useragent

Следующим процессором является ReplaceText процессор со следующей конфигурацией:

  • Поиск значения : (?s)(^.*$)
  • Значение замены : {...JSON template below...}

Шаблон JSON выглядит следующим образом:

{
    "title": "cat7-SQL Injection",
    "description": "alert description",
    "type": "Internal ",
    "source": "Splunk ",
    "sourceRef": "Splunk alert ",
    "severity": 2,
    "tlp": 2,
    "artifacts": [{
            "dataType": "ip",
            "data": "<template_ip>",
            "message": "<template_message>",
            "tags": ["SQL Injection"]
        },
        {
            "dataType": "user - agent",
            "data": "<template_user_agent>",
            "tags": ["SQL Injection"]
        }
    ],
    "caseTemplate": "SQL Injection"
}

Каждое значение формы <template_some_value> будет сопоставлено, а часть some_value будет извлечена как группа захвата, на которую ссылается $2.

Наконец, еще один ReplaceText используется для введения значения атрибута в каждое местоположение токена шаблона. Конфигурация:

  • Поиск значения : <(template_(\w+))>
  • Запасная стоимость : ${${'$2'}}

Окончательный результат будет выглядеть так:

Screenshot of flowfile content after value insertion

...