From 99f9abe3f603308b2d2613c7eaab9669e0b4d3b8 Mon Sep 17 00:00:00 2001 From: Nacho Rivera <59198746+n4ch04@users.noreply.github.com> Date: Wed, 14 Sep 2022 17:23:38 +0200 Subject: [PATCH] feat(db-connector): Include UUID for findings ID (#1368) --- README.md | 58 +++++++++++++++++++++++--------------------- include/db_connector | 2 +- include/outputs | 33 +++++++++++++++++++++++-- 3 files changed, 63 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 1ead4b08d0..55ed9855d5 100644 --- a/README.md +++ b/README.md @@ -360,36 +360,40 @@ Configure a `~/.pgpass` file into the root folder of the user that is going to l - `POSTGRES_TABLE` > *Note*: If you are using a schema different than postgres please include it at the beginning of the `POSTGRES_TABLE` variable, like: `export POSTGRES_TABLE=prowler.findings` +Also you need to have enabled the `uuid` postgresql extension, to enable it: + +`CREATE EXTENSION IF NOT EXISTS "uuid-ossp";` + Create a table in your PostgreSQL database to store the Prowler's data. You can use the following SQL statement to create the table: ``` CREATE TABLE IF NOT EXISTS prowler_findings ( -audit_id TEXT, -finding_id TEXT, -profile TEXT, -account_number TEXT, -region TEXT, -check_id TEXT, -result TEXT, -item_scored TEXT, -item_level TEXT, -check_title TEXT, -result_extended TEXT, -check_asff_compliance_type TEXT, -severity TEXT, -service_name TEXT, -check_asff_resource_type TEXT, -check_asff_type TEXT, -risk TEXT, -remediation TEXT, -documentation TEXT, -check_caf_epic TEXT, -resource_id TEXT, -account_details_email TEXT, -account_details_name TEXT, -account_details_arn TEXT, -account_details_org TEXT, -account_details_tags TEXT, -prowler_start_time TEXT +id uuid, +audit_id uuid , +profile text, +account_number text, +region text, +check_id text, +result text, +item_scored text, +item_level text, +check_title text, +result_extended text, +check_asff_compliance_type text, +severity text, +service_name text, +check_asff_resource_type text, +check_asff_type text, +risk text, +remediation text, +documentation text, +check_caf_epic text, +resource_id text, +account_details_email text, +account_details_name text, +account_details_arn text, +account_details_org text, +account_details_tags text, +prowler_start_time text ); ``` diff --git a/include/db_connector b/include/db_connector index 0ff630034c..afd08fe7ba 100755 --- a/include/db_connector +++ b/include/db_connector @@ -27,7 +27,7 @@ export SUPPORTED_DB_PROVIDERS postgresql_connector () { CSV_REGISTRY="${1}" - psql -q -U "${POSTGRES_USER}" -h "${POSTGRES_HOST}" -d "${POSTGRES_DB}" -c "copy ${POSTGRES_TABLE} from stdin with null as E'\'\'' delimiter ','" <<< "${CSV_REGISTRY}" + psql -q -U "${POSTGRES_USER}" -h "${POSTGRES_HOST}" -d "${POSTGRES_DB}" -c "INSERT INTO ${POSTGRES_TABLE} VALUES (uuid_generate_v4(),${CSV_REGISTRY})" } db_exit_abnormally() { diff --git a/include/outputs b/include/outputs index 9a17d9453a..b70e03e4fe 100644 --- a/include/outputs +++ b/include/outputs @@ -197,14 +197,43 @@ general_output() { #checking database provider if [[ ${DATABASE_PROVIDER} == 'postgresql' ]] then - FINDING_ID="$(LC_ALL=C echo -e -n "${CHECK_RESULT_EXTENDED}" | tr -cs '[:alnum:]._~-' '_')" END_STRIPPED_TITLE_TEXT=${TITLE_TEXT%%\]*} CHECK_ID="${END_STRIPPED_TITLE_TEXT##\[}" - POSTGRES_LINE="${AUDIT_ID//,/--}${SEP}${FINDING_ID//,/--}${SEP}${PROFILE//,/--}${SEP}${ACCOUNT_NUM//,/--}${SEP}${REGION_FROM_CHECK//,/--}${SEP}${CHECK_ID//,/--}${SEP}${CHECK_RESULT//,/--}${SEP}${ITEM_SCORED//,/--}${SEP}${ITEM_CIS_LEVEL//,/--}${SEP}${TITLE_TEXT//,/--}${SEP}${CHECK_RESULT_EXTENDED//,/--}${SEP}${CHECK_ASFF_COMPLIANCE_TYPE//,/--}${SEP}${CHECK_SEVERITY//,/--}${SEP}${CHECK_SERVICENAME//,/--}${SEP}${CHECK_ASFF_RESOURCE_TYPE//,/--}${SEP}${CHECK_ASFF_TYPE//,/--}${SEP}${CHECK_RISK//,/--}${SEP}${CHECK_REMEDIATION//,/--}${SEP}${CHECK_DOC//,/--}${SEP}${CHECK_CAF_EPIC//,/--}${SEP}${CHECK_RESOURCE_ID//,/--}${SEP}${ACCOUNT_DETAILS_EMAIL//,/--}${SEP}${ACCOUNT_DETAILS_NAME//,/--}${SEP}${ACCOUNT_DETAILS_ARN//,/--}${SEP}${ACCOUNT_DETAILS_ORG//,/--}${SEP}${ACCOUNT_DETAILS_TAGS//,/--}${SEP}${PROWLER_START_TIME//,/--}" + stripPostgresFields + DB_SEP="','" + POSTGRES_LINE="'${AUDIT_ID//,/--}${DB_SEP}${PROFILE//,/--}${DB_SEP}${ACCOUNT_NUM//,/--}${DB_SEP}${REGION_FROM_CHECK//,/--}${DB_SEP}${CHECK_ID//,/--}${DB_SEP}${CHECK_RESULT//,/--}${DB_SEP}${ITEM_SCORED//,/--}${DB_SEP}${ITEM_CIS_LEVEL//,/--}${DB_SEP}${TITLE_TEXT//,/--}${DB_SEP}${CHECK_RESULT_EXTENDED//,/--}${DB_SEP}${CHECK_ASFF_COMPLIANCE_TYPE//,/--}${DB_SEP}${CHECK_SEVERITY//,/--}${DB_SEP}${CHECK_SERVICENAME//,/--}${DB_SEP}${CHECK_ASFF_RESOURCE_TYPE//,/--}${DB_SEP}${CHECK_ASFF_TYPE//,/--}${DB_SEP}${CHECK_RISK//,/--}${DB_SEP}${CHECK_REMEDIATION//,/--}${DB_SEP}${CHECK_DOC//,/--}${DB_SEP}${CHECK_CAF_EPIC//,/--}${DB_SEP}${CHECK_RESOURCE_ID//,/--}${DB_SEP}${ACCOUNT_DETAILS_EMAIL//,/--}${DB_SEP}${ACCOUNT_DETAILS_NAME//,/--}${DB_SEP}${ACCOUNT_DETAILS_ARN//,/--}${DB_SEP}${ACCOUNT_DETAILS_ORG//,/--}${DB_SEP}${ACCOUNT_DETAILS_TAGS//,/--}${DB_SEP}${PROWLER_START_TIME//,/--}'" postgresql_connector "${POSTGRES_LINE}" fi } +stripPostgresFields(){ + AUDIT_ID=${AUDIT_ID//\'/´} + PROFILE=${PROFILE//\'/´} + ACCOUNT_NUM=${ACCOUNT_NUM//\'/´} + REGION_FROM_CHECK=${REGION_FROM_CHECK//\'/´} + CHECK_ID=${CHECK_ID//\'/´} + CHECK_RESULT=${CHECK_RESULT//\'/´} + ITEM_SCORED=${ITEM_SCORED//\'/´} + ITEM_CIS_LEVEL=${ITEM_CIS_LEVEL//\'/´} + TITLE_TEXT=${TITLE_TEXT//\'/´} + CHECK_RESULT_EXTENDED=${CHECK_RESULT_EXTENDED//\'/´} + CHECK_ASFF_COMPLIANCE_TYPE=${CHECK_ASFF_COMPLIANCE_TYPE//\'/´} + CHECK_SEVERITY=${CHECK_SEVERITY//\'/´} + CHECK_SERVICENAME=${CHECK_SERVICENAME//\'/´} + CHECK_ASFF_RESOURCE_TYPE=${CHECK_ASFF_RESOURCE_TYPE//\'/´} + CHECK_ASFF_TYPE=${CHECK_ASFF_TYPE//\'/´} + CHECK_RISK=${CHECK_RISK//\'/´} + CHECK_REMEDIATION=${CHECK_REMEDIATION//\'/´} + CHECK_DOC=${CHECK_DOC//\'/´} + CHECK_CAF_EPIC=${CHECK_CAF_EPIC//\'/´} + ACCOUNT_DETAILS_EMAIL=${ACCOUNT_DETAILS_EMAIL//\'/´} + ACCOUNT_DETAILS_NAME=${ACCOUNT_DETAILS_NAME//\'/´} + ACCOUNT_DETAILS_ARN=${ACCOUNT_DETAILS_ARN//\'/´} + ACCOUNT_DETAILS_ORG=${ACCOUNT_DETAILS_ORG//\'/´} + ACCOUNT_DETAILS_TAGS=${CHECK_RESOURCE_ID//\'/´} + PROWLER_START_TIME=${PROWLER_START_TIME//\'/´} +} + textPass(){ CHECK_RESULT="PASS" CHECK_RESULT_EXTENDED="${1}"