You can configure the AWS connector to upload all active asset and finding data from your Nucleus project to your own S3 buckets for your use outside of the Nucleus platform. Only active, manually mitigated, and custom findings are uploaded.
At this time, this feature is only available for customers using Nucleus on AWS. GCP, Azure, and Self-Hosted customers may not use this feature.
Before you get started, please review the documentations for Creating a cross-account role and setting permissions and follow the steps to setup permissions for that role to allow S3 exports
Setting up S3 data uploads
-
Log in to your Nucleus project.
-
From the navigation bar on the left, under Project Administration, select Connector Setup.
-
Select Amazon Web Services.

-
In the General tab, click the green plus button to add a new Role. Alternatively, you can bulk import credentials using a CSV file as detailed below.
-
In the Label field, enter a label for the AWS account.
-
In the Role ARN field, enter the Amazon Resource Name (ARN) of the role used for the connection.
-
Click Verify Credentials. If the credentials were entered correctly, a message confirming a successful connection will appear.
-
Select the S3 Data tab at the top.
-
Click the green plus button to add a new S3 bucket. Alternatively, you can bulk import credentials using a CSV file as detailed below.
-
In the Label field, enter a label for the AWS account.
-
In the S3 Bucket field, enter the address of the S3 bucket.
-
From the Region menu, select the region the S3 bucket is located in.
-
In the Role ARN field, enter the Amazon Resource Name (ARN) of the role used for the connection.
-
Click Verify Credentials. If the credentials were entered correctly, a message confirming a successful connection will appear.
-
Set the frequency to upload data.
- To upload data on a set schedule:
- Select the Upload asset data (daily) checkbox.
- From the Start time menu, select the time asset data will upload every day. The time selected is in Coordinated Universal Time (UTC).
- From the Buckets menu, select which buckets the asset data will upload to.
- Select the Upload finding data (weekly) checkbox.
- From the Day menu, select which day of the week finding data will upload.
- From the Start time menu, select the time finding data will upload every day. The time selected is in Coordinated Universal Time (UTC).
- From the Buckets menu, select which buckets the finding data will upload to.
- To upload data in realtime:
- Select the Upload finding deltas as new scans are ingested checkbox. When a new custom finding is created, or a custom finding is edited (any changed parameter, either at the unique level or the justification level), the finding will be uploaded to S3.
- From the Buckets menu, select which buckets data will upload to.
- To upload all asset and finding data immediately:
- Select the Upload entire asset and finding data from Nucleus to S3 on save checkbox.
- From the Buckets menu, select which buckets data will upload to.
- To upload data on a set schedule:
-
Optionally select Zip files prior to uploading them to S3 to compress the file size of the data uploaded to the S3 bucket.
-
Click Save & Finish.
Bulk import credentials template
If your organization has many S3 buckets, you can bulk import role ARNs by clicking Bulk Import Buckets and uploading a CSV structured in the following way:
label,s3bucket,region,crossaccountrole
Example template
The following is an example CloudFormation template that can be deployed to AWS accounts to provide access to S3 buckets.
When using the template below, replace ACCOUNT_ID_FROM_NUCLEUS, EXTERNAL_ID_FROM_NUCLEUS_PROJECT, and BUCKET_NAME_# with the relevant AWS Account, AWS External ID, and bucket name values.
AWSTemplateFormatVersion: "2010-09-09"
Resources:
NucleusAWSIntegrationRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: "NucleusAWSS3BucketConnectorRole"
Description: "Role used by a Nucleus Project AWS connector to upload asset and finding data to one or more S3 buckets."
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS:
- "arn:aws:iam::ACCOUNT_ID_FROM_NUCLEUS:root"
Action:
- "sts:AssumeRole"
Condition:
StringEquals:
"sts:ExternalId": "EXTERNAL_ID_FROM_NUCLEUS_PROJECT"
Policies:
- PolicyName: "NucleusAWSConnectorPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: "iam:ListAccountAliases"
Resource: "*"
- Effect: Allow
Action: "s3:PutObject"
Resource:
- "arn:aws:s3:::BUCKET_NAME_1"
- "arn:aws:s3:::BUCKET_NAME_1/*"
- "arn:aws:s3:::BUCKET_NAME_2"
- "arn:aws:s3:::BUCKET_NAME_2/*"
About uploaded data
Format
The data is uploaded in JSON format and separated into paginated files for each type of top-level object.
These files are uploaded into three directories; /assets, /findings and /externalIssues. The /assets directory contains data about all assets, including those without any findings associated with them, and includes metadata regarding the assets themselves (e.g., host information, Nucleus statistics, etc). The /findings directory contains data for all findings, including associated assets, groups, instances, justifications, and teams. The /externalIssues directory contains data about issues created by Nucleus in 3rd party Issue Trackers like Jira and ServiceNow.
Files with full in their name contain a complete upload of all data. Alternatively, files with delta in their name contain only data that has changed since the last scan (e.g., new findings, changed values).
Note: Delta uploads for external issues is not currently supported.
| Object | Description | File Name |
|---|---|---|
| Assets | Anything that can have a vulnerability correlated with it. This object contains data for all assets. | /assets/asset-data-FULL/DELTA-TIMESTAMP |
| Asset Findings | Anything that can have a vulnerability correlated with it. This object only contains data for assets with findings associated with it. | /findings/assets-finding-data-FULL/DELTA-TIMESTAMP |
| Asset Groups | Flexible collections of assets that allow you to organize your assets across your entire organization. | /findings/assetGroups-finding-data-FULL/DELTA-TIMESTAMP |
| Findings | Unique (top-level) and instance-level vulnerabilities that exist on assets. When a finding is detected in an asset, that makes it an instance of that finding. If the same vulnerability is discovered in 5 assets, there will be 5 instances of that vulnerability. |
'Vuln' and 'Vuln-Compliance' type unique findings: /findings/findings-finding-data-FULL/DELTA-TIMESTAMP'Compliance' and 'Vuln-Compliance' type unique findings: /findings/compliance-findings-finding-data-FULL/DELTA-TIMESTAMP'Vuln' and 'Vuln-Compliance' type findings: /instances/instances-finding-data-FULL/DELTA-TIMESTAMP'Compliance' and 'Vuln-Compliance' type findings: /instances/compliance-instances-finding-data-FULL/DELTA-TIMESTAMP |
| Justifications | Justifications track the changes (e.g., a status change) to instances over time and subsequent scans. Any time there is a change to a finding (manually or via scan) there will be a justification record for that change. | /findings/justifications-finding-data-FULL/DELTA-TIMESTAMP |
| Teams | Groups of users that collectively own assets and vulnerabilities in Nucleus. These Teams can then be linked to assets to define asset ownership, and then be further linked to vulnerabilities to define vulnerability ownership. | /teams-finding-data-FULL/DELTA-TIMESTAMP |
| External Issues | External issues are created by Nucleus through integrations with 3rd party Issue Trackers like Jira and ServiceNow. This object can be linked to finding instances. | /externalIssues/externalissues-instances-finding-data-FULL/DELTA-TIMESTAMP |
The /assets/asset-data-full-TIMESTAMP files contain data for all assets, including those without any findings associated with them. The /findings/assets-finding-data-FULL/DELTA-TIMESTAMP files contain data only for assets with findings associated with them.
Additionally, a "connectivity-verification" directory is created when when first verifying the S3 bucket connection. This directory contains empty, timestamped JSON files to confirm the AWS connector can successfully upload files.
These files are connected to each other via the following joining keys:
- Findings and Instances are connected via
finding_key. - Findings and Justifications are connected via
finding_number. - Instances and Justifications are connected via
instance_key. - Instances and External Issues are connected via
instance_key. - Assets and Instances are connected via
host_id(whereassets.asset_id=instances.host_id).
Schemas
Assets
| Primary Key | Type |
|---|---|
| host_id | INT |
| Foreign Keys | Type |
|---|---|
| ip_address | VARCHAR(64) |
| host_name | VARCHAR(2048 |
| host_type | VARCHAR(128) |
| host_criticality | VARCHAR(16) |
| operating_system_name | VARCHAR(256) |
Asset Groups
| Foreign Keys | Type |
|---|---|
| host_id | INT |
| asset_group_sources | VARCHAR(16) |
| asset_group_name | VARCHAR(256) |
Findings
| Foreign Keys | Type |
|---|---|
| finding_number | VARCHAR(251) |
| scan_type | VARCHAR(24) |
| finding_type | VARCHAR(24) |
| finding_severity | VARCHAR(32) |
| finding_severity_adjusted | VARCHAR(32) NULL |
| finding_exploitable | TINYTIN(1) |
| finding_name | VARCHAR(128) |
| finding_cve | VARCHAR(8192) |
| finding_iava | VARCHAR(170) |
| finding_type | VARCHAR(32) |
| finding_description | TEXT |
| finding_recommendation | TEXT |
| finding_references | JSON |
| finding_key | CONCAT(scan_type, '-', finding_number) |
| epss_score | FLOAT NULL |
| cisa_vulnerability_name | VARCHAR |
Instances
| Foreign Keys | Type |
|---|---|
| project_id | INT |
| assessment_id | INT |
| finding_number | VARCHAR(251) |
| scan_type | VARCHAR(24) |
| finding_type | VARCHAR(24) |
| finding_justification_key | VARCHAR(256) |
| finding_discovered | DATETIME |
| finding_output | TEXT |
| finding_port | VARCHAR(12) |
| finding_path | VARCHAR(4096) |
| finding_result | VARCHAR(16) |
| host_id | INT |
| scan_date | DATETIME |
| instance_key | CONCAT(scan_type, '-', finding_number, '-', host_id, '-', finding_justification_key) |
| finding_key | CONCAT(scan_type, '-', finding_number) |
| justification_assignee | VARCHAR(512) |
| justification_text | TEXT |
| justification_status_name | VARCHAR(64) |
| justification_verification_date | DATETIME |
| justification_datetime | DATETIME |
| due_date | DATE |
| justification_status_mitigating | TINYINT(1) |
| finding_score | INT |
| nucleus_threat_rating | VARCHAR |
| nucleus_exploited | ENUM('Yes', 'No', '') |
| nucleus_exploited_by_malware | ENUM('Yes', 'No', '') |
| nucleus_exploited_by_ransomware | ENUM('Yes', 'No', '') |
| nucleus_likely_to_be_exploited | ENUM('Yes', 'No', '') |
| nucleus_public_exploit_available | ENUM('Yes', 'No', '') |
| nucleus_private_exploit_available | ENUM('Yes', 'No', '') |
| nucleus_exploit_weaponized | ENUM('Yes', 'No', '') |
| nucleus_impacts_ot | ENUM('Yes', 'No', '') |
| nucleus_fix_available | ENUM('Yes', 'No', '') |
| nucleus_patch_available | ENUM('Yes', 'No', '') |
| nucleus_ease_of_exploitation | VARCHAR |
| nucleus_exploitation_consequence | VARCHAR |
| nucleus_remote_exploitation | ENUM('Yes', 'No', '') |
| nucleus_zero_day | ENUM('Yes', 'No', '') |
| nucleus_zero_day_previously | ENUM('Yes', 'No', '') |
| nucleus_mitigation_available | ENUM('Yes', 'No', '') |
| nucleus_widely_exploited | ENUM('Yes', 'No', '') |
| nucleus_media_mentions_alltime | INT NULL |
| nucleus_media_mentions_30day | INT NULL |
| nucleus_media_mentions_90day | INT NULL |
| nucleus_media_mentions_180day | INT NULL |
| threat_group_insights | JSON |
| malware_insights | JSON |
| mitigations_insights | JSON |
| patch_insights | JSON |
| exploits_insights | JSON |
| nucleus_actors | JSON |
| nucleus_malware | JSON |
NOTE:
The finding_score field (Nucleus Risk Score) is only included in full exports, not delta exports. If a risk score cannot be calculated, the value will be 0
*Justification fields are not included in instances files by default. If you would like this option enabled for your organization, please contact Nucleus support.
Justifications
| Foreign Keys | Type |
|---|---|
| host_id | INT |
| finding_number | VARCHAR(251) |
| scan_type | VARCHAR(24) |
| finding_justification_key | VARCHAR(256) |
| instance_key | CONCAT(scan_type, '-', finding_number, '-', host_id, '-', finding_justification_key) |
| justification_assignee | VARCHAR(512) |
| justification_text | TEXT |
| justification_status_id | INT |
| justification_verification_date | DATETIME |
| has_file | TINYINT(1) |
| security_comment_text | VARCHAR(8224) |
| justification_datetime | DATETIME |
| due_date | DATE |
Justification Status
| Foreign Keys | Type |
|---|---|
| justification_status_id | INT |
| justification_status_name | VARCHAR(64) |
| justification_status_mitigating | BOOL |
Teams
| Primary Key | Type |
|---|---|
| team_id | INT |
| Foreign Keys | Type |
|---|---|
| host_id | INT |
| finding_number | VARCHAR(251) |
| scan_type | VARCHAR(24) |
| finding_justification_key | VARCHAR(256) |
| instance_key | CONCAT(scan_type, '-', finding_number, '-', host_id, '-', finding_justification_key) |
External Issues
| Foreign Keys | Type |
|---|---|
| host_id | INT |
| finding_number | VARCHAR(251) |
| scan_type | VARCHAR(24) |
| finding_justification_key | VARCHAR(256) |
| instance_key | CONCAT(scan_type, '-', finding_number, '-', host_id, '-', finding_justification_key) |
Examples
Below are example files for each object type:
Assets
{
"page":1,
"pageTotal":1,
"assets":[
{
"asset_id":"1234567",
"asset_name":"abcdefg",
"asset_name_secondary":[
"ec2-233-252-0-211.us-east-2.compute.amazonaws.com",
"ip-198-51-100-120.us-east-2.compute.internal"
],
"ip_address":"233.252.0.211",
"ip_address_secondary":[
"198.51.100.120"
],
"asset_groups":[
"\/Hosts\/ec2",
"\/Hosts"
],
"asset_type":"Host",
"scan_date":"2022-06-14 21:32:59",
"asset_info":{
"aws.account-id":"112233445566",
"aws.region":"us-east-2",
"aws.service":"ec2",
"aws.partition":"aws",
"aws.arn":"arn:aws:ec2:us-east-2:111111111:instance\/i-111111111111",
"aws.ec2.instance-id":"i-111111111111",
"aws.ec2.image-id":"ami-123abc456def",
"aws.ec2.instance-state.code":"16",
"aws.ec2.instance-state.name":"running",
"aws.ec2.private-dns-name":"ip-198-51-100-120.us-east-2.compute.internal",
"aws.ec2.dns-name":"ec2-233-252-0-211.us-east-2.compute.amazonaws.com",
"aws.ec2.key-name":"key",
"aws.ec2.ami-launch-index":"0",
"aws.ec2.instance-type":"t2.micro",
"aws.ec2.launch-time":"2021-02-10T23:55:55.000Z",
"aws.ec2.placement.availability-zone":"us-east-2a",
"aws.ec2.placement.tenancy":"default",
"aws.ec2.monitoring.state":"disabled",
"aws.ec2.subnet-id":"subnet-123456abc",
"aws.ec2.vpc-id":"vpc-12345678",
"aws.ec2.private-ip-address":"198.51.100.120",
"aws.ec2.ip-address":"233.252.0.211",
"aws.ec2.source-dest-check":"true",
"aws.ec2.group-set-names":[
"launch-wizard-1"
],
"aws.ec2.group-set-ids":[
"sg-987654321"
],
"aws.ec2.architecture":"x86_64",
"aws.ec2.root-device-type":"ebs",
"aws.ec2.root-device-name":"name",
"aws.ec2.virtualization-type":"hvm",
"aws.tags.keyname":"value",
"aws.tags.owner":"Owner",
"aws.tags.name":"Name",
"aws.ec2.hypervisor":"xen",
"aws.ec2.iam-instance-profile.arn":"arn:aws:iam::123456789:instance-profile\/ec2role",
"aws.ec2.iam-instance-profile.id":"ABCDEFGHIJKLMNOP",
"aws.ec2.ebs-optimized":"false",
"aws.ec2.ena-support":"true"
},
"scan_date_timestamp":1655242379,
"operating_system_name":"",
"mac_address":"10:00:00:00:00:10",
"finding_count_critical":"23",
"finding_count_high":"321",
"finding_count_medium":"285",
"finding_count_low":"65",
"finding_count_informational":"4",
"finding_count_pass":"0",
"finding_count_fail":"0",
"finding_vulnerability_score":"900",
"asset_public":"1",
"asset_criticality":"Critical",
"asset_data_sensitivity_score":"10",
"asset_complianced_score":"10",
"asset_criticality_score":"10",
"asset_inactive_date":"",
"image_config":"",
"image_config_digest":"",
"image_manifest":"",
"image_manifest_digest":"",
"image_secondary_registries":[
],
"image_tags":[
],
"image_registry":"",
"image_repo":"",
"image_distro":"",
"operating_system_features":"",
"operating_system_version":"",
"image_platform_os":"",
"image_platform_os_features":[
],
"image_platform_os_version":"",
"image_platform_arch":"",
"image_platform_arch_features":[
],
"image_platform_arch_variant":"",
"active":true,
"business_owners"" [
"John Doe"
],
"owner_team": {
"team_id": "4000040",
"team_name": {
team_id": "400040",
"team_name": "Incident Response"
}
},
"support_team": {
"team_id": "4000032",
"team_name": {
team_id": "400032",
"team_name": "IT Support",
}
},
"branch":"",
"repo_url":""
},
...
]
}
Asset Findings
{
"page":1,
"pageTotal":1,
"assets":[
{
"host_id":"123456789",
"ip_address":"192.0.2.134",
"host_name":"192.0.2.134",
"host_type":"Host",
"host_criticality":"Critical",
"operating_system_name":""
},
...
]
}
Asset Groups
{
"page":1,
"pageTotal":1,
"assetGroups":[
{
"host_id":"123456789",
"asset_group_name":"Example Asset Group",
"asset_group_source":"manual"
},
...
]
}
Findings and Compliance Findings
{
"page":1,
"pageTotal":1,
"findings":[
{
"finding_number":"12345",
"scan_type":"QUALYS",
"finding_type":"Vuln",
"finding_severity":"Low",
"finding_severity_adjusted":null,
"finding_exploitable":"0",
"finding_name":"Web Server HTTP Trace\/Track Method Support Cross-Site Tracing Vulnerability",
"finding_cve":"CVE-2004-2320,CVE-2007-3008",
"finding_iava":"",
"finding_type":"Vuln",
"finding_description":"A Web server was detected that supports the HTTP TRACE method. A vulnerability related to this method was discovered. A malicious, active component in a Web page can send Trace requests to a Web server that supports this Trace method. Although unlikely and difficult to achieve, it's possible, in the presence of other browser vulnerabilities, for the active HTML content to make external requests to arbitrary Web servers beyond the hosting Web server.",
"finding_recommendation":"Solutions for some of the common Web servers are supplied below. For other Web servers, please check your vendor's documentation...",
"finding_references":{
"ID":"86473",
"CVE":"CVE-2004-2320,CVE-2007-3008",
"Category":"Web server",
"PCI Flagged":"1",
"Bugtraq IDs":"<a href=\"http:\/\/www.securityfocus.com\/bid\/24456\" target=\"_blank\">24456<\/a>,<a href=\"http:\/\/www.securityfocus.com\/bid\/9506\" target=\"_blank\">9506<\/a>"
},
"finding_key":"QUALYS-12345",
"finding_description_adjusted":null,
"finding_recommendation_adjusted":null,
"epss_score":null,
"cisa_vulnerability_name":"",
"nucleus_threat_rating":"",
"nucleus_exploited":"",
"nucleus_exploited_by_malware":"",
"nucleus_exploited_by_ransomware":"",
"nucleus_likely_to_be_exploited":"",
"nucleus_public_exploit_available":"",
"nucleus_private_exploit_available":"",
"nucleus_exploit_weaponized":"",
"nucleus_impacts_ot":"",
"nucleus_fix_available":"",
"nucleus_patch_available":"",
"nucleus_ease_of_exploitation":"",
"nucleus_exploitation_consequence":"",
"nucleus_remote_exploitation":"",
"nucleus_zero_day":"",
"nucleus_zero_day_previously":"",
"nucleus_mitigation_available":"",
"nucleus_widely_exploited":"",
"nucleus_media_mentions_alltime":null,
"nucleus_media_mentions_30day":null,
"nucleus_media_mentions_90day":null,
"nucleus_media_mentions_180day":null,
"threat_group_insights":[],
"malware_insights":[],
"mitigations_insights":[],
"patch_insights":[],
"exploits_insights":[],
"nucleus_actors":[],
"nucleus_malware":[]
},
...
]
}
Instances and Compliance Instances
{
"page":1,
"pageTotal":6,
"instances":[
{
"project_id":"123456789",
"assessment_id":"111111111",
"finding_number":"112345-abcdefg-67890",
"scan_type":"NESSUS",
"finding_type":"Vuln"
"finding_justification_key":"abcdefghijklmnopqrstuvwxyz",
"finding_discovered":"2022-05-31 21:00:39",
"finding_output":"The remote host (203.0.113.2) is considered as dead - not scanning\nThe remote host (203.0.113.2) did not respond to the following ping methods :\n- TCP ping\n- UDP ping\n- ICMP ping\n",
"finding_port":"0\/tcp",
"finding_path":"",
"finding_result":"FAILED",
"finding_severity": "Medium",
"finding_severity_adjusted": null,
"host_id":"222222222",
"scan_date":"2022-05-31 21:00:39",
"finding_score": 700,
"instance_key":"NESSUS-112345-abcdefg-67890-abcdefghijklmnopqrstuvwxyz",
"finding_key":"NESSUS-112345-abcdefg-67890"
},
...
]
}
Justifications
{
"page":1,
"pageTotal":1,
"justifications":[
{
"host_id":"111111111",
"finding_number":"abcdefg",
"scan_type":"ACUNETIX",
"finding_justification_key":"abcdefg-static\/111213\/js\/-",
"instance_key":"ACUNETIX-abcdefg-111111111-abcdefg-static\/111213\/js\/-",
"justification_assignee":null,
"justification_text":"",
"justification_status_id":"10",
"justification_verification_date":null,
"has_file":"0",
"security_comment_text":"Not yet provided.",
"justification_datetime":"2022-06-09 20:29:04",
"due_date":null,
"justification_status_name":"Potential",
"justification_status_mitigating":0
},
...
]
}
Teams
{
"page":1,
"pageTotal":1,
"teams":[
{
"team_id":"1111111",
"host_id":"2222222",
"finding_number":"FINDING-5",
"scan_type":"SUPERGREP",
"finding_justification_key":"FINDING-5-SUPERGREP-1111111-path\/to\/vulnerable\/file5.txt-",
"instance_key":"SUPERGREP-FINDING-5-1111111-FINDING-5-SUPERGREP-1111111-path\/to\/vulnerable\/file5.txt-",
"team_name":"RemediationTeam"
},
...
]
}
External Issues
{
"page": 1,
"pageTotal": 1,
"externalIssues": [
{
"host_id": "31000018",
"finding_number": "FINDING-1",
"scan_type": "CUSTOMSCANNER",
"finding_justification_key": "NETWORK-1-CUSTOMSCANNER-31000018--0/tcp",
"instance_key": "CUSTOMSCANNER-NETWORK-1-31000018-NETWORK-1-CUSTOMSCANNER-31000018--0/tcp",
"issue_type": "SERVICENOWAPP",
"issue_key": "INC0047849",
"issue_title": "Nucleus - [High] - FINDING-1",
"issue_url": "https://exampleco.service-now.com/task.do?sys_id=32474ab787db4e1007a6a60d3fbb35a8",
"issue_parent": "INC0047844",
"issue_priority": "",
"issue_status": "New",
"issue_assignee": "",
"issue_created": "2024-07-16 19:20:03",
"issue_updated": "0000-00-00 00:00:00",
"issue_synced": "0000-00-00 00:00:00",
"issue_closed": "0",
"finding_mitigated": "0"
},
...
]
}