TLS/SSL을 사용하여 보안 온라인 엔드포인트 구성

이 문서에서는 Azure Machine Learning을 통해 만든 Kubernetes 온라인 엔드포인트를 보호하는 방법을 보여 줍니다.

HTTPS를 사용하여 온라인 엔드포인트 액세스를 제한하고 클라이언트가 제출하는 데이터를 보호합니다. HTTPS는 TLS(전송 계층 보안)를 사용하여 클라이언트와 온라인 엔드포인트 간의 통신을 암호화합니다. TLS는 TLS의 선행 작업인 SSL(Secure Sockets Layer)이라고도 합니다.

  • 특히 Kubernetes 온라인 엔드포인트는 AKS(Azure Kubernetes Service) 및 Azure Arc 지원 Kubernetes용 TLS 버전 1.2를 지원합니다.
  • Azure Machine Learning용 TLS 버전 1.3 - Kubernetes 유추는 지원되지 않습니다.

TLS 및 SSL 모두 암호화 및 ID 확인에 도움이 되는 디지털 인증서가 사용됩니다. 디지털 인증서의 작동 방식에 대해서는 Wikipedia 토픽 공개 키 인프라를 참조하세요.

Warning

온라인 엔드포인트에 HTTPS를 사용하지 않으면 서비스에 대해 전송되는 데이터가 인터넷의 다른 사람에게 보여질 수 있습니다.

또한 클라이언트는 HTTPS를 통해 자신이 연결하는 대상 서버의 진위성을 확인할 수 있습니다. 이 기능은 중간자(man-in-the-middle) 공격으로부터 클라이언트를 보호합니다.

다음은 온라인 엔드포인트를 보호하는 일반적인 프로세스입니다.

  1. 도메인 이름을 가져옵니다.

  2. 디지털 인증서를 가져옵니다.

  3. Azure Machine Learning 확장에서 TLS/SSL을 구성합니다.

  4. 온라인 엔드포인트를 가리키도록 DNS를 FQDN(정규화된 도메인 이름)으로 업데이트합니다.

Important

도메인 이름 또는 TLS/SSL 인증서를 얻으려면 사용자 고유의 인증서를 구매한 다음, Azure Machine Learning 확장에서 구성해야 합니다. 자세한 내용은 이 문서의 뒷부분에 나오는 다음 섹션을 참조하세요.

도메인 이름 가져오기

고유 도메인 이름이 없으면 도메인 이름 등록자에게서 하나 구입합니다. 프로세스 및 가격은 등록자마다 다릅니다. 등록자는 도메인 이름 관리 도구를 제공합니다. 이러한 도구를 사용하여 FQDN(예: www.contoso.com)을 온라인 엔드포인트를 호스트하는 IP 주소에 매핑합니다.

온라인 엔드포인트의 IP 주소를 가져오는 방법에 대한 자세한 내용은 이 문서의 FQDN으로 DNS 업데이트 섹션을 참조하세요.

TLS/SSL 인증서를 받습니다.

TLS/SSL 인증서(디지털 인증서)는 여러 방법으로 얻을 수 있습니다. 가장 일반적인 방법은 CA(인증 기관)에서 구입하는 것입니다. 인증서를 어디에서 얻든 다음과 같은 파일이 필요합니다.

  • 전체 인증서 체인을 포함하고 PEM으로 인코딩된 인증서
  • PEM으로 인코딩된 키

참고 항목

암호 보호가 있는 PEM 파일의 SSL 키는 지원되지 않습니다.

인증서를 요청할 때는 온라인 엔드포인트에 사용하려는 주소의 FQDN(예: www.contoso.com)을 제공해야 합니다. 인증서에 적힌 주소와 클라이언트에 사용되는 주소를 비교하여 온라인 엔드포인트의 ID를 확인합니다. 이러한 주소가 일치하지 않으면 클라이언트에 오류 메시지가 표시됩니다.

FQDN을 사용하여 IP 밴딩을 구성하는 방법에 대한 자세한 내용은 이 문서의 FQDN으로 DNS 업데이트 섹션을 참조하세요.

인증 기관이 인증서와 키를 PEM으로 인코딩된 파일로 제공할 수 없는 경우 OpenSSL과 같은 유틸리티를 사용하여 형식을 변경할 수 있습니다.

Warning

자체 서명된 인증서는 개발에만 사용해야 합니다. 프로덕션 환경에서는 사용하지 마세요. 자체 서명된 인증서로 인해 클라이언트 애플리케이션에 문제가 발생할 수 있습니다. 자세한 내용은 클라이언트 애플리케이션에 사용되는 네트워크 라이브러리에 대한 설명서를 참조하세요.

Azure Machine Learning 확장에서 TLS/SSL 구성

보안 연결에 유추 HTTPS를 사용하도록 설정된 Kubernetes 온라인 엔드포인트의 경우 Kubernetes 클러스터에 Azure Machine Learning 확장을 배포할 때 배포 구성 설정으로 TLS 종료를 사용하도록 설정할 수 있습니다.

Azure Machine Learning 확장에 대한 배포 시 allowInsecureConnections 구성 설정은 기본적으로 False입니다. 확장 배포에 성공하려면 sslSecret 구성 설정 또는 sslKeyPemFilesslCertPemFile 구성 보호 설정의 조합을 지정해야 합니다. 그렇지 않으면 allowInsecureConnections=True이(가) HTTP를 지원하고 TLS 종료를 사용하지 않도록 설정할 수 있습니다.

참고 항목

HTTPS 온라인 엔드포인트를 지원하려면 allowInsecureConnections을(를) False(으)로 설정해야 합니다.

실시간 유추에 HTTPS 엔드포인트를 사용하도록 설정하려면 PEM으로 인코딩된 TLS/SSL 인증서와 키를 모두 제공해야 합니다. Azure Machine Learning 확장에 대한 배포 시 인증서와 키를 지정하는 방법에는 두 가지가 있습니다.

  • sslSecret 구성 설정을 지정합니다.
  • sslCertPemFileslKeyPemFile 구성으로 보호되는 설정의 조합을 지정합니다.

sslSecret 구성

가장 좋은 방법은 azureml 네임스페이스의 Kubernetes 비밀에 인증서와 키를 저장하는 것입니다.

sslSecret을(를) 구성하려면 네임스페이스의 Kubernetes 클러스터에 azureml Kubernetes 비밀을 저장하여 cert.pem(PEM 인코딩 TLS/SSL 인증서) 및 key.pem(PEM으로 인코딩된 TLS/SSL 키)을 저장해야 합니다.

다음 코드는 TLS/SSL 비밀의 샘플 YAML 정의입니다.

apiVersion: v1
data:
  cert.pem: <PEM-encoded SSL certificate> 
  key.pem: <PEM-encoded SSL key>
kind: Secret
metadata:
  name: <secret name>
  namespace: azureml
type: Opaque

클러스터에 비밀을 저장한 후 다음 Azure CLI 명령을 사용하여 sslSecret을(를) 이 Kubernetes 비밀의 이름으로 지정할 수 있습니다. (이 명령은 AKS를 사용하는 경우에만 작동합니다.)

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

sslCertPemFile 및 sslKeyPemFile 구성

sslCertPemFile 구성 설정을 PEM으로 인코딩된 TLS/SSL 인증서 파일의 경로로 지정하고 sslKeyPemFile 구성 설정을 PEM으로 인코딩된 TLS/SSL 키 파일의 경로로 지정할 수 있습니다.

다음 예제에서는 Azure CLI를 사용하여 구매한 TLS/SSL 인증서를 사용하는 Azure Machine Learning 확장에 PEM 파일을 지정하는 방법을 보여 줍니다. 이 예제에서는 AKS를 사용한다고 가정합니다.

   az k8s-extension create --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster

참고 항목

  • 암호로 보호된 PEM 파일은 지원되지 않습니다.
  • sslCertPemFIlesslKeyPemFIle은(는) 모두 구성으로 보호된 매개 변수를 사용합니다. sslSecretsslCertPemFile/sslKeyPemFile을(를) 동시에 구성하지 않습니다.

FQDN으로 DNS 업데이트

사용자 지정 인증서를 사용하여 Kubernetes 온라인 엔드포인트에서 모델을 배포하는 경우 온라인 엔드포인트의 IP 주소를 가리키도록 DNS 레코드를 업데이트해야 합니다. Azure Machine Learning 유추 라우터 서비스(azureml-fe)는 이 IP 주소를 제공합니다. azureml-fe에 대한 자세한 내용은 관리되는 Azure Machine Learning 유추 라우터를 참조하세요.

사용자 지정 도메인에 대한 DNS 레코드를 추가하려면 다음 단계를 따릅니다.

  1. 엔드포인트 점수 매기기 URI에서 엔드포인트 점수 매기기 IP 주소를 가져옵니다. 일반적으로 http://104.214.29.152:80/api/v1/service/<service-name>/score 형식입니다. 이 예제에서 IP 주소는 104.214.29.152.입니다.

    사용자 지정 도메인 이름을 구성한 후 점수 매기기 URI의 IP 주소를 대체합니다. 유추 라우터 서비스로 LoadBalancer을(를) 사용하는 Kubernetes 클러스터의 경우 azureml-fe은(는) 클라우드 공급자의 부하 분산 장치 및 TLS/SSL 종료를 통해 외부에서 노출됩니다. Kubernetes 온라인 엔드포인트의 IP 주소는 클러스터에 배포된 azureml-fe 서비스의 외부 IP 주소입니다.

    AKS를 사용하는 경우 Azure Portal IP 주소를 가져올 수 있습니다. AKS 리소스 페이지로 이동하여 서비스 및 수신으로 이동한 다음 azuerml 네임스페이스 아래에서 azureml-fe 서비스를 찾습니다. 그런 다음 외부 IP 열에서 IP 주소를 찾을 수 있습니다.

    Screenshot of adding a new extension to the Azure Arc-enabled Kubernetes cluster from the Azure portal.

    또한 클러스터에서 kubectl describe svc azureml-fe -n azureml Kubernetes 명령을 실행하여 출력의 LoadBalancer Ingress 매개 변수에서 IP 주소를 가져올 수 있습니다.

    참고 항목

    nodePort 또는 clusterIP을(를) 유추 라우터 서비스로 사용하는 Kubernetes 클러스터의 경우 azureml-fe에 대한 자체 부하 분산 솔루션 및 TLS/SSL 종료를 설정해야 합니다. 또한 클러스터 범위에서 azureml-fe 서비스의 IP 주소를 가져와야 합니다.

  2. 도메인 이름 등록자의 도구를 사용하여 도메인 이름에 대해 DNS 레코드를 업데이트합니다. 레코드는 FQDN(예: www.contoso.com)을 IP 주소에 매핑합니다. 레코드는 엔드포인트 점수 매기기의 IP 주소를 가리켜야 합니다.

    Microsoft는 사용자 지정 DNS 이름 또는 인증서에 대한 DNS를 업데이트할 책임이 없습니다. 도메인 이름 등록 기관으로 업데이트해야 합니다.

  3. DNS 레코드 업데이트 후 nslookup custom-domain-name 명령을 사용하여 DNS 확인의 유효성을 검사할 수 있습니다. DNS 레코드가 올바르게 업데이트된 경우 사용자 지정 도메인 이름이 엔드포인트 점수 매기기의 IP 주소를 가리킵니다.

    등록자 및 도메인 이름에 대해 구성된 TTL(Time To Live)에 따라 클라이언트가 도메인 이름을 확인할 수 있으려면 몇 분 또는 몇 시간까지 지연될 수 있습니다.

Azure Machine Learning DNS 확인에 대한 자세한 내용은 사용자 지정 DNS 서버에서 작업 영역을 사용하는 방법을 참조하세요.

TLS/SSL 인증서 업데이트

TLS/SSL 인증서가 만료되고 갱신되어야 합니다. 일반적으로 매년 발생합니다. 다음 단계의 정보에 따라 Kubernetes(AKS 및 Azure Arc 지원 Kubernetes)에 배포된 모델에 대해 인증서를 업데이트하고 갱신합니다.

  1. 인증 기관에서 제공된 문서를 사용하여 인증서를 갱신합니다. 이 프로세스는 새 인증서 파일을 만듭니다.

  2. Azure Machine Learning 확장을 업데이트하고 az k8s-extension update 명령을 사용하여 새 인증서 파일을 지정합니다.

    이전에 Kubernetes 비밀을 사용하여 TLS/SSL을 구성한 경우 먼저 Kubernetes 클러스터의 새 cert.pemkey.pem 구성으로 Kubernetes 비밀을 업데이트해야 합니다. 그런 다음 확장 업데이트 명령을 실행하여 인증서를 업데이트합니다.

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config inferenceRouterServiceType=LoadBalancer sslSecret=<Kubernetes secret name> sslCname=<ssl cname> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

    이전에 확장 배포 명령에서 PEM 파일을 직접 구성한 경우 확장 업데이트 명령을 실행하고 새 PEM 파일의 경로를 지정해야 합니다.

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config sslCname=<ssl cname> --config-protected sslCertPemFile=<file-path-to-cert-PEM> sslKeyPemFile=<file-path-to-cert-KEY> --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

TLS 사용 안 함

Kubernetes에 배포된 모델에 대해 TLS를 사용하지 않도록 설정하려면 다음을 수행합니다.

  1. allowInsercureconnection을(를) True(으)로 설정하여 Azure Machine Learning 확장을 업데이트합니다.

  2. sslSecret 또는 sslPem 구성 설정과 함께 sslCname 구성 설정을 제거합니다.

  3. Kubernetes 클러스터에서 다음 Azure CLI 명령을 실행한 다음 업데이트를 수행합니다. 이 명령은 AKS를 사용한다고 가정합니다.

       az k8s-extension update --name <extension-name> --extension-type Microsoft.AzureML.Kubernetes --config enableInference=True inferenceRouterServiceType=LoadBalancer allowInsercureconnection=True --cluster-type managedClusters --cluster-name <your-AKS-cluster-name> --resource-group <your-RG-name> --scope cluster
    

Warning

기본적으로 Azure Machine Learning 확장 배포는 HTTPS 지원에 대한 구성 설정을 예상합니다. 개발 또는 테스트 목적으로만 HTTP를 지원하는 것이 좋습니다. allowInsecureConnections=True 구성 설정은 HTTP 지원을 제공합니다.

다음 단계

다음의 방법을 알아보세요.