助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3309
問題を開く
ファイルとディレクトリを新規作成した際のデフォルトのパーミッションを、それぞれ「600」と「700」にしたい。適切なコマンドは次のうちどれか。

正解

umask 077

解説

新規に作成されるファイルやディレクトリのデフォルトのパーミッションは、システムのパーミッション初期値を基本とし、それを「umask値」(初期値から削除する権限の設定)で調整して決定されます。
umask値を確認または一時的に変更したい場合は、対象のユーザとしてログインして「umask」コマンドを使用します。
umask値を算出するには、システムのパーミッション初期値(新規ファイルは「666」、新規ディレクトリは「777」)から、「ユーザのカテゴリごと」かつ「各権限ごと」に、削除すべき権限を計算します。

新規ディレクトリのパーミッションを「777」から「700」に調整するumask値は、以下のように算出します。
 所有ユーザの権限   7 (rwx) と 7 (rwx) の差はないため 0
 所有グループの権限  7 (rwx) と 0 (---) の差は rwx のため 7
 その他のユーザの権限 7 (rwx) と 0 (---) の差は rwx のため 7

上記より、適切なumask値は 077 です。

新規ファイルのパーミッションを「666」から「600」に調整するumask値は、以下のように算出します。
なお、新規ファイル用のパーミッション初期値では既に実行権限 1 が削除されているため、umask値の各桁に実行権限 1 を加えても、加えなくても、作成されるパーミッションは同じになります。
 所有ユーザの権限   6 (rw-) と 6 (rw-) の差はないため 0(1でも可)
 所有グループの権限  6 (rw-) と 0 (---) の差は rw のため 6(7でも可)
 その他のユーザの権限 6 (rw-) と 0 (---) の差は rw のため 6(7でも可)

上記より、適切なumask値のうち最も小さな値は 066 ですが、他にも 067, 077 のように、umask値の各桁に実行権限 1 を加えても作成されるパーミッションは同じです。
ファイル作成時とディレクトリ作成時で参照するumask値は共通のため、双方の要件を満たすumask値は「077」です。

したがって正解は
・umask 077
です。

このようにファイル作成時とディレクトリ作成時に参照する、共通するumask値を求める問題の場合、ディレクトリ作成時に参照するumask値のみを算出すれば解くことが出来ます。

umask値に「077」を設定して新規ファイルや新規ディレクトリを作成すると、本問の要件を満たすパーミッションになります。


以下はumaskコマンドの実行例です。
最初にumask値を設定してその確認を行い、その後、新規ファイルと新規ディレクトリを作成してそれらのパーミッションも確認しています。


その他の選択肢については以下のとおりです。
・umask 700
この設定で新規作成すると、ファイルは「066」、ディレクトリは「077」のパーミッションになりますので、誤りです。

・umask 770
この設定で新規作成すると、ファイルは「006」、ディレクトリは「007」のパーミッションになりますので、誤りです。

・umask 047
この設定で新規作成すると、ファイルは「620」、ディレクトリは「730」のパーミッションになりますので、誤りです。

・umask 066
この設定で新規作成すると、ファイルは「600」、ディレクトリは「711」のパーミッションになりますので、誤りです。

参考

[ パーミッション ]
パーミッションとは、ファイルやディレクトリへのアクセス権限を指します。
具体的には「読み取り権」「書き込み権」「実行権」の3種類があります。


パーミッションは、以下3つのユーザのカテゴリごとに個別に設定できます。
・所有ユーザ  (ファイルやディレクトリの所有者。所有グループに所属していても、所有ユーザとしてのパーミッションが優先適用されます)
・所有グループ (そのファイルやディレクトリの所有グループに属するユーザ)
・その他のユーザ(所有ユーザや所有グループに属さないすべてのユーザ)

パーミッションの表現方法には「記号表現」と「数値表現」の2つがあります。


・権限が無い場合については、記号表現では「-」、数値表現では「0」と表されます。
・記号表現では、rwx(または-)をそのまま使用します。ユーザのカテゴリごとに、有する全権限を 3文字で表します。
・数値表現では、ユーザのカテゴリごとに、有する権限の数値を合算して1桁の数値で表します。

たとえば、全てのユーザに「読み取り」「書き込み」「実行」の権限がある場合は、以下のように表現されます。

左から順に「所有ユーザ」「所有グループ」「その他のユーザ」の権限を表しています。
数値表現では、読み取り「4」と書き込み「2」と実行「1」の合算により、全権限のある場合は「7」になります。

実際のシステムでは、以下のように、ユーザのカテゴリに応じたパーミッションが設定されています。

この例のパーミッションでは、「所有ユーザ」に「読み取り(r/4)」と「書き込み(w/2)」の権限、「所有グループ」「その他のユーザ」には「読み取り(r/4)」の権限のみが与えられている、という事が分かります。

[ デフォルトパーミッション と umask値 ]
新規に作成されるファイルやディレクトリのデフォルトのパーミッションは、システムで定められているパーミッションの初期値を基本とし、それを「umask値」で調整することで決定されます。
umask値は、システムのパーミッション初期値から、どの権限を削除するかを定義する設定です。通常「/etc/bashrc」などに設定されており、シェルの起動時にシステムのデフォルト値に戻ります。umask値を「~/.bashrc」などに設定することで、ユーザごとにも指定できます。
umask値は通常、パーミッションと同じく 3桁の数値で表されます。それは「所有ユーザ」「所有グループ」「その他のユーザ」という 3つあるユーザのカテゴリそれぞれに、削除する権限を設定するためです。
なお、一番左に 0 を付加した 4桁形式での指定も可能です(一番左の桁は特殊な意味をもつため 0 固定です)。
もし全ユーザに対してどの権限も削除しない(全権限を許可する)場合は、umask値は 000 です。説明上は 0 とすることもあります。

システムのパーミッション初期値は、新規ファイルは「666」、新規ディレクトリは「777」にあらかじめ設定されています。
新規ファイルはセキュリティ保護の観点から、実行権限「1」が削除された状態で作成されるため、各桁の値は最大でも「6」となります。必要に応じて、ファイル作成後にchmodコマンドを使用して実行権限を付与できます。
一方、新規ディレクトリは(ディレクトリの実行権限が移動権限を意味するため)基本的には実行権限が許可されており、各桁の値は最大「7」です。
つまり、権限を何も削除せずumask値が 0 の場合には、以下のようになります。


ファイルやディレクトリ作成時のパーミッションは、ここからumask値を「ユーザのカテゴリごと」かつ「各権限ごと」に引くことで求められます。
umask値は数値表現ですので、算出も数値表現の規則にもとづいて行います。
・パーミッションの各桁はユーザのカテゴリです。左から順に「所有ユーザ」「所有グループ」「その他のユーザ」です。
・各桁の数値は、権限の合算値です。(読み取り権限 4、書き込み権限 2、実行権限 1 )

例えば、次の例を考えてみましょう。
「所有グループ(中央の桁)について、書き込み(2)と実行(1)を禁止し、読み取り(4)は許可する。
 さらに、その他のユーザ(右の桁)については全ての権限を削除する。」

この場合の 3桁のumask値は、以下を並べて「037」です。
 所有ユーザの権限は何も削除されないので、            左の桁が「0」
 所有グループは書き込みと実行(2+1)の権限が削除されるので、中央の桁が「3」
 その他のユーザは全て(4+2+1)の権限が削除されるので、    右の桁が「7」

実際に「ユーザのカテゴリごと」かつ「各権限ごと」に引いてみると、以下のようになります。
まず記号表現の列を確認すると理解しやすくなります。水色はumask値により削除される権限です。ただし、最終的にumask値を利用するには数値表現の理解も不可欠です。
各桁と各権限が独立していること、そして単純な引き算ではなく赤字で示したような算出が行われることに注意してください。


ファイルを作成した場合のパーミッションは、以下のように算出され「640」になります。
 所有ユーザの権限は   6 (rw) - 0   = 6 (rwx)
 所有グループの権限は  6 (rw) - 3 (wx) = 4 (r) ※ 3にはなりません。読み取り権限が残ります。
 その他のユーザの権限は 6 (rw) - 7 (rwx) = 0   ※ -1にはなりません。

ディレクトリを作成した場合のパーミッションは、以下のように算出され「740」になります。
 所有ユーザの権限は   7 (rwx) - 0   = 7 (rwx)
 所有グループの権限は  7 (rwx) - 3 (wx) = 4 (r)
 その他のユーザの権限は 7 (rwx) - 7 (rwx) = 0

このように、umask値は、ファイルとディレクトリ両方の作成時に適用されますが、設問を解くにはどちらの場合について問われているのかを意識する必要があります。
新規ファイル用のシステムのパーミッション初期値では既に実行権限「1」が削除されています。そのため、umask値の各桁に実行権限を含むかどうかは、新規ファイルのパーミッションには影響がなく、新規ディレクトリのパーミッションにのみ影響を与えます。つまり、umask値の各桁に 0、2、4、6 を使用するか、それとも実行権限「1」を含む 1、3、5、7 を使用するかが影響するのは、新規ディレクトリ作成時のみとなります。

[ umaskコマンド ]
umask値を確認または一時的に変更したい場合は、対象のユーザとしてログインして「umask」コマンドを使用します。

umaskコマンドの書式は以下のとおりです。
 umask [umask値]
コマンドを単体で実行すると、現在のumask値を表示します。
コマンドの引数として新たなumask値を与えて実行すると、そのシェル上でのみumask値を新たな値に変更します。

以下はumaskコマンドの実行例です。
最初にumask値を設定してその確認を行い、その後、新規ファイルと新規ディレクトリを作成してそれらのパーミッションも確認しています。


[ SUID、SGID、スティッキービット ]
通常のパーミッションに特殊な操作制御を加えるためのパーミッションとして、SUID、SGID、スティッキービットの3種類が存在します。
一般的にパーミッションの数値表現は 3桁の数値ですが、これらの特殊なパーミッションが設定されている場合、それを示す 1桁を左に追加し、合計 4桁の数値が用いられます。つまり、千の位を使用することで、特殊なパーミッションの表現や設定を行います。

・SUID(Set User ID)
実行ファイルに設定する事で、そのプログラムをどのユーザが実行しても、プログラムの所有ユーザの権限で実行されます。
設定にはchmodコマンドを使用し、通常のパーミッションの値に4000を加えた値を設定するか、所有ユーザに「s」という権限を追加します(u+s)。
これが設定された代表的なプログラムに「passwd」コマンドがあります。

・SGID(Set Group ID)
実行ファイルに設定する事で、そのプログラムをどのユーザが実行しても、プログラムの所有グループの権限で実行されます。
また、ディレクトリに設定する事で、そのディレクトリ配下に作成したファイルやディレクトリの所有グループは親ディレクトリと同じになります。
設定にはchmodコマンドを使用し、通常のパーミッションの値に2000を加えた値を設定するか、所有グループに「s」という権限を追加します(g+s)。

・スティッキービット
ディレクトリに設定する事で、そのディレクトリに対して書き込み権限を持つユーザでも、自分が所有していないファイルの削除を禁止します。
設定にはchmodコマンドを使用し、通常のパーミッションの値に1000を加えた値を設定するか、その他のユーザに「t」という権限を追加します(o+t)。
これが設定された代表的なディレクトリに「/tmp」ディレクトリがあります。

上に戻る

パーミッションの変更について

公開日 2023/01/23

初歩的かもしれませんが質問失礼いたします。
ファイルのデフォルトのパーミッションについてです。

「パーミッションの表記は各桁が独立して、左から所有ユーザ、所有グループ、その他のユーザを表します。ですのでumask値を引く際も各桁ごとに引きます。」とあります。
666-77は各桁が独立し計算されるので6-7でマイナスの値を取る際もエラーや繰り下げが起こるわけではなく6-7=0となり、666→600となるということでしょうか?
裏を返せば設問の選択肢外ですが、umask 088というコマンドを打っても成立しますでしょうか?

宜しくお願いいたします。

2023/01/23 21:23

問題の解説で紹介されている

666 - マスク値 = ファイルのデフォルトのパーミッション
777 - マスク値 = ディレクトリのデフォルトのパーミッション

パーミッションの表記は各桁が独立して、左から所有ユーザ、所有グループ、その他のユーザを表します。ですのでumask値を引く際も各桁ごとに引きます。

というのは実は正確な説明ではなく、正確には引き算ではなく論理演算(ビットを反転して論理積をとる)を行います。
引き算を使うのは便宜上の説明なので、「6-7はマイナスだから…」のように考え出すと???となります。
ひとまずはそういうものだと覚えておいて、興味がわいたら論理演算について学習してみてください。

裏を返せば設問の選択肢外ですが、umask 088というコマンドを打っても成立しますでしょうか?

umask に指定するのは8進数であり、8進数に8は使えませんので、設定しようとすると

$ umask 088
-bash: umask: 088: octal number out of range

のようにエラーになりますね。


コメント

y ysatoag

2023/01/23 22:06

tnishita2様 早い回答大変ありがとうございます。 まさか単純な引き算ではなく論理演算が根底にあるとは初耳でした。 調べて実際に計算してみると確かに両方ともumask077で700と600と答えが出ました! 2進数にしたときに気づいたのですが、これパーミッションの2進数の値ががそれぞれの所有ユーザ、所有グループ、その他のユーザのrwxに対応していて、01でOnOffの意があるのですね。 とにかくより深い学びと新しい発見がありました。 教えて頂きありがとうございました!

g gomax10

2023/07/29 11:38

自身の理解不足で大変恐縮ですが、質問させていただきます。 当問題の論理演算した結果の過程をご教示いただけますでしょうか。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?