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

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

HDFSでアクセス制御リスト(ACL)を設定する

6日目です。
昨日のブログでHDFSの拡張属性を紹介しましたが、当初の予定はACLがメインででした。ところがCloudera Quickstart VM 5.2の思わぬ罠にハマってしまい、トラブルシュートに延々と時間を費やしたあげくに、結局はつまらないミスだったという、、、皆さんもご注意くださいね。(顛末に興味があればこちら
さて、Hadoop 2.5.0ではHDFSに拡張属性が追加され、ファイルやディレクトリに拡張属性が設定できるようになりました(HDFS-2006)。実はその前に、Hadoop 2.4.0から、HDFS上のファイルやディレクトリへのアクセス制御ができるようになっています。(HDFS-4685)。

アクセス制御リストと拡張属性

アクセス制御リストはユーザーが指定するもので、所有者、グループ、その他のユーザーに対し、パーミッションよりも柔軟なアクセス制御を行うことができます。
それに対して拡張属性は様々な用途に使用でき、例えばLinuxでは、拡張属性のsecurity名前空間をSELinuxのために使用しています。拡張属性はHDFS内部で利用され、ユーザーが直接拡張属性を使用することはあまりないでしょう)

HDFSでのACL

HDFSの権限に関するドキュメントはHDFS Permission Guideです。(日本語に翻訳されている資料は多分ないです)。基本的にはLinuxで設定するのと同じようにACLが設定できるので、慣れている方は簡単でしょう。

hdfs dfs -getfaclと-setfacl

コマンドだけざっと日本語に翻訳してみました。

  • hdfs dfs -getfacl [-R] <path> ファイルとディレクトリのアクセス制御リスト(ACL)を表示する。ディレクトリがデフォルトのACLを持っている場合、getfaclはデフォルトのACLも表示する
  • hdfs dfs -setfacl [-R] [-b|-k -m|-x <acl_spec> <path>]|[--set <acl_spec> <path>] ファイルとディレクトリのアクセス制御リストをセットする
  • hdfs dfs -ls <args> ファイルかディレクトリにACLを持っている場合、lsの出力パーミッションの文字列に '+' 文字を追加して表示するこれらのコマンド完全な詳細は File System Shell のドキュメントを参照

Apache Sentry

Spark, SQL on Hadoop etc. Advent Calendar 2014の5日目に、Apache Sentryで始めるアクセス制御 (Hive編)というブログが公開されています。Apache SentryではHiveやImpalaで使用するテーブルにアクセス制御を行うことができるので、HiveやImpala使いはSentryを使うと良いでしょうね。

ACLを設定する

では、あるファイルに対してアクセス制御を設定してみましょう。今回は3人の架空のユーザ (daisuke、shiumachi、tomo)に対して、ingressプロジェクトディレクトリにあるファイルへのアクセス制御を行ってみます。
今、/ingress/umaibo ディレクトリには、以下のファイルがあります。
[shell]
[daisuke@quickstart ~]$ hdfs dfs -ls /ingress/umaibo
Found 2 items
-rw-rw—- 1 daisuke coe 14 2014-12-06 02:56 /ingress/umaibo/normal.dat
-rw-rw—- 1 daisuke coe 29 2014-12-06 02:56 /ingress/umaibo/secret.dat
[/shell]
secret.datにACLを設定して、ユーザごとに権限を変えてみます。

  • daisukeは読み書きできる
  • shiumachiは読み書きできない
  • tomoは読み込みのみが可能

[shell]
[daisuke@quickstart ~]$ hdfs dfs -setfacl -m user:shiumachi:— /ingress/umaibo/secret.dat
[daisuke@quickstart ~]$ hdfs dfs -setfacl -m user:daisuke:rw- /ingress/umaibo/secret.dat
[daisuke@quickstart ~]$ hdfs dfs -setfacl -m user:tomo:r– /ingress/umaibo/secret.dat
[daisuke@quickstart ~]$ hdfs dfs -setfacl -m group::— /ingress/umaibo/secret.dat
[/shell]
ファイル一覧をしてみると、secret.datファイルの右側に ‘+’ 記号が表示されていることがわかります。
[shell]
[daisuke@quickstart ~]$ hdfs dfs -ls /ingress/umaiboFound 2 items
-rw-rw—- 1 daisuke coe 14 2014-12-06 02:56 /ingress/umaibo/normal.dat
-rw-rw—-+ 1 daisuke coe 29 2014-12-06 02:56 /ingress/umaibo/secret.dat
[/shell]
getfaclでファイルの情報を取得してみましょう。
期待通りに設定されています。
[shell]
[daisuke@quickstart ~]$ hdfs dfs -getfacl -R /ingress/umaibo/# file: /ingress/umaibo
# owner: daisuke
# group: coe
user::rwx
group::rwx
other::—
# file: /ingress/umaibo/normal.dat
# owner: daisuke
# group: coe
user::rw-
group::rw-
other::—
# file: /ingress/umaibo/secret.dat
# owner: daisuke
# group: coe
user::rw-
user:daisuke:rw-
user:shiumachi:—
user:tomo:r–
group::—
mask::rw-
other::—
[/shell]
さて、shiumachiはファイルを見ることができるのでしょうか?
[shell]
[shiumachi@quickstart ~]$ hdfs dfs -ls /ingress/umaibo
Found 2 items
-rw-rw—- 1 daisuke coe 14 2014-12-06 02:56 /ingress/umaibo/normal.dat
-rw-rw—-+ 1 daisuke coe 29 2014-12-06 02:56 /ingress/umaibo/secret.dat
[shiumachi@quickstart ~]$ hdfs dfs -cat /ingress/umaibo/normal.dat
Impala desu!!
[shiumachi@quickstart ~]$ hdfs dfs -cat /ingress/umaibo/secret.dat
cat: Permission denied: user=shiumachi, access=READ, inode="/ingress/umaibo/secret.dat":daisuke:coe:-rw-rw—-:user:daisuke:rw-,user:shiumachi:—,user:tomo:r–,group::—
[/shell]
上記のように、normal.datファイルは表示できましたが、secret.datは表示できません。
(エラーの結果から、user=shiumachi Permission deniedになっていることがわかりますね。明らかな村八分…ヒドい…)
tomoはどうでしょうか?
[shell]
[tomo@quickstart ~]$ hdfs dfs -cat /ingress/umaibo/secret.dat
This is securet file. HAHAHA
[/shell]
正しく表示できました。
このようにしてファイルやディレクトリにACLを設定することで、通常の権限よりも柔軟に設定できますね。

HueでACL

Hadoopの標準的なGUIであるHueを使えば、グラフィカルにACLを設定、表示できます。
ACLssecret_datこれは便利。最初からHueでやれば良かったw。
ちなみにHueではApache Setnryの設定も可能です。
Hue_sentryHueからSentryを設定するブログは、週末のこの時間でも世界中のトラブルを解決している @d1ce_ 氏が書いてくれるに違いない♪
 
 
 

コメント