인디노트

KMIP4J - Open source implementation of Key Management Interoperability Protocol 본문

인증기술/보안기술

KMIP4J - Open source implementation of Key Management Interoperability Protocol

인디개발자 2022. 4. 18. 09:37

KMIP(Key Management Interoperability Protocol)의 오픈 소스 구현

        KMIP는 KLMS(Key Lifecycle Management System)와 해당 클라이언트 간의 통신을 정의합니다. 대부분의 회사는 자신들의 프로그래밍 언어를 사용하여 자체적인 KMIP 를 구현하고 있고, 지금까지 오픈 소스 솔루션이 없었습니다. Java 코드를 사용하여 개발된 오픈 소스 KMIP 구현인 KMIP4J를 www.sourceforge.net에서 사용할 수 있습니다. 이 기사에서는 오픈 소스 구현에 대한 개요를 제공합니다.

        "암호화는 보안을 제공합니다!" 이 문장은 현대 IT 보안 분야에서 가장 큰 근본적인 오해 중 하나일 수 있습니다. 암호화에 대한 기본 지식이 있는 사람은 보안 통신을 위해 암호화, 메시지 무결성 및 통신 파트너의 ID 인증 외에도 보안이 중요하다는 것을 알고 있습니다. 그러나, 이러한 개념이 결합되어도 암호화에 사용되는 키를 부주의하게 다루면 아무 소용이 없습니다. 보안은 데이터 보호에서 키 관리 (키 생성, 보관, 업데이트 및 배포 작업)에 이르는 전체 프로세스와 관련됩니다.

KMIP가 해결한 문제

        가장 크고 유명한 IT 회사 중 일부가 새로운 프로토콜인 KMIP 를 담당하는 OASIS 작업 그룹을 구성 했습니다. KIMP 의 프로토콜은 일련의 이벤트, 메시지 내용 및 인코딩을 정의하는 언어로 볼 수 있습니다. KMIP는 키 관리 시스템과 클라이언트 간의 통신 요구 사항을 충족합니다.

        오늘날 대기업에는 일반적으로 고유한 통신 프로토콜이 있는 모든 종류의 KLMS(Key Lifecycle Management System, 비밀 키 수명 주기 관리 시스템)를 사용하고 있습니다 (그림의 왼쪽 참조). KMIP는 다른 방법을 채택하고 모든 객체와 운영 방법을 단일 프로토콜로 병합하여 중앙 집중식 KLMS를 가능하게 합니다(그림의 오른쪽 참조). 중앙 집중식 KLMS 프로토콜을 사용하면 운영 및 인프라 비용을 절감하고 보안 정책의 일관된 구현을 제공합니다. 또한 동일한 응용 프로그램에서 모든 암호화된 개체가 동일하게 관리됩니다.

        일부 회사는 그들만의 다른 프로그래밍 언어로 KMIP의 구현을 사용했지만 지금까지는 오픈 소스 솔루션이 없었습니다. 따라서 우리는 가까운 장래에 프로토콜을 확장할 수 있는 KMIP의 오픈 소스 구현을 작성하고 게시하기로 결정했습니다.

 

구현 작동 방식

        우리 시스템의 구조는 클라이언트-서버 아키텍처를 기반으로 합니다(그림참조). 점선은 라이브러리와 테스트 환경 사이의 KMIP 경계를 나타냅니다. 구현된 테스트 환경은 클라이언트와 서버로 구성됩니다. 클라이언트는 GUI 프로그램을 제공하고 서버는 단순화된 KLMS 및 고유 어댑터입니다. 어댑터를 사용하면 KMIP를 기존 또는 새로운 KLMS에 적용할 수 있습니다.

 

        클라이언트 GUI (그림참조)를 사용하면 특정 사용 사례에 대한 요청을 선택하고 실행 할 수 있습니다. XML 파일을 사용하여 AES 암호화를 위한 128비트 대칭키 생성과 같은 다른 요구 사항을 생성 할 수 있습니다. 이 정보는 스텁(stub)으로 전달되고 KMIP 지정 개체, 속성 및 작업으로 채워진 KMIP 컨테이너에 캡슐화됩니다.

        인코더(Encoder) 작업 처리 컨테이너(Container) 정보에서 KMIP 사양(그림참조)에 따라 TTLV(Tag-the Type-the Length-the Value) 인코딩 정보를 생성합니다. 디코더는 TTLV로 인코딩된 응답을 컨테이너로 변환하는 인코더 쌍입니다.

        여러 키 클래스가 인터페이스를 구현하며, 구성 파일(StubConfig.xml 또는 web.xml)에 대한 다른 유형의 변경으로 대체될 수 있습니다. 다음에 시작할 때 요청된 클래스가 동적으로 로드됩니다. 이 방법을 사용하면 소프트웨어를 매우 유연하고 쉽게 구성할 수 있습니다. 통신 계층은 교체 가능한 클래스의 예입니다. 구성을 수정하여 통신 계층을 다른 통신 방식으로 변경할 수 있습니다. 기본적으로 클라이언트와 서버 간에 SSL/TLS 연결이 설정됩니다. 테스트 사례에서 구성 파일의 통신 계층 구성을 변경하여 클라이언트와 서버 간에 HTTP 연결도 설정할 수 있습니다.

        서버 측에서는 웹이 서블릿용 서버와 결합하여 통신 메시지를 전달합니다. 메시지를 디코딩한 후 어댑터의 작업은 KMIP를 KLMS가 이해할 수 있는 형식으로 변환하는 것입니다. 기존 KLMS 시스템에서 KMIP 라이브러리를 사용하고자 하는 사용자는 이 기능을 구현해야 합니다. 구현된 테스트 환경의 KLMS는 4계층 아키텍처, 인터페이스 계층, 서비스 계층, 관리자 계층 및 데이터 계층을 가지고 있습니다. 그러나 현재 시스템은 KMIP 1.0 사용 사례에 지정된 작업만 지원합니다.

KMIP4J 오픈 소스 구현

        KMIP4J는 KMIP 1.0 사양의 구현입니다. 이 과정에서 OASIS는 작업 진행 상황에 통합되지 않은 KMIP 1.1 버전을 출시했습니다. 소프트웨어의 유연성과 확장성으로 인해 버전 1.1을 달성할 수 있습니다.

        OASIS 공식 KMIP 페이지(참고자료)는 더 많은 프로토콜 사양을 제공한다. 또 다른 중요한 문서 "KMIP V1.0 사용 사례, Use Case of KMIP V1.0". 에는 일반적인 KMIP 통신 "요청" - "응답" 시나리오가 포함됩니다. 문서에는 각 메시지의 매개변수와 TTLV 인코딩 결과가 포함되어 있습니다. 모든 사용 사례는 테스트 환경에서 성공적으로 테스트되었습니다.

        다음 섹션에서는 KMIP4J를 사용하여 간단한 KMIP 클라이언트를 구현하는 방법을 설명합니다.

 

KMIP 클라이언트 구현

        이 예는 매우 간단한 KMIP 클라이언트를 보여줍니다. KMIP4J 라이브러리를 사용하여 KLMS에 대한 요청을 생성합니다. 이 SimpleKMIPClient 의 주요 기능은 로거를 구성하고, KMIPStub을 만들고, createKMIPRequest를 호출하는 것입니다(목록 참조). 이 기능은 KMIP 개체 및 속성을 생성하고 "키 생성" 으로 작동하며 KMIP 컨테이너에 배치합니다. 이 요청에 대해 KLMS는 AES 알고리즘 암호화 및 암호해독을 위한 128비트 대칭키를 생성하도록 요청받았습니다. stub.processRequest(요청) 함수 호출의 결과는 컨테이너에 있습니다. 이 결과에는 서버 응답의 KMIP 개체 및 속성이 포함됩니다.

 

심플한 KMIP 클라이언트

import java.util.ArrayList;
import org.apache.log4j.Logger;
import org.apache.log4j.xml.DOMConfigurator;
import ch.ntb.inf.kmip.attributes.*;
import ch.ntb.inf.kmip.container.*;
import ch.ntb.inf.kmip.kmipenum.*;
import ch.ntb.inf.kmip.objects.base.*;
import ch.ntb.inf.kmip.stub.KMIPStub;

public class SimpleKMIPClient {

	//initialize Logger
	private static final Logger logger = Logger.getLogger(SimpleKMIPClient.class);

	public static void main(String[] args) {
		//configure Logger
		DOMConfigurator.configureAndWatch( "config/log4j-1.2.17.xml", 60*1000 );

		KMIPStub stub = new KMIPStub();
		KMIPContainer request = createKMIPRequest();
		KMIPContainer response = stub.processRequest(request);
		System.out.println(response.toString());
	}

	private static KMIPContainer createKMIPRequest() {
		//Create Container with one Batch
		KMIPContainer container = new KMIPContainer();
		KMIPBatch batch = new KMIPBatch();
		container.addBatch(batch);
		container.calculateBatchCount();

		//Set Operation and Attribute
		batch.setOperation(EnumOperation.Create);
		batch.addAttribute(new ObjectType(EnumObjectType.SymmetricKey));

		//Set TemplateAttribute with Attributes 
		ArrayList<Attribute> templateAttributes = new ArrayList<Attribute>();
		templateAttributes.add(new 
CryptographicAlgorithm(EnumCryptographicAlgorithm.AES));
		templateAttributes.add(new CryptographicLength(128));
		templateAttributes.add(new CryptographicUsageMask(0x0C));
		TemplateAttributeStructure tas = new TemplateAttribute();
		tas.setAttributes(templateAttributes);
		batch.addTemplateAttributeStructure(tas);
	
		return container;
	}
}

자체 서버가 실행 중일 때 SimpleKMIPClient는 다음 출력을 생성합니다(그림 5 참조).

        이 프로젝트를 구성하려면. kmip4j.jar 라이브러리를 빌드 경로에 추가해야 합니다. 또한, 도 6 같이 StubConfig.xml 프로파일과 log4j-1.2.17.xml이 추가되어야 한다. Eclipse 프로젝트 및 필요한 모든 파일은 참조 자료에서 찾을 수 있습니다.

      또한 HTTPS 통신을 사용하려면 인증서가 있는 Java 키 저장소 파일이 필요합니다. 키 저장소 파일의 경로는 StubConfig.xml 파일에 지정되어야 합니다.

        이 예는 클라이언트가 오픈 소스 KMIP4J 구현을 사용하여 KLMS에 대한 기본 KMIP 요청을 생성하는 방법을 보여줍니다. 이것은 대부분의 개발자 및 고객에게 좋은 출발점이 될 것입니다.

 

결론적으로

        KMIP는 핵심 라이프사이클 관리 시스템과 클라이언트 간의 커뮤니케이션을 정의합니다. 기존 시스템에 비해 호환되지 않는 프로토콜이 많이 있습니다. KMIP가 있는 중앙 집중식 KLMS는 운영 및 인프라 비용을 줄이고 보안 정책의 일관된 구현을 제공합니다. KMIP를 사용하는 것은 암호화된 개체의 더 나은 구성과 일관된 관리를 위한 매우 중요한 단계입니다.

 

반응형
Comments