feat(db-connector): Include UUID for findings ID (#1368)

This commit is contained in:
Nacho Rivera
2022-09-14 17:23:38 +02:00
committed by GitHub
parent f2950764f0
commit 99f9abe3f6
3 changed files with 63 additions and 30 deletions
+31 -27
View File
@@ -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
);
```
+1 -1
View File
@@ -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() {
+31 -2
View File
@@ -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}"