보안 비밀에 안전하게 접근할 수 있도록 제어된 실행 환경을 구축하고, 데이터 송신을 관리하며, 최소 권한 원칙을 엄격히 적용합니다.
MPE(관리형 프라이빗 엔드포인트)
시나리오: Fabric Spark에서 중요한 데이터를 사용하는 데이터 엔지니어입니다. 보안 팀은 보안 강화를 위해 네트워크 격리 환경에서 모든 코드를 실행해야 합니다.
VNet(Managed Virtual Network)을 사용하도록 설정합니다. 관리되는 VNet을 사용하도록 설정하려면 공용 설명서를 참조하세요. Microsoft Fabric은 각 패브릭 작업 영역에 대한 관리형 VNet( 가상 네트워크 )을 만들고 관리합니다. 패브릭 Spark 워크로드에 대한 네트워크 격리를 제공합니다. 즉, Microsoft Fabric은 작업 영역당 전용 네트워크에 컴퓨팅 클러스터를 배포하여 공유 가상 네트워크에서 제거합니다.
프로덕션 환경에서는 관리되는 VNet을 사용하여 Spark Notebook을 안전하게 실행합니다.
MPE(관리형 프라이빗 엔드포인트)를 만들면 기본적으로 작업 영역 수준에서 만들어집니다.
테넌트 수준에서 PL(Private Link)을 사용하도록 설정하면 시스템은 테넌트 내의 모든 작업 영역에 대해 관리되는 VNet을 사용하도록 설정합니다. PL 설정을 사용하도록 설정한 후 시스템은 첫 번째 Spark 작업(Notebook 또는 Spark 작업 정의)을 실행할 때 작업 영역에 대한 관리형 가상 네트워크를 만듭니다. 시스템은 또한 Lakehouse 작업, 예를 들어 테이블에 로드하거나 테이블 유지 관리 작업(최적화 또는 진공)를 수행할 때 가상 네트워크를 생성합니다.
비고
관리되는 VNet을 사용하도록 설정하면 시작 풀이 공유 네트워크에서 실행되므로 사용할 수 없게 됩니다.
WS OAP(작업 영역 아웃바운드 액세스 보호)
시나리오: 누군가가 Spark Notebook을 사용하여 권한이 없는 대상에 프로덕션 데이터를 실수로 쓸 수 있다는 우려가 있으며 이를 제어하려고 합니다.
WS OAP(작업 영역 아웃바운드 액세스 보호)를 사용하도록 설정합니다. 이렇게 하면 Spark에서 아웃바운드 인터넷 연결이 관리형 프라이빗 엔드포인트를 통해 승인된 대상으로만 전달됩니다.
- 공용 라이브러리 차단: PyPi, Maven 등에서 공용 라이브러리 설치도 차단합니다. 따라서 라이브러리를 JAR 또는 Wheel 파일로 패키지하고 사용자 지정 라이브러리를 환경이나 리소스에 업로드한 후 Notebook 내에서 %pip install을 사용하여 설치해야 합니다. 한 가지 주의해야 할 점은 리소스에 추가하고 인라인 %pip 설치를 사용하여 설치하는 경우 환경 게시 시간이 적다는 것입니다. 이는 빠른 개발 및 테스트에 유용합니다. 다양한 Notebook에서 패키지를 다시 사용하려면 환경에 게시하는 것이 좋습니다. 또 다른 방법은 프라이빗 리포지토리에 연결하는 것입니다. 자세한 내용은 데이터 엔지니어링 워크로드에 대한 작업 영역 아웃바운드 액세스 보호를 참조하세요.
시나리오: 개발 환경에서 WS OAP를 사용하도록 설정해야 하나요?
개발 프로세스에 영향을 주므로 개발 또는 하위 작업 영역에서 WS OAP를 켜지 않는 것이 좋습니다. Notebook 또는 SJD(Spark 작업 정의)가 공용 라이브러리로 테스트되면 사용자 지정 라이브러리를 사용하여 동일한 Notebook을 테스트합니다. 적절한 코드 검토 후 더 높은 환경에 배포한 다음 WS OAP를 켭니다. 개발 환경도 보호하려는 경우 WS OAP를 사용하도록 설정할 수 있지만 개발 프로세스를 방해할 수 있습니다. WS OAP를 사용하도록 설정하면 시작 풀을 사용할 수 없습니다.
Notebook에서 AKV(Azure Key Vault) 액세스
시나리오: 데이터 엔지니어이며 Spark Notebooks의 보안 자격 증명을 사용하여 여러 데이터 원본에 연결하려고 합니다.
자격 증명을 AKV(Azure Key Vault)에 안전하게 저장합니다. 모든 비밀을 보관하기 위해 하나의 키 볼트를 유지하지 마세요. 대신 가능한 경우 프로젝트/도메인을 기반으로 여러 키 볼트를 사용합니다.
Notebook에서 AKV(Azure Key Vault) 액세스
네트워크: 알려진 네트워크에서만 액세스할 수 있도록 방화벽 규칙으로 AKV를 보호하는 것이 좋습니다. 그러나 방화벽 규칙에서 패브릭 Spark의 IP 주소를 허용합니다. Fabric Spark Notebooks에서 보호된 AKV에 안전하게 연결하려면 AKV에 관리형 프라이빗 엔드포인트를 만드는 것이 좋습니다. 하나의 AKV는 최대 64개의 프라이빗 엔드포인트(Azure 구독 및 서비스 제한, 할당량 및 제약 조건)만 지원할 수 있습니다.
인증: 시스템은 작업/Notebook을 제출하는 사용자의 컨텍스트에서 Fabric Spark Notebook 및 SJD를 실행합니다. AKV에 액세스하려면 제출하는 사용자에게 비밀을 검색할 수 있는 충분한 액세스 권한이 있어야 합니다("Key Vault 비밀 책임자"). AKV 모범 사례를 참조하세요. Azure RBAC를 사용하여 Azure Key Vault에 액세스할 수 있는 권한을 애플리케이션에 부여합니다.
- Notebook/SJD를 실행하는 사용자의 자격 증명을 사용하여 notebookutils(이전에 mssparkutils라고 함)를 사용하여 AKV에 액세스할 수 있습니다.
notebookutils.credentials.getSecret('<AKV URL>', 'Secret Name')프로덕션 환경에서는 사용자에게 PROD 환경에서 AKV에 대한 액세스 권한을 제공하지 않는 것이 좋습니다. 대신 서비스 계정을 사용하여 KV(Key Vault)에 액세스합니다. 서비스 계정을 사용하여 Notebook/작업을 제출합니다.
경우에 따라 작업을 제출하는 서비스 계정에 AKV에서 비밀을 읽을 수 있는 액세스 권한이 있습니다.
경우에 따라 이 서비스 계정은 일반적으로 AKV에서 비밀을 읽을 수 있는 액세스 권한이 없는 DevOps 계정입니다. 이러한 경우 자격 증명 작성기는 다른 SPN(서비스 사용자 이름)을 사용하여 AKV에 액세스하는 데 유용합니다.
샘플 Scala 코드 조각은 다음과 같습니다.
val clientSecretCredential: ClientSecretCredential = new ClientSecretCredentialBuilder()
.clientId("<client id here>")
.clientSecret("<client secret here>")
.tenantId("<tenant id here>")
.build()
val secretClient: SecretClient = new SecretClientBuilder()
.vaultUrl("<vault url here>")
.credential(clientSecretCredential)
.buildClient()
val secretName = "<your value>"
val retrievedSecret = secretClient.getSecret(secretName)
println(s"Retrieved secret: ${retrievedSecret.getValue}")
비고
코드에서 비밀 또는 암호를 일반 텍스트로 하드 코딩하지 마세요. 항상 보안 금고(예: Azure Key Vault)를 사용하여 비밀을 저장하고 가져옵니다.