Synthetics canary에 대한 보안 고려 사항
다음 단원에서는 Synthetics에서 카나리아를 생성 및 실행할 때 고려해야 할 보안 문제에 대해 설명합니다.
보안 연결 사용
canary 코드와 canary 테스트 실행의 결과에는 중요한 정보가 포함될 수 있으므로 암호화되지 않은 연결을 통해 엔드포인트에 canary를 연결하지 마십시오. https://
로 시작하는 것과 같이 항상 암호화된 연결을 사용합니다.
canary 이름 지정 고려 사항
canary의 Amazon 리소스 이름(ARN)은 CloudWatch Synthetics 래퍼 라이브러리의 일부로 포함된 Puppeteer 기반 Chromium 브라우저에서 수행된 아웃바운드 호출의 일부로 user-agent 헤더에 포함됩니다. 이렇게 하면 CloudWatch Synthetics canary 트래픽을 식별하여 호출을 수행 중인 canary에 다시 연결할 수 있습니다.
canary ARN에는 canary 이름이 포함되어 있습니다. 독점 정보를 공개하지 않는 canary 이름을 선택하십시오.
또한 자신이 제어하는 웹 사이트 및 엔드포인트의 canary만 가리키도록 해야 합니다.
canary 코드의 비밀 및 민감한 정보
zip 파일을 사용하여 canary 코드를 canary에 직접 전달하면 스크립트의 내용을 AWS CloudTrail 로그에서 볼 수 있습니다.
canary 스크립트에 민감한 정보 또는 비밀(예: 액세스 키 또는 데이터베이스 자격 증명)이 있는 경우, zip 파일로 canary 코드를 전달하는 대신 스크립트를 Amazon S3에 버전이 지정된 객체로 저장하고 canary에 Amazon S3 위치를 전달하는 것이 좋습니다.
zip 파일을 사용하여 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는 예외 메시지와 스택 추적을 모두 다음 세 위치에 로그합니다.
테스트 실행을 설명할 때 디버깅 속도를 높이기 위해 CloudWatch Synthetics 서비스에 다시 로그
Lambda 함수가 생성되는 구성에 따라 CloudWatch Logs에 로그
canary의
resultsLocation
에 대해 설정한 값으로 지정된 Amazon S3 위치에 업로드되는 일반 텍스트 파일인 Synthetics 로그 파일에 로그
더 적은 정보를 보내고 저장하려는 경우 예외가 CloudWatch Synthetics 래퍼 라이브러리로 반환되기 전에 예외를 캡처할 수 있습니다.
또한 오류에 요청 URL이 있을 수도 있습니다. CloudWatch Synthetics는 스크립트에서 발생한 오류의 URL을 검색하며 [restrictedUrlParameters] 구성에 따라 제한된 URL 파라미터를 수정합니다. 스크립트에 오류 메시지를 로그하는 경우 getSanitizedErrorMessage 를 사용하여 로깅 전에 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는 canary 로그에 요청 URL, 상태 코드, 각 URL의 상태 이유를 로그합니다. 요청 URL은 canary 실행 보고서, HAR 파일 등에 표시될 수도 있습니다. 요청 URL에는 액세스 토큰 또는 암호와 같은 민감한 쿼리 파라미터가 포함될 수 있습니다. 민감한 정보를 CloudWatch Synthetics에서 로그하지 못하게 수정할 수 있습니다.
민감한 정보를 수정하려면 구성 속성인 [restrictedUrlParameters]를 설정합니다. 자세한 내용은 SyntheticsConfiguration 클래스 단원을 참조하세요. 이렇게 하면 CloudWatch Synthetics는 로깅 전에 [restrictedUrlParameters]에 따라 경로 및 쿼리 파라미터 값을 포함한 URL 파라미터를 수정합니다. 스크립트에 URL을 로그하는 경우 getSanitizedUrl(url, stepConfig = null)을 사용하여 로깅 전에 URL을 수정할 수 있습니다. 자세한 내용은 SyntheticsLogHelper 클래스 단원을 참조하십시오.
헤더
기본적으로 CloudWatch Synthetics는 요청 또는 응답 헤더를 로그하지 않습니다. UI canary의 경우 이는 런타임 버전 syn-nodejs-puppeteer-3.2
이상을 사용하는 canary의 기본 동작입니다.
헤더에 민감한 정보가 포함되어 있지 않으면 [includeRequestHeaders] 및 [includeResponseHeaders] 속성을 true
로 설정하여 HAR 파일 및 HTTP 보고서에서 헤더를 사용 설정할 수 있습니다. 모든 헤더를 사용 설정할 수 있지만, 민감한 헤더 키의 값을 제한하도록 선택할 수 있습니다. 예를 들어 canary가 생성한 아티팩트의 Authorization
헤더만 수정하도록 선택할 수 있습니다.
요청 및 응답 본문
기본적으로 CloudWatch Synthetics는 canary 로그 또는 보고서에 요청 또는 응답 본문을 로그하지 않습니다. 이 정보는 API canary에 특히 유용합니다. Synthetics는 모든 HTTP 요청을 캡처하고 헤더, 요청 및 응답 본문을 표시할 수 있습니다. 자세한 내용은 executeHttpStep(stepName, requestOptions, [callback], [stepConfig]) 단원을 참조하세요. [includeRequestBody] 및 [includeResponseBody] 속성을 true
로 설정하여 요청 및 응답 본문을 사용하도록 선택할 수 있습니다.