@grc-claw/integration-marketplace 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/IntegrationMarketplace.d.ts +32 -0
- package/dist/IntegrationMarketplace.js +319 -0
- package/dist/connectors/ADPConnector.d.ts +12 -0
- package/dist/connectors/ADPConnector.js +97 -0
- package/dist/connectors/AWSCloudTrailConnector.d.ts +12 -0
- package/dist/connectors/AWSCloudTrailConnector.js +77 -0
- package/dist/connectors/AWSCloudWatchConnector.d.ts +12 -0
- package/dist/connectors/AWSCloudWatchConnector.js +70 -0
- package/dist/connectors/AWSGuardDutyConnector.d.ts +12 -0
- package/dist/connectors/AWSGuardDutyConnector.js +139 -0
- package/dist/connectors/AWSIAMConnector.d.ts +12 -0
- package/dist/connectors/AWSIAMConnector.js +90 -0
- package/dist/connectors/AWSKMSConnector.d.ts +12 -0
- package/dist/connectors/AWSKMSConnector.js +70 -0
- package/dist/connectors/AWSLambdaConnector.d.ts +12 -0
- package/dist/connectors/AWSLambdaConnector.js +84 -0
- package/dist/connectors/AWSRDSConnector.d.ts +12 -0
- package/dist/connectors/AWSRDSConnector.js +84 -0
- package/dist/connectors/AWSS3Connector.d.ts +12 -0
- package/dist/connectors/AWSS3Connector.js +112 -0
- package/dist/connectors/AkamaiConnector.d.ts +12 -0
- package/dist/connectors/AkamaiConnector.js +98 -0
- package/dist/connectors/ArgoCDConnector.d.ts +12 -0
- package/dist/connectors/ArgoCDConnector.js +93 -0
- package/dist/connectors/ArtifactoryConnector.d.ts +12 -0
- package/dist/connectors/ArtifactoryConnector.js +94 -0
- package/dist/connectors/AtlassianJiraConnector.d.ts +12 -0
- package/dist/connectors/AtlassianJiraConnector.js +134 -0
- package/dist/connectors/Auth0Connector.d.ts +12 -0
- package/dist/connectors/Auth0Connector.js +150 -0
- package/dist/connectors/AzureADConnector.d.ts +12 -0
- package/dist/connectors/AzureADConnector.js +115 -0
- package/dist/connectors/AzureDevOpsConnector.d.ts +12 -0
- package/dist/connectors/AzureDevOpsConnector.js +130 -0
- package/dist/connectors/AzureDevOpsPipelinesConnector.d.ts +12 -0
- package/dist/connectors/AzureDevOpsPipelinesConnector.js +72 -0
- package/dist/connectors/AzurePipelinesConnector.d.ts +12 -0
- package/dist/connectors/AzurePipelinesConnector.js +72 -0
- package/dist/connectors/AzurePolicyConnector.d.ts +12 -0
- package/dist/connectors/AzurePolicyConnector.js +141 -0
- package/dist/connectors/AzureReposConnector.d.ts +12 -0
- package/dist/connectors/AzureReposConnector.js +96 -0
- package/dist/connectors/AzureSentinelConnector.d.ts +12 -0
- package/dist/connectors/AzureSentinelConnector.js +88 -0
- package/dist/connectors/BambooCICDConnector.d.ts +12 -0
- package/dist/connectors/BambooCICDConnector.js +72 -0
- package/dist/connectors/BambooHRConnector.d.ts +12 -0
- package/dist/connectors/BambooHRConnector.js +84 -0
- package/dist/connectors/BeyondTrustConnector.d.ts +12 -0
- package/dist/connectors/BeyondTrustConnector.js +94 -0
- package/dist/connectors/BitbucketConnector.d.ts +12 -0
- package/dist/connectors/BitbucketConnector.js +100 -0
- package/dist/connectors/BitbucketPipelinesConnector.d.ts +12 -0
- package/dist/connectors/BitbucketPipelinesConnector.js +72 -0
- package/dist/connectors/BoxConnector.d.ts +12 -0
- package/dist/connectors/BoxConnector.js +122 -0
- package/dist/connectors/BuildkiteConnector.d.ts +12 -0
- package/dist/connectors/BuildkiteConnector.js +95 -0
- package/dist/connectors/CarbonBlackConnector.d.ts +12 -0
- package/dist/connectors/CarbonBlackConnector.js +89 -0
- package/dist/connectors/CassandraConnector.d.ts +12 -0
- package/dist/connectors/CassandraConnector.js +69 -0
- package/dist/connectors/CheckPointConnector.d.ts +12 -0
- package/dist/connectors/CheckPointConnector.js +98 -0
- package/dist/connectors/CircleCIConnector.d.ts +12 -0
- package/dist/connectors/CircleCIConnector.js +129 -0
- package/dist/connectors/CircleCIConnectorsConnector.d.ts +12 -0
- package/dist/connectors/CircleCIConnectorsConnector.js +69 -0
- package/dist/connectors/CiscoUmbrellaConnector.d.ts +12 -0
- package/dist/connectors/CiscoUmbrellaConnector.js +96 -0
- package/dist/connectors/CloudBeesJenkinsConnector.d.ts +12 -0
- package/dist/connectors/CloudBeesJenkinsConnector.js +70 -0
- package/dist/connectors/CloudflareDNSConnector.d.ts +12 -0
- package/dist/connectors/CloudflareDNSConnector.js +71 -0
- package/dist/connectors/CloudflareWAFConnector.d.ts +12 -0
- package/dist/connectors/CloudflareWAFConnector.js +98 -0
- package/dist/connectors/ConfluenceConnector.d.ts +12 -0
- package/dist/connectors/ConfluenceConnector.js +101 -0
- package/dist/connectors/ConstantContactConnector.d.ts +12 -0
- package/dist/connectors/ConstantContactConnector.js +70 -0
- package/dist/connectors/CouchDBConnector.d.ts +12 -0
- package/dist/connectors/CouchDBConnector.js +69 -0
- package/dist/connectors/CrowdStrikeConnector.d.ts +12 -0
- package/dist/connectors/CrowdStrikeConnector.js +86 -0
- package/dist/connectors/CrowdStrikeFalconConnector.d.ts +12 -0
- package/dist/connectors/CrowdStrikeFalconConnector.js +92 -0
- package/dist/connectors/CrowdStrikeSpotlightConnector.d.ts +12 -0
- package/dist/connectors/CrowdStrikeSpotlightConnector.js +139 -0
- package/dist/connectors/CyberArkConnector.d.ts +12 -0
- package/dist/connectors/CyberArkConnector.js +95 -0
- package/dist/connectors/DatabricksConnector.d.ts +12 -0
- package/dist/connectors/DatabricksConnector.js +95 -0
- package/dist/connectors/DatadogConnector.d.ts +12 -0
- package/dist/connectors/DatadogConnector.js +110 -0
- package/dist/connectors/DigitalOceanConnector.d.ts +12 -0
- package/dist/connectors/DigitalOceanConnector.js +85 -0
- package/dist/connectors/DiscordConnector.d.ts +12 -0
- package/dist/connectors/DiscordConnector.js +98 -0
- package/dist/connectors/DockerHubConnector.d.ts +12 -0
- package/dist/connectors/DockerHubConnector.js +80 -0
- package/dist/connectors/DocuSignConnector.d.ts +12 -0
- package/dist/connectors/DocuSignConnector.js +96 -0
- package/dist/connectors/DriftConnector.d.ts +12 -0
- package/dist/connectors/DriftConnector.js +69 -0
- package/dist/connectors/DropboxConnector.d.ts +12 -0
- package/dist/connectors/DropboxConnector.js +127 -0
- package/dist/connectors/ESETConnector.d.ts +12 -0
- package/dist/connectors/ESETConnector.js +70 -0
- package/dist/connectors/ElasticsearchCloudConnector.d.ts +12 -0
- package/dist/connectors/ElasticsearchCloudConnector.js +70 -0
- package/dist/connectors/FSecureConnector.d.ts +12 -0
- package/dist/connectors/FSecureConnector.js +70 -0
- package/dist/connectors/FeatureFlagConnector.d.ts +12 -0
- package/dist/connectors/FeatureFlagConnector.js +70 -0
- package/dist/connectors/FluxCDConnector.d.ts +12 -0
- package/dist/connectors/FluxCDConnector.js +94 -0
- package/dist/connectors/ForgeRockConnector.d.ts +12 -0
- package/dist/connectors/ForgeRockConnector.js +95 -0
- package/dist/connectors/FortinetConnector.d.ts +12 -0
- package/dist/connectors/FortinetConnector.js +98 -0
- package/dist/connectors/FreshdeskConnector.d.ts +12 -0
- package/dist/connectors/FreshdeskConnector.js +71 -0
- package/dist/connectors/GCPBigQueryConnector.d.ts +12 -0
- package/dist/connectors/GCPBigQueryConnector.js +71 -0
- package/dist/connectors/GCPComputeConnector.d.ts +12 -0
- package/dist/connectors/GCPComputeConnector.js +87 -0
- package/dist/connectors/GCPConfigConnector.d.ts +12 -0
- package/dist/connectors/GCPConfigConnector.js +149 -0
- package/dist/connectors/GCPFirestoreConnector.d.ts +12 -0
- package/dist/connectors/GCPFirestoreConnector.js +71 -0
- package/dist/connectors/GCPIAMConnector.d.ts +12 -0
- package/dist/connectors/GCPIAMConnector.js +98 -0
- package/dist/connectors/GCPSCCConnector.d.ts +12 -0
- package/dist/connectors/GCPSCCConnector.js +94 -0
- package/dist/connectors/GitHubActionsConnector.d.ts +12 -0
- package/dist/connectors/GitHubActionsConnector.js +104 -0
- package/dist/connectors/GitHubConnector.d.ts +12 -0
- package/dist/connectors/GitHubConnector.js +135 -0
- package/dist/connectors/GitHubCopilotConnector.d.ts +12 -0
- package/dist/connectors/GitHubCopilotConnector.js +72 -0
- package/dist/connectors/GitLabCIConnector.d.ts +12 -0
- package/dist/connectors/GitLabCIConnector.js +71 -0
- package/dist/connectors/GitLabConnector.d.ts +12 -0
- package/dist/connectors/GitLabConnector.js +101 -0
- package/dist/connectors/GitLabSASTConnector.d.ts +12 -0
- package/dist/connectors/GitLabSASTConnector.js +130 -0
- package/dist/connectors/GoogleWorkspaceConnector.d.ts +12 -0
- package/dist/connectors/GoogleWorkspaceConnector.js +136 -0
- package/dist/connectors/HelmConnector.d.ts +12 -0
- package/dist/connectors/HelmConnector.js +94 -0
- package/dist/connectors/HubSpotConnector.d.ts +12 -0
- package/dist/connectors/HubSpotConnector.js +77 -0
- package/dist/connectors/IFTTTConnector.d.ts +12 -0
- package/dist/connectors/IFTTTConnector.js +70 -0
- package/dist/connectors/ImpervaConnector.d.ts +12 -0
- package/dist/connectors/ImpervaConnector.js +94 -0
- package/dist/connectors/InfluxDBConnector.d.ts +12 -0
- package/dist/connectors/InfluxDBConnector.js +70 -0
- package/dist/connectors/IntercomConnector.d.ts +12 -0
- package/dist/connectors/IntercomConnector.js +69 -0
- package/dist/connectors/JenkinsConnector.d.ts +12 -0
- package/dist/connectors/JenkinsConnector.js +96 -0
- package/dist/connectors/JiraConnector.d.ts +12 -0
- package/dist/connectors/JiraConnector.js +103 -0
- package/dist/connectors/KafkaConnector.d.ts +12 -0
- package/dist/connectors/KafkaConnector.js +70 -0
- package/dist/connectors/KasperskyConnector.d.ts +12 -0
- package/dist/connectors/KasperskyConnector.js +70 -0
- package/dist/connectors/KubernetesConnector.d.ts +12 -0
- package/dist/connectors/KubernetesConnector.js +109 -0
- package/dist/connectors/LaceworkConnector.d.ts +13 -0
- package/dist/connectors/LaceworkConnector.js +143 -0
- package/dist/connectors/LaunchDarklyConnector.d.ts +12 -0
- package/dist/connectors/LaunchDarklyConnector.js +86 -0
- package/dist/connectors/LinodeConnector.d.ts +12 -0
- package/dist/connectors/LinodeConnector.js +70 -0
- package/dist/connectors/LookerConnector.d.ts +12 -0
- package/dist/connectors/LookerConnector.js +94 -0
- package/dist/connectors/MailchimpConnector.d.ts +12 -0
- package/dist/connectors/MailchimpConnector.js +71 -0
- package/dist/connectors/MalwarebytesConnector.d.ts +12 -0
- package/dist/connectors/MalwarebytesConnector.js +85 -0
- package/dist/connectors/McAfeeConnector.d.ts +12 -0
- package/dist/connectors/McAfeeConnector.js +85 -0
- package/dist/connectors/Microsoft365Connector.d.ts +12 -0
- package/dist/connectors/Microsoft365Connector.js +139 -0
- package/dist/connectors/MongoDBConnector.d.ts +12 -0
- package/dist/connectors/MongoDBConnector.js +86 -0
- package/dist/connectors/NamelyConnector.d.ts +12 -0
- package/dist/connectors/NamelyConnector.js +97 -0
- package/dist/connectors/Neo4jConnector.d.ts +12 -0
- package/dist/connectors/Neo4jConnector.js +70 -0
- package/dist/connectors/NetSuiteConnector.d.ts +12 -0
- package/dist/connectors/NetSuiteConnector.js +94 -0
- package/dist/connectors/NetskopeConnector.d.ts +12 -0
- package/dist/connectors/NetskopeConnector.js +98 -0
- package/dist/connectors/NexusConnector.d.ts +12 -0
- package/dist/connectors/NexusConnector.js +93 -0
- package/dist/connectors/NotionConnector.d.ts +12 -0
- package/dist/connectors/NotionConnector.js +109 -0
- package/dist/connectors/OktaConnector.d.ts +12 -0
- package/dist/connectors/OktaConnector.js +123 -0
- package/dist/connectors/OktaSystemLogConnector.d.ts +12 -0
- package/dist/connectors/OktaSystemLogConnector.js +129 -0
- package/dist/connectors/OpsgenieConnector.d.ts +12 -0
- package/dist/connectors/OpsgenieConnector.js +70 -0
- package/dist/connectors/PagerDutyConnector.d.ts +12 -0
- package/dist/connectors/PagerDutyConnector.js +106 -0
- package/dist/connectors/PalantirConnector.d.ts +12 -0
- package/dist/connectors/PalantirConnector.js +95 -0
- package/dist/connectors/PaloAltoPrismaCloudConnector.d.ts +12 -0
- package/dist/connectors/PaloAltoPrismaCloudConnector.js +110 -0
- package/dist/connectors/PingFederateConnector.d.ts +12 -0
- package/dist/connectors/PingFederateConnector.js +97 -0
- package/dist/connectors/PostgreSQLCloudConnector.d.ts +12 -0
- package/dist/connectors/PostgreSQLCloudConnector.js +70 -0
- package/dist/connectors/PowerBIConnector.d.ts +12 -0
- package/dist/connectors/PowerBIConnector.js +95 -0
- package/dist/connectors/PrismaCloudConnector.d.ts +12 -0
- package/dist/connectors/PrismaCloudConnector.js +147 -0
- package/dist/connectors/QualysConnector.d.ts +12 -0
- package/dist/connectors/QualysConnector.js +96 -0
- package/dist/connectors/QualysScannerConnector.d.ts +12 -0
- package/dist/connectors/QualysScannerConnector.js +131 -0
- package/dist/connectors/QuickBooksConnector.d.ts +12 -0
- package/dist/connectors/QuickBooksConnector.js +97 -0
- package/dist/connectors/RabbitMQConnector.d.ts +12 -0
- package/dist/connectors/RabbitMQConnector.js +69 -0
- package/dist/connectors/RadwareConnector.d.ts +12 -0
- package/dist/connectors/RadwareConnector.js +94 -0
- package/dist/connectors/RedisCloudConnector.d.ts +12 -0
- package/dist/connectors/RedisCloudConnector.js +70 -0
- package/dist/connectors/RingCentralConnector.d.ts +12 -0
- package/dist/connectors/RingCentralConnector.js +94 -0
- package/dist/connectors/SAPSuccessFactorsConnector.d.ts +12 -0
- package/dist/connectors/SAPSuccessFactorsConnector.js +103 -0
- package/dist/connectors/SailPointConnector.d.ts +12 -0
- package/dist/connectors/SailPointConnector.js +97 -0
- package/dist/connectors/SalesforceConnector.d.ts +12 -0
- package/dist/connectors/SalesforceConnector.js +91 -0
- package/dist/connectors/SendGridConnector.d.ts +12 -0
- package/dist/connectors/SendGridConnector.js +69 -0
- package/dist/connectors/SentinelOneConnector.d.ts +12 -0
- package/dist/connectors/SentinelOneConnector.js +89 -0
- package/dist/connectors/ServiceNowConnector.d.ts +12 -0
- package/dist/connectors/ServiceNowConnector.js +123 -0
- package/dist/connectors/SlackConnector.d.ts +12 -0
- package/dist/connectors/SlackConnector.js +109 -0
- package/dist/connectors/SnowflakeConnector.d.ts +12 -0
- package/dist/connectors/SnowflakeConnector.js +105 -0
- package/dist/connectors/SnykConnector.d.ts +12 -0
- package/dist/connectors/SnykConnector.js +84 -0
- package/dist/connectors/SnykMonitorConnector.d.ts +12 -0
- package/dist/connectors/SnykMonitorConnector.js +131 -0
- package/dist/connectors/SophosConnector.d.ts +12 -0
- package/dist/connectors/SophosConnector.js +87 -0
- package/dist/connectors/SpinnakerConnector.d.ts +12 -0
- package/dist/connectors/SpinnakerConnector.js +70 -0
- package/dist/connectors/SplunkConnector.d.ts +12 -0
- package/dist/connectors/SplunkConnector.js +126 -0
- package/dist/connectors/StripeConnector.d.ts +12 -0
- package/dist/connectors/StripeConnector.js +97 -0
- package/dist/connectors/TableauConnector.d.ts +12 -0
- package/dist/connectors/TableauConnector.js +101 -0
- package/dist/connectors/TaniumConnector.d.ts +12 -0
- package/dist/connectors/TaniumConnector.js +97 -0
- package/dist/connectors/TeamCityConnector.d.ts +12 -0
- package/dist/connectors/TeamCityConnector.js +71 -0
- package/dist/connectors/TeamsConnector.d.ts +12 -0
- package/dist/connectors/TeamsConnector.js +96 -0
- package/dist/connectors/TenableIOConnector.d.ts +12 -0
- package/dist/connectors/TenableIOConnector.js +130 -0
- package/dist/connectors/TerraformCloudConnector.d.ts +12 -0
- package/dist/connectors/TerraformCloudConnector.js +106 -0
- package/dist/connectors/TravisCIConnector.d.ts +12 -0
- package/dist/connectors/TravisCIConnector.js +95 -0
- package/dist/connectors/TrendMicroConnector.d.ts +12 -0
- package/dist/connectors/TrendMicroConnector.js +85 -0
- package/dist/connectors/TwilioConnector.d.ts +12 -0
- package/dist/connectors/TwilioConnector.js +70 -0
- package/dist/connectors/VercelConnector.d.ts +12 -0
- package/dist/connectors/VercelConnector.js +70 -0
- package/dist/connectors/VultrConnector.d.ts +12 -0
- package/dist/connectors/VultrConnector.js +70 -0
- package/dist/connectors/WebexConnector.d.ts +12 -0
- package/dist/connectors/WebexConnector.js +94 -0
- package/dist/connectors/WizConnector.d.ts +12 -0
- package/dist/connectors/WizConnector.js +172 -0
- package/dist/connectors/WorkdayConnector.d.ts +12 -0
- package/dist/connectors/WorkdayConnector.js +100 -0
- package/dist/connectors/XeroConnector.d.ts +12 -0
- package/dist/connectors/XeroConnector.js +96 -0
- package/dist/connectors/ZapierConnector.d.ts +12 -0
- package/dist/connectors/ZapierConnector.js +70 -0
- package/dist/connectors/ZendeskConnector.d.ts +12 -0
- package/dist/connectors/ZendeskConnector.js +71 -0
- package/dist/connectors/ZenefitsConnector.d.ts +12 -0
- package/dist/connectors/ZenefitsConnector.js +93 -0
- package/dist/connectors/ZoomConnector.d.ts +12 -0
- package/dist/connectors/ZoomConnector.js +97 -0
- package/dist/connectors/ZscalerConnector.d.ts +12 -0
- package/dist/connectors/ZscalerConnector.js +97 -0
- package/dist/connectors/index.d.ts +150 -0
- package/dist/connectors/index.js +157 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +16 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +139 -0
- package/dist/types.d.ts +57 -0
- package/dist/types.js +8 -0
- package/package.json +33 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "tableau-workbooks",
|
|
5
|
+
name: "Workbook Security",
|
|
6
|
+
description: "Fetch workbook permissions and data source access",
|
|
7
|
+
evidenceCategories: ["access_control", "data_protection"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "tableau-projects",
|
|
11
|
+
name: "Project Hierarchies",
|
|
12
|
+
description: "Fetch project site and permission settings",
|
|
13
|
+
evidenceCategories: ["access_control", "configuration"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "tableau-extracts",
|
|
17
|
+
name: "Data Extracts",
|
|
18
|
+
description: "Fetch extract refresh schedules and embedded credentials",
|
|
19
|
+
evidenceCategories: ["data_protection", "change_management"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "tableau-audit",
|
|
23
|
+
name: "Admin Events",
|
|
24
|
+
description: "Fetch Tableau Server admin event and login logs",
|
|
25
|
+
evidenceCategories: ["monitoring", "access_control"],
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
export class TableauConnector {
|
|
29
|
+
id = "tableau";
|
|
30
|
+
name = "Tableau";
|
|
31
|
+
category = "data_warehouse";
|
|
32
|
+
authType = "api_key";
|
|
33
|
+
capabilities = capabilities;
|
|
34
|
+
frameworks = [
|
|
35
|
+
"SOC2",
|
|
36
|
+
"ISO27001",
|
|
37
|
+
"NIST_CSF",
|
|
38
|
+
"HIPAA",
|
|
39
|
+
];
|
|
40
|
+
async fetchApi(config, endpoint) {
|
|
41
|
+
const base = config.baseUrl || "https://tableau.example.com/api/3.19";
|
|
42
|
+
const resp = await fetch(`${base}${endpoint}`, {
|
|
43
|
+
headers: {
|
|
44
|
+
"X-Tableau-Auth": config.apiToken || "",
|
|
45
|
+
"Content-Type": "application/json",
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
if (!resp.ok)
|
|
49
|
+
throw new Error(`Tableau API ${resp.status}: ${resp.statusText}`);
|
|
50
|
+
return (await resp.json());
|
|
51
|
+
}
|
|
52
|
+
async testConnection(config) {
|
|
53
|
+
try {
|
|
54
|
+
await this.fetchApi(config, "/sites");
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async collectEvidence(config) {
|
|
62
|
+
const artifacts = [];
|
|
63
|
+
const now = new Date().toISOString();
|
|
64
|
+
const siteId = config.extra?.siteId || "";
|
|
65
|
+
const workbooks = await this.fetchApi(config, `/sites/${siteId}/workbooks`).catch(() => ({ workbooks: { workbook: [] } }));
|
|
66
|
+
const wbData = workbooks;
|
|
67
|
+
const wbObj = wbData.workbooks || {};
|
|
68
|
+
const wbList = wbObj.workbook || [];
|
|
69
|
+
artifacts.push({
|
|
70
|
+
id: generateEvidenceId(),
|
|
71
|
+
connectorId: this.id,
|
|
72
|
+
capabilityId: "tableau-workbooks",
|
|
73
|
+
timestamp: now,
|
|
74
|
+
hash: hashEvidence(workbooks),
|
|
75
|
+
framework: "SOC2",
|
|
76
|
+
controlId: "CC6.1",
|
|
77
|
+
source: `tableau/${siteId}/workbooks`,
|
|
78
|
+
status: wbList.length > 0 ? "compliant" : "unknown",
|
|
79
|
+
data: { workbookCount: wbList.length },
|
|
80
|
+
metadata: { siteId },
|
|
81
|
+
});
|
|
82
|
+
const projects = await this.fetchApi(config, `/sites/${siteId}/projects`).catch(() => ({ projects: { project: [] } }));
|
|
83
|
+
const projData = projects;
|
|
84
|
+
const projObj = projData.projects || {};
|
|
85
|
+
const projList = projObj.project || [];
|
|
86
|
+
artifacts.push({
|
|
87
|
+
id: generateEvidenceId(),
|
|
88
|
+
connectorId: this.id,
|
|
89
|
+
capabilityId: "tableau-projects",
|
|
90
|
+
timestamp: now,
|
|
91
|
+
hash: hashEvidence(projects),
|
|
92
|
+
framework: "ISO27001",
|
|
93
|
+
controlId: "A.6.2.1",
|
|
94
|
+
source: `tableau/${siteId}/projects`,
|
|
95
|
+
status: projList.length > 0 ? "compliant" : "non_compliant",
|
|
96
|
+
data: { projectCount: projList.length },
|
|
97
|
+
metadata: { siteId },
|
|
98
|
+
});
|
|
99
|
+
return artifacts;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationConnector, ConnectorConfig, EvidenceArtifact, IntegrationCapability, ComplianceFramework } from "../types.js";
|
|
2
|
+
export declare class TaniumConnector implements IntegrationConnector {
|
|
3
|
+
readonly id = "tanium";
|
|
4
|
+
readonly name = "Tanium";
|
|
5
|
+
readonly category: "endpoint";
|
|
6
|
+
readonly authType: "api_key";
|
|
7
|
+
readonly capabilities: IntegrationCapability[];
|
|
8
|
+
readonly frameworks: ComplianceFramework[];
|
|
9
|
+
private fetchApi;
|
|
10
|
+
testConnection(config: ConnectorConfig): Promise<boolean>;
|
|
11
|
+
collectEvidence(config: ConnectorConfig): Promise<EvidenceArtifact[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "tanium-endpoints",
|
|
5
|
+
name: "Endpoint Inventory",
|
|
6
|
+
description: "Fetch Tanium endpoint count and compliance status",
|
|
7
|
+
evidenceCategories: ["endpoint", "monitoring"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "tanium-policies",
|
|
11
|
+
name: "Compliance Policies",
|
|
12
|
+
description: "Fetch compliance policy rules and violation counts",
|
|
13
|
+
evidenceCategories: ["compliance", "monitoring"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "tanium-patches",
|
|
17
|
+
name: "Patch Status",
|
|
18
|
+
description: "Fetch endpoint patch compliance and missing updates",
|
|
19
|
+
evidenceCategories: ["vulnerability_management", "endpoint"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "tanium-packages",
|
|
23
|
+
name: "Threat Response",
|
|
24
|
+
description: "Fetch threat detection packages and response actions",
|
|
25
|
+
evidenceCategories: ["vulnerability_management", "monitoring"],
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
export class TaniumConnector {
|
|
29
|
+
id = "tanium";
|
|
30
|
+
name = "Tanium";
|
|
31
|
+
category = "endpoint";
|
|
32
|
+
authType = "api_key";
|
|
33
|
+
capabilities = capabilities;
|
|
34
|
+
frameworks = [
|
|
35
|
+
"SOC2",
|
|
36
|
+
"ISO27001",
|
|
37
|
+
"NIST_CSF",
|
|
38
|
+
"HIPAA",
|
|
39
|
+
"PCI_DSS",
|
|
40
|
+
];
|
|
41
|
+
async fetchApi(config, endpoint) {
|
|
42
|
+
const base = config.baseUrl || "https://tanium.example.com";
|
|
43
|
+
const resp = await fetch(`${base}/api/v2${endpoint}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${config.apiToken}`,
|
|
46
|
+
"Content-Type": "application/json",
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
if (!resp.ok)
|
|
50
|
+
throw new Error(`Tanium API ${resp.status}: ${resp.statusText}`);
|
|
51
|
+
return (await resp.json());
|
|
52
|
+
}
|
|
53
|
+
async testConnection(config) {
|
|
54
|
+
try {
|
|
55
|
+
await this.fetchApi(config, "/version");
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async collectEvidence(config) {
|
|
63
|
+
const artifacts = [];
|
|
64
|
+
const now = new Date().toISOString();
|
|
65
|
+
const endpoints = await this.fetchApi(config, "/endpoints?count=1").catch(() => ({
|
|
66
|
+
totalRecords: 0,
|
|
67
|
+
}));
|
|
68
|
+
artifacts.push({
|
|
69
|
+
id: generateEvidenceId(),
|
|
70
|
+
connectorId: this.id,
|
|
71
|
+
capabilityId: "tanium-endpoints",
|
|
72
|
+
timestamp: now,
|
|
73
|
+
hash: hashEvidence(endpoints),
|
|
74
|
+
framework: "SOC2",
|
|
75
|
+
controlId: "CC6.8",
|
|
76
|
+
source: "tanium/endpoints",
|
|
77
|
+
status: endpoints.totalRecords > 0 ? "compliant" : "unknown",
|
|
78
|
+
data: { endpointCount: endpoints.totalRecords },
|
|
79
|
+
metadata: {},
|
|
80
|
+
});
|
|
81
|
+
const packages = await this.fetchApi(config, "/packages").catch(() => ({ data: [] }));
|
|
82
|
+
artifacts.push({
|
|
83
|
+
id: generateEvidenceId(),
|
|
84
|
+
connectorId: this.id,
|
|
85
|
+
capabilityId: "tanium-packages",
|
|
86
|
+
timestamp: now,
|
|
87
|
+
hash: hashEvidence(packages),
|
|
88
|
+
framework: "ISO27001",
|
|
89
|
+
controlId: "A.12.2.1",
|
|
90
|
+
source: "tanium/packages",
|
|
91
|
+
status: packages.data?.length > 0 ? "compliant" : "non_compliant",
|
|
92
|
+
data: { activePackages: packages.data?.length || 0 },
|
|
93
|
+
metadata: {},
|
|
94
|
+
});
|
|
95
|
+
return artifacts;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationConnector, ConnectorConfig, EvidenceArtifact, IntegrationCapability, ComplianceFramework } from "../types.js";
|
|
2
|
+
export declare class TeamCityConnector implements IntegrationConnector {
|
|
3
|
+
readonly id = "teamcity";
|
|
4
|
+
readonly name = "JetBrains TeamCity";
|
|
5
|
+
readonly category: "ci_cd";
|
|
6
|
+
readonly authType: "bearer_token";
|
|
7
|
+
readonly capabilities: IntegrationCapability[];
|
|
8
|
+
readonly frameworks: ComplianceFramework[];
|
|
9
|
+
private fetchApi;
|
|
10
|
+
testConnection(config: ConnectorConfig): Promise<boolean>;
|
|
11
|
+
collectEvidence(config: ConnectorConfig): Promise<EvidenceArtifact[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "teamcity-builds",
|
|
5
|
+
name: "Build Configurations",
|
|
6
|
+
description: "Fetch TeamCity build configurations and VCS root settings",
|
|
7
|
+
evidenceCategories: ["ci_cd", "change_management"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "teamcity-agents",
|
|
11
|
+
name: "Build Agents",
|
|
12
|
+
description: "Fetch TeamCity build agent status and pool assignments",
|
|
13
|
+
evidenceCategories: ["infrastructure", "monitoring"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "teamcity-security",
|
|
17
|
+
name: "Build Security",
|
|
18
|
+
description: "Fetch TeamCity build trigger rules and access tokens",
|
|
19
|
+
evidenceCategories: ["access_control", "secret_management"],
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
export class TeamCityConnector {
|
|
23
|
+
id = "teamcity";
|
|
24
|
+
name = "JetBrains TeamCity";
|
|
25
|
+
category = "ci_cd";
|
|
26
|
+
authType = "bearer_token";
|
|
27
|
+
capabilities = capabilities;
|
|
28
|
+
frameworks = ["SOC2", "ISO27001", "NIST_CSF"];
|
|
29
|
+
async fetchApi(config, endpoint) {
|
|
30
|
+
const base = config.baseUrl || "https://teamcity.example.com/app/rest";
|
|
31
|
+
const resp = await fetch(`${base}${endpoint}`, {
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `Bearer ${config.apiToken}`,
|
|
34
|
+
"Content-Type": "application/json",
|
|
35
|
+
Accept: "application/json",
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
if (!resp.ok)
|
|
39
|
+
throw new Error(`TeamCity API ${resp.status}: ${resp.statusText}`);
|
|
40
|
+
return (await resp.json());
|
|
41
|
+
}
|
|
42
|
+
async testConnection(config) {
|
|
43
|
+
try {
|
|
44
|
+
await this.fetchApi(config, "/buildTypes?count=1");
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async collectEvidence(config) {
|
|
52
|
+
const artifacts = [];
|
|
53
|
+
const now = new Date().toISOString();
|
|
54
|
+
const builds = await this.fetchApi(config, "/buildTypes?count=100").catch(() => ({ buildType: [] }));
|
|
55
|
+
const buildList = (builds.buildType || []);
|
|
56
|
+
artifacts.push({
|
|
57
|
+
id: generateEvidenceId(),
|
|
58
|
+
connectorId: this.id,
|
|
59
|
+
capabilityId: "teamcity-builds",
|
|
60
|
+
timestamp: now,
|
|
61
|
+
hash: hashEvidence({ buildConfigCount: buildList.length }),
|
|
62
|
+
framework: "SOC2",
|
|
63
|
+
controlId: "CC8.1",
|
|
64
|
+
source: "teamcity/buildTypes",
|
|
65
|
+
status: "unknown",
|
|
66
|
+
data: { buildConfigCount: buildList.length },
|
|
67
|
+
metadata: {},
|
|
68
|
+
});
|
|
69
|
+
return artifacts;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationConnector, ConnectorConfig, EvidenceArtifact, IntegrationCapability, ComplianceFramework } from "../types.js";
|
|
2
|
+
export declare class TeamsConnector implements IntegrationConnector {
|
|
3
|
+
readonly id = "microsoft-teams";
|
|
4
|
+
readonly name = "Microsoft Teams";
|
|
5
|
+
readonly category: "communication";
|
|
6
|
+
readonly authType: "oauth2";
|
|
7
|
+
readonly capabilities: IntegrationCapability[];
|
|
8
|
+
readonly frameworks: ComplianceFramework[];
|
|
9
|
+
private fetchApi;
|
|
10
|
+
testConnection(config: ConnectorConfig): Promise<boolean>;
|
|
11
|
+
collectEvidence(config: ConnectorConfig): Promise<EvidenceArtifact[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "teams-policies",
|
|
5
|
+
name: "Meeting Policies",
|
|
6
|
+
description: "Fetch Teams meeting and messaging policy configurations",
|
|
7
|
+
evidenceCategories: ["access_control", "configuration"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "teams-compliance",
|
|
11
|
+
name: "Compliance Management",
|
|
12
|
+
description: "Fetch retention policies and eDiscovery configurations",
|
|
13
|
+
evidenceCategories: ["compliance", "data_protection"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "teams-security",
|
|
17
|
+
name: "Security Defaults",
|
|
18
|
+
description: "Fetch conditional access and MFA enforcement status",
|
|
19
|
+
evidenceCategories: ["access_control", "configuration"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "teams-audit",
|
|
23
|
+
name: "Unified Audit Log",
|
|
24
|
+
description: "Fetch Teams activity from Microsoft 365 audit logs",
|
|
25
|
+
evidenceCategories: ["monitoring", "access_control"],
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
export class TeamsConnector {
|
|
29
|
+
id = "microsoft-teams";
|
|
30
|
+
name = "Microsoft Teams";
|
|
31
|
+
category = "communication";
|
|
32
|
+
authType = "oauth2";
|
|
33
|
+
capabilities = capabilities;
|
|
34
|
+
frameworks = [
|
|
35
|
+
"SOC2",
|
|
36
|
+
"ISO27001",
|
|
37
|
+
"NIST_CSF",
|
|
38
|
+
"HIPAA",
|
|
39
|
+
"GDPR",
|
|
40
|
+
];
|
|
41
|
+
async fetchApi(config, endpoint) {
|
|
42
|
+
const base = config.baseUrl || "https://graph.microsoft.com/v1.0";
|
|
43
|
+
const resp = fetch(`${base}${endpoint}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${config.apiToken}`,
|
|
46
|
+
"Content-Type": "application/json",
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const r = await resp;
|
|
50
|
+
if (!r.ok)
|
|
51
|
+
throw new Error(`Teams API ${r.status}: ${r.statusText}`);
|
|
52
|
+
return (await r.json());
|
|
53
|
+
}
|
|
54
|
+
async testConnection(config) {
|
|
55
|
+
try {
|
|
56
|
+
await this.fetchApi(config, "/me");
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async collectEvidence(config) {
|
|
64
|
+
const artifacts = [];
|
|
65
|
+
const now = new Date().toISOString();
|
|
66
|
+
const teams = await this.fetchApi(config, "/me/joinedTeams").catch(() => ({ value: [] }));
|
|
67
|
+
artifacts.push({
|
|
68
|
+
id: generateEvidenceId(),
|
|
69
|
+
connectorId: this.id,
|
|
70
|
+
capabilityId: "teams-policies",
|
|
71
|
+
timestamp: now,
|
|
72
|
+
hash: hashEvidence(teams),
|
|
73
|
+
framework: "SOC2",
|
|
74
|
+
controlId: "CC6.1",
|
|
75
|
+
source: "teams/joinedTeams",
|
|
76
|
+
status: teams.value?.length > 0 ? "compliant" : "unknown",
|
|
77
|
+
data: { teamCount: teams.value?.length || 0 },
|
|
78
|
+
metadata: {},
|
|
79
|
+
});
|
|
80
|
+
const messages = await this.fetchApi(config, "/me/messages?$top=10&$select=subject,receivedDateTime").catch(() => ({ value: [] }));
|
|
81
|
+
artifacts.push({
|
|
82
|
+
id: generateEvidenceId(),
|
|
83
|
+
connectorId: this.id,
|
|
84
|
+
capabilityId: "teams-compliance",
|
|
85
|
+
timestamp: now,
|
|
86
|
+
hash: hashEvidence(messages),
|
|
87
|
+
framework: "ISO27001",
|
|
88
|
+
controlId: "A.8.3.1",
|
|
89
|
+
source: "teams/messages",
|
|
90
|
+
status: "partial",
|
|
91
|
+
data: { recentMessages: messages.value?.length || 0 },
|
|
92
|
+
metadata: {},
|
|
93
|
+
});
|
|
94
|
+
return artifacts;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationConnector, ConnectorConfig, EvidenceArtifact, IntegrationCapability, ComplianceFramework } from "../types.js";
|
|
2
|
+
export declare class TenableIOConnector implements IntegrationConnector {
|
|
3
|
+
readonly id = "tenable_io";
|
|
4
|
+
readonly name = "Tenable.io";
|
|
5
|
+
readonly category: "vulnerability";
|
|
6
|
+
readonly authType: "api_key";
|
|
7
|
+
readonly capabilities: IntegrationCapability[];
|
|
8
|
+
readonly frameworks: ComplianceFramework[];
|
|
9
|
+
private fetchApi;
|
|
10
|
+
testConnection(config: ConnectorConfig): Promise<boolean>;
|
|
11
|
+
collectEvidence(config: ConnectorConfig): Promise<EvidenceArtifact[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "tenable-vulns",
|
|
5
|
+
name: "Vulnerability Findings",
|
|
6
|
+
description: "Fetch Tenable.io vulnerability findings and severity breakdown",
|
|
7
|
+
evidenceCategories: ["vulnerability_management", "asset_management"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "tenable-scans",
|
|
11
|
+
name: "Scan Results",
|
|
12
|
+
description: "Fetch scan history and completion status",
|
|
13
|
+
evidenceCategories: ["vulnerability_management", "monitoring"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "tenable-assets",
|
|
17
|
+
name: "Asset Inventory",
|
|
18
|
+
description: "Fetch discovered assets and vulnerability counts per host",
|
|
19
|
+
evidenceCategories: ["asset_management", "vulnerability_management"],
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
id: "tenable-compliance",
|
|
23
|
+
name: "Compliance Checks",
|
|
24
|
+
description: "Fetch CIS and DISA STIG compliance scan results",
|
|
25
|
+
evidenceCategories: ["compliance", "configuration"],
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
export class TenableIOConnector {
|
|
29
|
+
id = "tenable_io";
|
|
30
|
+
name = "Tenable.io";
|
|
31
|
+
category = "vulnerability";
|
|
32
|
+
authType = "api_key";
|
|
33
|
+
capabilities = capabilities;
|
|
34
|
+
frameworks = [
|
|
35
|
+
"SOC2",
|
|
36
|
+
"ISO27001",
|
|
37
|
+
"NIST_CSF",
|
|
38
|
+
"PCI_DSS",
|
|
39
|
+
"HIPAA",
|
|
40
|
+
];
|
|
41
|
+
async fetchApi(config, endpoint) {
|
|
42
|
+
const base = config.baseUrl || "https://cloud.tenable.com";
|
|
43
|
+
const resp = await fetch(`${base}${endpoint}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
"X-ApiKeys": `accessKey=${config.clientId}; secretKey=${config.clientSecret}`,
|
|
46
|
+
Accept: "application/json",
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
if (!resp.ok)
|
|
50
|
+
throw new Error(`Tenable API ${resp.status}: ${resp.statusText}`);
|
|
51
|
+
return (await resp.json());
|
|
52
|
+
}
|
|
53
|
+
async testConnection(config) {
|
|
54
|
+
try {
|
|
55
|
+
await this.fetchApi(config, "/server/properties");
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async collectEvidence(config) {
|
|
63
|
+
const artifacts = [];
|
|
64
|
+
const now = new Date().toISOString();
|
|
65
|
+
const vulns = await this.fetchApi(config, "/vulns/export?filters.state=active&filters.severity=critical,high&limit=100").catch(() => ({ vulnerabilities: [] }));
|
|
66
|
+
const vulnList = Array.isArray(vulns.vulnerabilities) ? vulns.vulnerabilities : [];
|
|
67
|
+
artifacts.push({
|
|
68
|
+
id: generateEvidenceId(),
|
|
69
|
+
connectorId: this.id,
|
|
70
|
+
capabilityId: "tenable-vulns",
|
|
71
|
+
timestamp: now,
|
|
72
|
+
hash: hashEvidence({ count: vulnList.length }),
|
|
73
|
+
framework: "SOC2",
|
|
74
|
+
controlId: "CC6.6",
|
|
75
|
+
source: "tenable/vulnerabilities",
|
|
76
|
+
status: vulnList.length === 0 ? "compliant" : "non_compliant",
|
|
77
|
+
data: { criticalHighVulns: vulnList.length },
|
|
78
|
+
metadata: {},
|
|
79
|
+
});
|
|
80
|
+
const scans = await this.fetchApi(config, "/scans?limit=10&sort=creation_date:desc").catch(() => ({ scans: [] }));
|
|
81
|
+
const scanList = Array.isArray(scans.scans) ? scans.scans : [];
|
|
82
|
+
const completedScans = scanList.filter((s) => s.status === "completed");
|
|
83
|
+
artifacts.push({
|
|
84
|
+
id: generateEvidenceId(),
|
|
85
|
+
connectorId: this.id,
|
|
86
|
+
capabilityId: "tenable-scans",
|
|
87
|
+
timestamp: now,
|
|
88
|
+
hash: hashEvidence({ scans: scanList.slice(0, 5) }),
|
|
89
|
+
framework: "NIST_CSF",
|
|
90
|
+
controlId: "DE.CM",
|
|
91
|
+
source: "tenable/scans",
|
|
92
|
+
status: completedScans.length > 0 ? "compliant" : "non_compliant",
|
|
93
|
+
data: { recentScans: scanList.length, completed: completedScans.length },
|
|
94
|
+
metadata: {},
|
|
95
|
+
});
|
|
96
|
+
const assets = await this.fetchApi(config, "/assets?limit=100").catch(() => ({ assets: [] }));
|
|
97
|
+
const assetList = Array.isArray(assets.assets) ? assets.assets : [];
|
|
98
|
+
artifacts.push({
|
|
99
|
+
id: generateEvidenceId(),
|
|
100
|
+
connectorId: this.id,
|
|
101
|
+
capabilityId: "tenable-assets",
|
|
102
|
+
timestamp: now,
|
|
103
|
+
hash: hashEvidence({ count: assetList.length }),
|
|
104
|
+
framework: "ISO27001",
|
|
105
|
+
controlId: "A.8.1.1",
|
|
106
|
+
source: "tenable/assets",
|
|
107
|
+
status: assetList.length > 0 ? "compliant" : "partial",
|
|
108
|
+
data: { discoveredAssets: assetList.length },
|
|
109
|
+
metadata: {},
|
|
110
|
+
});
|
|
111
|
+
const compliance = await this.fetchApi(config, "/compliance/scan/export?limit=20").catch(() => ({ compliance_results: [] }));
|
|
112
|
+
const compResults = Array.isArray(compliance.compliance_results)
|
|
113
|
+
? compliance.compliance_results
|
|
114
|
+
: [];
|
|
115
|
+
artifacts.push({
|
|
116
|
+
id: generateEvidenceId(),
|
|
117
|
+
connectorId: this.id,
|
|
118
|
+
capabilityId: "tenable-compliance",
|
|
119
|
+
timestamp: now,
|
|
120
|
+
hash: hashEvidence({ count: compResults.length }),
|
|
121
|
+
framework: "PCI_DSS",
|
|
122
|
+
controlId: "2.2.1",
|
|
123
|
+
source: "tenable/compliance",
|
|
124
|
+
status: compResults.length > 0 ? "compliant" : "partial",
|
|
125
|
+
data: { complianceResults: compResults.length },
|
|
126
|
+
metadata: {},
|
|
127
|
+
});
|
|
128
|
+
return artifacts;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationConnector, ConnectorConfig, EvidenceArtifact, IntegrationCapability, ComplianceFramework } from "../types.js";
|
|
2
|
+
export declare class TerraformCloudConnector implements IntegrationConnector {
|
|
3
|
+
readonly id = "terraform-cloud";
|
|
4
|
+
readonly name = "Terraform Cloud";
|
|
5
|
+
readonly category: "iac";
|
|
6
|
+
readonly authType: "bearer_token";
|
|
7
|
+
readonly capabilities: IntegrationCapability[];
|
|
8
|
+
readonly frameworks: ComplianceFramework[];
|
|
9
|
+
private fetchApi;
|
|
10
|
+
testConnection(config: ConnectorConfig): Promise<boolean>;
|
|
11
|
+
collectEvidence(config: ConnectorConfig): Promise<EvidenceArtifact[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { hashEvidence, generateEvidenceId } from "../types.js";
|
|
2
|
+
const capabilities = [
|
|
3
|
+
{
|
|
4
|
+
id: "tfc-workspaces",
|
|
5
|
+
name: "Workspace Configs",
|
|
6
|
+
description: "Fetch Terraform Cloud workspace configurations and variables",
|
|
7
|
+
evidenceCategories: ["iac", "configuration"],
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
id: "tfc-state",
|
|
11
|
+
name: "State Files",
|
|
12
|
+
description: "Fetch state file metadata and resource counts",
|
|
13
|
+
evidenceCategories: ["iac", "change_management"],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "tfc-drift",
|
|
17
|
+
name: "Drift Detection",
|
|
18
|
+
description: "Fetch drift detection results and policy violations",
|
|
19
|
+
evidenceCategories: ["iac", "compliance"],
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
export class TerraformCloudConnector {
|
|
23
|
+
id = "terraform-cloud";
|
|
24
|
+
name = "Terraform Cloud";
|
|
25
|
+
category = "iac";
|
|
26
|
+
authType = "bearer_token";
|
|
27
|
+
capabilities = capabilities;
|
|
28
|
+
frameworks = ["SOC2", "ISO27001", "NIST_CSF"];
|
|
29
|
+
async fetchApi(config, endpoint) {
|
|
30
|
+
const base = config.baseUrl || "https://app.terraform.io/api/v2";
|
|
31
|
+
const resp = await fetch(`${base}${endpoint}`, {
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `Bearer ${config.apiToken}`,
|
|
34
|
+
"Content-Type": "application/vnd.api+json",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (!resp.ok)
|
|
38
|
+
throw new Error(`Terraform Cloud API ${resp.status}: ${resp.statusText}`);
|
|
39
|
+
return (await resp.json());
|
|
40
|
+
}
|
|
41
|
+
async testConnection(config) {
|
|
42
|
+
try {
|
|
43
|
+
await this.fetchApi(config, "/organizations?filter[name]=default");
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async collectEvidence(config) {
|
|
51
|
+
const artifacts = [];
|
|
52
|
+
const now = new Date().toISOString();
|
|
53
|
+
const org = config.extra?.org || "default";
|
|
54
|
+
const workspaces = await this.fetchApi(config, `/organizations/${org}/workspaces`).catch(() => ({ data: [] }));
|
|
55
|
+
const wsList = Array.isArray(workspaces.data) ? workspaces.data : [];
|
|
56
|
+
artifacts.push({
|
|
57
|
+
id: generateEvidenceId(),
|
|
58
|
+
connectorId: this.id,
|
|
59
|
+
capabilityId: "tfc-workspaces",
|
|
60
|
+
timestamp: now,
|
|
61
|
+
hash: hashEvidence({ workspaceCount: wsList.length }),
|
|
62
|
+
framework: "SOC2",
|
|
63
|
+
controlId: "CC8.1",
|
|
64
|
+
source: `terraform-cloud/organizations/${org}/workspaces`,
|
|
65
|
+
status: "unknown",
|
|
66
|
+
data: { workspaceCount: wsList.length },
|
|
67
|
+
metadata: { org },
|
|
68
|
+
});
|
|
69
|
+
const wsId = config.extra?.workspaceId || wsList[0]?.id || "";
|
|
70
|
+
const state = wsId
|
|
71
|
+
? await this.fetchApi(config, `/workspaces/${wsId}/current-state-version`)
|
|
72
|
+
.catch(() => ({ data: null }))
|
|
73
|
+
: { data: null };
|
|
74
|
+
artifacts.push({
|
|
75
|
+
id: generateEvidenceId(),
|
|
76
|
+
connectorId: this.id,
|
|
77
|
+
capabilityId: "tfc-state",
|
|
78
|
+
timestamp: now,
|
|
79
|
+
hash: hashEvidence(state),
|
|
80
|
+
framework: "ISO27001",
|
|
81
|
+
controlId: "A.12.3.1",
|
|
82
|
+
source: `terraform-cloud/workspaces/${wsId}/state`,
|
|
83
|
+
status: state.data ? "compliant" : "non_compliant",
|
|
84
|
+
data: { stateVersion: state.data },
|
|
85
|
+
metadata: { org, workspaceId: wsId },
|
|
86
|
+
});
|
|
87
|
+
const runs = wsId
|
|
88
|
+
? await this.fetchApi(config, `/workspaces/${wsId}/runs?filter[status]=planned,errored&filter[kinds][]=drift`).catch(() => ({ data: [] }))
|
|
89
|
+
: { data: [] };
|
|
90
|
+
const runList = Array.isArray(runs.data) ? runs.data : [];
|
|
91
|
+
artifacts.push({
|
|
92
|
+
id: generateEvidenceId(),
|
|
93
|
+
connectorId: this.id,
|
|
94
|
+
capabilityId: "tfc-drift",
|
|
95
|
+
timestamp: now,
|
|
96
|
+
hash: hashEvidence({ driftRuns: runList.length }),
|
|
97
|
+
framework: "SOC2",
|
|
98
|
+
controlId: "CC8.1",
|
|
99
|
+
source: `terraform-cloud/workspaces/${wsId}/drift`,
|
|
100
|
+
status: runList.length === 0 ? "compliant" : "non_compliant",
|
|
101
|
+
data: { driftRuns: runList.length },
|
|
102
|
+
metadata: { org, workspaceId: wsId },
|
|
103
|
+
});
|
|
104
|
+
return artifacts;
|
|
105
|
+
}
|
|
106
|
+
}
|