🛡️

AWS App RunnerをCloudFront経由で安全に使用する方法

2024/06/25に公開

はじめに

AWSのApp RunnerをCloudFront経由で使用する際に、CloudFrontからのアクセスのみを許可したい場合があります。これを実現するためには、CloudFrontからのアクセスに含まれる特定のヘッダーキーに合致する場合のみ許可するWAF(Web Application Firewall)をApp Runnerに適用することが効果的です。

手順

1. WAFの作成

以下のようなルールを設定します。この例では、X-Custom-Headerというヘッダーの値がxxx-yyy-zzzとなっているかどうかをチェックしています。
実際に設定するヘッダーの値は複雑にすることが重要です。

const appRunnerWebAcl = new CfnWebACL(this, 'AppRunnerWebAcl', {
    name: 'app-runner-web-acl',
    defaultAction: { block: {} },
    scope: 'REGIONAL',
    visibilityConfig: {
        cloudWatchMetricsEnabled: true,
        metricName: 'app-runner-web-acl',
        sampledRequestsEnabled: true
    },
    rules: [
        {
          name: 'AllowFromCloudFront',
          priority: 0,
          action: { allow: {} },
          statement: {
            byteMatchStatement: {
              searchString: 'xxx-yyy-zzz',
              fieldToMatch: {
                singleHeader: {
                  name: 'X-Custom-Header'
                }
              },
              textTransformations: [{
                priority: 0,
                type: 'NONE'
              }],
              positionalConstraint: 'EXACTLY'
            }
          },
          visibilityConfig: {
            sampledRequestsEnabled: true,
            cloudWatchMetricsEnabled: true,
            metricName: 'BlockNotFromCloudFrontMetric'
          }
        }
    ]
})

2. WAFの適用

1で作成したWAFをApp Runnerに適用します。

const service = new CfnService(this, 'AppRunnerService', {
      serviceName: 'xxx-service'
}
new CfnWebACLAssociation(this, 'WafAppRunner', {
    webAclArn: webAcl.attrArn, # 先ほど作成したWAFARN
    resourceArn: service.attrServiceArn # App RunnerのARN
})

3. CloudFrontからヘッダーを渡す

App RunnerへのオリジンのX-Custom-Headerxxx-yyy-zzzを含めるようにします。

const origin = new HttpOrigin(appRunnerService.attrServiceUrl, {
    httpsPort: 443,
    customHeaders: { 'X-Custom-Header': 'xxx-yyy-zzz' },
    originSslProtocols: [OriginSslPolicy.TLS_V1_2]
})

まとめ

CloudFront経由でのみApp Runnerへのアクセスを許可するためには、特定のヘッダーキーに基づいてアクセスを制御するWAFを適用することが効果的です。これにより、セキュリティを強化することができます。しかし、完全にCloudFront経由のアクセスのみとすることは難しいため、総当たり攻撃の検知も必要です。ぜひ、この方法を活用して、安全なシステム運用を実現してください。

CareNet Engineers

Discussion