클라이언트 인증서를 사용하여 API에 액세스 보호

완료됨

인증서는 클라이언트와 API 게이트웨이 간에 TLS 상호 인증을 제공하는 데 사용할 수 있습니다. 특정 지문이 포함된 인증서가 포함된 요청만 허용하도록 API Management 게이트웨이를 구성할 수 있습니다. 게이트웨이 수준의 권한은 인바운드 정책을 통해 처리됩니다.

기상 앱의 경우, 믿을 수 있는 인증 기관(CA)에서 발급된 클라이언트 인증서를 보유한 고객이 있습니다. 이 고객이 해당 인증서를 전달하여 인증하도록 허용해야 합니다.

여기서는 클라이언트 인증서를 허용하도록 API Management를 구성하는 방법을 알아봅니다.

TLS 클라이언트 인증

TLS 클라이언트 인증을 통해 API 관리 게이트웨이는 클라이언트 요청에 포함된 인증서를 검사하고 다음과 같은 속성을 확인할 수 있습니다.

속성 이유
CA(인증 기관) 특정 CA에서 서명한 인증서만 허용합니다.
지문 지정된 지문을 포함한 인증서를 허용합니다.
Subject 지정된 제목의 인증서만 허용합니다.
만료 날짜 만료되지 않은 인증서만 허용합니다.

이러한 속성은 상호 배타적이지 않으며, 둘 이상을 결합하여 사용자의 자체 정책 요구 사항을 구성할 수 있습니다. 예를 들어, 요청에서 전달된 인증서가 만료되지 않았고 특정 인증 기관에 의해 서명되었음을 지정할 수 있습니다.

클라이언트 인증서는 변조되지 않았음을 보증하기 위해 서명됩니다. 파트너가 인증서를 보낸 경우 사칭자가 아니라 실제로 해당 파트너가 보낸 것인지 확인합니다. 인증서를 확인하는 일반적인 방법은 두 가지가 있습니다.

  • 누가 인증서를 발급했는지 확인합니다. 발급자가 신뢰할 수 있는 인증 기관인 경우 인증서를 사용할 수 있습니다. Azure Portal에서 신뢰할 수 있는 인증 기관을 구성하여 이 프로세스를 자동화할 수 있습니다.

  • 파트너가 인증서를 발급한 경우 실제로 해당 파트너가 발급한 것인지 확인합니다. 예를 들어 파트너가 인증서를 직접 전달한 경우 그 신뢰성을 확신할 수 있습니다. 이러한 인증서를 자체 서명된 인증서라고 합니다.

소비 계층에서 클라이언트 인증서를 수락

API Management의 소비 계층은 서버리스 디자인 원칙을 준수하도록 설계되어 있습니다. Azure Functions와 같은 서버리스 기술에서 API를 빌드하는 경우 이 계층이 적합합니다. 소비 계층에서는 사용자 지정 도메인 창에서 수행할 수 있는 클라이언트 인증서 사용을 명시적으로 활성화해야 합니다. 다른 계층에서는 이 단계가 필요하지 않습니다.

Configure the gateway to request certificates.

인증서 권한 부여 정책 만들기

API Management 게이트웨이 내의 인바운드 처리 정책 파일에서 이러한 정책을 만듭니다.

Inbound processing policy button.

클라이언트 인증서에 대한 지문 확인

모든 클라이언트 인증서에는 지문이 포함되며, 이는 다른 인증서 속성에서 계산된 해시입니다. 지문은 인증 기관에서 인증서를 발급한 이후 인증서의 값이 변경되지 않았음을 보증합니다. 정책에서 지문을 확인할 수 있습니다. 다음 예제에서는 요청에서 전달된 인증서의 지문을 확인합니다.

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

API Management에 업로드된 인증서에 대해 지문 확인

이전 예에서는 하나의 지문만 작동하므로 하나의 인증서만 유효성이 검사됩니다. 일반적으로 각 고객 또는 파트너 회사는 다른 지문을 사용하여 다른 인증서를 전달합니다. 이 시나리오를 지원하려면 파트너로부터 인증서를 가져오고 Azure Portal의 클라이언트 인증서 창을 사용하여 인증서를 API Management 리소스에 업로드합니다. 그런 다음, 이 코드를 정책에 추가합니다.

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Request.Certificate.Verify()  || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

클라이언트 인증서 발급자와 제목 확인

다음 예제에서는 요청에 전달된 인증서의 발급자와 제목을 확인합니다.

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Issuer != "trusted-issuer" || context.Request.Certificate.SubjectName.Name != "expected-subject-name")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>