AmbariによるHBaseのケルベロスサポートについて パート1

この記事は、[AMBARI KERBEROS SUPPORT FOR HBASE PART 1](https://hortonworks.com/blog/ambari-kerberos-support-hbase-1/ "AMBARI KERBEROS SUPPORT FOR HBASE PART 1")の翻訳記事です。

# はじめに
HDP(Hortonworks Data Platform)とそのコンポーネントの大半は、ケルベロスベースの認証メカニズムをサポートしています。デフォルトでは、インストールが簡単にできるように認証は無効になっていますが、本番環境や機密データをホスティングしているクラスタでは、ケルベロスベースの認証を有効にすることを強くお勧めしています。ケルベルス認証を有効にする設定やデプロイは困難で時間のかかる作業のように見えるかもしれませんが、Ambariはウィザードを使ったSPN(Service Provider Name)の自動プロビジョニングや、クラスタ全体へのKeytabファイルの配布等を自動的に行なってくれるため、非常にシンプルに設定することができます。

これは、管理者と開発者のために、HDPクラスタのケルベルス認証を有効にすることを説明した初めてのブログ記事です。本記事では、まず、Hadoopクラスタ(HDFS + YARN)において、どのようにケルベロスを有効にするかを説明します。そして次回以降の記事で、HBaseのケルベロス対応について説明していきます。

# ケルベロス認証とは

ケルベロス認証とは、信頼できないネットワークと信頼できるホストを前提としたネットワーク認証プロトコルです。以下は、本記事や今後の記事でよく使われる用語です。

* Key Distribution Center (KDC)
* Ticket Granting Ticket (TGT)
* Service Principal Name (SPN)
* Keytabファイル

# ケルベロス認証を有効にする

まずは、ケルベロスのKDCサーバーをインストールするところから始めます。もし、既にKDCサーバーをインストールしているなら、その管理者クレデンシャルを使うこともできます。

## ケルベロスKDCサーバーのインストール

```
$> sudo yum -y install krb5-server
```

## ケルベロスKDCサーバーの設定

KDCデータベースを初期化してドメインを作成する前に、KDCにレルム（ドメイン）名を設定する必要があります。 
以下のファイルを編集する必要があります。

1. /etc/krb5.conf
2. /var/kerberos/krb5kdc/kdc.conf
3. /var/kerberos/krb5kdc/kadm5.acl

今回はAmbariと同じノードにKDCがインストールされているものとします。

![HBaseSec02-600x190.png](https://qiita-image-store.s3.amazonaws.com/0/8576/cd53ea8a-885c-bd2e-09f8-5936877a1871.png)

以下、編集内容になります。
(元記事では編集部分がハイライト表示されていますが、やり方がわからなかったためそれをしていません。)

```
$>cat /etc/krb5.conf
#
[libdefaults]
     default_realm = YOUR_DOMAIN.COM
     default_tkt_enctypes = DES-CBC-CRC
     default_tgs_enctypes = DES-CBC-CRC
     ccache_type = 2
[realms]
     YOUR_DOMAIN.COM = {
     kdc = kdc.your_domain.com:88
     admin_server = admin.your_domain.com:749
     }
[domain_realm]
     .your_domain.com = YOUR_DOMAIN.COM
     your_domain.com = YOUR_DOMAIN.COM
[logging]
     kdc = FILE:/var/adm/krb5kdc.log
     admin_server = FILE:/var/log/kadmin.log
     default = FILE:/var/log/krb5lib.log
$>cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_ports = 88
    kdc_tcp_ports = 88

[realms]
    YOUR_DOMAIN.COM = {
        kdc_ports = 88
        admin_keytab = /etc/kadm5.keytab
        database_name = /var/kerberos/krb5kdc/principal
        acl_file = /var/kerberos/krb5kdc/kadm5.acl
        key_stash_file = /var/kerberos/krb5kdc/stash
        max_life = 10h 0m 0s
        max_renewable_life = 7d 0h 0m 0s
        master_key_type = des3-hmac-sha1
        supported_enctypes = arcfour-hmac:normal des3-hmac-sha1:normal 
des-cbc-crc:normal des:normal des:v4 des:norealm des:onlyrealm des:afs3
        default_principal_flags = +preauth
    }

$>cat /var/kerberos/krb5kdc/kadm5.acl
*/admin@YOUR_DOMAIN.COM  *
```

より詳細に知りたい方は、以下の記事を参照してください。

https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_security/content/install-kdc.html

設定の変更が終わったら、ケルベロスのデータベースの初期化をしましょう。

※ もし、ランダムな数値を生成するためのシステムエントロピーが小さかった場合、この初期化は時間がかかります。`rngd –r /dev/urandom –o /dev/random –b`このコマンドはこの処理をスピードアップしてくれます(rng-toolsがインストールされている必要があります)。

```
$> sudo /usr/sbin/kdb5_util create -s
```

マスターのパスワードをセットアップします(そして、安全な場所に保存しておきましょう)。

```
$> sudo /usr/sbin/kadmin.local -q “addprinc admin/admin”
```

さらに、管理者プリンシパルを作成します(先ほどと同様にパスワードは安全な場所に保存しましょう。このパスワードはAmbariでのインストール時に必要になります)。

```
$> sudo service krb5kdc start

$> sudo service kadmin start
```

# Ambariでケルベロス認証を有効にする

まず、AmbariのWebUIで、"Admin"タブをクリックし"Kerberos"を選択します。

![HBaseSec01-1024x174.png](https://qiita-image-store.s3.amazonaws.com/0/8576/41b20fbc-25c8-faf1-6f79-486438c3321e.png)

この新しいクラスタにはデータがないため、"Proceed Anyway"をクリックします。

![HBaseSec02-600x190.png](https://qiita-image-store.s3.amazonaws.com/0/8576/8b9b8b5c-e58f-b9fe-8010-ce23e7650429.png)

※ もし既存のクラスタに対して行う場合は、動いているジョブを停止してください。

もう既に前のステップでKDCをインストールし管理者プリンシパルを作成しています。JCEは、イメージベーキングプロセスの一環として、すべてのマシンに導入されています。もし、Active Directoryを使っている場合は[このブログ記事](http://hortonworks.com/blog/enabling-kerberos-hdp-active-directory-integration/)を参照してください。

次に、KDCを配備する際に作成した管理者プリンシパルと、KDC（ここではAmbariサーバー）のレルムと場所等を追加します。


その後、「Test KDC Connection」をクリックしてKDCに接続できることを確認し、「次へ」をクリックします。 Kerberosクライアントのインストールが完了したら、[OK]をクリックします。

![HBaseSec04-1024x559.png](https://qiita-image-store.s3.amazonaws.com/0/8576/67f71ec5-2574-643b-b1e7-aaca2cd00665.png)

その後、ウィザードに従って残りのケルベロスの設定を完了します。

![HBaseSec05-1024x420.png](https://qiita-image-store.s3.amazonaws.com/0/8576/a58438c9-8c44-73ee-4e19-6de460347c2f.png)

ここでは、セットアップを確認できます。

![HBaseSec06-1024x598.png](https://qiita-image-store.s3.amazonaws.com/0/8576/2616a6ba-e470-ed20-b897-fc58b8399af9.png)

完了したら、Ambari上で以下のように表示され、「Kerberos security is enabled」と表示されます。

![HBaseSec08-1024x645.png](https://qiita-image-store.s3.amazonaws.com/0/8576/f164f8e9-793d-1d79-1b6b-c2197ccd2d19.png)

より詳細についてを知りたい方は、下記の公式ドキュメントを参照してください。

https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.2/bk_security/content/_launching_the_kerberos_wizard_automated_setup.html

次に、Ambariのトップ画面へ行き、すべての設定変更が必要なサービスを再起動します。

これで、クラスタのケルベロス化が完了しました。次のステップはケルベロス認証がちゃんと有効になっているかの確認です。

Ambariサーバにssh等でログインし、下記のようにkeytabファイルを確認できます。

```
[centos@ambud-hdp-3 ~]$ ls -lh /etc/security/keytabs/
total 16K
-rw——-. 1 root      root   393 Dec 22 19:50 ambari.server.keytab
-r–r—–. 1 hdfs      hadoop 348 Dec 22 19:50 hdfs.headless.keytab
-r–r—–. 1 ambari-qa hadoop 373 Dec 22 19:50 smokeuser.headless.keytab
-r–r—–. 1 root      hadoop 463 Dec 22 19:50 spnego.service.keytab
```

それでは、ケルベロス認証がきちんとアクティブになっているかを確認してみましょう。TGTを持っていない状態では、HDFSを使うためのクレデンシャルを持っていないので、認証が失敗し、以下のようにコマンドが失敗します。

```
[centos@hdp ~]$> sudo -u hdfs hdfs dfs -ls /
16/12/22 19:56:26 WARN ipc.Client: Exception encountered while connecting to the server :
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
```

それでは、TGTを取得し、再度HDFSコマンドを実行してみます。

```
$> kinit hdfs-user_local –t /etc/security/keytabs/hdfs.headless.keytab

$> hdfs dfs –ls /
```

もし、ファイルの一覧が表示されたら、ケルベロス認証がきちんと有効になっているということになります。

これに続くパートでは、HBaseクラスタにおいてどのように認証を有効にするかをについてと、そのクラスタにどのようにプログラム的にアクセスするかを議論していきたいと思います。