diff --git a/src/operator/controllers/webhook_traffic/custom_resource_definition_reconciler.go b/src/operator/controllers/webhook_traffic/custom_resource_definition_reconciler.go index 8064ecaf2..ce3edde62 100644 --- a/src/operator/controllers/webhook_traffic/custom_resource_definition_reconciler.go +++ b/src/operator/controllers/webhook_traffic/custom_resource_definition_reconciler.go @@ -11,7 +11,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller" ) -// +kubebuilder:rbac:groups=admissionregistration.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch +//+kubebuilder:rbac:groups="apiextensions.k8s.io",resources=customresourcedefinitions,verbs=get;list;watch type CustomResourceDefinitionReconciler struct { client.Client diff --git a/src/shared/operator_cloud_client/status_report.go b/src/shared/operator_cloud_client/status_report.go index 0b1176028..934a4c7ca 100644 --- a/src/shared/operator_cloud_client/status_report.go +++ b/src/shared/operator_cloud_client/status_report.go @@ -162,6 +162,11 @@ func uploadConfiguration(ctx context.Context, client CloudClient, mgr manager.Ma }) configInput.AwsALBLoadBalancerExemptionEnabled = viper.GetBool(operatorconfig.IngressControllerALBExemptKey) + configInput.AutomatedThirdPartyPolicyTypes = []graphqlclient.AutomatedThirdPartyPolicyTypes{ + graphqlclient.AutomatedThirdPartyPolicyTypesExternalTraffic, + graphqlclient.AutomatedThirdPartyPolicyTypesMetricsTraffic, + graphqlclient.AutomatedThirdPartyPolicyTypesWebhookTraffic, + } client.ReportIntentsOperatorConfiguration(timeoutCtx, configInput) } diff --git a/src/shared/otterizecloud/graphqlclient/generated.go b/src/shared/otterizecloud/graphqlclient/generated.go index 3c69a8af7..56ad1ce6f 100644 --- a/src/shared/otterizecloud/graphqlclient/generated.go +++ b/src/shared/otterizecloud/graphqlclient/generated.go @@ -26,6 +26,14 @@ const ( AutomateThirdPartyNetworkPolicyIfBlockedByOtterize AutomateThirdPartyNetworkPolicy = "IF_BLOCKED_BY_OTTERIZE" ) +type AutomatedThirdPartyPolicyTypes string + +const ( + AutomatedThirdPartyPolicyTypesExternalTraffic AutomatedThirdPartyPolicyTypes = "EXTERNAL_TRAFFIC" + AutomatedThirdPartyPolicyTypesMetricsTraffic AutomatedThirdPartyPolicyTypes = "METRICS_TRAFFIC" + AutomatedThirdPartyPolicyTypesWebhookTraffic AutomatedThirdPartyPolicyTypes = "WEBHOOK_TRAFFIC" +) + type AzureKeyVaultPolicyInput struct { CertificatePermissions []*string `json:"certificatePermissions"` KeyPermissions []*string `json:"keyPermissions"` @@ -449,6 +457,7 @@ type IntentsOperatorConfigurationInput struct { ExternallyManagedPolicyWorkloads []ExternallyManagedPolicyWorkloadInput `json:"externallyManagedPolicyWorkloads"` AutomateThirdPartyNetworkPolicies AutomateThirdPartyNetworkPolicy `json:"automateThirdPartyNetworkPolicies"` PrometheusServerConfigs []PrometheusServerConfigInput `json:"prometheusServerConfigs"` + AutomatedThirdPartyPolicyTypes []AutomatedThirdPartyPolicyTypes `json:"automatedThirdPartyPolicyTypes"` } // GetGlobalEnforcementEnabled returns IntentsOperatorConfigurationInput.GlobalEnforcementEnabled, and is useful for accessing the field via an interface. @@ -549,6 +558,11 @@ func (v *IntentsOperatorConfigurationInput) GetPrometheusServerConfigs() []Prome return v.PrometheusServerConfigs } +// GetAutomatedThirdPartyPolicyTypes returns IntentsOperatorConfigurationInput.AutomatedThirdPartyPolicyTypes, and is useful for accessing the field via an interface. +func (v *IntentsOperatorConfigurationInput) GetAutomatedThirdPartyPolicyTypes() []AutomatedThirdPartyPolicyTypes { + return v.AutomatedThirdPartyPolicyTypes +} + type InternetConfigInput struct { Domains []*string `json:"domains"` DiscoveredTarget *DNSIPPairInput `json:"discoveredTarget"` diff --git a/src/shared/otterizecloud/graphqlclient/schema.graphql b/src/shared/otterizecloud/graphqlclient/schema.graphql index 8204dbc3d..697800496 100644 --- a/src/shared/otterizecloud/graphqlclient/schema.graphql +++ b/src/shared/otterizecloud/graphqlclient/schema.graphql @@ -313,6 +313,12 @@ enum AutomateThirdPartyNetworkPolicy { IF_BLOCKED_BY_OTTERIZE } +enum AutomatedThirdPartyPolicyTypes { + EXTERNAL_TRAFFIC + METRICS_TRAFFIC + WEBHOOK_TRAFFIC +} + enum AwsIamStep { CREATE_CLUSTER CONNECT_CLUSTER @@ -624,7 +630,7 @@ enum CustomConstraint { } input DNSIPPairInput { - dnsName: String! + dnsName: String ips: [String!] } @@ -1600,6 +1606,7 @@ input IntentsOperatorConfigurationInput { externallyManagedPolicyWorkloads: [ExternallyManagedPolicyWorkloadInput!] automateThirdPartyNetworkPolicies: AutomateThirdPartyNetworkPolicy prometheusServerConfigs: [PrometheusServerConfigInput!] + automatedThirdPartyPolicyTypes: [AutomatedThirdPartyPolicyTypes!] } type IntentsOperatorState { @@ -1610,7 +1617,7 @@ type IntentsOperatorState { type InternetConfig { appliedDomains: [String!] - dnsName: String! + dnsName: String ips: [String!] ports: [Int!] } @@ -1793,6 +1800,14 @@ enum K8sServiceType { EXTERNAL_NAME } +input K8sWebhookServiceInput { + otterizeName: String! + serviceName: String! + namespace: String! + webhookName: String! + webhookType: WebhookType! +} + type KafkaConfig { name: String! operations: [KafkaOperation!] @@ -2193,6 +2208,9 @@ type Mutation { reason: EligibleForMetricsCollectionReason! resources: [K8sResourceEligibleForMetricsCollectionInput!]! ): Boolean! + reportK8sWebhookServices( + services: [K8sWebhookServiceInput!]! + ): Boolean! reportKafkaServerConfigs( namespace: String! serverConfigs: [KafkaServerConfigInput!]! @@ -3277,6 +3295,12 @@ type ValidIDFilter { environmentIds: IDFilterValue } +enum WebhookType { + VALIDATING_WEBHOOK + MUTATING_WEBHOOK + CONVERSION_WEBHOOK +} + type Workload { id: ID! service: Service! diff --git a/src/shared/telemetries/telemetriesgql/schema.graphql b/src/shared/telemetries/telemetriesgql/schema.graphql index 8ce1fdf68..697800496 100644 --- a/src/shared/telemetries/telemetriesgql/schema.graphql +++ b/src/shared/telemetries/telemetriesgql/schema.graphql @@ -154,6 +154,7 @@ input AWSVisibilitySettingsInput { type AccessApprovalRuleset { id: ID! + order: Int! origin: AccessApprovalRulesetFilter! target: AccessApprovalRulesetFilter! action: AccessApprovalRulesetAction! @@ -301,12 +302,23 @@ enum AuthRole { VIEWER } +type AutoApproveMoreRestrictiveIntentsByEnv { + environmentId: ID! + enabled: Boolean! +} + enum AutomateThirdPartyNetworkPolicy { OFF ALWAYS IF_BLOCKED_BY_OTTERIZE } +enum AutomatedThirdPartyPolicyTypes { + EXTERNAL_TRAFFIC + METRICS_TRAFFIC + WEBHOOK_TRAFFIC +} + enum AwsIamStep { CREATE_CLUSTER CONNECT_CLUSTER @@ -618,7 +630,7 @@ enum CustomConstraint { } input DNSIPPairInput { - dnsName: String! + dnsName: String ips: [String!] } @@ -884,6 +896,7 @@ type FeatureFlags { useTypedIntentsCTE: Boolean enableInternetIntentsSuggestions: Boolean enableIAMIntentsSuggestions: Boolean + enableNetworkPoliciesInAccessGraph: Boolean } type Finding { @@ -1004,12 +1017,14 @@ type GitHubRepoInfo { repository: String! baseBranch: String! intentsPath: String! + terraformPath: String } input GitHubRepoInfoInput { repository: String! baseBranch: String! intentsPath: String! + terraformPath: String } type GitHubSettings { @@ -1044,6 +1059,7 @@ input GitLabRepoInfoInput { projectPath: String! baseBranch: String! intentsPath: String! + terraformPath: String } type GitLabSettings { @@ -1117,6 +1133,7 @@ input IncomingTrafficIntentInput { serverName: String! namespace: String! source: IncomingInternetSourceInput! + connectionsCount: ConnectionsCount } input IngressControllerConfigInput { @@ -1129,6 +1146,8 @@ input IngressControllerConfigInput { input InputAccessApprovalRuleset { """Ruleset""" id: ID! +"""Ruleset""" + order: Int! """Ruleset""" origin: InputAccessApprovalRulesetConfigFilter! """Ruleset""" @@ -1208,6 +1227,11 @@ input InputAppliedIntentsRequestFilter { approvalStatuses: InputIDFilterValue } +input InputAutoApproveMoreRestrictiveIntentsByEnv { + environmentId: ID! + enabled: Boolean! +} + input InputDefaultIntentsApprovalActionByEnv { environmentId: ID! action: AccessApprovalRulesetAction! @@ -1221,6 +1245,7 @@ input InputFeatureFlags { useTypedIntentsCTE: Boolean enableInternetIntentsSuggestions: Boolean enableIAMIntentsSuggestions: Boolean + enableNetworkPoliciesInAccessGraph: Boolean } """ Findings filter """ @@ -1289,6 +1314,11 @@ input InputNumericFilterValue { operator: NumericFilterOperators! } +input InputOffsetPagination { + page: Int + size: Int +} + input InputResourceInventoryFilter { serviceIds: InputIDFilterValue environmentIds: InputIDFilterValue @@ -1312,15 +1342,21 @@ input InputServiceFilter { integrationIds: [ID!] } +input InputTerraformAwsInlinePolicyInfo { + name: String! + policy: String! +} + input InputTerraformAwsPolicyInfo { arn: String! + policy: String! address: String! } input InputTerraformAwsRoleInfo { arn: String! address: String! - inlinePolicy: String! + inlinePolicy: [InputTerraformAwsInlinePolicyInfo!] attachedPolicies: [InputTerraformAwsPolicyInfo!] } @@ -1541,10 +1577,12 @@ type IntentsOperatorConfiguration { gcpIAMPolicyEnforcementEnabled: Boolean! azureIAMPolicyEnforcementEnabled: Boolean! databaseEnforcementEnabled: Boolean! + strictModeEnabled: Boolean! protectedServicesEnabled: Boolean! protectedServices: [Service!]! egressNetworkPolicyEnforcementEnabled: Boolean! enforcedNamespaces: [String!] + excludedStrictModeNamespaces: [String!] } input IntentsOperatorConfigurationInput { @@ -1559,6 +1597,8 @@ input IntentsOperatorConfigurationInput { gcpIAMPolicyEnforcementEnabled: Boolean azureIAMPolicyEnforcementEnabled: Boolean databaseEnforcementEnabled: Boolean + strictModeEnabled: Boolean + excludedStrictModeNamespaces: [String!] enforcedNamespaces: [String!] ingressControllerConfig: [IngressControllerConfigInput!] awsALBLoadBalancerExemptionEnabled: Boolean @@ -1566,6 +1606,7 @@ input IntentsOperatorConfigurationInput { externallyManagedPolicyWorkloads: [ExternallyManagedPolicyWorkloadInput!] automateThirdPartyNetworkPolicies: AutomateThirdPartyNetworkPolicy prometheusServerConfigs: [PrometheusServerConfigInput!] + automatedThirdPartyPolicyTypes: [AutomatedThirdPartyPolicyTypes!] } type IntentsOperatorState { @@ -1576,7 +1617,7 @@ type IntentsOperatorState { type InternetConfig { appliedDomains: [String!] - dnsName: String! + dnsName: String ips: [String!] ports: [Int!] } @@ -1759,6 +1800,14 @@ enum K8sServiceType { EXTERNAL_NAME } +input K8sWebhookServiceInput { + otterizeName: String! + serviceName: String! + namespace: String! + webhookName: String! + webhookType: WebhookType! +} + type KafkaConfig { name: String! operations: [KafkaOperation!] @@ -2159,6 +2208,9 @@ type Mutation { reason: EligibleForMetricsCollectionReason! resources: [K8sResourceEligibleForMetricsCollectionInput!]! ): Boolean! + reportK8sWebhookServices( + services: [K8sWebhookServiceInput!]! + ): Boolean! reportKafkaServerConfigs( namespace: String! serverConfigs: [KafkaServerConfigInput!]! @@ -2287,6 +2339,11 @@ type NetworkMapperComponent { status: ComponentStatus! } +type NetworkPoliciesPage { + data: [NetworkPolicy!]! + meta: PaginationMeta +} + enum NetworkPoliciesStep { """Connect cluster""" CREATE_CLUSTER @@ -2413,6 +2470,7 @@ type OrganizationSettings { ignoreInternetIntents: Boolean domainsDefaultRole: AuthRole! defaultInviteMembership: OrganizationMembership! + autoApproveMoreRestrictiveIntentsByEnv: [AutoApproveMoreRestrictiveIntentsByEnv!]! } input OrganizationSettingsInput { @@ -2422,6 +2480,7 @@ input OrganizationSettingsInput { defaultIntentsApprovalActionByEnv: [InputDefaultIntentsApprovalActionByEnv!] ignoreInternetIntents: Boolean defaultInviteMembership: OrganizationMembershipInput + autoApproveMoreRestrictiveIntentsByEnv: [InputAutoApproveMoreRestrictiveIntentsByEnv!] } input PaginationInput { @@ -2631,7 +2690,8 @@ type Query { ): NetworkPolicy networkPolicies( filter: InputNetworkPolicyFilter - ): [NetworkPolicy!]! + pagination: InputOffsetPagination + ): NetworkPoliciesPage """List organizations""" organizations: [Organization!]! """Get organization""" @@ -2749,6 +2809,7 @@ type Resource { enum RowDiff { ADDED REMOVED + STRICT_MODE_WARNING } type RulesetsWithResources { @@ -2971,6 +3032,7 @@ enum ServiceType { KUBERNETES_LOAD_BALANCER AWS_VISIBILITY_EKS DETECTED_CLOUD_SERVER + CONTROL_PLANE } type ServicesResponse { @@ -3078,21 +3140,28 @@ input TelemetryInput { data: TelemetryData! } +type TerraformAwsInlinePolicyInfo { + name: String! + policy: String! +} + type TerraformAwsPolicyInfo { arn: String! + policy: String! address: String! } type TerraformAwsRoleInfo { arn: String! address: String! - inlinePolicy: String! + inlinePolicy: [TerraformAwsInlinePolicyInfo!] attachedPolicies: [TerraformAwsPolicyInfo!] } type TerraformResourceInfo { modulePath: String! - gitOriginUrl: String! + gitPlatform: String! + gitOrigin: String! gitCommitHash: String! awsRoles: [TerraformAwsRoleInfo!] } @@ -3226,6 +3295,12 @@ type ValidIDFilter { environmentIds: IDFilterValue } +enum WebhookType { + VALIDATING_WEBHOOK + MUTATING_WEBHOOK + CONVERSION_WEBHOOK +} + type Workload { id: ID! service: Service!