상호 TLS 사용

상호 TLS(mTLS) 인증에서는 트래픽이 클라이언트와 서버 간 양방향으로 안전하며 신뢰할 수 있습니다. 엔터프라이즈 요금제 레벨의 고객만 사용할 수 있습니다.

mTLS가 구성되면 해당 클라이언트 인증서가 있는 요청에만 액세스 권한이 부여됩니다. 요청이 애플리케이션에 도달하면, CIS 는 클라이언트 인증서 요청을 응답으로 반환합니다. 클라이언트가 인증서 제공에 실패하면 요청이 진행되지 않습니다. 그렇지 않으면 키 교환이 진행됩니다.

mTLS
다이어그램

상호 TLS 구성

상호 TLS ( mTLS )는 보안 강화를 위해 인증서 기반 클라이언트 인증을 제공합니다. mTLS 는 기본적으로 활성화되어 있지 않으며 도메인별로 사전 승인이 필요합니다. mTLS, 를 구성하려면 다음 단계를 따르십시오:

  1. 승인을 요청합니다. 지원 사례를 만들어 IBM Cloud 계정에 대한 mTLS 활성화를 요청하세요.

    mTLS 를 활성화한 후에는 비활성화할 수 없습니다.

  2. 활성화 mTLS:

    1. CIS 콘솔에서 보안을 클릭한 다음 상호 TLS 탭을 선택합니다.
    2. 사용을 클릭하십시오.
  3. 루트 인증서를 업로드합니다:

    1. 상호 TLS 페이지의 루트 인증서 표에서 추가를 클릭하여 새 루트 인증서를 정의합니다.

    2. 인증서 콘텐츠를 인증서 콘텐츠 필드에 붙여넣습니다. 루트 CA 인증서의 이름을 입력하고 이 인증서를 사용할 엔드포인트의 FQDN(정규화된 도메인 이름)을 하나 이상 추가합니다.

      이 FQDN들은 ‘ mTLS ’ 애플리케이션 정책에 의해 보호되는 리소스에서 사용되는 호스트 이름입니다. 루트 CA를 보호된 애플리케이션에서 사용하는 FQDN과 연결해야 합니다.

    3. 저장 을 클릭하십시오.

      중간 인증서를 사용하는 경우, 전체 인증서 체인을 업로드합니다.

  4. mTLS 액세스 정책 생성:

    1. Mutual TLS 페이지의 MTLS 액세스 정책 표에서 만들기를 클릭하여 액세스 애플리케이션을 만듭니다.

    2. 업로드한 루트 인증서와 연결된 FQDN 중 하나에 일치하는 호스트 이름을 선택하거나 입력하고 만들기를 클릭합니다.

      애플리케이션 정책은 non_identity 의 결정을 사용하도록 미리 설정되어 있으며 유효한 클라이언트 인증서와 일치하는 규칙을 포함합니다.

  5. API로 클라이언트 인증서 전달을 사용 설정합니다:

    유효성이 검사된 클라이언트 인증서를 원본 서버로 전달하려면(로깅, 감사 또는 백엔드 인증에 유용) 전달을 사용 설정해야 합니다.

    클라이언트 인증서는 각 mTLS 연결에서 첫 번째 요청에 대해서만 전달됩니다.

    클라이언트 인증서 전달을 사용하도록 설정하는 API 예제는 액세스 인증서 설정 업데이트 API를 참조하세요.

    클라이언트 인증서 헤더가 원본 서버로 전송됩니다:

    • Cf-Client-Cert-Der-Base64 Base64-encoded DER 클라이언트 인증서 버전
    • Cf-Client-Cert-Sha256: SHA-256 클라이언트 인증서의 지문

    API로 전달 상태를 확인하려면 다음과 같이 하세요:

    curl -X GET https://api.cis.cloud.ibm.com/v1/crn:v1:bluemix:public:internet-svcs:global:a/<account-id>:<instance-id>::/zones/<zone-id>/access/certificates/settings \
     -H 'X-Auth-User-Token: Bearer <IAM-TOKEN>'
    
  6. 인증되지 않은 요청을 차단하는 WAF 사용자 지정 규칙을 만듭니다:

    특히 로그인 경로나 API와 같은 민감한 엔드포인트의 보안을 강화하려면 유효한 클라이언트 인증서를 제시하지 않는 요청을 차단하는 WAF 규칙을 만드세요.

    1. CIS 콘솔에서 보안 섹션으로 다시 이동한 다음 사용자 지정 규칙 탭을 선택합니다.
    2. 작성을 클릭하십시오.
    3. WAF 사용자 지정 규칙 만들기 사이드 패널에서 표현식 편집기 사용을 클릭합니다.
    4. 표현식 빌더 사용 필드에 다음 조건을 입력합니다(필요에 따라 hostnamepath 업데이트).
       (http.host eq "example.com" and http.request.uri.path eq "/authenticate" and not cf.tls_client_auth.cert_verified)
    
    1. ‘작업 ’을 ‘차단 ’으로 설정하세요.
    2. 작성을 클릭하십시오.

    이 규칙은 클라이언트 인증서가 성공적으로 확인된 경우에만 액세스를 인증할 수 있도록 허용합니다. mTLS 또는 유효하지 않은 인증서가 없는 요청은 차단됩니다.

mTLS 액세스 테스트

다음 예제에서는 curl을 사용하여 클라이언트 인증서를 사용하거나 사용하지 않고 요청을 수행하여 mTLS 인증을 테스트합니다.

  1. 클라이언트 인증서 없이 사이트에 액세스하려고 시도합니다.

    이 예제에서는 curl을 사용하여 mTLS 을 적용하는 사이트에 대한 액세스를 테스트하는 방법을 보여줍니다. 이 예제에서 URL 의 대상은 https://auth.example.com 입니다.

    curl -sv https://auth.example.com
    

    클라이언트 인증서가 제공되지 않았으므로 요청은 403 Forbidden 응답으로 실패할 것으로 예상됩니다.

  2. 요청에 클라이언트 인증서와 개인 키를 추가합니다:

    curl -sv https://auth.example.com --cert example.pem --key key.pem
    

    클라이언트가 제대로 인증된 경우 응답에 CF_Authorization Set-Cookie 헤더가 포함되어 mTLS 인증이 성공했음을 나타냅니다.

상호 TLS 유효성 검증

이 액세스 정책을 사용하도록 설정하면 다음 워크플로를 사용하여 클라이언트 인증서의 유효성을 검사합니다:

오리진에 대한 모든 요청이 올바른 클라이언트 인증서에 대해 평가됩니다.

  1. 클라이언트는 Hello 메시지를 전송하여 연결을 시작합니다.
  2. 액세스 애플리케이션은 Hello 으로 응답하고 클라이언트 인증서를 요청합니다.
  3. 클라이언트는 유효성 검사를 위해 인증서를 보냅니다.
  4. 클라이언트 인증서는 구성된 루트 인증 기관에 대해 인증됩니다.
  5. 인증서 체인을 사용하는 경우, 시스템은 만료된 인증서가 있는지 확인하고 전체 체인의 유효성도 검사합니다.
  6. 클라이언트 인증서가 신뢰할 수 있는 것으로 확인되면, 해당 클라이언트에 대해 서명된 JSON 웹 토큰(JWT)이 생성되며, 이를 통해 해당 요청 및 후속 요청이 진행될 수 있습니다.
  7. 클라이언트가 유효한 인증서를 제시하지 않으면 서버는 403 Forbidden 응답을 반환합니다.

API로 액세스 인증서를 검색하려면 액세스 인증서 목록을 참조하세요.