Skip to main content

Firewall Rule Service Template

A Backstage Software Template for managing firewall rules using Crossplane.

Overview

This template creates the necessary Crossplane resources to manage firewall rules in your infrastructure. It includes:

  • XRD (Composite Resource Definition): Defines the FirewallRule API
  • Composition: Implements the firewall rule management logic
  • Example Claim: Shows how to create a firewall rule

Features

  • 🔒 Security Management: Define network access control rules
  • 🌐 Protocol Support: TCP, UDP, ICMP, or all protocols
  • Action Control: Accept, drop, or reject traffic
  • 📊 CIDR Support: Full IPv4 CIDR notation support

Prerequisites

Crossplane Installation

Ensure Crossplane is installed in your cluster:

kubectl create namespace crossplane-system
helm repo add crossplane-stable https://charts.crossplane.io/stable
helm install crossplane --namespace crossplane-system crossplane-stable/crossplane

Required Functions

Install the necessary Crossplane composition functions:

kubectl apply -f - <<EOF
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-go-templating
spec:
package: xpkg.upbound.io/crossplane-contrib/function-go-templating:v0.10.0
---
apiVersion: pkg.crossplane.io/v1beta1
kind: Function
metadata:
name: function-auto-ready
spec:
package: xpkg.upbound.io/crossplane-contrib/function-auto-ready:v0.2.1
EOF

Usage

Through Backstage

  1. Navigate to the Software Catalog
  2. Click "Create Component"
  3. Select "Firewall Rule"
  4. Fill in the required parameters:
    • Rule Name: Unique identifier for this firewall rule
    • Namespace: Kubernetes namespace (default: default)
    • Source IP/CIDR: Source address or network
    • Destination IP/CIDR: Destination address or network
    • Protocol: ALL, TCP, UDP, or ICMP
    • Action: ACCEPT, DROP, or REJECT
    • Owner: Team or user who owns this resource

Manual Deployment

  1. Apply the XRD:
kubectl apply -f content/definition.yaml
  1. Apply the Composition:
kubectl apply -f content/composition.yaml
  1. Create a claim:
kubectl apply -f content/example.yaml

Parameters

ParameterDescriptionTypeDefaultRequired
nameRule namestring-Yes
namespaceKubernetes namespacestringdefaultNo
sourceSource IP/CIDRstring-Yes
destinationDestination IP/CIDRstring-Yes
protocolNetwork protocolstringALLNo
actionRule actionstringACCEPTNo
ownerResource ownerstringgroup:platformNo

Rule Examples

Allow All Traffic

spec:
source: 0.0.0.0/0
destination: 0.0.0.0/0
protocol: ALL
action: ACCEPT

Block Specific Network

spec:
source: 192.168.1.0/24
destination: 10.0.0.0/8
protocol: ALL
action: DROP

Allow HTTPS Traffic

spec:
source: 0.0.0.0/0
destination: 10.0.0.100
protocol: TCP
action: ACCEPT
# Note: Port specification would be added in production

Allow Ping (ICMP)

spec:
source: 10.0.0.0/24
destination: 10.0.1.0/24
protocol: ICMP
action: ACCEPT

Actions Explained

ACCEPT

Allows the traffic to pass through. This is the default action for permissive rules.

DROP

Silently discards the packet without sending any response to the source. Used for stealth blocking.

REJECT

Blocks the traffic and sends an ICMP response to the source indicating the traffic was rejected.

Architecture

The template creates a composite resource that:

  1. ConfigMap: Stores firewall rule configuration
  2. Provider Integration: Would connect to actual firewall/security group providers
  3. Rule Application: Applies rules to network infrastructure

Production Considerations

For production use, you'll need to:

  1. Install a Cloud Provider: Such as provider-aws, provider-azure, or provider-gcp
  2. Configure Provider Credentials: Set up authentication for your cloud provider
  3. Update Composition: Replace the mock implementation with actual security group resources

Example with AWS Security Groups:

- step: create-security-group-rule
functionRef:
name: function-go-templating
input:
apiVersion: gotemplating.fn.crossplane.io/v1beta1
kind: GoTemplate
source: Inline
inline:
template: |
apiVersion: ec2.aws.upbound.io/v1beta1
kind: SecurityGroupRule
spec:
forProvider:
region: us-east-1
type: ingress
fromPort: 443
toPort: 443
protocol: tcp
cidrBlocks:
- {{ .observed.composite.resource.spec.source }}
securityGroupIdRef:
name: my-security-group

Example with Azure Network Security Groups:

- step: create-nsg-rule
functionRef:
name: function-go-templating
input:
apiVersion: gotemplating.fn.crossplane.io/v1beta1
kind: GoTemplate
source: Inline
inline:
template: |
apiVersion: network.azure.upbound.io/v1beta1
kind: SecurityRule
spec:
forProvider:
access: {{ .observed.composite.resource.spec.action }}
direction: Inbound
priority: 100
protocol: {{ .observed.composite.resource.spec.protocol }}
sourceAddressPrefix: {{ .observed.composite.resource.spec.source }}
destinationAddressPrefix: {{ .observed.composite.resource.spec.destination }}

CIDR Notation

The template supports standard CIDR notation:

  • Individual IP: 192.168.1.1
  • Subnet: 192.168.1.0/24 (256 addresses)
  • Large Network: 10.0.0.0/8 (16,777,216 addresses)
  • All IPs: 0.0.0.0/0

Troubleshooting

Common Issues

Rule not being applied

  • Check if the composition is properly configured
  • Verify ConfigMap was created successfully
  • Check composition logs: kubectl describe composition firewallrule

Invalid CIDR format

  • Ensure IP addresses are valid (0-255 for each octet)
  • CIDR suffix must be 0-32
  • Use online CIDR calculators to verify format

Rule conflicts

  • Check for overlapping rules with different actions
  • Verify rule priority/order if supported by provider

Security Best Practices

  1. Principle of Least Privilege: Only allow necessary traffic
  2. Default Deny: Start with blocking all, then allow specific traffic
  3. Segmentation: Use different rules for different network segments
  4. Logging: Enable logging for DROP/REJECT actions
  5. Regular Review: Periodically audit firewall rules

Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Submit a pull request

License

MIT License - see LICENSE file for details

Support

For issues and questions: