🛡️
AWS App RunnerをCloudFront経由で安全に使用する方法
はじめに
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, # 先ほど作成したWAFのARN
resourceArn: service.attrServiceArn # App RunnerのARN
})
3. CloudFrontからヘッダーを渡す
App RunnerへのオリジンのX-Custom-Header
にxxx-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経由のアクセスのみとすることは難しいため、総当たり攻撃の検知も必要です。ぜひ、この方法を活用して、安全なシステム運用を実現してください。
Discussion