이 규칙은 안전하지 않은 TLS 프로토콜 버전(“TLSv1.2”, “TLSv1.3”, “DTLSv1.2” 또는 “DTLSv1.3”과 다른 프로토콜)이 사용되거나 허용될 때 문제를 제기합니다.
최소 프로토콜 버전으로 TLS 1.2를 적용하고 TLS 1.0과 같은 이전 버전은 허용하지 않는 것이 좋습니다. 그렇게 하지 않으면 다운그레이드 공격에 노출될 수 있습니다. 연결을 가로챌 수 있는 악의적인 공격자가 요청된 프로토콜 버전을 수정하여 보안이 낮은 버전으로 다운그레이드할 수 있습니다.
대부분의 경우 기본 시스템 구성을 사용하는 것은 규정을 준수하지 않습니다. 실제로 애플리케이션이 다양한 구성을 가진 다양한 시스템에 배포될 수 있습니다. 최신 최신 시스템에서는 시스템의 기본값을 사용하는 것이 안전할 수 있지만, 구형 시스템에서는 그렇지 않을 수 있습니다. 따라서 모든 경우에 명시적으로 안전한 구성을 설정하는 것이 좋습니다.
규칙을 어긴 코드
from OpenSSL import SSL
SSL.Context(SSL.SSLv3_METHOD) # 규칙을 어긴 코드
import ssl
ssl.SSLContext(ssl.PROTOCOL_SSLv3) # 규칙을 어긴 코드
aws_cdk.aws_apigateway.DomainNamed 의 경우:
from aws_cdk.aws_apigateway import DomainName, SecurityPolicy
class ExampleStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
DomainName(self, "example",
domain_name="example.com",
certificate=certificate,
security_policy=SecurityPolicy.TLS_1_0 # 규칙을 어긴 코드
)
aws_cdk.aws_opensearchservice.CfnDomain 의 경:
from aws_cdk.aws_opensearchservice import CfnDomain, EngineVersion
class ExampleStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
CfnDomain(self, "example",
version=EngineVersion.OPENSEARCH_1_3
) # 규칙을 어긴 코드: 더 이상 사용되지 않는 프로토콜 버전인 TLS 1.0을 활성화합니다.
규칙을 준수한 해결책
from OpenSSL import SSL
context = SSL.Context(SSL.TLS_SERVER_METHOD)
context.set_min_proto_version(SSL.TLS1_3_VERSION)
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.minimum_version = ssl.TLSVersion.TLSv1_3
aws_cdk.aws_apigateway.DomainNamed 의 경우:
from aws_cdk.aws_apigateway import DomainName, SecurityPolicy
class ExampleStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwa우rgs)
DomainName(self, "example",
domain_name="example.com",
certificate=certificate,
security_policy=SecurityPolicy.TLS_1_2
)
aws_cdk.aws_opensearchservice.CfnDomain 의 경우:
from aws_cdk.aws_opensearchservice import CfnDomain, EngineVersion
class ExampleStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
CfnDomain(self, "example",
version=EngineVersion.OPENSEARCH_1_3
domain_endpoint_options=CfnDomain.DomainEndpointOptionsProperty(
tls_security_policy="Policy-Min-TLS-1-2-2019-07"
)
)
같이보면 좋은 자료드
- OWASP Top 10 2021 Category A2 - 암호화 실패
- OWASP Top 10 2021 Category A7 - 식별 및 인증 실패
- OWASP Top 10 2017 Category A3 - 민감한 데이터 노출
- OWASP Top 10 2017 Category A6 - 보안 구성 오류
- Mobile AppSec Verification Standard - 네트워크 통신 요구 사항
- OWASP Mobile Top 10 2016 Category M3 - 안전하지 않은 통신
- MITRE, CWE-327 - 부적절한 암호화 강도
- MITRE, CWE-326 - 깨지거나 위험한 암호화 알고리즘 사용
- SANS Top 25 - 다공성 방어
- SSL and TLS Deployment Best Practices - 보안 프로토콜 사용
-
Amazon API Gateway - 최소 TLS 버전 선택하기
If you like SONARKUBE, don’t forget to give me a star.