📖

aws load balancer controllerでCloudFrontのカスタムヘッダ以外からのリクエストを403にするサンプル

2022/09/26に公開

やりたいこと

CloudFront + ALBの組み合わせの場合、とくに設定をしない場合、ALBのドメインへアクセスしてもバックエンドへ到達できてしまう。その場合、アタックをもろに受けることになってしまうので、防御策を弄したい。
こちらの記事にしたがって、CloudFrontを経由しないと付与されないカスタムヘッダがない場合は、403を返却する設定をいれることで、防御することができる。
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/restrict-access-to-load-balancer.html

サンプル

  • 各ruleにはservice.port.nameをuse-annotationとすることで、annotationに記述したルールを参照することができる
  • conditionはどのようなリクエストが来たらということを定義する
  • actionは具体的な動作を定義する
    • 左がcondition、右がactionのイメージ
  • spec.defaultBackendはその名前の通り、どのルールにも一致しなかったら実行されるアクションを定義する
    • デフォルトだと404エラーになったはず
    • この部分を今回は403に変更している
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  ...
  annotations:
    ...
    alb.ingress.kubernetes.io/actions.response-403: >
      {"type":"fixed-response","fixedResponseConfig":{"contentType":"text/plain","statusCode":"403","messageBody":"Forbidden"}}
    alb.ingress.kubernetes.io/actions.service: >
      {"type":"forward","forwardConfig":{"targetGroups":[{"serviceName":"service","servicePort":80}]}}
    alb.ingress.kubernetes.io/conditions.service: >
      [{"field":"http-header","httpHeaderConfig":{"httpHeaderName": "from-restriction-cloudfront", "values":["aiueo"]}}]
spec:
  ingressClassName: alb
  defaultBackend:
    service:
      name: response-403
      port:
        name: use-annotation
  rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: service
              port:
                name: use-annotation

参考

https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/ingress/annotations/#actions
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.4/guide/ingress/annotations/#conditions

Discussion