6.2. セカンダリー Ingress Controller の設定
標準 (およびデフォルト) クラスター Ingress Controller からの WAF 保護対象の外部トラフィックをセグメント化するために、セカンダリー Ingress Controller を設定する必要があります。
前提条件
カスタムドメイン用の公的に信頼された SAN 証明書またはワイルドカード証明書 (例:
CN=*.apps.example.com
)重要Amazon CloudFront は HTTPS を使用してクラスターのセカンダリー Ingress Controller と通信します。Amazon CloudFront のドキュメント で説明されているように、CloudFront とクラスター間の HTTPS 通信には自己署名証明書を使用できません。Amazon CloudFront は、証明書が信頼できる認証局によって発行されたことを確認します。
手順
秘密鍵と公開証明書から新しい TLS シークレットを作成します。
fullchain.pem
は完全なワイルドカード証明書チェーン (中間証明書を含む)、privkey.pem
はワイルドカード証明書の秘密鍵です。例
$ oc -n openshift-ingress create secret tls waf-tls --cert=fullchain.pem --key=privkey.pem
新規の
IngressController
リソースを作成します。waf-Ingress-controller.yaml
の例apiVersion: operator.openshift.io/v1 kind: IngressController metadata: name: cloudfront-waf namespace: openshift-ingress-operator spec: domain: apps.example.com 1 defaultCertificate: name: waf-tls endpointPublishingStrategy: loadBalancer: dnsManagementPolicy: Unmanaged providerParameters: aws: type: NLB type: AWS scope: External type: LoadBalancerService routeSelector: 2 matchLabels: route: waf
IngressController
を適用します。例
$ oc apply -f waf-ingress-controller.yaml
IngressController が外部ロードバランサーを正常に作成したことを確認します。
$ oc -n openshift-ingress get service/router-cloudfront-waf
出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-cloudfront-waf LoadBalancer 172.30.16.141 a68a838a7f26440bf8647809b61c4bc8-4225395f488830bd.elb.us-east-1.amazonaws.com 80:30606/TCP,443:31065/TCP 2m19s
6.2.1. AWS WAF の設定
AWS WAF サービスは Web アプリケーションファイアウォールです。ROSA などの保護対象の Web アプリケーションリソースに転送される HTTP および HTTPS 要求を監視、保護、制御できます。
Web ACL に適用する AWS WAF ルールファイルを作成します。
$ cat << EOF > ${SCRATCH}/waf-rules.json [ { "Name": "AWS-AWSManagedRulesCommonRuleSet", "Priority": 0, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesCommonRuleSet" } }, "OverrideAction": { "None": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "AWS-AWSManagedRulesCommonRuleSet" } }, { "Name": "AWS-AWSManagedRulesSQLiRuleSet", "Priority": 1, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesSQLiRuleSet" } }, "OverrideAction": { "None": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "AWS-AWSManagedRulesSQLiRuleSet" } } ] EOF
これにより、コア (共通) および SQL AWS マネージドルールセットが有効になります。
上記で指定したルールを使用して、AWS WAF の Web ACL を作成します。
$ WAF_WACL=$(aws wafv2 create-web-acl \ --name cloudfront-waf \ --region ${REGION} \ --default-action Allow={} \ --scope CLOUDFRONT \ --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER}-waf-metrics \ --rules file://${SCRATCH}/waf-rules.json \ --query 'Summary.Name' \ --output text)