hadoop-logo
ようこそ Tech blogへ!
「これからHadoopを勉強しよう」という方はまず下記のページから

サイトの移行に伴って画像が表示されないなどの不具合が生じています

セキュアなHadoopクラスタ:Cloudera ManagerでのKerberos化

前回はCloudera Managerを使ってCloudera Quickstart VMを利用できるようにしました。今回はKerberosを使用してセキュアなクラスタ化を行います。

セキュア化の背景

Hadoopのメリットの一つはデータを一箇所に溜めておき、そのデータに対して様々なアプローチができることです。(データレイク、と呼ばれることも多い)


参考リンク:データを一箇所に集めることで「データ活用の民主化」が進んだという話
データを一箇所に集めることによってデータの民主化は進みますが、その一方、セキュリティについて考慮することも必要でしょう。例えば以下のようなことが考えられます。

  • 不適切なユーザーからのアクセス(→認証が必要)
  • 重要なデータを誤って消してしまう、または見られてはいけないデータにアクセスができてしまう(→認可が必要)
  • データをどんな風に扱ったかわからない(→監査が必要)
  • データ流出に対する保護(→暗号化が必要)

今回はQuickstart VMをKerberos化し、認証されたユーザーのみが利用できるようにします。

Kerberos?

Hadoopのユーザー認証は、KerberosやActive Directoryを使って行います。ユーザーが認証されれば Apache Sentryなどを利用して、ロールベースの認可を行うこともできます。
Kerberosのセットアップ手順はOSのディストリビューション等により異なります。(例:RHEL6のセットアップ手順: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Smart_Cards/index.html
が、Cloudera Quickstart VMにはKerberos化するためのスクリプトが含まれています。今回の目的はあくまでKerbrorsを利用することなので詳細は割愛しますが、セキュアなHadoopクラスタを運用する場合にはKerberosの知識は必須なのでご注意下さい。

Kerberos化スクリプトを実行

まず、ターミナルからCloudera Managerサービスを停止します。
[code]
[cloudera@quickstart ~]$ sudo /etc/init.d/cloudera-scm-agent stop
Stopping cloudera-scm-agent: [ OK ]
[cloudera@quickstart ~]$ sudo /etc/init.d/cloudera-scm-server stop
Stopping cloudera-scm-server: [ OK ]
[cloudera@quickstart ~]$
[/code]
 
仮想マシンのデスクトップにある「Configure Kerberos」アイコンをダブルクリックします。
ker1(注:手元の環境ではスクリプト実行中に途中で止まってしまうことがありました。Kerberos化する前にスナップショットを取得しておくと良いかもしれません)
ターミナルが開き、セットアップが自動的に行われます。
[code]
[QuickStart] Installing Kerberos…
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
epel/metalink
:
Success! Kerberos is now running. You can enable Kerberos in a Cloudera Manager
cluster from the drop-down menu for that cluster on the CM home page. It will
ask you to confirm that this script performed the following steps:
* set up a working KDC.
* checked that the KDC allows renewable tickets.
* installed the client libraries.
* created a proper account for Cloudera Manager.
Then, it will prompt you for the following details (accept defaults if not
specified here):
KDC Type: MIT KDC
KDC Server Host: quickstart.cloudera
Kerberos Security Realm: CLOUDERA
Later, it will prompt you for KDC account manager credentials:
Username: cloudera-scm/admin (@ CLOUDERA)
Password: cloudera
Press [Enter] to exit…
[/code]
Enterキーを押してセットアップを完了します。
ターミナルからKerberosの確認をしてみましょう。(パスワードはclouderaです)
[code]
[cloudera@quickstart ~]$ klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_501)
[cloudera@quickstart ~]$ kinit cloudera-scm/admin@CLOUDERA
Password for cloudera-scm/admin@CLOUDERA:
[cloudera@quickstart ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_501
Default principal: cloudera-scm/admin@CLOUDERA
Valid starting Expires Service principal
05/06/16 20:40:00 05/07/16 20:40:00 krbtgt/CLOUDERA@CLOUDERA
renew until 05/13/16 20:40:00
[cloudera@quickstart ~]$
[/code]
先ほどCloudera Managerのサービスを停止したので、マシンを再起動するか停止したCloudera Managerの各サービスを起動しておきます。

Cloudera ManagerでKerberosを有効にする

Cloudera Managerを使ったKerberos化の手順はドキュメント化されています。
Enabling Kerberos Authentication Using the Wizard
 
まずCloudera Manager のメニューから、セキュリティを選びます。(管理->セキュリティ)
ker3セキュリティ画面が開きます。
ker4セキュリティインスペクタを実行してみます。
ker5インスペクタの結果を表示
ker6※レルムには注意が必要ですね。
致命的なエラーがなかったので、先ほどの画面から「Kerberosの有効化」ボタンをクリックします。ウィザードが起動するので(今回は全てにチェックを入れて)続行します。
ker7セキュリティインスペクタで提示されたレルムに変更します。
ker8kerb5.confファイルをCloudera Managerから管理できるようにします。
ker9スクリプト実行時に表示されたパスワードを入力します。今回は cloudera-scm/admin@CLOUDERAのパスワードはclouderaですね。
ker10資格情報のインポートです。。しばらく待ちましょう。
ker11
ker12Kerberosのプリンシパルの設定です。特に変更せず続行します。
ker13今回はポートも変更しません。再起動する準備ができたのでチェックボックスにチェックして続行します。
ker14Kerberosの有効化が始まります。しばらく待ちましょう。
ker15
ker18終わったので続行します。おめでとうございます。無事にKerberos化が行われました!完了を押して終了します。

全てのサービスを起動しておく必要はないので、不要なサービスは停止しておいた方が良いかもしれません。

Kerbros化をテストする

現在はclouderaユーザでログインしています。コマンドラインからHDFSにアクセスしてみましょう。失敗すれば成功です(!?)
[code]
[cloudera@quickstart ~]$ hdfs dfs -ls
16/05/10 09:31:56 WARN security.UserGroupInformation: PriviledgedActionException as:cloudera (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)]
16/05/10 09:31:56 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)]
16/05/10 09:31:56 WARN security.UserGroupInformation: PriviledgedActionException as:cloudera (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: "quickstart.cloudera/127.0.0.1"; destination host is: "quickstart.cloudera":8020;
[/code]
Kerberos化スクリプト、およびCloudera Managerがウィザードで設定した中にはclouderaのプリンシパルはありませんでした。(impalaやhueなどのプリンシパルは作成されています。)
kadminコマンドを使ってプリンシパルをリストします。
[code]
[cloudera@quickstart ~]$ kinit cloudera-scm/admin@CLOUDERA
Password for cloudera-scm/admin@CLOUDERA: <cloudera>
[cloudera@quickstart ~]$ kadmin
Authenticating as principal cloudera-scm/admin@CLOUDERA with password.
Password for cloudera-scm/admin@CLOUDERA:
kadmin: list_principals
HTTP/quickstart.cloudera@CLOUDERA
K/M@CLOUDERA
cloudera-scm/admin@CLOUDERA
hbase/quickstart.cloudera@CLOUDERA
hdfs/quickstart.cloudera@CLOUDERA
hive/quickstart.cloudera@CLOUDERA
hue/quickstart.cloudera@CLOUDERA
impala/quickstart.cloudera@CLOUDERA
kadmin/admin@CLOUDERA
kadmin/changepw@CLOUDERA
kadmin/quickstart.cloudera@CLOUDERA
krbtgt/CLOUDERA@CLOUDERA
mapred/quickstart.cloudera@CLOUDERA
oozie/quickstart.cloudera@CLOUDERA
solr/quickstart.cloudera@CLOUDERA
spark/quickstart.cloudera@CLOUDERA
sqoop2/quickstart.cloudera@CLOUDERA
yarn/quickstart.cloudera@CLOUDERA
zookeeper/quickstart.cloudera@CLOUDERA
kadmin:
[/code]
cloudera アカウント用のプリンシパルを追加します。パスワードはclouderaとしてみました。
[code]
kadmin: add_principal cloudera/quickstart.cloudera@CLOUDERA
WARNING: no policy specified for cloudera/quickstart.cloudera@CLOUDERA; defaulting to no policy
Enter password for principal "cloudera/quickstart.cloudera@CLOUDERA":
Re-enter password for principal "cloudera/quickstart.cloudera@CLOUDERA":
Principal "cloudera/quickstart.cloudera@CLOUDERA" created.
[/code]
作成したらkadminを抜けて、kinit、klistします。
[code]
[cloudera@quickstart ~]$ kinit cloudera/quickstart.cloudera@CLOUDERA
Password for cloudera/quickstart.cloudera@CLOUDERA:
[cloudera@quickstart ~]$ klist
Ticket cache: FILE:/tmp/krb5cc_501
Default principal: cloudera/quickstart.cloudera@CLOUDERA
Valid starting Expires Service principal
05/10/16 09:46:04 05/11/16 09:46:04 krbtgt/CLOUDERA@CLOUDERA
renew until 05/17/16 09:46:04
[cloudera@quickstart ~]$
[/code]
先ほど失敗したHDFSにアクセスしてみます。今度は成功しました。
[code]
[cloudera@quickstart ~]$ hdfs dfs -ls
Found 4 items
drwxr-xr-x – cloudera cloudera 0 2016-05-02 20:01 .sparkStaging
drwx—— – cloudera cloudera 0 2016-05-02 18:41 .staging
drwxr-xr-x – cloudera cloudera 0 2016-05-02 18:41 mr.out
-rw-r–r– 1 cloudera cloudera 641020 2016-05-02 18:38 services
[cloudera@quickstart ~]$
[/code]
 
Kerberos化に合わせてYARNの設定を変更する
HDFSにはアクセスできるようになりましたが、MapReduceのジョブを実行すると次のようなエラーになってしまいました。
[code]
[cloudera@quickstart ~]$ hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount services mr.out16/05/10 09:46:54 INFO client.RMProxy: Connecting to ResourceManager at quickstart.cloudera/127.0.0.1:8032
16/05/10 09:46:55 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 20 for cloudera on 127.0.0.1:8020
16/05/10 09:46:55 INFO security.TokenCache: Got dt for hdfs://quickstart.cloudera:8020; Kind: HDFS_DELEGATION_TOKEN, Service: 127.0.0.1:8020, Ident: (HDFS_DELEGATION_TOKEN token 20 for cloudera)
16/05/10 09:46:55 INFO input.FileInputFormat: Total input paths to process : 1
16/05/10 09:46:55 INFO mapreduce.JobSubmitter: number of splits:1
16/05/10 09:46:55 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1462840051143_0003
16/05/10 09:46:55 INFO mapreduce.JobSubmitter: Kind: HDFS_DELEGATION_TOKEN, Service: 127.0.0.1:8020, Ident: (HDFS_DELEGATION_TOKEN token 20 for cloudera)
16/05/10 09:46:55 INFO impl.YarnClientImpl: Submitted application application_1462840051143_0003
16/05/10 09:46:55 INFO mapreduce.Job: The url to track the job: http://quickstart.cloudera:8088/proxy/application_1462840051143_0003/
16/05/10 09:46:55 INFO mapreduce.Job: Running job: job_1462840051143_0003
16/05/10 09:46:58 INFO mapreduce.Job: Job job_1462840051143_0003 running in uber mode : false
16/05/10 09:46:58 INFO mapreduce.Job: map 0% reduce 0%
16/05/10 09:46:58 INFO mapreduce.Job: Job job_1462840051143_0003 failed with state FAILED due to: Application application_1462840051143_0003 failed 2 times due to AM Container for appattempt_1462840051143_0003_000002 exited with exitCode: -1000
For more detailed output, check application tracking page:http://quickstart.cloudera:8088/proxy/application_1462840051143_0003/Then, click on links to logs of each attempt.
Diagnostics: Application application_1462840051143_0003 initialization failed (exitCode=255) with output: main : command provided 0
main : run as user is cloudera
main : requested yarn user is cloudera
Requested user cloudera is not whitelisted and has id 501,which is below the minimum allowed 1000
Failing this attempt. Failing the application.
16/05/10 09:46:58 INFO mapreduce.Job: Counters: 0
[cloudera@quickstart ~]$
[/code]
原因は次のログです。
[code]
Requested user cloudera is not whitelisted and has id 501,which is below the minimum allowed 1000
[/code]
Cloudera Managerの日本語のヘルプによると、最小ユーザーID (min.user.id)は「許可される最小の Linux ユーザー ID です。 他のスーパーユーザーを防ぐために使用されます」とあり、この値が1000になっています。ところがドキュメントにも記載されていますが、ユーザーIDは1000以上である必要があります。
[code]
[cloudera@quickstart ~]$ id
uid=501(cloudera) gid=501(cloudera) groups=501(cloudera),502(default)
[cloudera@quickstart ~]$
[/code]
clouderaユーザーのユーザーIDは501なので、このままではうまく実行できません。Cloudera ManagerのYARNの設定から変更してみます。
セキュリティをクリックし、画面をスクロールして
ker22
ker231000を500に変更し、許可済みシステムユーザー (allowed.system.users)にclouderaを追加します。
ker24保存すると、右上に再起動を促すアイコンが表示されるのでクリックします。
ker25変更箇所が表示され、
ker26「古いサービスの再起動」をクリックします。
ker27クライアント設定も配布しておきましょう。今すぐ再起動を押してサービスを再起動します。
ker28ker29終わったら完了を押します。
無事にサービスが起動していることが確認できたら、先ほど失敗したMapReduceのジョブを実行してみましょう。今度はうまくいきました!
[code]
[cloudera@quickstart ~]$ hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount services mr.out
16/05/10 09:55:06 INFO client.RMProxy: Connecting to ResourceManager at quickstart.cloudera/127.0.0.1:8032
16/05/10 09:55:07 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 21 for cloudera on 127.0.0.1:8020
16/05/10 09:55:07 INFO security.TokenCache: Got dt for hdfs://quickstart.cloudera:8020; Kind: HDFS_DELEGATION_TOKEN, Service: 127.0.0.1:8020, Ident: (HDFS_DELEGATION_TOKEN token 21 for cloudera)
16/05/10 09:55:07 INFO input.FileInputFormat: Total input paths to process : 1
16/05/10 09:55:07 INFO mapreduce.JobSubmitter: number of splits:1
16/05/10 09:55:07 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1462841510360_0001
16/05/10 09:55:07 INFO mapreduce.JobSubmitter: Kind: HDFS_DELEGATION_TOKEN, Service: 127.0.0.1:8020, Ident: (HDFS_DELEGATION_TOKEN token 21 for cloudera)
16/05/10 09:55:08 INFO impl.YarnClientImpl: Submitted application application_1462841510360_0001
16/05/10 09:55:08 INFO mapreduce.Job: The url to track the job: http://quickstart.cloudera:8088/proxy/application_1462841510360_0001/
16/05/10 09:55:08 INFO mapreduce.Job: Running job: job_1462841510360_0001
16/05/10 09:55:16 INFO mapreduce.Job: Job job_1462841510360_0001 running in uber mode : false
16/05/10 09:55:16 INFO mapreduce.Job: map 0% reduce 0%
16/05/10 09:55:22 INFO mapreduce.Job: map 100% reduce 0%
16/05/10 09:55:27 INFO mapreduce.Job: map 100% reduce 100%
16/05/10 09:55:27 INFO mapreduce.Job: Job job_1462841510360_0001 completed successfully
16/05/10 09:55:27 INFO mapreduce.Job: Counters: 49
File System Counters
FILE: Number of bytes read=143653
FILE: Number of bytes written=523593
FILE: Number of read operations=0
FILE: Number of large read operations=0
FILE: Number of write operations=0
HDFS: Number of bytes read=641139
HDFS: Number of bytes written=236073
HDFS: Number of read operations=6
HDFS: Number of large read operations=0
HDFS: Number of write operations=2
Job Counters
Launched map tasks=1
Launched reduce tasks=1
Data-local map tasks=1
Total time spent by all maps in occupied slots (ms)=485120
Total time spent by all reduces in occupied slots (ms)=384384
Total time spent by all map tasks (ms)=3790
Total time spent by all reduce tasks (ms)=3003
Total vcore-seconds taken by all map tasks=3790
Total vcore-seconds taken by all reduce tasks=3003
Total megabyte-seconds taken by all map tasks=485120
Total megabyte-seconds taken by all reduce tasks=384384
Map-Reduce Framework
Map input records=10774
Map output records=58108
Map output bytes=645717
Map output materialized bytes=143647
Input split bytes=119
Combine input records=58108
Combine output records=21848
Reduce input groups=21848
Reduce shuffle bytes=143647
Reduce input records=21848
Reduce output records=21848
Spilled Records=43696
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=117
CPU time spent (ms)=3090
Physical memory (bytes) snapshot=271663104
Virtual memory (bytes) snapshot=1483919360
Total committed heap usage (bytes)=92798976
Shuffle Errors
BAD_ID=0
CONNECTION=0
IO_ERROR=0
WRONG_LENGTH=0
WRONG_MAP=0
WRONG_REDUCE=0
File Input Format Counters
Bytes Read=641020
File Output Format Counters
Bytes Written=236073
[cloudera@quickstart ~]$
[/code]
これでセキュアなHadoopクラスタの第一歩が完了です。

コメント