DEV Community

Cover image for Using AWS Waf And Shield To Protect DDoS
πŸš€ Vu Dao πŸš€
πŸš€ Vu Dao πŸš€

Posted on

3 1

Using AWS Waf And Shield To Protect DDoS

Alt Text

- AWS Shield and Web Application Firewall (WAF) are both products which provide perimeter defence for AWS networks.

- Shield provides DDOS protection and WAF is a Layer 7 Application Firewall.

- Ref: https://www.cloudflare.com/en-au/learning/ddos/what-is-a-ddos-attack/

- We can use CDK to create AWS WAF with the expected rules and associate it to the ALB


What’s In This Document


πŸš€ Init WAF CDK Project



⚑ $ mkdir waf_alb
⚑ $ cd waf_alb
⚑ $ cdk init -l python


Enter fullscreen mode Exit fullscreen mode

πŸš€ Write code stack

  • At RuleProperty, we set OverrideActionProperty to count so that if a rule matches a web request, it only counts the match.
  • To defines and enables Amazon CloudWatch metrics and web request sample collection, we enable VisibilityConfig
  • Scope: REGIONAL vs CLOUDFRONT

    • REGIONAL: A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, or an AWS AppSync GraphQL API
    • CLOUDFRONT
  • How to get availabe managed rule group:

    
    

aws wafv2 list-available-managed-rule-groups --scope REGIONAL


- code: https://github.com/vumdao/waf-alb/waf_alb_stack.py

Enter fullscreen mode Exit fullscreen mode

from aws_cdk import (
aws_cloudformation as cfn,
aws_wafv2 as waf,
core,
)

class WafStack(core.Stack):

def __init__(self, scope: core.Construct, id: str, env, target_arn, **kwargs) -> None:
    super().__init__(scope, id, env=env, **kwargs)

    waf_rules = list()

    """ 1. Reputation List """
    aws_ip_rep_list = waf.CfnWebACL.RuleProperty(
        name='WafIpreputation',
        priority=1,
        override_action=waf.CfnWebACL.OverrideActionProperty(count={}),
        statement=waf.CfnWebACL.StatementOneProperty(
            managed_rule_group_statement=waf.CfnWebACL.ManagedRuleGroupStatementProperty(
                name='AWSManagedRulesAmazonIpReputationList',
                vendor_name='AWS',
                excluded_rules=[]
            )
        ),
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='aws_reputation',
            sampled_requests_enabled=True,
        )
    )
    waf_rules.append(aws_ip_rep_list)

    """ 2. AnonymousIpList """
    aws_anony_list = waf.CfnWebACL.RuleProperty(
        name='WafAnony',
        priority=2,
        override_action=waf.CfnWebACL.OverrideActionProperty(count={}),
        statement=waf.CfnWebACL.StatementOneProperty(
            managed_rule_group_statement=waf.CfnWebACL.ManagedRuleGroupStatementProperty(
                name='AWSManagedRulesAnonymousIpList',
                vendor_name='AWS',
                excluded_rules=[]
            )
        ),
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='aws_anony',
            sampled_requests_enabled=True,
        )
    )
    waf_rules.append(aws_anony_list)

    """ 3. CommonRule """
    aws_common_rule = waf.CfnWebACL.RuleProperty(
        name='WafCommonRule',
        priority=3,
        override_action=waf.CfnWebACL.OverrideActionProperty(count={}),
        statement=waf.CfnWebACL.StatementOneProperty(
            managed_rule_group_statement=waf.CfnWebACL.ManagedRuleGroupStatementProperty(
                name='AWSManagedRulesCommonRuleSet',
                vendor_name='AWS',
                excluded_rules=[]
            )
        ),
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='aws_common',
            sampled_requests_enabled=True,
        )
    )
    waf_rules.append(aws_common_rule)

    """ 4. PHP Rule """
    aws_php_rule = waf.CfnWebACL.RuleProperty(
        name='WafPHPRule',
        priority=4,
        override_action=waf.CfnWebACL.OverrideActionProperty(count={}),
        statement=waf.CfnWebACL.StatementOneProperty(
            managed_rule_group_statement=waf.CfnWebACL.ManagedRuleGroupStatementProperty(
                name='AWSManagedRulesPHPRuleSet',
                vendor_name='AWS',
                excluded_rules=[]
            )
        ),
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='aws_php',
            sampled_requests_enabled=True,
        )
    )
    waf_rules.append(aws_php_rule)

    """ 5. Linux Rule """
    aws_linux_rule = waf.CfnWebACL.RuleProperty(
        name='WafLinuxRule',
        priority=5,
        override_action=waf.CfnWebACL.OverrideActionProperty(count={}),
        statement=waf.CfnWebACL.StatementOneProperty(
            managed_rule_group_statement=waf.CfnWebACL.ManagedRuleGroupStatementProperty(
                name='AWSManagedRulesLinuxRuleSet',
                vendor_name='AWS',
                excluded_rules=[]
            )
        ),
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='aws_linux',
            sampled_requests_enabled=True,
        )
    )
    waf_rules.append(aws_linux_rule)

    """ DefaultAction: Action of AWS WAF to perform when a web request doesn't match any of the rules in the WebACL. """
    web_acl = waf.CfnWebACL(
        self, 'WebACL',
        default_action=waf.CfnWebACL.DefaultActionProperty(
            allow={}
        ),
        scope="REGIONAL",  # vs 'CLOUDFRONT'
        visibility_config=waf.CfnWebACL.VisibilityConfigProperty(
            cloud_watch_metrics_enabled=True,
            metric_name='webACL',
            sampled_requests_enabled=True
        ),
        name=f'prod-acl',
        rules=waf_rules
    )

    """ Associate it with the resource provided. """
    waf.CfnWebACLAssociation(self, 'WAFACLAssociateALB',
                             web_acl_arn=web_acl.attr_arn,
                             resource_arn=target_arn
                             )
Enter fullscreen mode Exit fullscreen mode

### πŸš€ **[Deploy stacks](#-Deploy-stacks)**
Enter fullscreen mode Exit fullscreen mode

⚑ $ cdk ls
theWalACLAlblon

⚑ $ cdk deploy
theWalACLAlblon: deploying...
theWalACLAlblon: creating CloudFormation changeset...
β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ

βœ… theWalACLAlblon

Stack ARN:
arn:aws:cloudformation:eu-west-2:111111111111:stack/theWalACLAlblon/fbe06250-740f-11eb-9c9f-0685bc814060


- Requests:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ducohx9p4rhj7wsquaif.png)

- Rules:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ouz75dyj9jo72gugm3fl.png)

- Associate ALB
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lgrmdhhgrp2mla0nztpx.png)

- Cloudwatch metrics
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/psltrd7doo9lhs8kqm70.png)

<h3 align="center">
  <a href="https://dev.to/vumdao">:stars: Blog</a>
  <span> Β· </span>
  <a href="https://github.com/vumdao/">Github</a>
  <span> Β· </span>
  <a href="https://vumdao.hashnode.dev/">Web</a>
  <span> Β· </span>
  <a href="https://www.linkedin.com/in/vu-dao-9280ab43/">Linkedin</a>
  <span> Β· </span>
  <a href="https://www.linkedin.com/groups/12488649/">Group</a>
  <span> Β· </span>
  <a href="https://www.facebook.com/CloudOpz-104917804863956">Page</a>
  <span> Β· </span>
  <a href="https://twitter.com/VuDao81124667">Twitter :stars:</a>
</h3>
Enter fullscreen mode Exit fullscreen mode

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Sentry image

See why 4M developers consider Sentry, β€œnot bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay