Запрос возвращает результаты при его индивидуальном запуске, возвращает неоднозначную ссылку, когда я добавляю его в запрос большего размера. - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь написать запрос, который суммирует уязвимости по имени хоста и включает информацию об этом хосте.Запрос выполняется в Rapid7 InsightVM

Запрос, который возвращает информацию об активе, выполняется успешно, за исключением случаев, когда я добавляю этот запрос, чтобы вернуть информацию об уязвимости, он возвращает неоднозначную справочную ошибку для description.Но значения ip address, host_name и asset_id возвращаются просто отлично.

Я просто пытаюсь объединить их вместе, чтобы вернуть эту информацию.Я чувствую, что чего-то очевидного не хватает.

Это возвращает то, что я хочу из таблицы активов, включая описание ОС (Windows, RHEL и т. Д.):

SELECT da.asset_id, da.host_name, da.ip_address, dos.description
FROM dim_asset da
JOIN dim_operating_system dos ON dos.operating_system_id = da.operating_system_id
JOIN fact_asset fa ON fa.asset_id = da.asset_id
GROUP BY da.asset_id, da.host_name, da.ip_address, dos.description

Это возвращает неоднозначную ссылку дляописание, это работает для asset_id, host_name и ip_address:

    WITH remediations AS (
        SELECT DISTINCT fr.solution_id AS ultimate_soln_id, summary, fix, estimate, riskscore, dshs.solution_id AS solution_id
        FROM fact_remediation(10,'riskscore DESC') fr
        JOIN dim_solution ds USING (solution_id)
        JOIN dim_solution_highest_supercedence dshs ON (fr.solution_id = dshs.superceding_solution_id AND ds.solution_id = dshs.superceding_solution_id)

    ),

    assets AS (
        SELECT da.asset_id, da.host_name, da.ip_address, dos.description
        FROM dim_asset da
        JOIN dim_operating_system dos ON dos.operating_system_id = da.operating_system_id
        JOIN fact_asset fa ON fa.asset_id = da.asset_id
        GROUP BY da.asset_id, da.host_name, da.ip_address, dos.description
    )

    SELECT
       csv(DISTINCT dv.title) AS "Vulnerability Title",
       host_name AS "Asset Hostname", ip_address AS "Asset IP", description AS "OS",
       round(sum(dv.riskscore)) AS "Asset Risk",
       summary AS "Solution",
       fix as "Fix"

    FROM remediations r
       JOIN dim_asset_vulnerability_solution dvs USING (solution_id)
       JOIN dim_vulnerability dv USING (vulnerability_id)
       JOIN assets USING (asset_id)

    GROUP BY r.riskscore, host_name, ip_address, asset_id, summary, fix
    ORDER BY "Asset Risk" DESC     WITH remediations AS (

1 Ответ

0 голосов
/ 29 марта 2019

Скорее всего, dim_asset_vulnerability_solution или dim_vulnerability также имеют поле description.Простая квалификация выбранных полей с их предполагаемым источником должна решить эту проблему.

...
a.host_name AS "Asset Hostname", a.ip_address AS "Asset IP", a.description AS "OS"
...
JOIN assets AS a USING (asset_id)
...
GROUP BY r.riskscore, a.host_name, a.ip_address, asset_id, summary, fix

Примечание: asset_id не проблема, потому что в USING есть некоторая дополнительная «магия», которая объединяет ссылки, соединенные ею.

Комментарий: Если нет очень конкретных причин, GROUP BY не следует использовать в качестве замены SELECT DISTINCT (, относящихся к активам CTE, в частности )

...