Hadoop: 암호화된 셔플(Encrypted Shuffle)

Hadoop: 암호화된 셔플(Encrypted Shuffle)

Encrypted Shuffle 기능은 HTTPS를 사용하고 선택적으로 클라이언트 인증(양방향 HTTPS, 또는 클라이언트 인증서를 사용한 HTTPS)을 통해 MapReduce shuffle을 암호화할 수 있게 해줘요.

출처: 문서

본문

소개 (Introduction)

Encrypted Shuffle 기능은 HTTPS와 선택적 클라이언트 인증(양방향 HTTPS, 또는 클라이언트 인증서를 사용한 HTTPS라고도 함)을 사용해 MapReduce shuffle을 암호화할 수 있게 해줘요. 다음으로 구성돼요:

  • shuffle을 HTTP와 HTTPS 사이에서 전환하는 Hadoop 구성 설정.
  • shuffle 서비스와 shuffle 데이터를 가져오는 reducer 태스크가 사용하는 keystore와 truststore 속성(위치, 유형, 비밀번호)을 지정하는 Hadoop 구성 설정.
  • 클러스터 전체에서 truststore를 다시 로드하는 방법(노드가 추가되거나 제거될 때).

구성 (Configuration)

core-site.xml 속성 (core-site.xml Properties)

암호화된 shuffle을 활성화하려면 클러스터의 모든 노드 core-site.xml에서 다음 속성을 설정해요:

Property Default Value Explanation
hadoop.ssl.require.client.cert false 클라이언트 인증서가 필요한지 여부
hadoop.ssl.hostname.verifier DEFAULT HttpsURLConnections에 제공할 호스트 이름 검증기. 유효한 값: DEFAULT, STRICT, STRICT_IE6, DEFAULT_AND_LOCALHOST, ALLOW_ALL
hadoop.ssl.keystores.factory.class org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory 사용할 KeyStoresFactory 구현
hadoop.ssl.server.conf ssl-server.xml ssl 서버 keystore 정보가 추출될 리소스 파일. 이 파일은 클래스패스에서 찾으며, 보통 Hadoop conf/ 디렉터리에 있어야 해요.
hadoop.ssl.client.conf ssl-client.xml ssl 클라이언트 keystore 정보가 추출될 리소스 파일. 이 파일은 클래스패스에서 찾으며, 보통 Hadoop conf/ 디렉터리에 있어야 해요.
hadoop.ssl.enabled.protocols TLSv1.2 지원되는 SSL 프로토콜. 이 파라미터는 DatanodeHttpServer에서만 사용돼요.

중요: 현재 클라이언트 인증서 요구는 false로 설정해야 해요. 자세한 내용은 Client Certificates 섹션을 참고하세요.

중요: 이 모든 속성은 클러스터 구성 파일에서 final로 표시해야 해요.

예:

<property>
    <name>hadoop.ssl.require.client.cert</name>
    <value>false</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.hostname.verifier</name>
    <value>DEFAULT</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.keystores.factory.class</name>
    <value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.server.conf</name>
    <value>ssl-server.xml</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.client.conf</name>
    <value>ssl-client.xml</value>
    <final>true</final>
  </property>

mapred-site.xml 속성 (mapred-site.xml Properties)

암호화된 shuffle을 활성화하려면 클러스터의 모든 노드 mapred-site.xml에서 다음 속성을 설정해요:

Property Default Value Explanation
mapreduce.shuffle.ssl.enabled false 암호화된 shuffle이 활성화되는지 여부

중요: 이 속성은 클러스터 구성 파일에서 final로 표시해야 해요.

예:

<property>
    <name>mapreduce.shuffle.ssl.enabled</name>
    <value>true</value>
    <final>true</final>
  </property>

Linux 컨테이너 실행기를 설정해 작업 태스크가 서버 keystore 정보를 읽고 shuffle 서버 인증서에 접근하지 못하게 해야 해요. 방법은 Hadoop Kerberos 구성 문서를 참고하세요.

Keystore와 Truststore 설정 (Keystore and Truststore Settings)

현재 FileBasedKeyStoresFactory가 유일한 KeyStoresFactory 구현이에요. FileBasedKeyStoresFactory 구현은 ssl-server.xml과 ssl-client.xml 파일에서 다음 속성을 사용해 keystore와 truststore를 구성해요.

ssl-server.xml (Shuffle 서버) 구성 (ssl-server.xml (Shuffle server) Configuration:)

mapred 사용자가 ssl-server.xml 파일을 소유하고 이에 대한 독점 읽기 접근을 가져야 해요.

Property Default Value Explanation
ssl.server.keystore.type jks Keystore 파일 유형
ssl.server.keystore.location NONE Keystore 파일 위치. mapred 사용자가 이 파일을 소유하고 독점 읽기 접근을 가져야 해요.
ssl.server.keystore.password NONE Keystore 파일 비밀번호
ssl.server.truststore.type jks Truststore 파일 유형
ssl.server.truststore.location NONE Truststore 파일 위치. mapred 사용자가 이 파일을 소유하고 독점 읽기 접근을 가져야 해요.
ssl.server.truststore.password NONE Truststore 파일 비밀번호
ssl.server.truststore.reload.interval 10000 Truststore 재로드 간격 (밀리초)

예:

<configuration>

  <!-- Server Certificate Store -->
  <property>
    <name>ssl.server.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.location</name>
    <value>${user.home}/keystores/server-keystore.jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.password</name>
    <value>serverfoo</value>
  </property>

  <!-- Server Trust Store -->
  <property>
    <name>ssl.server.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.server.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>

ssl-client.xml (Reducer/Fetcher) 구성 (ssl-client.xml (Reducer/Fetcher) Configuration:)

mapred 사용자가 ssl-client.xml 파일을 소유하고 기본 권한을 가져야 해요.

Property Default Value Explanation
ssl.client.keystore.type jks Keystore 파일 유형
ssl.client.keystore.location NONE Keystore 파일 위치. mapred 사용자가 이 파일을 소유하고 기본 권한을 가져야 해요.
ssl.client.keystore.password NONE Keystore 파일 비밀번호
ssl.client.truststore.type jks Truststore 파일 유형
ssl.client.truststore.location NONE Truststore 파일 위치. mapred 사용자가 이 파일을 소유하고 기본 권한을 가져야 해요.
ssl.client.truststore.password NONE Truststore 파일 비밀번호
ssl.client.truststore.reload.interval 10000 Truststore 재로드 간격 (밀리초)

예:

<configuration>

  <!-- Client certificate Store -->
  <property>
    <name>ssl.client.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.location</name>
    <value>${user.home}/keystores/client-keystore.jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.password</name>
    <value>clientfoo</value>
  </property>

  <!-- Client Trust Store -->
  <property>
    <name>ssl.client.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.client.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>

Encrypted Shuffle 활성화 (Activating Encrypted Shuffle)

위 구성 변경을 마쳤으면 모든 NodeManager를 다시 시작해 Encrypted Shuffle을 활성화해요. 중요: 암호화된 shuffle을 사용하면 상당한 성능 영향이 발생해요. 사용자는 이를 프로파일링하고 잠재적으로 암호화된 shuffle을 위해 코어 1개 이상을 예약해야 해요.

클라이언트 인증서 (Client Certificates)

클라이언트 인증서 사용은 클라이언트가 그 작업의 reducer 태스크임을 완전히 보장하지는 않아요. 현재 클라이언트 인증서(그 개인 키) keystore 파일은 클러스터에 작업을 제출하는 모든 사용자가 읽을 수 있어야 해요. 이것은 악성 작업이 그런 keystore 파일을 읽고 그 안의 클라이언트 인증서를 사용해 Shuffle 서버와 보안 연결을 설정할 수 있음을 의미해요. 그러나 악성 작업에 적절한 JobToken이 없다면 Shuffle 서버에서 shuffle 데이터를 검색할 수 없어요. Job은 자신의 JobToken을 사용해 자기 자신에게 속한 shuffle 데이터만 검색할 수 있어요.

Truststore 재로드 (Reloading Truststores)

기본적으로 truststore는 10초마다 구성을 다시 로드해요. 새 truststore 파일이 기존 파일 위에 복사되면 다시 읽히고, 그 인증서가 옛 인증서를 대체해요. 이 메커니즘은 클러스터에서 노드를 추가·제거하거나 신뢰된 클라이언트를 추가·제거하는 데 유용해요. 이런 경우 클라이언트 또는 NodeManager 인증서가 시스템의 모든 truststore 파일에 추가(또는 제거)되고, NodeManager 데몬을 다시 시작하지 않아도 새 구성이 반영돼요.

디버깅 (Debugging)

참고: 디버깅은 문제 해결 시에만, 그리고 소량의 데이터에 대해 실행되는 작업에만 활성화해요. 매우 장황하며 작업을 몇 자릿수만큼 느리게 해요. (태스크가 너무 느리게 실행돼 작업이 실패하는 것을 방지하기 위해 mapred.task.timeout을 늘려야 할 수도 있어요.)

reducer에서 SSL 디버깅을 활성화하려면 mapreduce.reduce.child.java.opts 속성에 -Djavax.net.debug=all을 설정해요. 예:

<property>
    <name>mapred.reduce.child.java.opts</name>
    <value>-Xmx-200m -Djavax.net.debug=all</value>
  </property>

이것은 작업별로 하거나 mapred-site.xml 파일의 클러스터 전체 설정으로 할 수 있어요. NodeManager에서 이 속성을 설정하려면 yarn-env.sh 파일에 설정해요:

YARN_NODEMANAGER_OPTS="-Djavax.net.debug=all"

암호화된 중간 데이터 Spill 파일 (Encrypted Intermediate Data Spill files)

이 기능은 merge와 shuffle 단계 중에 생성되는 중간 파일을 암호화할 수 있게 해줘요. mapreduce.job.encrypted-intermediate-data 작업 속성을 true로 설정해 활성화할 수 있어요.

Name Type Description
mapreduce.job.encrypted-intermediate-data boolean Map 인터미디에이트 spill 파일 암호화 활성화/비활성화. 기본값 false.
mapreduce.job.encrypted-intermediate-data-key-size-bits int 디스크에 spill된 데이터를 암호화하는 keygenerator가 사용하는 키 길이
mapreduce.job.encrypted-intermediate-data.buffer.kb int 암호화 후 디스크에 쓰는 스트림의 버퍼 크기 (kb)

참고: 현재 암호화된 중간 데이터 spill을 활성화하면 작업의 시도(attempt) 수가 1로 제한돼요.

더 알아보기 (Learn more)