Documentation ¶
Index ¶
- Constants
- type ActiveSuppressCount
- type ComplianceEntry
- type ComplianceStatus
- type DeletePolicy
- type DeleteResource
- type DeleteStatusEntry
- type DeleteStatusInput
- type DescribeOrgInput
- type DescribeOrgOutput
- type DescribePolicyInput
- type DescribeResourceInput
- type GetOrgOverviewInput
- type GetStatusInput
- type ItemSummary
- type LambdaInput
- type OrgSummary
- type Paging
- type PolicyResourceDetail
- type PolicySummary
- type ResourceOfType
- type ResourceSummary
- type ScannedResources
- type SetStatusEntry
- type SetStatusInput
- type Severity
- type StatusCount
- type StatusCountBySeverity
- type UpdateMetadataInput
Constants ¶
const ( DefaultPage = 1 DefaultPageSize = 25 DefaultLimitTopFailing = 10 // GetOrgOverview )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ActiveSuppressCount ¶
type ActiveSuppressCount struct { Active StatusCount `json:"active"` Suppressed StatusCount `json:"suppressed"` }
type ComplianceEntry ¶
type ComplianceEntry struct { // Python error message when policy was applied to this resource ErrorMessage string `json:"errorMessage"` // Dynamo TTL - unix time when the status will be automatically cleared ExpiresAt int64 `json:"expiresAt"` // IntegrationID where the resource was discovered IntegrationID string `json:"integrationId"` // When the compliance state was last updated in the Panther database LastUpdated time.Time `json:"lastUpdated"` PolicyID string `json:"policyId"` PolicySeverity Severity `json:"policySeverity"` // INFO, LOW, MEDIUM, HIGH, or CRITICAL ResourceID string `json:"resourceId"` ResourceType string `json:"resourceType"` Status ComplianceStatus `json:"status"` // True if this resource is ignored/suppressed by this specific policy. // Suppressed resources are still analyzed and reported, but not trigger alerts nor remediations. Suppressed bool `json:"suppressed"` }
type ComplianceStatus ¶
type ComplianceStatus string
const ( StatusPass ComplianceStatus = "PASS" StatusFail ComplianceStatus = "FAIL" StatusError ComplianceStatus = "ERROR" )
type DeletePolicy ¶
type DeleteResource ¶
type DeleteResource struct {
ID string `json:"id" validate:"required"`
}
type DeleteStatusEntry ¶
type DeleteStatusEntry struct { // Exactly one of the following must be specified: Policy *DeletePolicy `json:"policy" validate:"required_without=Resource"` Resource *DeleteResource `json:"resource" validate:"required_without=Policy"` }
type DeleteStatusInput ¶
type DeleteStatusInput struct {
Entries []DeleteStatusEntry `json:"entries" validate:"min=1,dive"`
}
Delete the compliance status associated with one or more policies or resources
The policy-api deletes statuses when a policy is disabled or deleted or no longer applies to a resource type, and the resources-api deletes statuses when a resource is deleted.
type DescribeOrgInput ¶
type DescribeOrgInput struct { // Which type of information is returned Type string `json:"type" validate:"oneof=policy resource"` }
List pass/fail status for every policy or resource in the org TODO - handle responses > 6MB
The resources-api and policy-api load and cache all pass/fail information so they can filter and sort their respective lists.
For example,
{ "describeOrg": {"type": "policy"} }
might return
{ "policies": [ (or "resources") { "id": "AWS.S3.EncryptionEnabled", "status": "ERROR|FAIL|PASS", } ] }
type DescribeOrgOutput ¶
type DescribeOrgOutput struct { Policies []ItemSummary `json:"policies"` Resources []ItemSummary `json:"resources"` }
type DescribePolicyInput ¶
type DescribePolicyInput struct { PolicyID string `json:"policyId" validate:"required"` // URL-encoded // Which page of results to retrieve Page int `json:"page" validate:"omitempty,min=1"` // Number of items in each page of results (DefaultPageSize if not specified) PageSize int `json:"pageSize" validate:"omitempty,min=1,max=1000"` // Include only policies which match the given compliance status Status ComplianceStatus `json:"status" validate:"omitempty,oneof=ERROR FAIL PASS"` // Include only policies which are or are not suppressed Suppressed *bool `json:"suppressed"` }
The UI policy detail page shows pass/fail counts and pages through affected resources. TODO - add sorting options TODO - use cursor-based pagination
For example,
{ "describePolicy": { "policyId": "AWS.S3.BucketEncryptionEnabled", // can be url-encoded "page": 1, "pageSize": 25, "suppressed": false } }
might return:
{ "items": [ { "errorMessage": "ZeroDivisionError", "lastUpdated": "2019-08-22T00:00:00Z", "policyId": "AWS.S3.BucketEncryptionEnabled", "policySeverity": "MEDIUM", "resourceId": "arn:aws:s3:::my-bucket", "resourceType": "AWS.S3.Bucket", "status": "ERROR", "suppressed": false, "integrationId": "ff76ea2a-5afc-4005-9e77-61a32c4c365f" }, { "lastUpdated": "2019-08-22T00:00:00Z", "policyId": "AWS.S3.BucketEncryptionEnabled", "policySeverity": "MEDIUM", "resourceId": "arn:aws:s3:::my-other-bucket", "resourceType": "AWS.S3.Bucket", "status": "PASS", "suppressed": false, "integrationId": "ff76ea2a-5afc-4005-9e77-61a32c4c365f" } ], "paging": { "thisPage": 1, "totalPages": 15, "totalItems": 123 }, "status": "ERROR", "totals": { // global totals - will be the same regardless of paging/filtering "active": {"error": 0, "fail": 4, "pass": 10}, "suppressed": {"error": 0, "fail": 4, "pass": 5} } }
type DescribeResourceInput ¶
type DescribeResourceInput struct { ResourceID string `json:"resourceId" validate:"required"` // URL-encoded // Which page of results to retrieve Page int `json:"page" validate:"omitempty,min=1"` // Number of items in each page of results (DefaultPageSize if not specified) PageSize int `json:"pageSize" validate:"omitempty,min=1,max=1000"` // Include only policies with this severity Severity Severity `json:"severity" validate:"omitempty,oneof=INFO LOW MEDIUM HIGH CRITICAL"` // Include only policies which match the given compliance status Status ComplianceStatus `json:"status" validate:"omitempty,oneof=ERROR FAIL PASS"` // Include only policies which are or are not suppressed Suppressed *bool `json:"suppressed"` }
The UI resource detail page shows pass/fail counts and pages through applied policies.
type GetOrgOverviewInput ¶
type GetOrgOverviewInput struct {
LimitTopFailing int `json:"limitTopFailing" validate:"min=0,max=500"`
}
The UI dashboard shows:
- failing policy counts by severity
- total number of failing resources
- top failing policies/resources
Example: { "getOrgOverview": {"limitTopFailing": 10} }
Note that errors can generally be considered failures - it means the Python policy failed to analyze a specific resource. Suppressions are not included in any counts.
Response (OrgSummary): { "appliedPolicies": { // This ONLY includes enabled policies which scanned at least one resource. "info": {"error": 0, "fail": 10, "pass": 0}, "low": {"error": 0, "fail": 10, "pass": 0}, "medium": {"error": 0, "fail": 10, "pass": 0}, "high": {"error": 0, "fail": 10, "pass": 0}, "critical": {"error": 0, "fail": 10, "pass": 0} }, "scannedResources": { // This ONLY includes resources with at least one applicable policy. // There could be more resources in the account (e.g. with no policies for them). "byType": [ { "count": {"error": 0, "fail": 5, "pass": 1}, "type": "AWS.S3.Bucket" } ], }, "topFailingPolicies": [ { "count": {"error": 1, "fail": 10, "pass": 0}, "id": "AWS.S3.BlockPublicAccess", "severity": "CRITICAL", }, { "count": {"error": 0, "fail": 20, "pass": 9}, "id": "AWS.S3.VersioningEnabled", "severity": "MEDIUM", } ], "topFailingResources": [ { "count": { "info": {"error": 0, "fail": 10, "pass": 0}, "low": {"error": 0, "fail": 10, "pass": 0}, "medium": {"error": 0, "fail": 10, "pass": 0}, "high": {"error": 0, "fail": 10, "pass": 0}, "critical": {"error": 0, "fail": 10, "pass": 0} } "id": "arn:aws:s3:::my-bucket", "type": "AWS.S3.Bucket" } ] }
type GetStatusInput ¶
type GetStatusInput struct { PolicyID string `json:"policyId" validate:"required"` ResourceID string `json:"resourceId" validate:"required"` }
Get compliance status for a single policy/resource pair
The alert-processor verifies a resource is still failing a specific policy before proceeding to deliver the remediation and/or alert.
type ItemSummary ¶
type ItemSummary struct { // Policy/resource ID ID string `json:"id"` // Compliance status for a policy/resource pair Status ComplianceStatus `json:"status"` }
Summary of a single policy or resource compliance status
type LambdaInput ¶
type LambdaInput struct { DescribeOrg *DescribeOrgInput `json:"describeOrg"` DescribePolicy *DescribePolicyInput `json:"describePolicy"` DescribeResource *DescribeResourceInput `json:"describeResource"` GetOrgOverview *GetOrgOverviewInput `json:"getOrgOverview"` GetStatus *GetStatusInput `json:"getStatus"` DeleteStatus *DeleteStatusInput `json:"deleteStatus"` SetStatus *SetStatusInput `json:"setStatus"` UpdateMetadata *UpdateMetadataInput `json:"updateMetadata"` }
LambdaInput is the request structure for the compliance-api Lambda function.
type OrgSummary ¶
type OrgSummary struct { AppliedPolicies StatusCountBySeverity `json:"appliedPolicies"` ScannedResources ScannedResources `json:"scannedResources"` TopFailingPolicies []PolicySummary `json:"topFailingPolicies"` TopFailingResources []ResourceSummary `json:"topFailingResources"` }
type PolicyResourceDetail ¶
type PolicyResourceDetail struct { Items []ComplianceEntry `json:"items"` Paging Paging `json:"paging"` Status ComplianceStatus `json:"status"` // overall compliance status Totals ActiveSuppressCount `json:"totals"` }
Returned from DescribePolicy and DescribeResource
type PolicySummary ¶
type PolicySummary struct { Count StatusCount `json:"count"` ID string `json:"id"` Severity Severity `json:"severity"` }
Summary of a single policy compliance status
type ResourceOfType ¶
type ResourceOfType struct { Count StatusCount `json:"count"` Type string `json:"type"` }
type ResourceSummary ¶
type ResourceSummary struct { Count StatusCountBySeverity `json:"count"` ID string `json:"id"` Type string `json:"type"` }
Summary of a single resource compliance status
type ScannedResources ¶
type ScannedResources struct {
ByType []ResourceOfType `json:"byType"`
}
type SetStatusEntry ¶
type SetStatusEntry struct { ErrorMessage string `json:"errorMessage"` IntegrationID string `json:"integrationId" validate:"required"` PolicyID string `json:"policyId" validate:"required"` PolicySeverity Severity `json:"policySeverity" validate:"oneof=INFO LOW MEDIUM HIGH CRITICAL"` ResourceID string `json:"resourceId" validate:"required"` ResourceType string `json:"resourceType" validate:"required"` Status ComplianceStatus `json:"status" validate:"oneof=ERROR PASS FAIL"` Suppressed bool `json:"suppressed"` }
type SetStatusInput ¶
type SetStatusInput struct {
Entries []SetStatusEntry `json:"entries" validate:"min=1,dive"`
}
Set the compliance status for a batch of resource/policy pairs.
The resource-processor analyzes each modified resource and posts the results here.
type StatusCount ¶
type StatusCountBySeverity ¶
type StatusCountBySeverity struct { Info StatusCount `json:"info"` Low StatusCount `json:"low"` Medium StatusCount `json:"medium"` High StatusCount `json:"high"` Critical StatusCount `json:"critical"` }
type UpdateMetadataInput ¶
type UpdateMetadataInput struct { PolicyID string `json:"policyId" validate:"required"` Severity Severity `json:"severity" validate:"oneof=INFO LOW MEDIUM HIGH CRITICAL"` Suppressions []string `json:"suppressions"` }
The policy-api updates the relevant policy attributes here when they change (severity/suppressions). For these updates, we don't need to re-scan the resources and can instead directly modify the compliance state.