LFCS — Linux Foundation認定システム管理者
権限ビット、umask、ACLマスク
目標
8進数とシンボリックモード、umask、特殊ビット、ACLとマスクを、1つのディレクトリの中で順番に設定してみて、その相互作用を目で確認します。
なぜ重要なのか
権限の問題は、「なぜ動かないのか」で始まり、たいていchmod 777で終わります。その習慣が監査で引っかかる理由は単純です。必要なのは1人の例外なのに、全員に扉を開けたからです。3つの欄(所有者・グループ・その他)では表現できない要求が生じたときに、グループを新しく作る代わりにACLを使う判断、そして、複数の人が同じディレクトリにファイルを溜めるときに、setgidでグループを統一する判断が、この領域の核心です。マスクは特に重要です。ACLを正確に付与しても、あとで誰かがchmodを1回かけると、マスクが再計算されて、そのACLが静かに無力になります。getfaclの#effective:の表示を読めるようになっていれば、この状況を5秒で見抜けます。
ステップ
- ディレクトリ
/root/lfcs-perm/を作成し、グループlfcsteamと、ユーザーlfcsone、lfcstwoを作成してください。両方のユーザーが、lfcsteamを補助グループとして持つ必要があります(プライマリグループはそれぞれの個人グループ)。 /root/lfcs-perm/notes.txtを作成し、権限を640、グループをlfcsteamにしてください。/root/lfcs-perm/run.shに任意の内容を入れ、シンボリックモードを使って、権限を750、グループをlfcsteamにしてください。- umaskを
0027に変更したシェルで、/root/lfcs-perm/umask-demo/newfileファイルと/root/lfcs-perm/umask-demo/newdirディレクトリを新しく作成してください。そして、/root/lfcs-perm/umask.txtに、umask=0027、file=<새 파일의 권한>、dir=<새 디렉터리의 권한>の3行を書いてください(プレースホルダーは順に、新しいファイルの権限、新しいディレクトリの権限です)。 /root/lfcs-perm/probeを、root所有・権限4755で作成し、/root/lfcs-perm/tools/ディレクトリを1777で作成してください。/root/lfcs-perm/shared/を、グループlfcsteam、権限2770で作成したあとに、その中にhandoff.txtを作成してください。ファイルのグループが、継承によってlfcsteamになる必要があります。handoff.txtに、lfcsoneはrw-、lfcstwoはr--でACLを付与し、shared/ディレクトリには、lfcsteamグループのdefault ACLをrwxで付与してください。handoff.txtのACLマスクをr--に下げ、/root/lfcs-perm/mask.txtに、lfcsone_effective=<마스크 적용 후 lfcsone 의 실효 권한>の1行を書いてください(プレースホルダーは、マスクを適用したあとのlfcsoneの実効権限です)。
参考
- 特殊ビットは、8進数4桁の先頭の桁です。setuidは4、setgidは2、stickyは1です。
- ステップ6は、順序がすべてです。ビットを設定する前に作成したファイルは、グループを引き継ぎません。
getfaclは、マスクが実際の権限を削るときだけ、#effective:を付けます。- よくある間違い: ACLを付与したあとに
chmodをかけると、グループビットがマスクとして解釈され、ACLが無力になります。
協業用のグループとユーザーの準備
ディレクトリ/root/lfcs-perm/を作成し、グループlfcsteamと、ユーザーlfcsone、lfcstwoを作成してください。両方のユーザーが、lfcsteamを補助グループとして持つ必要があります(プライマリグループはそれぞれの個人グループ)。
両方のユーザーが、チームのグループを補助グループとして持つ必要があります。プライマリグループまでチームのグループにすると、後のステップの継承の実験が、意味を失います。
8進数モードとグループの所有権
/root/lfcs-perm/notes.txtを作成し、権限を640、グループをlfcsteamにしてください。
権限とグループは、別のコマンドです。640は、所有者が読み取り・書き込み、グループが読み取り、その他はなしです。
シンボリックモードで権限を付ける
/root/lfcs-perm/run.shに任意の内容を入れ、シンボリックモードを使って、権限を750、グループをlfcsteamにしてください。
シンボリックモードは、対象(u/g/o/a)、演算子(+/-/=)、権限(r/w/x)を組み合わせます。等号は、残りを消して、指定した値だけを残します。
umaskが初期権限を削る仕組み
umaskを0027に変更したシェルで、/root/lfcs-perm/umask-demo/newfileファイルと/root/lfcs-perm/umask-demo/newdirディレクトリを新しく作成してください。そして、/root/lfcs-perm/umask.txtに、umask=0027、file=<새 파일의 권한>、dir=<새 디렉터리의 권한>の3行を書いてください(プレースホルダーは順に、新しいファイルの権限、新しいディレクトリの権限です)。
ファイルの基準値は666、ディレクトリの基準値は777で、umaskのビットがそこから引かれます。あとでchmodで合わせずに、umaskを変更したシェルで新しく作成してください。
setuidとstickyビット
/root/lfcs-perm/probeを、root所有・権限4755で作成し、/root/lfcs-perm/tools/ディレクトリを1777で作成してください。
特殊ビットは、8進数4桁の先頭の桁です。setuidは4、setgidは2、stickyは1です。setuidは、所有者が誰かが核心です。
setgidの協業ディレクトリ
/root/lfcs-perm/shared/を、グループlfcsteam、権限2770で作成したあとに、その中にhandoff.txtを作成してください。ファイルのグループが、継承によってlfcsteamになる必要があります。
順序が重要です。ディレクトリにビットを設定してグループを合わせたあとに、中にファイルを作成して初めて、継承が起きます。
名前付きユーザーのACLとdefault ACL
handoff.txtに、lfcsoneはrw-、lfcstwoはr--でACLを付与し、shared/ディレクトリには、lfcsteamグループのdefault ACLをrwxで付与してください。
ファイルには個別のユーザーのエントリを、ディレクトリには今後作成されるファイルに引き継がせるエントリを設定します。後者には、別のフラグが必要です。
マスクが実効権限を削る
handoff.txtのACLマスクをr--に下げ、/root/lfcs-perm/mask.txtに、lfcsone_effective=<마스크 적용 후 lfcsone 의 실효 권한>の1行を書いてください(プレースホルダーは、マスクを適用したあとのlfcsoneの実効権限です)。
マスクは、所有者とその他を除くすべてのエントリの上限です。マスクだけを別に指定するエントリの表記があり、下げたあとは、getfaclが実効権限も一緒に表示します。