Synthetics Canary のセキュリティ上の考慮事項 - Amazon CloudWatch

Synthetics Canary のセキュリティ上の考慮事項

次のセクションでは、Synthetics で Canary を作成および実行するときに考慮すべきセキュリティ上の問題について説明します。

セキュリティで保護された接続を使用

Canary コードと Canary テストの実行結果には機密情報が含まれている可能性があるため、Canary は暗号化されていない接続を介してエンドポイントに接続しないでください。https:// で始まる接続など、常に暗号化された接続を使用してください。

Canary の命名に関する考慮事項

Canary の Amazon リソースネーム (ARN) は、CloudWatch Synthetics ラッパーライブラリの一部として含まれている Puppeteer 主導の Chromium ブラウザからのアウトバウンド呼び出しの一部として、ユーザーエージェントヘッダーに含まれます。これにより、CloudWatch Synthetics Canary トラフィックを特定し、電話をかける Canary に関連付けることができます。

Canary ARN には Canary 名が含まれます。専有情報を明らかにしない Canary の名前を選択してください。

また、Canary は、管理するウェブサイトとエンドポイントにのみ向けるようにしてください。

Canary コードの秘密

Canary ソースコードには、アクセスキーやデータベース認証情報などのシークレットを含めないことをお勧めします。AWS Secrets Manager を使用してシークレットを安全に保つ方法の詳細については、「AWS Secrets Manager の概要」を参照してください。

許可に関する考慮事項

CloudWatch Synthetics によって作成または使用されるリソースへのアクセスを制限することをお勧めします。Canary がテストランの結果とログやスクリーンショットなどのその他のアーティファクトを保存する Amazon S3 バケットには、厳しいアクセス許可を使用します。

同様に、Canary ソースコードが保存されている場所に対するアクセス許可を厳しく保ち、Canary で使用されている Lambda レイヤーや Lambda 関数をユーザーが誤ってまたは悪意を持って削除しないようにします。

意図した Canary コードを確実に実行できるように、Canary コードが保存されている Amazon S3 バケットでオブジェクトバージョニングを使用できます。次に、このコードを Canary として実行するように指定すると、次の例のように、versionId オブジェクトをパスの一部として含めることができます。

https://bucket.s3.amazonaws.com/path/object.zip?versionId=version-id https://s3.amazonaws.com/bucket/path/object.zip?versionId=version-id https://bucket.s3-region.amazonaws.com/path/object.zip?versionId=version-id

スタックトレースと例外メッセージ

デフォルトでは、CloudWatch Synthetics Canary は、スクリプトがカスタムであるか、設計図からのものであるかに関係なく、Canary スクリプトによってスローされた例外をキャプチャします。CloudWatch Synthetics は、例外メッセージとスタックトレースの両方を 3 つの場所に記録します。

  • テストランを記述するときにデバッグを高速化する CloudWatch Synthetics サービス

  • Lambda 関数が作成した設定に従って CloudWatch Logs に

  • Synthetics ログファイル。これは、Canary の resultsLocation に設定した値で指定された Amazon S3 ロケーションにアップロードされるプレーンテキストファイルです。

送信および保存する情報を少なくする場合は、CloudWatch Synthetics ラッパーライブラリに戻る前に例外をキャプチャできます。

また、エラーにリクエスト URL を設定することもできます。CloudWatch Synthetics は、スクリプトによってスローされたエラーの URL をスキャンし、restrictedUrlParameters 設定に基づいて、それらから制限された URL パラメータを編集します。スクリプトにエラーメッセージを記録している場合は、 を使用して、ロギング前に URL を編集することができます。

IAM ロールの範囲を絞り込む

潜在的に悪意のある URL またはエンドポイントにアクセスするように Canary を設定しないことをお勧めします。信頼できないウェブサイトやエンドポイントに Canary をポイントすると、Lambda 関数コードが悪意のあるユーザーのスクリプトに公開される可能性があります。悪意のあるウェブサイトが Chromium から抜け出す可能性があると仮定すると、インターネットブラウザを使用して接続した場合と同様の方法で Lambda コードにアクセスできる可能性があります。

スコープダウン許可を持つ IAM 実行ロールを使用して Lambda 関数を実行します。このようにして、Lambda 関数が悪意のあるスクリプトによって侵害された場合、Canary の AWS アカウントとして実行するときに実行できるアクションに制限されます。

CloudWatch コンソールを使用して Canary を作成すると、そのコンソールはスコープダウン IAM 実行ロールで作成されます。

機密データの編集

CloudWatch Synthetics は、URL、ステータスコード、エラーの理由 (存在する場合)、およびリクエストとレスポンスのヘッダーと本文をキャプチャします。これにより、Canary ユーザは、Canary を理解、モニタリング、デバッグすることができます。

次のセクションで説明する構成は、Canary 実行の任意の時点で設定できます。また、異なる Synthetics ステップに異なる設定を適用することもできます。

リクエスト URL

デフォルトでは、CloudWatch Synthetics ログは URL、ステータスコード、および Canary ログ内の各 URL のステータス理由をリクエストします。リクエスト URL は、Canary 実行レポート、HAR ファイルなどにも表示できます。リクエスト URL には、アクセストークンやパスワードなどの機密性の高いクエリパラメータが含まれている場合があります。CloudWatch Synthetics によって機密情報が記録されないように編集することができます。

機密情報を編集するには、設定プロパティ restrictedUrlParameters を設定します。詳細については、「SyntheticsConfiguration クラス」を参照してください。これにより、CloudWatch Synthetics は URL パラメータ(パスおよびクエリパラメータ値を含む)をログを記録する前に restrictedUrlParameters に基づいて編集します。スクリプトに URL を記録している場合は、 を使用して、ロギング前に URL を編集することができます。詳細については、「SyntheticsLogHelper クラス」を参照してください。

Headers

デフォルトでは、CloudWatch Synthetics はリクエスト/レスポンスヘッダーを記録しません。UI Canary の場合、これはランタイムバージョン syn-nodejs-puppeteer-3.2 以降を使用する Canary のデフォルトの動作です。

ヘッダーに機密情報が含まれていない場合は、HAR ファイルおよび HTTP レポートでヘッダーを有効にするには、includeRequestHeaders および includeResponseHeaders プロパティを true に設定します。すべてのヘッダーを有効にできますが、機密性の高いヘッダーキーの値を制限することを選択できます。例えば、Canary によって生成されたアーティファクトから Authorization ヘッダーだけを編集するように選択できます。

リクエストとレスポンスの本文

デフォルトでは、CloudWatch Synthetics はリクエスト/レスポンス本文を Canary ログまたはレポートに記録しません。この情報は、API Canary で特に有益です。Synthetics は、すべてのHTTPリクエストをキャプチャし、ヘッダー、リクエスト、レスポンスの本文を表示できます。詳細については、「executeHttpStep(stepName, requestOptions, [callback], [stepConfig])」を参照してください。リクエスト/レスポンス本文を有効にするかどうかは、includeRequestBody および includeResponseBody プロパティを true に設定することで選択できます。