JDBC 드라이버와 보안 Enclave를 사용한 Always Encrypted 사용
이 페이지에서는 보안 Enclave를 사용한 Always Encrypted 및 Microsoft JDBC Driver 8.2 (또는 그 이상) for SQL Server를 사용하여 Java 응용 프로그램을 개발하는 방법을 설명합니다.
보안 Enclave 기능은 기존 Always Encrypted 기능에 추가됩니다. 보안 Enclave의 목적은 Always Encrypted 데이터로 작업할 때의 제한 사항을 해결하는 것입니다. 이전에는 사용자가 Always Encrypted 데이터에서 같음만 비교할 수 있었으며, 다른 작업을 하려면 데이터를 검색하고 암호 해독해야 했습니다. 보안 Enclave를 통해 서버 쪽 보안 Enclave에 있는 일반 텍스트 데이터에서 계산할 수 있게 되면 이 제한 사항이 해결됩니다. 보안 Enclave는 SQL Server 프로세스 내에서 보호되는 메모리 영역입니다. SQL Server 엔진 내에서 중요한 데이터를 처리할 수 있도록 신뢰할 수 있는 실행 환경으로 기능합니다. 보안 Enclave는 SQL Server의 나머지 부분 및 호스팅 머신의 다른 프로세스에서 검은색 상자로 표시됩니다. 디버거를 사용하더라도 외부에서 Enclave 내의 데이터나 코드를 볼 수 없습니다.
필수 조건
- Microsoft JDBC Driver 8.2(이상) for SQL Server가 개발 컴퓨터에 설치되어 있는지 확인합니다.
- DLL, 키 저장소 등의 환경 종속성이 올바른 경로에 있는지 확인합니다. 보안 Enclave를 사용한 Always Encrypted는 기존 Always Encrypted 기능의 추가 기능이며 유사한 필수 구성 요소를 공유합니다.
참고 항목
이전 버전의 JDK 8을 사용하는 경우 JCE(Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files를 다운로드하여 설치해야 할 수 있습니다. zip 파일에 포함된 추가 정보에서 설치 지침 및 가능한 내보내기/가져오기 문제와 관련된 자세한 내용을 읽어야 합니다.
JCE(Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files 8 다운로드에서 정책 파일을 다운로드할 수 있습니다.
보안 Enclave 설정
자습서: SQL Server에서 보안 Enclave가 있는 Always Encrypted 사용, 자습서: Azure SQL 데이터베이스에서 Intel SGX Enclave가 있는 Always Encrypted 사용, 또는 자습서: Azure SQL 데이터베이스에서 VBS Enclave가 있는 Always Encrypted 사용 내용에 따라 보안 Enclave를 시작합니다. 더 자세한 내용은 보안 Enclave를 사용한 Always Encrypted를 참조하세요.
연결 문자열 속성
데이터베이스 연결에 enclave 계산을 사용하려면 Always Encrypted를 사용하도록 설정하는 것 외에도 다음 연결 문자열 키워드를 설정해야 합니다.
enclaveAttestationProtocol - 증명 프로토콜을 지정합니다.
- SQL Server 및 HGS(호스트 보호 서비스)를 사용하는 경우 이 키워드의 값은
HGS
여야 합니다. - Azure SQL Database 및 Microsoft Azure Attestation을 사용하는 경우 이 키워드의 값은
AAS
여야 합니다. - 증명 서비스를 사용할 수 없는 환경에서 보안 Enclave를 사용하는 경우 이 키워드의 값이
NONE
이어야 합니다. JDBC 12.2 이상이 필요합니다.
- SQL Server 및 HGS(호스트 보호 서비스)를 사용하는 경우 이 키워드의 값은
enclaveAttestationUrl: - 증명 URL(증명 서비스 엔드포인트)을 지정합니다. 사용 중인 환경의 증명 URL을 얻으려면 증명 서비스 관리자에게 문의해야 합니다.
- SQL Server 및 HGS(호스트 보호 서비스)를 사용하는 경우 HGS 증명 URL 확인 및 공유를 참조하세요.
- Azure SQL Database 및 Microsoft Azure Attestation을 사용하는 경우 증명 정책의 증명 URL 확인을 참조하세요.
NONE
증명 프로토콜을 사용하는 경우 속성을 비워 둘 수 있습니다.
사용자는 columnEncryptionSetting을 사용하도록 설정하고 위의 연결 문자열 속성을 모두 올바르게 설정하여 Microsoft JDBC Driver for SQL Server의 보안 Enclave를 사용한 Always Encrypted를 사용하도록 설정해야 합니다.
보안 Enclave 작업
Enclave 연결 속성이 제대로 설정되면 이 기능이 투명하게 작동합니다. 이 드라이버는 쿼리가 보안 Enclave의 사용을 자동으로 요구할지 여부를 결정합니다. 다음은 Enclave 계산을 트리거하는 쿼리의 예입니다. 자습서: SQL Server에서 보안 Enclaves가 있는 Always Encrypted 사용 또는 자습서: Azure SQL 데이터베이스에서 보안 Enclave가 있는 Always Encrypted 사용에서 데이터베이스 및 테이블 설정을 확인할 수 있습니다.
풍부한 쿼리는 Enclave 계산을 트리거합니다.
private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL)) {
try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SSN LIKE ?")) {
p.setString(1, "%6818");
try (ResultSet rs = p.executeQuery()) {
while (rs.next()) {
// Do work with data
}
}
}
try (PreparedStatement p = c.prepareStatement("SELECT * FROM Employees WHERE SALARY > ?")) {
((SQLServerPreparedStatement) p).setMoney(1, new BigDecimal(0));
try (ResultSet rs = p.executeQuery()) {
while (rs.next()) {
// Do work with data
}
}
}
}
열에서 암호화를 전환하면 Enclave 계산도 트리거됩니다.
private static final String URL = "jdbc:sqlserver://<server>:<port>;encrypt=true;user=<username>;password=<password>;databaseName=ContosoHR;columnEncryptionSetting=enabled;enclaveAttestationUrl=<attestation-url>;enclaveAttestationProtocol=<attestation-protocol>;";
try (Connection c = DriverManager.getConnection(URL);Statement s = c.createStatement()) {
s.executeUpdate("ALTER TABLE Employees ALTER COLUMN SSN CHAR(11) NULL WITH (ONLINE = ON)");
}
Java 8 사용자
이 기능을 사용하려면 RSASSA-PSA 서명 알고리즘이 필요합니다. 이 알고리즘은 JDK 11에서 추가되었지만 JDK 8에 다시 이식할 수 없습니다. Microsoft JDBC Driver for SQL Server의 JDK 8 버전에서 이 기능을 사용하려는 사용자는 RSASSA-PSA 서명 알고리즘을 지원하는 자체 공급자를 로드하거나 선택적인 BouncyCastleProvider
종속성을 포함해야 합니다. JDK 8이 서명 알고리즘을 백포팅하거나 JDK 8의 지원 수명 주기가 종료되면 나중에 종속성이 제거됩니다.