はじめに
Cloudera Manager Advent Calendar の25日目です。
本番はKerberosを使ってセキュアにしている、という環境も増えていると思いますが、自分で検証用の環境を構築するとなるとKerberosの構成が面倒だったりして手元でセキュアクラスタを構築するということはまだあまりないのかなと思います。
また、Sentryなどがユースケースに合うかを確認したいという場合にも検証のための環境を用意するのが面倒だと二の足を踏むということもあると思います。
今回は動作の検証のためにセキュアクラスタの環境を構築したい、という場合を想定したKerberos化について説明していきます。
principalとパスワードが同じだったりとセキュアクラスタなのにセキュアではない構成なので今回の内容はあくまで動作検証のためのもので本番環境を想定したものではない点は注意してください。
検証環境と前提
- 検証環境は CentOS6.6
- 使用したバージョンは Clouera Manager/CDH 5.5.1
- Cloudera Manager ServerのノードにKDCと認証サーバを構築
- デプロイメントの全ノードが対象になるのでクラスタが一つだけある環境で実施すること
- 作業はrootユーザで実施
- Cloudera Managerのユーザ/パスワードは admin
作業
Linux 側の作業
検証用のKerberos設定スクリプト krb-bootstrap を使ってKDCと認証サーバを構成したあと、各ノードでクライアントのインストール、という流れになっています。
#!/bin/sh
BASE=http://localhost:7180/api/v8
USERNAME="admin"
USERPASS="admin"
nodes=$(curl -X GET -u "$USERNAME:$USERPASS" -i $BASE/hosts | grep hostname | awk -F'"' '{print $4}')
# install KDC/krb5.conf
yum -y install git; git clone https://github.com/daisukebe/krb-bootstrap.git; cd krb-bootstrap; ./configure_krb5.sh
# install client and deply krb5.conf
for i in $(echo $nodes | cut -d' ' -f2-);do ssh $i yum -y install krb5-workstation; scp /etc/krb5.conf $i:/etc ;done
上記が終了すれば用意ができたことになります。
krb-bootstrapスクリプトが何をしているかについてはlink先のReadmeを見てみてください。
Cloudera Manager 側の作業
ここからは設定ウィザードの進め方について説明していきます。
まずはセキュリティメニューを選択します
対象クラスタのEnable Kerberosボタンからウィザードを開始します
前提条件の確認です。前述のLinux側の作業が完了していれば全てチェックして次に進んでください
Kerberos側の設定情報を聞かれますので下記のように設定してください
KDC サーバホスト: Cloudera Manager Serverをインストールしたノードのhostname
Kerberos セキュリティのレルム: HADOOP (krb-bootstrap で指定しているもの)
Linux側の作業内で手動でkrb5.confを配布しているのでチェックしなくても大丈夫です
Adminユーザの情報を下記のように入力してください
ユーザ名: cloudera-scm/admin
パスワード: cloudera
共にkrb-bootstrap で指定している内容です
各サービスで使用する Principalの設定です。変更する必要はありません
こちらも値を変更する必要はありません
クラスタの再起動についてチェックして進んでください
コマンドが実行されていきますので終了まで待ってください
ここまで終了すれば完了の画面が表示されて終了です
ケルベロス化されていればセキュリティから下記のように状況を確認できます。
構築後
Kerberos化されていれば下記のようにOSユーザではなく、kinitで認証したprincipalでコマンドを実行できるようになります。
下記でのhdfs@HADOOPのパスワードはhdfsになります。
[root@n1 ~]# kinit hdfs
Password for hdfs@HADOOP:
[root@n1 ~]# hdfs dfs -ls /user/history
Found 2 items
drwxrwx--- - mapred hadoop 0 2015-12-25 11:17 /user/history/done
drwxrwxrwt - mapred hadoop 0 2015-12-25 11:17 /user/history/done_intermediate
逆にOSのhdfsユーザであってもprincipalとして認証がされなければ下記のようにエラーになることも確認できます。
[root@n1 ~]# sudo -u hdfs hdfs dfs -ls /user/history
15/12/25 15:57:29 WARN security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
15/12/25 15:57:29 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)]
15/12/25 15:57:29 WARN security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "n1.lab.cloudera.com/10.17.81.194"; destination host is: "n1.lab.cloudera.com":8020;
Sentryを使う場合にはこちらが参考になります。
Hive, Impalaを使う場合には是非試してみてください。
(impalaのprincipal は今回の手順では作っていないので検証時には echo "addprinc -pw impala impala" | kadmin.local
などのようにして作ってください)
おわりに
いかがでしたでしょうか。
動くものがあるかどうかで大分敷居が下がると思います。検証環境などでクラスタを構成できる、という場合には是非試してみてください。
下記は参考までにCloudera Manager側の作業をAPIでやってみた例です。
wget https://gist.githubusercontent.com/azurecube/040aa92d8da605e68a28/raw/83218685ab0f8ab16407c53f0e856cb7dc771155/cm_kerberize.sh
bash cm_kerberize.sh
セキュアクラスタのファーストステップ、もしくは検証の敷居が少しでも低くなれば幸いです。