権限・ユーザ・グループを扱う
目標
ユーザーとグループを作り、共有ディレクトリに必要な特殊ビットを掛け、権限が期待どおりかを自分で点検するスクリプトまで作ります。
なぜ重要なのか
権限の事故の大半は、「ファイルの権限」だけを見て「ディレクトリの権限」を忘れることから起きます。ファイルを消すのに必要なのは、そのファイルへの書き込み権限ではなく、そのファイルが入っているディレクトリへの書き込み権限です。そのため読み取り専用のファイルでも他人に消すことができ、Unix はその穴をふさぐために sticky ビットを別に用意しました。同じ理由で、複数人が使うディレクトリには setgid が必要です。掛けないと、各自が自分の基本グループでファイルを作り、お互いに読めない状況が繰り返されます。
ステップ
/root/secret.txtを作り、権限を600にしてください。student1ユーザーを作ってください。devsグループを作り、student1をそのグループに入れてください(既存のグループは維持)。/root/shared/report.txtを作り、所有者:グループをstudent1:devsに変更してください。/root/sharedディレクトリのグループをdevsにし、権限を2770にしてください。/root/shared/incomingディレクトリを作り、権限を1777にしてください。/root/shared/run.shを作り、権限を750にしてください。/root/shared/checkmode.sh <파일경로> <기대권한>(ファイルパスと期待する権限)を作ってください。実行権限が必要で、権限が一致すれば終了コード 0、異なれば 0 以外のコードで終了しつつ、現在の権限を出力しなければなりません。ファイルがないときも 0 以外のコードでなければなりません。
参考
stat -c %a 파일は8進数の権限だけを出力します。特殊ビットがあれば4桁で出ます。id -nG student1で、ユーザーが属しているグループの一覧を見られます。- よくあるミス1: 3番で
usermod -G devs student1のように-aを外すと、既存の補助グループがすべて消えます。 - よくあるミス2: 5番で
chmod 770だけを行うと、先頭桁の setgid が抜けます。4桁で指定してください。
秘密ファイルの権限をロックする
/root/secret.txt を作り、権限を 600 にしてください。
8進数の3桁は、所有者/グループ/その他の順です。所有者だけが読み書きできるようにするには?
ユーザーを作る
student1 ユーザーを作ってください。
useradd で作成します。id コマンドで確認できます。
グループを作ってユーザーを入れる
devs グループを作り、student1 をそのグループに入れてください(既存のグループは維持)。
groupadd でグループを作り、usermod で補助グループに追加します。-a を外すと既存のグループが消えます。
所有者とグループを変更する
/root/shared/report.txt を作り、所有者:グループを student1:devs に変更してください。
chown は所有者:グループの形式を一度に受け取ります。ファイルが先に存在している必要があります。
共有ディレクトリに setgid を掛ける
/root/shared ディレクトリのグループを devs にし、権限を 2770 にしてください。
8進数4桁のうち、いちばん前の桁が特殊ビットです。グループの継承を担当する値を探してください。
アップロード用ディレクトリに sticky を掛ける
/root/shared/incoming ディレクトリを作り、権限を 1777 にしてください。
/tmp の権限を ls -ld で確認してみてください。同じ形にすれば大丈夫です。
実行スクリプトの権限を整える
/root/shared/run.sh を作り、権限を 750 にしてください。
所有者は読み取り・書き込み・実行、グループは読み取り・実行、その他は何もない組み合わせです。
権限を点検するスクリプトを作る
/root/shared/checkmode.sh <파일경로> <기대권한>(ファイルパスと期待する権限)を作ってください。実行権限が必要で、権限が一致すれば終了コード 0、異なれば 0 以外のコードで終了しつつ、現在の権限を出力しなければなりません。ファイルがないときも 0 以外のコードでなければなりません。
stat -c %a で現在の権限を読み、期待値と比較してください。結果は終了コードで知らせ、不一致のときは現在の権限もあわせて出力します。