Apache HBase에 대한 보안 클라이언트 접근

Apache HBase에 대한 보안 클라이언트 접근

이 문서는 HBase 클라이언트에 Kerberos 기반 보안 인증을 구성하는 방법을 설명해요. 서버와 클라이언트 양쪽 설정 절차, Thrift/REST 게이트웨이 설정, 프록시 사용자(impersonation)까지 다뤄요. HBase를 강한 인증으로 운영하고 싶다면 필수로 알아야 할 내용이에요.

출처: 문서

본문

새로운 버전의 Apache HBase(>= 0.92)는 클라이언트의 선택적 SASL 인증을 지원해요. Matteo Bertozzi의 Understanding User Authentication and Authorization in Apache HBase 문서도 참고하세요.

이 문서는 보안 HBase 리소스에 연결하기 위해 Apache HBase와 클라이언트를 설정하는 방법을 설명해요.

사전 준비

Hadoop 인증 구성

강한 인증으로 HBase RPC를 실행하려면 hbase.security.authentication을 kerberos로 설정해야 해요. 이 경우 core-site.xml의 hadoop.security.authentication도 kerberos로 설정해야 해요. 그렇지 않으면 HBase에는 강한 인증을 사용하지만 기본 HDFS에는 사용하지 않게 되어 어떤 이점도 상쇄돼요.

Kerberos KDC

동작하는 Kerberos KDC가 필요해요.

보안 운영을 위한 서버 측 구성

먼저 security.prerequisites를 참고하고 기본 HDFS 구성이 안전한지 확인하세요.

클러스터의 모든 서버 머신에 있는 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.security.authentication</name>
  <value>kerberos</value>
</property>
<property>
  <name>hbase.security.authorization</name>
  <value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
  <value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>

이 구성 변경을 배포할 때는 HBase 서비스의 전체 종료와 재시작이 필요해요.

보안 운영을 위한 클라이언트 측 구성

먼저 Prerequisites를 참고하고 기본 HDFS 구성이 안전한지 확인하세요.

모든 클라이언트의 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.security.authentication</name>
  <value>kerberos</value>
</property>

2.2.0 버전 이전에는, 클라이언트 환경이 HBase 클러스터와 통신하기 전에 kinit 명령을 통해 KDC나 keytab에서 Kerberos에 로그인해야 했어요.

2.2.0부터 클라이언트는 hbase-site.xml에 다음 구성을 지정할 수 있어요:

<property>
  <name>hbase.client.keytab.file</name>
  <value>/local/path/to/client/keytab</value>
</property>

<property>
  <name>hbase.client.keytab.principal</name>
  <value>[email protected]</value>
</property>

그러면 애플리케이션이 클라이언트 간섭 없이 로그인과 자격 증명 갱신 작업을 자동으로 수행할 수 있어요.

이것은 선택 기능이에요. 2.2.0으로 업그레이드한 클라이언트는 hbase.client.keytab.file과 hbase.client.keytab.principal을 설정하지 않은 채로 두면 이전 버전에서 이미 하던 로그인과 자격 증명 갱신 로직을 계속 유지할 수 있어요.

클라이언트와 서버 측 사이트 파일의 hbase.security.authentication이 일치하지 않으면 클라이언트가 클러스터와 통신할 수 없다는 점을 알아 두세요.

HBase가 보안 RPC용으로 구성되면 암호화된 통신을 선택적으로 구성할 수 있어요. 그러려면 모든 클라이언트의 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.rpc.protection</name>
  <value>privacy</value>
</property>

이 구성 프로퍼티는 연결별로도 설정할 수 있어요. Table에 제공되는 Configuration에 설정하세요.

Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
conf.set("hbase.rpc.protection", "privacy");
try (Connection connection = ConnectionFactory.createConnection(conf);
     Table table = connection.getTable(TableName.valueOf(tablename))) {
  .... do your stuff
}

암호화된 통신에 대해 약 10% 성능 저하를 예상하세요.

보안 운영을 위한 클라이언트 측 구성 - Thrift 게이트웨이

모든 Thrift 게이트웨이에 대해 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.thrift.keytab.file</name>
  <value>/etc/hbase/conf/hbase.keytab</value>
</property>
<property>
  <name>hbase.thrift.kerberos.principal</name>
  <value>$USER/[email protected]</value>
  <!-- TODO: This may need to be  HTTP/_HOST@<REALM> and _HOST may not work.
   You may have  to put the concrete full hostname.
   -->
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
  <name>hbase.thrift.dns.interface</name>
  <value>default</value>
</property>
<property>
  <name>hbase.thrift.dns.nameserver</name>
  <value>default</value>
</property>

$USER와 $KEYTAB에 대해 각각 적절한 자격 증명과 keytab으로 대체하세요.

Thrift API 프린시펄을 사용해 HBase와 상호작용하려면 hbase.thrift.kerberos.principal을 acl 테이블에 추가하는 것도 필요해요. 예를 들어 Thrift API 프린시펄 thrift_server에게 관리 권한을 주려면 다음과 같은 명령이면 충분해요.

grant 'thrift_server', 'RWCA'

ACL에 대한 자세한 내용은 Access Control Labels (ACLs) 섹션을 참고하세요.

Thrift 게이트웨이는 제공된 자격 증명으로 HBase에 인증해요. Thrift 게이트웨이 자체는 인증을 수행하지 않아요. Thrift 게이트웨이를 통한 모든 클라이언트 접근은 Thrift 게이트웨이의 자격 증명을 사용하고 그 권한을 가지게 돼요.

Thrift 게이트웨이가 클라이언트를 대신해 인증하도록 구성

보안 운영을 위한 클라이언트 측 구성 - Thrift 게이트웨이는 고정 사용자를 사용해 Thrift 클라이언트를 HBase에 인증하는 방법을 설명해요. 대안으로 Thrift 게이트웨이가 클라이언트를 대신해 HBase에 인증하고 프록시 사용자로 HBase에 접근하도록 구성할 수 있어요. 이것은 Thrift 1용 HBASE-11349, Thrift 2용 HBASE-11474에서 구현됐어요.

framed transport를 사용한다면 이 기능을 활용할 수 없어요. 현재 SASL이 Thrift framed transport에서 동작하지 않기 때문이에요.

활성화하려면 다음을 하세요.

  1. 보안 운영을 위한 클라이언트 측 구성 - Thrift 게이트웨이에 설명된 절차에 따라 Thrift가 보안 모드로 실행 중인지 확인하세요.
  2. REST Gateway Impersonation Configuration에 설명된 대로 HBase가 프록시 사용자를 허용하도록 구성되어 있는지 확인하세요.
  3. Thrift 게이트웨이가 실행되는 각 클러스터 노드의 hbase-site.xml에서 hbase.thrift.security.qop 프로퍼티를 다음 세 값 중 하나로 설정하세요.
    • privacy - 인증, 무결성, 기밀성 검사.
    • integrity - 인증 및 무결성 검사
    • authentication - 인증 검사만
  4. 변경 사항을 적용하려면 Thrift 게이트웨이 프로세스를 재시작하세요. 노드에서 Thrift가 실행 중이라면 jps 명령의 출력에 ThriftServer 프로세스가 나열될 거예요. 노드에서 Thrift를 중지하려면 bin/hbase-daemon.sh stop thrift 명령을 실행하고, 시작하려면 bin/hbase-daemon.sh start thrift 명령을 실행하세요.

Thrift 게이트웨이가 doAs 기능을 사용하도록 구성

Thrift 게이트웨이가 클라이언트를 대신해 인증하도록 구성은 Thrift 게이트웨이가 클라이언트를 대신해 HBase에 인증하고 프록시 사용자로 HBase에 접근하도록 구성하는 방법을 설명해요. 이 방식의 한계는 클라이언트가 특정 자격 증명 집합으로 초기화된 후 세션 중에 이 자격 증명을 변경할 수 없다는 것이에요. doAs 기능은 같은 클라이언트로 여러 프린시펄을 가장(impersonate)할 수 있는 유연한 방법을 제공해요. 이 기능은 Thrift 1용 HBASE-12640에서 구현됐지만 현재 Thrift 2에서는 사용할 수 없어요.

doAs 기능을 활성화하려면 모든 Thrift 게이트웨이의 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.regionserver.thrift.http</name>
  <value>true</value>
</property>
<property>
  <name>hbase.thrift.support.proxyuser</name>
  <value>true</value>
</property>

doAs 가장을 사용할 때 프록시 사용자를 허용하려면 모든 HBase 노드의 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hadoop.security.authorization</name>
  <value>true</value>
</property>
<property>
  <name>hadoop.proxyuser.$USER.groups</name>
  <value>$GROUPS</value>
</property>
<property>
  <name>hadoop.proxyuser.$USER.hosts</name>
  <value>$GROUPS</value>
</property>

클라이언트에서 이 기능을 사용하는 방법에 대한 전반적인 아이디어를 얻으려면 demo client를 살펴보세요.

보안 운영을 위한 클라이언트 측 구성 - REST 게이트웨이

모든 REST 게이트웨이에 대해 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hbase.rest.keytab.file</name>
  <value>$KEYTAB</value>
</property>
<property>
  <name>hbase.rest.kerberos.principal</name>
  <value>$USER/[email protected]</value>
</property>

$USER와 $KEYTAB에 대해 각각 적절한 자격 증명과 keytab으로 대체하세요.

REST 게이트웨이는 제공된 자격 증명으로 HBase에 인증해요.

REST API 프린시펄을 사용해 HBase와 상호작용하려면 hbase.rest.kerberos.principal을 acl 테이블에 추가하는 것도 필요해요. 예를 들어 REST API 프린시펄 rest_server에게 관리 권한을 주려면 다음과 같은 명령이면 충분해요.

grant 'rest_server', 'RWCA'

ACL에 대한 자세한 내용은 Access Control Labels (ACLs) 섹션을 참고하세요.

HBase REST 게이트웨이는 게이트웨이에 대한 클라이언트 접근을 위해 SPNEGO HTTP authentication을 지원해요. 클라이언트 접근에 대한 REST 게이트웨이 Kerberos 인증을 활성화하려면 모든 REST 게이트웨이의 hbase-site.xml 파일에 다음을 추가하세요.

<property>
  <name>hbase.rest.support.proxyuser</name>
  <value>true</value>
</property>
<property>
  <name>hbase.rest.authentication.type</name>
  <value>kerberos</value>
</property>
<property>
  <name>hbase.rest.authentication.kerberos.principal</name>
  <value>HTTP/[email protected]</value>
</property>
<property>
  <name>hbase.rest.authentication.kerberos.keytab</name>
  <value>$KEYTAB</value>
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
  <name>hbase.rest.dns.interface</name>
  <value>default</value>
</property>
<property>
  <name>hbase.rest.dns.nameserver</name>
  <value>default</value>
</property>

HTTP용 keytab을 $KEYTAB으로 대체하세요.

HBase REST 게이트웨이는 다양한 'hbase.rest.authentication.type'을 지원해요: simple, kerberos. 또한 Hadoop AuthenticationHandler를 구현해 사용자 정의 인증을 구현하고, 'hbase.rest.authentication.type' 값으로 전체 클래스 이름을 지정할 수 있어요. 자세한 내용은 SPNEGO HTTP authentication을 참고하세요.

REST 게이트웨이 가장 구성

기본적으로 REST 게이트웨이는 가장(impersonation)을 지원하지 않아요. 이전 섹션에서 구성된 사용자로 클라이언트를 대신해 HBase에 접근해요. HBase 서버 입장에서는 모든 요청이 REST 게이트웨이 사용자로부터 오는 것으로 보여요. 실제 사용자는 알 수 없어요. 가장 지원을 켤 수 있어요. 가장을 사용하면 REST 게이트웨이 사용자는 프록시 사용자가 돼요. HBase 서버는 각 요청의 실제 사용자를 알게 돼요. 그래서 적절한 인가를 적용할 수 있어요.

REST 게이트웨이 가장을 켜려면 HBase 서버(masters와 region servers)가 프록시 사용자를 허용하도록 구성하고, REST 게이트웨이가 가장을 활성화하도록 구성해야 해요.

프록시 사용자를 허용하려면 모든 HBase 서버의 hbase-site.xml 파일에 다음을 추가하세요:

<property>
  <name>hadoop.security.authorization</name>
  <value>true</value>
</property>
<property>
  <name>hadoop.proxyuser.$USER.groups</name>
  <value>$GROUPS</value>
</property>
<property>
  <name>hadoop.proxyuser.$USER.hosts</name>
  <value>$GROUPS</value>
</property>

REST 게이트웨이 프록시 사용자를 $USER, 허용된 그룹 목록을 $GROUPS로 대체하세요.

REST 게이트웨이 가장을 활성화하려면 모든 REST 게이트웨이의 hbase-site.xml 파일에 다음을 추가하세요.

<property>
  <name>hbase.rest.authentication.type</name>
  <value>kerberos</value>
</property>
<property>
  <name>hbase.rest.authentication.kerberos.principal</name>
  <value>HTTP/[email protected]</value>
</property>
<property>
  <name>hbase.rest.authentication.kerberos.keytab</name>
  <value>$KEYTAB</value>
</property>

HTTP용 keytab을 $KEYTAB으로 대체하세요.

더 알아보기 (Learn more)