SecurityPolicyRuleCompute class
A rule for the SecurityPolicy.
To get more information about SecurityPolicyRule, see:
- API documentation
- How-to Guides
- Creating global security policy rules
Example Usage
Security Policy Rule Basic
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.SecurityPolicy("default", {
name: "policyruletest",
description: "basic global security policy",
type: "CLOUD_ARMOR",
});
const policyRule = new gcp.compute.SecurityPolicyRule("policy_rule", {
securityPolicy: _default.name,
description: "new rule",
priority: 100,
match: {
versionedExpr: "SRC_IPS_V1",
config: {
srcIpRanges: ["10.10.0.0/16"],
},
},
action: "allow",
preview: true,
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.SecurityPolicy("default",
name="policyruletest",
description="basic global security policy",
type="CLOUD_ARMOR")
policy_rule = gcp.compute.SecurityPolicyRule("policy_rule",
security_policy=default.name,
description="new rule",
priority=100,
match={
"versioned_expr": "SRC_IPS_V1",
"config": {
"src_ip_ranges": ["10.10.0.0/16"],
},
},
action="allow",
preview=True)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.SecurityPolicy("default", new()
{
Name = "policyruletest",
Description = "basic global security policy",
Type = "CLOUD_ARMOR",
});
var policyRule = new Gcp.Compute.SecurityPolicyRule("policy_rule", new()
{
SecurityPolicy = @default.Name,
Description = "new rule",
Priority = 100,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
VersionedExpr = "SRC_IPS_V1",
Config = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchConfigArgs
{
SrcIpRanges = new[]
{
"10.10.0.0/16",
},
},
},
Action = "allow",
Preview = true,
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewSecurityPolicy(ctx, "default", &compute.SecurityPolicyArgs{
Name: pulumi.String("policyruletest"),
Description: pulumi.String("basic global security policy"),
Type: pulumi.String("CLOUD_ARMOR"),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy_rule", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: _default.Name,
Description: pulumi.String("new rule"),
Priority: pulumi.Int(100),
Match: &compute.SecurityPolicyRuleMatchArgs{
VersionedExpr: pulumi.String("SRC_IPS_V1"),
Config: &compute.SecurityPolicyRuleMatchConfigArgs{
SrcIpRanges: pulumi.StringArray{
pulumi.String("10.10.0.0/16"),
},
},
},
Action: pulumi.String("allow"),
Preview: pulumi.Bool(true),
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_compute_securitypolicy" "default" {
name = "policyruletest"
description = "basic global security policy"
type = "CLOUD_ARMOR"
}
resource "gcp_compute_securitypolicyrule" "policy_rule" {
security_policy = gcp_compute_securitypolicy.default.name
description = "new rule"
priority = 100
match = {
versioned_expr = "SRC_IPS_V1"
config = {
src_ip_ranges = ["10.10.0.0/16"]
}
}
action = "allow"
preview = true
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.SecurityPolicy;
import com.pulumi.gcp.compute.SecurityPolicyArgs;
import com.pulumi.gcp.compute.SecurityPolicyRule;
import com.pulumi.gcp.compute.SecurityPolicyRuleArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchConfigArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new SecurityPolicy("default", SecurityPolicyArgs.builder()
.name("policyruletest")
.description("basic global security policy")
.type("CLOUD_ARMOR")
.build());
var policyRule = new SecurityPolicyRule("policyRule", SecurityPolicyRuleArgs.builder()
.securityPolicy(default_.name())
.description("new rule")
.priority(100)
.match(SecurityPolicyRuleMatchArgs.builder()
.versionedExpr("SRC_IPS_V1")
.config(SecurityPolicyRuleMatchConfigArgs.builder()
.srcIpRanges("10.10.0.0/16")
.build())
.build())
.action("allow")
.preview(true)
.build());
}
}
resources:
default:
type: gcp:compute:SecurityPolicy
properties:
name: policyruletest
description: basic global security policy
type: CLOUD_ARMOR
policyRule:
type: gcp:compute:SecurityPolicyRule
name: policy_rule
properties:
securityPolicy: ${default.name}
description: new rule
priority: 100
match:
versionedExpr: SRC_IPS_V1
config:
srcIpRanges:
- 10.10.0.0/16
action: allow
preview: true
Security Policy Rule Default Rule
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.SecurityPolicy("default", {
name: "policyruletest",
description: "basic global security policy",
type: "CLOUD_ARMOR",
});
const defaultRule = new gcp.compute.SecurityPolicyRule("default_rule", {
securityPolicy: _default.name,
description: "default rule",
action: "deny",
priority: 2147483647,
match: {
versionedExpr: "SRC_IPS_V1",
config: {
srcIpRanges: ["*"],
},
},
});
const policyRule = new gcp.compute.SecurityPolicyRule("policy_rule", {
securityPolicy: _default.name,
description: "new rule",
priority: 100,
match: {
versionedExpr: "SRC_IPS_V1",
config: {
srcIpRanges: ["10.10.0.0/16"],
},
},
action: "allow",
preview: true,
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.SecurityPolicy("default",
name="policyruletest",
description="basic global security policy",
type="CLOUD_ARMOR")
default_rule = gcp.compute.SecurityPolicyRule("default_rule",
security_policy=default.name,
description="default rule",
action="deny",
priority=2147483647,
match={
"versioned_expr": "SRC_IPS_V1",
"config": {
"src_ip_ranges": ["*"],
},
})
policy_rule = gcp.compute.SecurityPolicyRule("policy_rule",
security_policy=default.name,
description="new rule",
priority=100,
match={
"versioned_expr": "SRC_IPS_V1",
"config": {
"src_ip_ranges": ["10.10.0.0/16"],
},
},
action="allow",
preview=True)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.SecurityPolicy("default", new()
{
Name = "policyruletest",
Description = "basic global security policy",
Type = "CLOUD_ARMOR",
});
var defaultRule = new Gcp.Compute.SecurityPolicyRule("default_rule", new()
{
SecurityPolicy = @default.Name,
Description = "default rule",
Action = "deny",
Priority = 2147483647,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
VersionedExpr = "SRC_IPS_V1",
Config = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchConfigArgs
{
SrcIpRanges = new[]
{
"*",
},
},
},
});
var policyRule = new Gcp.Compute.SecurityPolicyRule("policy_rule", new()
{
SecurityPolicy = @default.Name,
Description = "new rule",
Priority = 100,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
VersionedExpr = "SRC_IPS_V1",
Config = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchConfigArgs
{
SrcIpRanges = new[]
{
"10.10.0.0/16",
},
},
},
Action = "allow",
Preview = true,
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewSecurityPolicy(ctx, "default", &compute.SecurityPolicyArgs{
Name: pulumi.String("policyruletest"),
Description: pulumi.String("basic global security policy"),
Type: pulumi.String("CLOUD_ARMOR"),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "default_rule", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: _default.Name,
Description: pulumi.String("default rule"),
Action: pulumi.String("deny"),
Priority: pulumi.Int(2147483647),
Match: &compute.SecurityPolicyRuleMatchArgs{
VersionedExpr: pulumi.String("SRC_IPS_V1"),
Config: &compute.SecurityPolicyRuleMatchConfigArgs{
SrcIpRanges: pulumi.StringArray{
pulumi.String("*"),
},
},
},
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy_rule", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: _default.Name,
Description: pulumi.String("new rule"),
Priority: pulumi.Int(100),
Match: &compute.SecurityPolicyRuleMatchArgs{
VersionedExpr: pulumi.String("SRC_IPS_V1"),
Config: &compute.SecurityPolicyRuleMatchConfigArgs{
SrcIpRanges: pulumi.StringArray{
pulumi.String("10.10.0.0/16"),
},
},
},
Action: pulumi.String("allow"),
Preview: pulumi.Bool(true),
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_compute_securitypolicy" "default" {
name = "policyruletest"
description = "basic global security policy"
type = "CLOUD_ARMOR"
}
resource "gcp_compute_securitypolicyrule" "default_rule" {
security_policy = gcp_compute_securitypolicy.default.name
description = "default rule"
action = "deny"
priority = "2147483647"
match = {
versioned_expr = "SRC_IPS_V1"
config = {
src_ip_ranges = ["*"]
}
}
}
resource "gcp_compute_securitypolicyrule" "policy_rule" {
security_policy = gcp_compute_securitypolicy.default.name
description = "new rule"
priority = 100
match = {
versioned_expr = "SRC_IPS_V1"
config = {
src_ip_ranges = ["10.10.0.0/16"]
}
}
action = "allow"
preview = true
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.SecurityPolicy;
import com.pulumi.gcp.compute.SecurityPolicyArgs;
import com.pulumi.gcp.compute.SecurityPolicyRule;
import com.pulumi.gcp.compute.SecurityPolicyRuleArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchConfigArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new SecurityPolicy("default", SecurityPolicyArgs.builder()
.name("policyruletest")
.description("basic global security policy")
.type("CLOUD_ARMOR")
.build());
var defaultRule = new SecurityPolicyRule("defaultRule", SecurityPolicyRuleArgs.builder()
.securityPolicy(default_.name())
.description("default rule")
.action("deny")
.priority(2147483647)
.match(SecurityPolicyRuleMatchArgs.builder()
.versionedExpr("SRC_IPS_V1")
.config(SecurityPolicyRuleMatchConfigArgs.builder()
.srcIpRanges("*")
.build())
.build())
.build());
var policyRule = new SecurityPolicyRule("policyRule", SecurityPolicyRuleArgs.builder()
.securityPolicy(default_.name())
.description("new rule")
.priority(100)
.match(SecurityPolicyRuleMatchArgs.builder()
.versionedExpr("SRC_IPS_V1")
.config(SecurityPolicyRuleMatchConfigArgs.builder()
.srcIpRanges("10.10.0.0/16")
.build())
.build())
.action("allow")
.preview(true)
.build());
}
}
resources:
default:
type: gcp:compute:SecurityPolicy
properties:
name: policyruletest
description: basic global security policy
type: CLOUD_ARMOR
defaultRule:
type: gcp:compute:SecurityPolicyRule
name: default_rule
properties:
securityPolicy: ${default.name}
description: default rule
action: deny
priority: '2147483647'
match:
versionedExpr: SRC_IPS_V1
config:
srcIpRanges:
- '*'
policyRule:
type: gcp:compute:SecurityPolicyRule
name: policy_rule
properties:
securityPolicy: ${default.name}
description: new rule
priority: 100
match:
versionedExpr: SRC_IPS_V1
config:
srcIpRanges:
- 10.10.0.0/16
action: allow
preview: true
Security Policy Rule Multiple Rules
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.SecurityPolicy("default", {
name: "policywithmultiplerules",
description: "basic global security policy",
type: "CLOUD_ARMOR",
});
const policyRuleOne = new gcp.compute.SecurityPolicyRule("policy_rule_one", {
securityPolicy: _default.name,
description: "new rule one",
priority: 100,
match: {
versionedExpr: "SRC_IPS_V1",
config: {
srcIpRanges: ["10.10.0.0/16"],
},
},
action: "allow",
preview: true,
});
const policyRuleTwo = new gcp.compute.SecurityPolicyRule("policy_rule_two", {
securityPolicy: _default.name,
description: "new rule two",
priority: 101,
match: {
versionedExpr: "SRC_IPS_V1",
config: {
srcIpRanges: [
"192.168.0.0/16",
"10.0.0.0/8",
],
},
},
action: "allow",
preview: true,
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.SecurityPolicy("default",
name="policywithmultiplerules",
description="basic global security policy",
type="CLOUD_ARMOR")
policy_rule_one = gcp.compute.SecurityPolicyRule("policy_rule_one",
security_policy=default.name,
description="new rule one",
priority=100,
match={
"versioned_expr": "SRC_IPS_V1",
"config": {
"src_ip_ranges": ["10.10.0.0/16"],
},
},
action="allow",
preview=True)
policy_rule_two = gcp.compute.SecurityPolicyRule("policy_rule_two",
security_policy=default.name,
description="new rule two",
priority=101,
match={
"versioned_expr": "SRC_IPS_V1",
"config": {
"src_ip_ranges": [
"192.168.0.0/16",
"10.0.0.0/8",
],
},
},
action="allow",
preview=True)
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.SecurityPolicy("default", new()
{
Name = "policywithmultiplerules",
Description = "basic global security policy",
Type = "CLOUD_ARMOR",
});
var policyRuleOne = new Gcp.Compute.SecurityPolicyRule("policy_rule_one", new()
{
SecurityPolicy = @default.Name,
Description = "new rule one",
Priority = 100,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
VersionedExpr = "SRC_IPS_V1",
Config = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchConfigArgs
{
SrcIpRanges = new[]
{
"10.10.0.0/16",
},
},
},
Action = "allow",
Preview = true,
});
var policyRuleTwo = new Gcp.Compute.SecurityPolicyRule("policy_rule_two", new()
{
SecurityPolicy = @default.Name,
Description = "new rule two",
Priority = 101,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
VersionedExpr = "SRC_IPS_V1",
Config = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchConfigArgs
{
SrcIpRanges = new[]
{
"192.168.0.0/16",
"10.0.0.0/8",
},
},
},
Action = "allow",
Preview = true,
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewSecurityPolicy(ctx, "default", &compute.SecurityPolicyArgs{
Name: pulumi.String("policywithmultiplerules"),
Description: pulumi.String("basic global security policy"),
Type: pulumi.String("CLOUD_ARMOR"),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy_rule_one", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: _default.Name,
Description: pulumi.String("new rule one"),
Priority: pulumi.Int(100),
Match: &compute.SecurityPolicyRuleMatchArgs{
VersionedExpr: pulumi.String("SRC_IPS_V1"),
Config: &compute.SecurityPolicyRuleMatchConfigArgs{
SrcIpRanges: pulumi.StringArray{
pulumi.String("10.10.0.0/16"),
},
},
},
Action: pulumi.String("allow"),
Preview: pulumi.Bool(true),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy_rule_two", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: _default.Name,
Description: pulumi.String("new rule two"),
Priority: pulumi.Int(101),
Match: &compute.SecurityPolicyRuleMatchArgs{
VersionedExpr: pulumi.String("SRC_IPS_V1"),
Config: &compute.SecurityPolicyRuleMatchConfigArgs{
SrcIpRanges: pulumi.StringArray{
pulumi.String("192.168.0.0/16"),
pulumi.String("10.0.0.0/8"),
},
},
},
Action: pulumi.String("allow"),
Preview: pulumi.Bool(true),
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_compute_securitypolicy" "default" {
name = "policywithmultiplerules"
description = "basic global security policy"
type = "CLOUD_ARMOR"
}
resource "gcp_compute_securitypolicyrule" "policy_rule_one" {
security_policy = gcp_compute_securitypolicy.default.name
description = "new rule one"
priority = 100
match = {
versioned_expr = "SRC_IPS_V1"
config = {
src_ip_ranges = ["10.10.0.0/16"]
}
}
action = "allow"
preview = true
}
resource "gcp_compute_securitypolicyrule" "policy_rule_two" {
security_policy = gcp_compute_securitypolicy.default.name
description = "new rule two"
priority = 101
match = {
versioned_expr = "SRC_IPS_V1"
config = {
src_ip_ranges = ["192.168.0.0/16", "10.0.0.0/8"]
}
}
action = "allow"
preview = true
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.SecurityPolicy;
import com.pulumi.gcp.compute.SecurityPolicyArgs;
import com.pulumi.gcp.compute.SecurityPolicyRule;
import com.pulumi.gcp.compute.SecurityPolicyRuleArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchConfigArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new SecurityPolicy("default", SecurityPolicyArgs.builder()
.name("policywithmultiplerules")
.description("basic global security policy")
.type("CLOUD_ARMOR")
.build());
var policyRuleOne = new SecurityPolicyRule("policyRuleOne", SecurityPolicyRuleArgs.builder()
.securityPolicy(default_.name())
.description("new rule one")
.priority(100)
.match(SecurityPolicyRuleMatchArgs.builder()
.versionedExpr("SRC_IPS_V1")
.config(SecurityPolicyRuleMatchConfigArgs.builder()
.srcIpRanges("10.10.0.0/16")
.build())
.build())
.action("allow")
.preview(true)
.build());
var policyRuleTwo = new SecurityPolicyRule("policyRuleTwo", SecurityPolicyRuleArgs.builder()
.securityPolicy(default_.name())
.description("new rule two")
.priority(101)
.match(SecurityPolicyRuleMatchArgs.builder()
.versionedExpr("SRC_IPS_V1")
.config(SecurityPolicyRuleMatchConfigArgs.builder()
.srcIpRanges(
"192.168.0.0/16",
"10.0.0.0/8")
.build())
.build())
.action("allow")
.preview(true)
.build());
}
}
resources:
default:
type: gcp:compute:SecurityPolicy
properties:
name: policywithmultiplerules
description: basic global security policy
type: CLOUD_ARMOR
policyRuleOne:
type: gcp:compute:SecurityPolicyRule
name: policy_rule_one
properties:
securityPolicy: ${default.name}
description: new rule one
priority: 100
match:
versionedExpr: SRC_IPS_V1
config:
srcIpRanges:
- 10.10.0.0/16
action: allow
preview: true
policyRuleTwo:
type: gcp:compute:SecurityPolicyRule
name: policy_rule_two
properties:
securityPolicy: ${default.name}
description: new rule two
priority: 101
match:
versionedExpr: SRC_IPS_V1
config:
srcIpRanges:
- 192.168.0.0/16
- 10.0.0.0/8
action: allow
preview: true
Security Policy Rule Advanced Features
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const policy = new gcp.compute.SecurityPolicy("policy", {
name: "policyruletest",
description: "Security policy with WAF exclusions, Headers, and Redirect",
});
const policySecurityPolicyRule = new gcp.compute.SecurityPolicyRule("policy", {
securityPolicy: policy.name,
description: "Complex rule using advanced features: WAF config, header actions, and redirect options",
priority: 100,
action: "allow",
match: {
expr: {
expression: "request.path.matches('/api/v1/.*')",
},
},
preconfiguredWafConfig: {
exclusions: [{
targetRuleSet: "sqli-v33-stable",
targetRuleIds: ["owasp-crs-v030301-id942100-sqli"],
requestHeaders: [{
operator: "EQUALS",
value: "internal-scan",
}],
}],
},
headerAction: {
requestHeadersToAdds: [{
headerName: "X-Added-By-Armor",
headerValue: "Verified-Traffic",
}],
},
});
import pulumi
import pulumi_gcp as gcp
policy = gcp.compute.SecurityPolicy("policy",
name="policyruletest",
description="Security policy with WAF exclusions, Headers, and Redirect")
policy_security_policy_rule = gcp.compute.SecurityPolicyRule("policy",
security_policy=policy.name,
description="Complex rule using advanced features: WAF config, header actions, and redirect options",
priority=100,
action="allow",
match={
"expr": {
"expression": "request.path.matches('/api/v1/.*')",
},
},
preconfigured_waf_config={
"exclusions": [{
"target_rule_set": "sqli-v33-stable",
"target_rule_ids": ["owasp-crs-v030301-id942100-sqli"],
"request_headers": [{
"operator": "EQUALS",
"value": "internal-scan",
}],
}],
},
header_action={
"request_headers_to_adds": [{
"header_name": "X-Added-By-Armor",
"header_value": "Verified-Traffic",
}],
})
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var policy = new Gcp.Compute.SecurityPolicy("policy", new()
{
Name = "policyruletest",
Description = "Security policy with WAF exclusions, Headers, and Redirect",
});
var policySecurityPolicyRule = new Gcp.Compute.SecurityPolicyRule("policy", new()
{
SecurityPolicy = policy.Name,
Description = "Complex rule using advanced features: WAF config, header actions, and redirect options",
Priority = 100,
Action = "allow",
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
Expr = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchExprArgs
{
Expression = "request.path.matches('/api/v1/.*')",
},
},
PreconfiguredWafConfig = new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigArgs
{
Exclusions = new[]
{
new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs
{
TargetRuleSet = "sqli-v33-stable",
TargetRuleIds = new[]
{
"owasp-crs-v030301-id942100-sqli",
},
RequestHeaders = new[]
{
new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestHeaderArgs
{
Operator = "EQUALS",
Value = "internal-scan",
},
},
},
},
},
HeaderAction = new Gcp.Compute.Inputs.SecurityPolicyRuleHeaderActionArgs
{
RequestHeadersToAdds = new[]
{
new Gcp.Compute.Inputs.SecurityPolicyRuleHeaderActionRequestHeadersToAddArgs
{
HeaderName = "X-Added-By-Armor",
HeaderValue = "Verified-Traffic",
},
},
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
policy, err := compute.NewSecurityPolicy(ctx, "policy", &compute.SecurityPolicyArgs{
Name: pulumi.String("policyruletest"),
Description: pulumi.String("Security policy with WAF exclusions, Headers, and Redirect"),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: policy.Name,
Description: pulumi.String("Complex rule using advanced features: WAF config, header actions, and redirect options"),
Priority: pulumi.Int(100),
Action: pulumi.String("allow"),
Match: &compute.SecurityPolicyRuleMatchArgs{
Expr: &compute.SecurityPolicyRuleMatchExprArgs{
Expression: pulumi.String("request.path.matches('/api/v1/.*')"),
},
},
PreconfiguredWafConfig: &compute.SecurityPolicyRulePreconfiguredWafConfigArgs{
Exclusions: compute.SecurityPolicyRulePreconfiguredWafConfigExclusionArray{
&compute.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs{
TargetRuleSet: pulumi.String("sqli-v33-stable"),
TargetRuleIds: pulumi.StringArray{
pulumi.String("owasp-crs-v030301-id942100-sqli"),
},
RequestHeaders: compute.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestHeaderArray{
&compute.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestHeaderArgs{
Operator: pulumi.String("EQUALS"),
Value: pulumi.String("internal-scan"),
},
},
},
},
},
HeaderAction: &compute.SecurityPolicyRuleHeaderActionArgs{
RequestHeadersToAdds: compute.SecurityPolicyRuleHeaderActionRequestHeadersToAddArray{
&compute.SecurityPolicyRuleHeaderActionRequestHeadersToAddArgs{
HeaderName: pulumi.String("X-Added-By-Armor"),
HeaderValue: pulumi.String("Verified-Traffic"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_compute_securitypolicy" "policy" {
name = "policyruletest"
description = "Security policy with WAF exclusions, Headers, and Redirect"
}
resource "gcp_compute_securitypolicyrule" "policy" {
security_policy = gcp_compute_securitypolicy.policy.name
description = "Complex rule using advanced features: WAF config, header actions, and redirect options"
priority = 100
action = "allow"
match = {
expr = {
expression = "request.path.matches('/api/v1/.*')"
}
}
preconfigured_waf_config = {
exclusions = [{
"targetRuleSet" = "sqli-v33-stable"
"targetRuleIds" = ["owasp-crs-v030301-id942100-sqli"]
"requestHeaders" = [{
"operator" = "EQUALS"
"value" = "internal-scan"
}]
}]
}
header_action = {
request_headers_to_adds = [{
"headerName" = "X-Added-By-Armor"
"headerValue" = "Verified-Traffic"
}]
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.SecurityPolicy;
import com.pulumi.gcp.compute.SecurityPolicyArgs;
import com.pulumi.gcp.compute.SecurityPolicyRule;
import com.pulumi.gcp.compute.SecurityPolicyRuleArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchExprArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestHeaderArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleHeaderActionArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleHeaderActionRequestHeadersToAddArgs;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var policy = new SecurityPolicy("policy", SecurityPolicyArgs.builder()
.name("policyruletest")
.description("Security policy with WAF exclusions, Headers, and Redirect")
.build());
var policySecurityPolicyRule = new SecurityPolicyRule("policySecurityPolicyRule", SecurityPolicyRuleArgs.builder()
.securityPolicy(policy.name())
.description("Complex rule using advanced features: WAF config, header actions, and redirect options")
.priority(100)
.action("allow")
.match(SecurityPolicyRuleMatchArgs.builder()
.expr(SecurityPolicyRuleMatchExprArgs.builder()
.expression("request.path.matches('/api/v1/.*')")
.build())
.build())
.preconfiguredWafConfig(SecurityPolicyRulePreconfiguredWafConfigArgs.builder()
.exclusions(SecurityPolicyRulePreconfiguredWafConfigExclusionArgs.builder()
.targetRuleSet("sqli-v33-stable")
.targetRuleIds("owasp-crs-v030301-id942100-sqli")
.requestHeaders(SecurityPolicyRulePreconfiguredWafConfigExclusionRequestHeaderArgs.builder()
.operator("EQUALS")
.value("internal-scan")
.build())
.build())
.build())
.headerAction(SecurityPolicyRuleHeaderActionArgs.builder()
.requestHeadersToAdds(SecurityPolicyRuleHeaderActionRequestHeadersToAddArgs.builder()
.headerName("X-Added-By-Armor")
.headerValue("Verified-Traffic")
.build())
.build())
.build());
}
}
resources:
policy:
type: gcp:compute:SecurityPolicy
properties:
name: policyruletest
description: Security policy with WAF exclusions, Headers, and Redirect
policySecurityPolicyRule:
type: gcp:compute:SecurityPolicyRule
name: policy
properties:
securityPolicy: ${policy.name}
description: 'Complex rule using advanced features: WAF config, header actions, and redirect options'
priority: 100
action: allow
match:
expr:
expression: request.path.matches('/api/v1/.*')
preconfiguredWafConfig:
exclusions:
- targetRuleSet: sqli-v33-stable
targetRuleIds:
- owasp-crs-v030301-id942100-sqli
requestHeaders:
- operator: EQUALS
value: internal-scan
headerAction:
requestHeadersToAdds:
- headerName: X-Added-By-Armor
headerValue: Verified-Traffic
Security Policy Rule With Body Exclude
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const _default = new gcp.compute.Network("default", {
name: "test-network",
autoCreateSubnetworks: false,
});
const defaultSubnetwork = new gcp.compute.Subnetwork("default", {
name: "test-subnet",
region: "us-west2",
network: _default.id,
ipCidrRange: "10.10.0.0/24",
});
const defaultHealthCheck = new gcp.compute.HealthCheck("default", {
name: "test-health-check",
httpHealthCheck: {
port: 80,
},
});
const defaultSecurityPolicy = new gcp.compute.SecurityPolicy("default", {
name: "policyruletest",
description: "global security policy with body inspection",
type: "CLOUD_ARMOR",
advancedOptionsConfig: {
jsonParsing: "STANDARD",
logLevel: "VERBOSE",
},
});
const defaultInstanceTemplate = new gcp.compute.InstanceTemplate("default", {
networkInterfaces: [{
accessConfigs: [{}],
subnetwork: defaultSubnetwork.id,
}],
name: "backendpolicy",
machineType: "e2-micro",
disks: [{
sourceImage: "projects/debian-cloud/global/images/family/debian-11",
autoDelete: true,
boot: true,
}],
});
const defaultInstanceGroupManager = new gcp.compute.InstanceGroupManager("default", {
name: "backendpolicy",
baseInstanceName: "backend",
zone: "us-west2-a",
versions: [{
instanceTemplate: defaultInstanceTemplate.id,
}],
targetSize: 1,
});
const defaultBackendService = new gcp.compute.BackendService("default", {
name: "backendpolicy",
protocol: "HTTP",
loadBalancingScheme: "EXTERNAL_MANAGED",
timeoutSec: 30,
healthChecks: defaultHealthCheck.id,
backends: [{
group: defaultInstanceGroupManager.instanceGroup,
}],
securityPolicy: defaultSecurityPolicy.id,
});
const policyRuleOne = new gcp.compute.SecurityPolicyRule("policy_rule_one", {
securityPolicy: defaultSecurityPolicy.name,
description: "waf body rule",
action: "deny(403)",
priority: 100,
preview: true,
match: {
expr: {
expression: "evaluatePreconfiguredWaf('sqli-v33-stable')",
},
},
preconfiguredWafConfig: {
exclusions: [{
targetRuleSet: "sqli-v33-stable",
requestBodies: [{
operator: "EQUALS",
value: "safe-field",
}],
}],
},
}, {
dependsOn: [defaultBackendService],
});
import pulumi
import pulumi_gcp as gcp
default = gcp.compute.Network("default",
name="test-network",
auto_create_subnetworks=False)
default_subnetwork = gcp.compute.Subnetwork("default",
name="test-subnet",
region="us-west2",
network=default.id,
ip_cidr_range="10.10.0.0/24")
default_health_check = gcp.compute.HealthCheck("default",
name="test-health-check",
http_health_check={
"port": 80,
})
default_security_policy = gcp.compute.SecurityPolicy("default",
name="policyruletest",
description="global security policy with body inspection",
type="CLOUD_ARMOR",
advanced_options_config={
"json_parsing": "STANDARD",
"log_level": "VERBOSE",
})
default_instance_template = gcp.compute.InstanceTemplate("default",
network_interfaces=[{
"access_configs": [{}],
"subnetwork": default_subnetwork.id,
}],
name="backendpolicy",
machine_type="e2-micro",
disks=[{
"source_image": "projects/debian-cloud/global/images/family/debian-11",
"auto_delete": True,
"boot": True,
}])
default_instance_group_manager = gcp.compute.InstanceGroupManager("default",
name="backendpolicy",
base_instance_name="backend",
zone="us-west2-a",
versions=[{
"instance_template": default_instance_template.id,
}],
target_size=1)
default_backend_service = gcp.compute.BackendService("default",
name="backendpolicy",
protocol="HTTP",
load_balancing_scheme="EXTERNAL_MANAGED",
timeout_sec=30,
health_checks=default_health_check.id,
backends=[{
"group": default_instance_group_manager.instance_group,
}],
security_policy=default_security_policy.id)
policy_rule_one = gcp.compute.SecurityPolicyRule("policy_rule_one",
security_policy=default_security_policy.name,
description="waf body rule",
action="deny(403)",
priority=100,
preview=True,
match={
"expr": {
"expression": "evaluatePreconfiguredWaf('sqli-v33-stable')",
},
},
preconfigured_waf_config={
"exclusions": [{
"target_rule_set": "sqli-v33-stable",
"request_bodies": [{
"operator": "EQUALS",
"value": "safe-field",
}],
}],
},
opts = pulumi.ResourceOptions(depends_on=[default_backend_service]))
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var @default = new Gcp.Compute.Network("default", new()
{
Name = "test-network",
AutoCreateSubnetworks = false,
});
var defaultSubnetwork = new Gcp.Compute.Subnetwork("default", new()
{
Name = "test-subnet",
Region = "us-west2",
Network = @default.Id,
IpCidrRange = "10.10.0.0/24",
});
var defaultHealthCheck = new Gcp.Compute.HealthCheck("default", new()
{
Name = "test-health-check",
HttpHealthCheck = new Gcp.Compute.Inputs.HealthCheckHttpHealthCheckArgs
{
Port = 80,
},
});
var defaultSecurityPolicy = new Gcp.Compute.SecurityPolicy("default", new()
{
Name = "policyruletest",
Description = "global security policy with body inspection",
Type = "CLOUD_ARMOR",
AdvancedOptionsConfig = new Gcp.Compute.Inputs.SecurityPolicyAdvancedOptionsConfigArgs
{
JsonParsing = "STANDARD",
LogLevel = "VERBOSE",
},
});
var defaultInstanceTemplate = new Gcp.Compute.InstanceTemplate("default", new()
{
NetworkInterfaces = new[]
{
new Gcp.Compute.Inputs.InstanceTemplateNetworkInterfaceArgs
{
AccessConfigs = new[]
{
null,
},
Subnetwork = defaultSubnetwork.Id,
},
},
Name = "backendpolicy",
MachineType = "e2-micro",
Disks = new[]
{
new Gcp.Compute.Inputs.InstanceTemplateDiskArgs
{
SourceImage = "projects/debian-cloud/global/images/family/debian-11",
AutoDelete = true,
Boot = true,
},
},
});
var defaultInstanceGroupManager = new Gcp.Compute.InstanceGroupManager("default", new()
{
Name = "backendpolicy",
BaseInstanceName = "backend",
Zone = "us-west2-a",
Versions = new[]
{
new Gcp.Compute.Inputs.InstanceGroupManagerVersionArgs
{
InstanceTemplate = defaultInstanceTemplate.Id,
},
},
TargetSize = 1,
});
var defaultBackendService = new Gcp.Compute.BackendService("default", new()
{
Name = "backendpolicy",
Protocol = "HTTP",
LoadBalancingScheme = "EXTERNAL_MANAGED",
TimeoutSec = 30,
HealthChecks = defaultHealthCheck.Id,
Backends = new[]
{
new Gcp.Compute.Inputs.BackendServiceBackendArgs
{
Group = defaultInstanceGroupManager.InstanceGroup,
},
},
SecurityPolicy = defaultSecurityPolicy.Id,
});
var policyRuleOne = new Gcp.Compute.SecurityPolicyRule("policy_rule_one", new()
{
SecurityPolicy = defaultSecurityPolicy.Name,
Description = "waf body rule",
Action = "deny(403)",
Priority = 100,
Preview = true,
Match = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchArgs
{
Expr = new Gcp.Compute.Inputs.SecurityPolicyRuleMatchExprArgs
{
Expression = "evaluatePreconfiguredWaf('sqli-v33-stable')",
},
},
PreconfiguredWafConfig = new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigArgs
{
Exclusions = new[]
{
new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs
{
TargetRuleSet = "sqli-v33-stable",
RequestBodies = new[]
{
new Gcp.Compute.Inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestBodyArgs
{
Operator = "EQUALS",
Value = "safe-field",
},
},
},
},
},
}, new CustomResourceOptions
{
DependsOn =
{
defaultBackendService,
},
});
});
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/compute"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_default, err := compute.NewNetwork(ctx, "default", &compute.NetworkArgs{
Name: pulumi.String("test-network"),
AutoCreateSubnetworks: pulumi.Bool(false),
})
if err != nil {
return err
}
defaultSubnetwork, err := compute.NewSubnetwork(ctx, "default", &compute.SubnetworkArgs{
Name: pulumi.String("test-subnet"),
Region: pulumi.String("us-west2"),
Network: _default.ID().ToIDOutput().ToStringOutput(),
IpCidrRange: pulumi.String("10.10.0.0/24"),
})
if err != nil {
return err
}
defaultHealthCheck, err := compute.NewHealthCheck(ctx, "default", &compute.HealthCheckArgs{
Name: pulumi.String("test-health-check"),
HttpHealthCheck: &compute.HealthCheckHttpHealthCheckArgs{
Port: pulumi.Int(80),
},
})
if err != nil {
return err
}
defaultSecurityPolicy, err := compute.NewSecurityPolicy(ctx, "default", &compute.SecurityPolicyArgs{
Name: pulumi.String("policyruletest"),
Description: pulumi.String("global security policy with body inspection"),
Type: pulumi.String("CLOUD_ARMOR"),
AdvancedOptionsConfig: &compute.SecurityPolicyAdvancedOptionsConfigArgs{
JsonParsing: pulumi.String("STANDARD"),
LogLevel: pulumi.String("VERBOSE"),
},
})
if err != nil {
return err
}
defaultInstanceTemplate, err := compute.NewInstanceTemplate(ctx, "default", &compute.InstanceTemplateArgs{
NetworkInterfaces: compute.InstanceTemplateNetworkInterfaceArray{
&compute.InstanceTemplateNetworkInterfaceArgs{
AccessConfigs: compute.InstanceTemplateNetworkInterfaceAccessConfigArray{
&compute.InstanceTemplateNetworkInterfaceAccessConfigArgs{},
},
Subnetwork: defaultSubnetwork.ID().ToIDOutput().ToStringOutput(),
},
},
Name: pulumi.String("backendpolicy"),
MachineType: pulumi.String("e2-micro"),
Disks: compute.InstanceTemplateDiskArray{
&compute.InstanceTemplateDiskArgs{
SourceImage: pulumi.String("projects/debian-cloud/global/images/family/debian-11"),
AutoDelete: pulumi.Bool(true),
Boot: pulumi.Bool(true),
},
},
})
if err != nil {
return err
}
defaultInstanceGroupManager, err := compute.NewInstanceGroupManager(ctx, "default", &compute.InstanceGroupManagerArgs{
Name: pulumi.String("backendpolicy"),
BaseInstanceName: pulumi.String("backend"),
Zone: pulumi.String("us-west2-a"),
Versions: compute.InstanceGroupManagerVersionArray{
&compute.InstanceGroupManagerVersionArgs{
InstanceTemplate: defaultInstanceTemplate.ID().ToIDOutput().ToStringOutput(),
},
},
TargetSize: pulumi.Int(1),
})
if err != nil {
return err
}
defaultBackendService, err := compute.NewBackendService(ctx, "default", &compute.BackendServiceArgs{
Name: pulumi.String("backendpolicy"),
Protocol: pulumi.String("HTTP"),
LoadBalancingScheme: pulumi.String("EXTERNAL_MANAGED"),
TimeoutSec: pulumi.Int(30),
HealthChecks: defaultHealthCheck.ID().ToIDOutput().ToStringOutput(),
Backends: compute.BackendServiceBackendArray{
&compute.BackendServiceBackendArgs{
Group: defaultInstanceGroupManager.InstanceGroup,
},
},
SecurityPolicy: defaultSecurityPolicy.ID().ToIDOutput().ToStringOutput(),
})
if err != nil {
return err
}
_, err = compute.NewSecurityPolicyRule(ctx, "policy_rule_one", &compute.SecurityPolicyRuleArgs{
SecurityPolicy: defaultSecurityPolicy.Name,
Description: pulumi.String("waf body rule"),
Action: pulumi.String("deny(403)"),
Priority: pulumi.Int(100),
Preview: pulumi.Bool(true),
Match: &compute.SecurityPolicyRuleMatchArgs{
Expr: &compute.SecurityPolicyRuleMatchExprArgs{
Expression: pulumi.String("evaluatePreconfiguredWaf('sqli-v33-stable')"),
},
},
PreconfiguredWafConfig: &compute.SecurityPolicyRulePreconfiguredWafConfigArgs{
Exclusions: compute.SecurityPolicyRulePreconfiguredWafConfigExclusionArray{
&compute.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs{
TargetRuleSet: pulumi.String("sqli-v33-stable"),
RequestBodies: compute.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestBodyArray{
&compute.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestBodyArgs{
Operator: pulumi.String("EQUALS"),
Value: pulumi.String("safe-field"),
},
},
},
},
},
}, pulumi.DependsOn([]pulumi.Resource{
defaultBackendService,
}))
if err != nil {
return err
}
return nil
})
}
pulumi {
required_providers {
gcp = {
source = "pulumi/gcp"
}
}
}
resource "gcp_compute_network" "default" {
name = "test-network"
auto_create_subnetworks = false
}
resource "gcp_compute_subnetwork" "default" {
name = "test-subnet"
region = "us-west2"
network = gcp_compute_network.default.id
ip_cidr_range = "10.10.0.0/24"
}
resource "gcp_compute_healthcheck" "default" {
name = "test-health-check"
http_health_check = {
port = 80
}
}
resource "gcp_compute_securitypolicy" "default" {
name = "policyruletest"
description = "global security policy with body inspection"
type = "CLOUD_ARMOR"
advanced_options_config = {
json_parsing = "STANDARD"
log_level = "VERBOSE"
}
}
resource "gcp_compute_instancetemplate" "default" {
network_interfaces {
access_configs {
}
subnetwork = gcp_compute_subnetwork.default.id
}
name = "backendpolicy"
machine_type = "e2-micro"
disks {
source_image = "projects/debian-cloud/global/images/family/debian-11"
auto_delete = true
boot = true
}
}
resource "gcp_compute_instancegroupmanager" "default" {
name = "backendpolicy"
base_instance_name = "backend"
zone = "us-west2-a"
versions {
instance_template = gcp_compute_instancetemplate.default.id
}
target_size = 1
}
resource "gcp_compute_backendservice" "default" {
name = "backendpolicy"
protocol = "HTTP"
load_balancing_scheme = "EXTERNAL_MANAGED"
timeout_sec = 30
health_checks = gcp_compute_healthcheck.default.id
backends {
group = gcp_compute_instancegroupmanager.default.instance_group
}
security_policy = gcp_compute_securitypolicy.default.id
}
resource "gcp_compute_securitypolicyrule" "policy_rule_one" {
depends_on = [gcp_compute_backendservice.default]
security_policy = gcp_compute_securitypolicy.default.name
description = "waf body rule"
action = "deny(403)"
priority = 100
preview = true
match = {
expr = {
expression = "evaluatePreconfiguredWaf('sqli-v33-stable')"
}
}
preconfigured_waf_config = {
exclusions = [{
"targetRuleSet" = "sqli-v33-stable"
"requestBodies" = [{
"operator" = "EQUALS"
"value" = "safe-field"
}]
}]
}
}
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.compute.Network;
import com.pulumi.gcp.compute.NetworkArgs;
import com.pulumi.gcp.compute.Subnetwork;
import com.pulumi.gcp.compute.SubnetworkArgs;
import com.pulumi.gcp.compute.HealthCheck;
import com.pulumi.gcp.compute.HealthCheckArgs;
import com.pulumi.gcp.compute.inputs.HealthCheckHttpHealthCheckArgs;
import com.pulumi.gcp.compute.SecurityPolicy;
import com.pulumi.gcp.compute.SecurityPolicyArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyAdvancedOptionsConfigArgs;
import com.pulumi.gcp.compute.InstanceTemplate;
import com.pulumi.gcp.compute.InstanceTemplateArgs;
import com.pulumi.gcp.compute.inputs.InstanceTemplateNetworkInterfaceArgs;
import com.pulumi.gcp.compute.inputs.InstanceTemplateNetworkInterfaceAccessConfigArgs;
import com.pulumi.gcp.compute.inputs.InstanceTemplateDiskArgs;
import com.pulumi.gcp.compute.InstanceGroupManager;
import com.pulumi.gcp.compute.InstanceGroupManagerArgs;
import com.pulumi.gcp.compute.inputs.InstanceGroupManagerVersionArgs;
import com.pulumi.gcp.compute.BackendService;
import com.pulumi.gcp.compute.BackendServiceArgs;
import com.pulumi.gcp.compute.inputs.BackendServiceBackendArgs;
import com.pulumi.gcp.compute.SecurityPolicyRule;
import com.pulumi.gcp.compute.SecurityPolicyRuleArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRuleMatchExprArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionArgs;
import com.pulumi.gcp.compute.inputs.SecurityPolicyRulePreconfiguredWafConfigExclusionRequestBodyArgs;
import com.pulumi.resources.CustomResourceOptions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var default_ = new Network("default", NetworkArgs.builder()
.name("test-network")
.autoCreateSubnetworks(false)
.build());
var defaultSubnetwork = new Subnetwork("defaultSubnetwork", SubnetworkArgs.builder()
.name("test-subnet")
.region("us-west2")
.network(default_.id())
.ipCidrRange("10.10.0.0/24")
.build());
var defaultHealthCheck = new HealthCheck("defaultHealthCheck", HealthCheckArgs.builder()
.name("test-health-check")
.httpHealthCheck(HealthCheckHttpHealthCheckArgs.builder()
.port(80)
.build())
.build());
var defaultSecurityPolicy = new SecurityPolicy("defaultSecurityPolicy", SecurityPolicyArgs.builder()
.name("policyruletest")
.description("global security policy with body inspection")
.type("CLOUD_ARMOR")
.advancedOptionsConfig(SecurityPolicyAdvancedOptionsConfigArgs.builder()
.jsonParsing("STANDARD")
.logLevel("VERBOSE")
.build())
.build());
var defaultInstanceTemplate = new InstanceTemplate("defaultInstanceTemplate", InstanceTemplateArgs.builder()
.networkInterfaces(InstanceTemplateNetworkInterfaceArgs.builder()
.accessConfigs(InstanceTemplateNetworkInterfaceAccessConfigArgs.builder()
.build())
.subnetwork(defaultSubnetwork.id())
.build())
.name("backendpolicy")
.machineType("e2-micro")
.disks(InstanceTemplateDiskArgs.builder()
.sourceImage("projects/debian-cloud/global/images/family/debian-11")
.autoDelete(true)
.boot(true)
.build())
.build());
var defaultInstanceGroupManager = new InstanceGroupManager("defaultInstanceGroupManager", InstanceGroupManagerArgs.builder()
.name("backendpolicy")
.baseInstanceName("backend")
.zone("us-west2-a")
.versions(InstanceGroupManagerVersionArgs.builder()
.instanceTemplate(defaultInstanceTemplate.id())
.build())
.targetSize(1)
.build());
var defaultBackendService = new BackendService("defaultBackendService", BackendServiceArgs.builder()
.name("backendpolicy")
.protocol("HTTP")
.loadBalancingScheme("EXTERNAL_MANAGED")
.timeoutSec(30)
.healthChecks(defaultHealthCheck.id())
.backends(BackendServiceBackendArgs.builder()
.group(defaultInstanceGroupManager.instanceGroup())
.build())
.securityPolicy(defaultSecurityPolicy.id())
.build());
var policyRuleOne = new SecurityPolicyRule("policyRuleOne", SecurityPolicyRuleArgs.builder()
.securityPolicy(defaultSecurityPolicy.name())
.description("waf body rule")
.action("deny(403)")
.priority(100)
.preview(true)
.match(SecurityPolicyRuleMatchArgs.builder()
.expr(SecurityPolicyRuleMatchExprArgs.builder()
.expression("evaluatePreconfiguredWaf('sqli-v33-stable')")
.build())
.build())
.preconfiguredWafConfig(SecurityPolicyRulePreconfiguredWafConfigArgs.builder()
.exclusions(SecurityPolicyRulePreconfiguredWafConfigExclusionArgs.builder()
.targetRuleSet("sqli-v33-stable")
.requestBodies(SecurityPolicyRulePreconfiguredWafConfigExclusionRequestBodyArgs.builder()
.operator("EQUALS")
.value("safe-field")
.build())
.build())
.build())
.build(), CustomResourceOptions.builder()
.dependsOn(defaultBackendService)
.build());
}
}
resources:
default:
type: gcp:compute:Network
properties:
name: test-network
autoCreateSubnetworks: false
defaultSubnetwork:
type: gcp:compute:Subnetwork
name: default
properties:
name: test-subnet
region: us-west2
network: ${default.id}
ipCidrRange: 10.10.0.0/24
defaultHealthCheck:
type: gcp:compute:HealthCheck
name: default
properties:
name: test-health-check
httpHealthCheck:
port: 80
defaultSecurityPolicy:
type: gcp:compute:SecurityPolicy
name: default
properties:
name: policyruletest
description: global security policy with body inspection
type: CLOUD_ARMOR
advancedOptionsConfig:
jsonParsing: STANDARD
logLevel: VERBOSE
defaultInstanceTemplate:
type: gcp:compute:InstanceTemplate
name: default
properties:
networkInterfaces:
- accessConfigs:
- {}
subnetwork: ${defaultSubnetwork.id}
name: backendpolicy
machineType: e2-micro
disks:
- sourceImage: projects/debian-cloud/global/images/family/debian-11
autoDelete: true
boot: true
defaultInstanceGroupManager:
type: gcp:compute:InstanceGroupManager
name: default
properties:
name: backendpolicy
baseInstanceName: backend
zone: us-west2-a
versions:
- instanceTemplate: ${defaultInstanceTemplate.id}
targetSize: 1
defaultBackendService:
type: gcp:compute:BackendService
name: default
properties:
name: backendpolicy
protocol: HTTP
loadBalancingScheme: EXTERNAL_MANAGED
timeoutSec: 30
healthChecks: ${defaultHealthCheck.id}
backends:
- group: ${defaultInstanceGroupManager.instanceGroup}
securityPolicy: ${defaultSecurityPolicy.id}
policyRuleOne:
type: gcp:compute:SecurityPolicyRule
name: policy_rule_one
properties:
securityPolicy: ${defaultSecurityPolicy.name}
description: waf body rule
action: deny(403)
priority: 100
preview: true
match:
expr:
expression: evaluatePreconfiguredWaf('sqli-v33-stable')
preconfiguredWafConfig:
exclusions:
- targetRuleSet: sqli-v33-stable
requestBodies:
- operator: EQUALS
value: safe-field
options:
dependsOn:
- ${defaultBackendService}
Import
SecurityPolicyRule can be imported using any of these accepted formats:
projects/{{project}}/global/securityPolicies/{{security_policy}}/priority/{{priority}}{{project}}/{{security_policy}}/{{priority}}{{security_policy}}/{{priority}}
When using the pulumi import command, SecurityPolicyRule can be imported using one of the formats above. For example:
$ pulumi import gcp:compute/securityPolicyRule:SecurityPolicyRule default projects/{{project}}/global/securityPolicies/{{security_policy}}/priority/{{priority}}
$ pulumi import gcp:compute/securityPolicyRule:SecurityPolicyRule default {{project}}/{{security_policy}}/{{priority}}
$ pulumi import gcp:compute/securityPolicyRule:SecurityPolicyRule default {{security_policy}}/{{priority}}
Constructors
- SecurityPolicyRuleCompute(String name, {SecurityPolicyRuleArgs? args, CustomResourceOptions? options})
-
Creates a new SecurityPolicyRuleCompute.
nameThe Pulumi resource name.argsArguments used to configure this SecurityPolicyRuleCompute. The set of arguments for SecurityPolicyRule.optionsResource options controlling this resource's behavior. - SecurityPolicyRuleCompute.reference(String urn)
- Creates a typed reference to an existing SecurityPolicyRuleCompute resource.
Properties
-
action
↔ Output<
String> -
The Action to perform when the rule is matched. The following are the valid actions:
latefinal
-
childResources
→ Set<
Resource> -
finalinherited
-
completionSources
↔ Map<
String, IOutputCompletionSource> -
latefinalinherited
-
deletionPolicy
↔ Output<
String> -
Whether Terraform will be prevented from destroying the resource. Defaults to DELETE.
When a 'terraform destroy' or 'pulumi up' would delete the resource,
the command will fail if this field is set to "PREVENT" in Terraform state.
When set to "ABANDON", the command will remove the resource from Terraform
management without updating or deleting the resource in the API.
When set to "DELETE", deleting the resource is allowed.
latefinal
-
description
↔ Output<
String?> -
An optional description of this resource. Provide this property when you create the resource.
latefinal
- hashCode → int
-
The hash code for this object.
no setterinherited
-
headerAction
↔ Output<
SecurityPolicyRuleHeaderAction?> -
Optional, additional actions that are performed on headers. This field is only supported in Global Security Policies of type CLOUD_ARMOR.
Structure is documented below.
latefinal
-
id
↔ Output<
String> -
getter/setter pairinherited
- isCustom → bool
-
Returns whether this resource is provider-managed.
no setterinherited
- isProtected → bool
-
Returns whether this resource is protected from deletion.
no setterinherited
- isRemote → bool
-
Whether this resource is registered as remote.
no setterinherited
- isResourceReference → bool
-
Whether this instance represents a resource value returned over RPC.
finalinherited
-
match
↔ Output<
SecurityPolicyRuleMatch?> -
A match condition that incoming traffic is evaluated against.
If it evaluates to true, the corresponding 'action' is enforced.
Structure is documented below.
latefinal
-
preconfiguredWafConfig
↔ Output<
SecurityPolicyRulePreconfiguredWafConfig?> -
Preconfigured WAF configuration to be applied for the rule.
If the rule does not evaluate preconfigured WAF rules, i.e., if evaluatePreconfiguredWaf() is not used, this field will have no effect.
Structure is documented below.
latefinal
-
preview
↔ Output<
bool?> -
If set to true, the specified action is not enforced.
latefinal
-
priority
↔ Output<
int> -
An integer indicating the priority of a rule in the list.
The priority must be a positive value between 0 and 2147483647.
Rules are evaluated from highest to lowest priority where 0 is the highest priority and 2147483647 is the lowest priority.
latefinal
-
project
↔ Output<
String> -
The ID of the project in which the resource belongs.
If it is not provided, the provider project is used.
latefinal
-
rateLimitOptions
↔ Output<
SecurityPolicyRuleRateLimitOptions?> -
Must be specified if the action is "rateBasedBan" or "throttle". Cannot be specified for any other actions.
Structure is documented below.
latefinal
-
redirectOptions
↔ Output<
SecurityPolicyRuleRedirectOptions?> -
Parameters defining the redirect action. Cannot be specified for any other actions. This field is only supported in Global Security Policies of type CLOUD_ARMOR.
Structure is documented below.
latefinal
-
resourceTransforms
→ List<
ResourceTransform> -
Inherited/explicit async transforms.
no setterinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
-
securityPolicy
↔ Output<
String> -
The name of the security policy this rule belongs to.
latefinal
-
transformations
→ List<
ResourceTransformation> -
Inherited/explicit legacy transformations.
no setterinherited
-
urn
↔ Output<
String> -
latefinalinherited
Methods
-
failId(
Object error) → void -
Completes this resource ID with an error when registration fails.
inherited
-
failOutputs(
Object error) → void -
Completes all output properties with
error.inherited -
failUrn(
Object error) → void -
Completes this resource URN with an error when registration fails.
inherited
-
getProvider(
String moduleMember) → ProviderResource? -
Returns provider for
moduleMember's package, if configured.inherited -
getResourceName(
) → String -
Returns this resource's logical name.
inherited
-
getResourceType(
) → String -
Returns this resource's Pulumi type token.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
registerOutput<
T> (String propertyName, {Object? decoder(Object?)?, bool isSecret = false}) → Output< T> -
Registers a dynamic output property for this resource.
inherited
-
resolveId(
String? value, {required bool isKnown}) → void -
Resolves the provider-assigned ID for this resource.
inherited
-
resolveOutputs(
Struct outputs) → void -
Resolves all output properties from a monitor response payload.
inherited
-
resolveUrn(
String value) → void -
Resolves this resource's URN once assigned by the engine.
inherited
-
serializeProperties(
Map< String, dynamic> properties) → Future<Struct> -
Serializes resource properties for RPC transmission.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Static Methods
-
get(
String name, Input< String> id, {SecurityPolicyRuleState? state, CustomResourceOptions? options}) → SecurityPolicyRuleCompute -
Gets an existing SecurityPolicyRuleCompute resource's state with the given
nameandid.