TT Lab
はじめる
学ぶ 学習パス コース

Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する

財務フォルダーを一つのチームだけに開き、別の人には読み取りだけを与える

TT Labで続きを見る

目標

財務フォルダーをaliceとfinanceグループだけが使えるようにロックし、bobが拒否されるのを見たあと、ACLでbobに読み取りだけを開きます。デフォルトACLで新しいファイルにもその権限が引き継がれるようにし、全員が使うフォルダーで他人のファイルを削除できないようにするスティッキービットを試します。最後に、シンプル認証が何を信じるのかを整理します。

なぜ重要なのか

HDFSの権限モデルは、POSIXとほぼ同じです。ファイルとディレクトリごとに所有者・グループ・権限ビットがあり、ディレクトリの中を見るには、そのディレクトリの実行(x)権限が必要です。違うのは、誰が誰であるかを誰が決めるかです。デフォルト設定(シンプル認証)では、NameNodeはクライアントが送ったユーザー名をそのまま信じます。HADOOP_USER_NAME=rootの1行で、誰でもスーパーユーザーです。このラボでユーザーを切り替えながら試せるのも、そのためです。 そのため、権限ビットとACLは「誤って他人のデータに触れないようにするフェンス」であり、セキュリティの境界ではありません。セキュリティの境界が必要なら、Kerberosで認証を強制する必要があります。 フェンスとしての権限は、それでも重要です。チームごとにフォルダーを分け、ほかのチームには必要な分だけACLで開き、全員が使う一時フォルダーには、スティッキービットをかけて他人のファイルを削除できないようにします。デフォルトACLをかけないと、新しくできるファイルには権限が引き継がれず、「昨日はできたのに、今日のファイルではできない」という問い合わせが来ます。

ステップ

  1. /proj/financeをrootで作成し、所有者をalice:finance、権限を750にしてください。
  2. HADOOP_USER_NAME=aliceで/data/finance/q1.csvをアップロードしてください(アップロード先: /proj/finance/)。
  3. HADOOP_USER_NAME=bobで、/proj/finance/q1.csvを-catしてみて、エラー出力を、/root/hdp/perm/bob_denied.txtに保存してください。
  4. aliceでbobにACLを与えてください。/proj/financeにはuser:bob:r-x、/proj/finance/q1.csvにはuser:bob:r--です。
  5. bobでq1.csvを読んで行数を数え、/root/hdp/perm/bob_lines.txtに整数で記入してください。
  6. /proj/financeに、aliceでデフォルトACLdefault:user:bob:r--をかけ、/data/finance/q2.csvをアップロードしてください(アップロード先: /proj/finance/)。新しいファイルにbobのACLが引き継がれている必要があります。
  7. /proj/sharedをrootで作成して1777(スティッキービット)にし、aliceで/data/finance/q1.csvを、/proj/shared/alice-q1.csvとしてアップロードしたあと、bobでそれを-rm -skipTrashしてみて、エラー出力を、/root/hdp/perm/sticky.txtに保存してください。
  8. /root/hdp/perm/report.mdに、## 소유자와 권한・## ACL・## 단순 인증의 한계の3つの節を書いてください(見出しは韓国語で、順に「所有者と権限」「ACL」「シンプル認証の限界」を意味します)。2つ目の節にステップ5の行数を、3つ目の節にHADOOP_USER_NAMEとKerberosを入れてください。

参考

チームフォルダーをロックする

/proj/financeをrootでHDFSに作成し、hdfs dfs -chown alice:financeとhdfs dfs -chmod 750を適用してください。

750は、所有者rwx、グループr-x、その他---です。所有者を変えるchownは、スーパーユーザーしかできません。そのため、rootで行います。

aliceでアップロードする

HADOOP_USER_NAME=alice hdfs dfs -put /data/finance/q1.csv /proj/finance/で、aliceにファイルをアップロードさせてください。

シンプル認証では、環境変数1つでユーザーが変わります。新しいファイルの所有者はアップロードしたユーザー、グループは親ディレクトリのグループに従います(BSDルール)。-lsで確認してください。

bobは拒否される

HADOOP_USER_NAME=bob hdfs dfs -cat /proj/finance/q1.csvを実行してみて、標準エラー出力を、/root/hdp/perm/bob_denied.txtに保存してください。

拒否メッセージには、誰が(user=)、何をしようとして(access=)、どのinodeで止められたか(inode=)がすべて入っています。ファイルの読み取りではなく、ディレクトリの実行権限で止められたことを見てください。入れなければ、中のファイルは見えません。

ACLで1人にだけ開く

aliceで、/proj/financeにuser:bob:r-xを、/proj/finance/q1.csvにuser:bob:r--のACLを与えてください(hdfs dfs -setfacl -m)。

権限ビットでは、「所有者・グループ・その他」の3つしか表現できません。ACLは、名前付きのユーザーとグループを加えます。ディレクトリには実行(x)が必要で、初めて中のファイルに到達できます。ACLを変更するのは、所有者(またはスーパーユーザー)の仕事です。

これでbobが読める

HADOOP_USER_NAME=bobで、/proj/finance/q1.csvを-catして行数を数え、/root/hdp/perm/bob_lines.txtに整数で記入してください。

ACLがあるファイルの権限チェックは、名前付きユーザーのエントリとマスクを合わせて見ます。-getfaclの#effective:の表示が、実際に適用される権限です。

デフォルトACL(新しいファイルにも引き継ぐ)

aliceで、/proj/financeにデフォルトACLdefault:user:bob:r--をかけ、HADOOP_USER_NAME=aliceで/data/finance/q2.csvをアップロードしてください(アップロード先: /proj/finance/)。新しいファイルq2.csvに、user:bob:r--が引き継がれている必要があります。

デフォルトACLはディレクトリにだけかけられ、その下に新しく作られるものにコピーされます。すでにあるq1.csvには遡って適用されません。デフォルトACLをかけると、新しいファイルのその他(other)の権限もデフォルトACLに従うことを、-getfaclで見てください。

スティッキービット(全員のフォルダーで他人のファイルを守る)

/proj/sharedをrootで作成してhdfs dfs -chmod 1777にし、aliceで/data/finance/q1.csvを、/proj/shared/alice-q1.csvとしてアップロードしたあと、HADOOP_USER_NAME=bob hdfs dfs -rm -skipTrash /proj/shared/alice-q1.csvのエラー出力を、/root/hdp/perm/sticky.txtに保存してください。

777のディレクトリでは、誰でも誰のファイルでも削除できます(削除はディレクトリの書き込み権限なので)。スティッキービットがあれば、ファイルの所有者とディレクトリの所有者だけが削除できます。/tmpがそうなっている理由です。

フェンスと錠前を区別して書き残す

/root/hdp/perm/report.mdに、## 소유자와 권한・## ACL・## 단순 인증의 한계の3つの節を書いてください(見出しは韓国語で、順に「所有者と権限」「ACL」「シンプル認証の限界」を意味します)。2つ目の節にステップ5の行数を、3つ目の節にHADOOP_USER_NAMEとKerberosを入れてください。

3つ目の節が核心です。このラボでユーザーを切り替えた方法が、本番で何を意味するのか、そのため本番のクラスターには何が必要なのかを書いてください。