はじめに
小売業者の分析担当者は商品データセットを読む必要がありますが、変更はできないようにしたいとします。ファイルが存在し、ブロックが健全でも、別のユーザーには Permission denied と表示されることがあります。ストレージの健全性とアクセスの認可は、それぞれ「データを利用できるか」「このユーザーにアクセスが許されているか」という異なる問いに答えます。
HDFS は、所有者、グループ、権限ビットで基本的なアクセスを判断します。通常の所有者である labex として作業し、bigdata グループを通じて、準備済みの analyst ユーザーにデータセットを共有します。別の通常ユーザー nobody を、グループ外の人の例として使います。NameNode は hdfs として動作しており、あなたは HDFS のスーパーユーザーではありません。
既存の権限を読み取り、グループに読み取り専用のアクセスを設定し、ディレクトリを通過できない問題を再現します。ここで調べるのは HDFS の権限であり、ローカルの Linux ファイルの権限ではありません。この環境は単純認証の学習用構成で、Kerberos などによる本番環境の安全な認証を実演するものではありません。必要なデータは以前の実験とは独立しています。ターミナルを使用してください。
アクセスのルールを読み取る
このステップでは、非公開のデータセットの所有者、グループ、アクセスモードを確認します。
ローカルのプロジェクトディレクトリから始めます。
cd /home/labex/project
HDFS の -ls -d は、ディレクトリの中身ではなく、ディレクトリ自体の項目を表示します。ディレクトリとファイルをまとめて確認します。
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt
重要なのは、次のモードとユーザー・グループです。サイズや日時は変わります。
drwx------ ... labex labex ... /user/labex/basic-permissions/team
-rw------- ... labex labex ... /user/labex/basic-permissions/team/products.txt
先頭の1文字は対象の種類を表し、d はディレクトリ、- はファイルです。次の9文字は3文字ずつ、所有者、グループ、その他のユーザーに分かれています。r は読み取り、w は書き込み、x は実行を表します。ただし、ディレクトリの x は通過を意味します。ハイフンは、その権限がないことを示します。
ファイルでは、読み取り権限で内容を読み、書き込み権限で内容を変更できます。ディレクトリでは、読み取り権限で名前を一覧表示できます。書き込み権限は、通過権限と組み合わせて、項目の作成や削除を許可します。実行権限は、ディレクトリを通過して名前を指定した子要素にアクセスするためのものです。そのため、ファイルを読むには、ファイル自体だけでなく、そのパス上の権限も必要です。
現在のディレクトリのモードでは、labex にすべてのアクセスがあり、それ以外にはありません。ファイルでは、labex に読み書きが許されています。所有者が読めることを確かめます。
hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
期待されるテキストは次のとおりです。
notebook pen
folder notebook
ローカルへの出力リダイレクトで、最初の一覧を保存します。
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt > /home/labex/project/output/initial-permissions.txt
ファイルが欠けていたり壊れていたりするのではなく、非公開の状態であることが分かりました。次は、対象グループに必要なアクセスだけを与えます。
グループに読み取り専用で共有する
このステップでは、bigdata グループにディレクトリの通過とファイルの読み取りを許可し、分析担当者のアクセスを確認します。
準備済みの labex と analyst は、どちらも bigdata のメンバーです。HDFS の -chgrp は対象のグループを変更します。所有者であり、変更先グループのメンバーでもあるので、HDFS のスーパーユーザーにならずに設定できます。
hdfs dfs -chgrp bigdata /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt
-chmod でモードを設定します。各桁の数字は1組の権限を表し、r=4、w=2、x=1 です。所有者、グループ、その他について、必要な値を足します。
| モード | 所有者 | グループ | その他 |
|---|---|---|---|
ディレクトリの 750 |
読み取り、書き込み、通過 | 読み取りと通過 | アクセス不可 |
ファイルの 640 |
読み取りと書き込み | 読み取り | アクセス不可 |
ディレクトリのモードを設定します。
hdfs dfs -chmod 750 /user/labex/basic-permissions/team
ファイルのモードを設定します。
hdfs dfs -chmod 640 /user/labex/basic-permissions/team/products.txt
次に、実際に分析担当者のユーザーで試します。sudo -u analyst は、このコマンドだけを準備済みの通常ユーザーとして実行します。HDFS クライアントの絶対パスで、同じツールを指定しています。これは別のユーザーのアクセスを試すための操作で、通常のファイル作業を管理者として行うためではありません。
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
同じ2行の商品データが表示されるはずです。グループはディレクトリを通過し、ファイルを読めます。
書き込みも試します。アクセスが許されていれば、-appendToFile はローカルファイルの内容を HDFS ファイルに追記します。/tmp に用意された読み取り専用の試験ファイルには、信頼できるデータセットに入れてはいけない追加ラベルが含まれています。通常の試験用ユーザーが読めるよう、非公開のローカルホームディレクトリの外に置いてあります。これにより、HDFS の書き込み権限だけを切り分けて試せます。次のコマンドは、失敗するのが期待される動作です。
sudo -u analyst /usr/local/bin/hdfs dfs -appendToFile /tmp/labex-hdfs-write-probe.txt /user/labex/basic-permissions/team/products.txt
Permission denied と、書き込みアクセスについての表示を探してください。この失敗こそ望んだ結果です。分析担当者は読めますが、追記はできません。意図的な拒否なので、コマンドの終了ステータスが0以外でも正常です。次のステップへ進んでください。誰でも書き込める状態にすると、この保護が失われます。
ディレクトリの通過権限の問題を調べる
このステップでは、権限ビットを1つ変えてアクセスの失敗を観察し、必要な権限だけを元に戻します。
現在、ファイルはグループに読み取りを許可しています。ディレクトリでグループが名前を一覧表示できても、その中を通過できなくなったらどうなるか予想してください。740 は所有者のアクセスとグループの読み取りを残し、グループの x を取り除きます。
hdfs dfs -chmod 740 /user/labex/basic-permissions/team
同じ分析担当者として、同じファイルを読みます。次のコマンドは、失敗するのが期待される動作です。
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
アクセス拒否のメッセージは、ディレクトリの通過権限が足りないことを示すはずです。ファイルの読み取り権限をさらに加えても直りません。まずパスを通過できる必要があるからです。練習したモードに戻して、ディレクトリのグループの x ビットを復元します。
hdfs dfs -chmod 750 /user/labex/basic-permissions/team
分析担当者が再び読めることを確認します。
sudo -u analyst /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
元の2行が戻るはずです。最後に、共有グループに属さない通常ユーザーで試します。nobody は、この実験の無関係なユーザーとしてだけ使います。次のコマンドは、失敗するのが期待される動作です。
sudo -u nobody /usr/local/bin/hdfs dfs -cat /user/labex/basic-permissions/team/products.txt
この拒否から、グループ共有によってデータセットが公開状態になっていないと分かります。最後の一覧を保存します。
hdfs dfs -ls -d /user/labex/basic-permissions/team /user/labex/basic-permissions/team/products.txt > /home/labex/project/output/final-permissions.txt
結果を読みます。
cat /home/labex/project/output/final-permissions.txt
ディレクトリは drwxr-x---、ファイルは -rw-r----- となり、所有者は labex、グループは bigdata のはずです。最初の非公開のモードと意味を比較してください。権限チェックを無効にしたり 777 にしたりせず、特定のグループに必要な最小限のアクセスを与えました。
まとめ
HDFS の所有者・グループ・その他のモードを読み取り、共有グループを割り当て、ディレクトリとファイルに異なるモードを使いました。実際に別ユーザーで確かめた結果、分析担当者は読めても書き込めず、無関係なユーザーは読めないことが分かりました。
ディレクトリの通過権限を取り除いてから戻すことで、読み取り可能なファイルでも、そのパスを通ってアクセスできない理由を学びました。次のチャレンジでは、同様の共有の問題を独力で見つけて修正します。



