Linux/Unix chmodコマンド完全ガイド:使い方、意味、設定例


Linux/Unix chmodコマンド完全ガイド:使い方、意味、設定例

はじめに:ファイル権限の重要性とchmodの役割

LinuxやUnix系のオペレーティングシステムにおいて、ファイルやディレクトリの「権限(パーミッション)」は、システムのセキュリティと安定性を維持する上で極めて重要な役割を果たします。誰がファイルを読むことができるのか、誰がファイルの内容を変更できるのか、誰がプログラムを実行できるのか。これらのアクセス制御は、すべてファイル権限によって管理されています。

このファイル権限を設定・変更するために使用されるコマンドが、今回詳細に解説するchmod(チェンジ・モード)コマンドです。chmodは、chown(チェンジ・オウン:所有者変更)やchgrp(チェンジ・グループ:グループ変更)と並び、ファイル管理における基本中の基本と言えるコマンドです。しかし、その機能は非常に奥深く、単に読み書き実行権限を設定するだけでなく、特殊な権限(SetUID, SetGID, Sticky Bit)を設定することで、より高度なアクセス制御やシステム動作の制御も可能になります。

本記事では、chmodコマンドの基本的な使い方から、ファイル権限の仕組み、権限の表現方法(シンボルモードと数値モード)、特殊な権限の設定方法、そして実際の使用例までを、初心者にも理解できるように丁寧に解説します。約5000語の詳細な説明と豊富な例を通じて、chmodコマンドを完全にマスターし、Linux/Unixシステムでのファイル管理能力を向上させることを目指します。

ファイル権限の基本構造

chmodコマンドの詳細に入る前に、まずLinux/Unixにおけるファイル権限の基本的な構造を理解しておきましょう。ファイル権限は、主に以下の3つの要素に対して設定されます。

  1. 所有者(Owner – u): そのファイルやディレクトリを作成したユーザー、またはchownコマンドで所有権を与えられたユーザーです。所有者は通常、そのファイルに対する最も強い権限を持ちます。
  2. グループ(Group – g): そのファイルやディレクトリに紐付けられたグループです。同じグループに属するユーザーは、グループに対して設定された権限を持ちます。これにより、特定のプロジェクトメンバーなど、複数のユーザー間で共通のアクセス権限を管理できます。
  3. その他のユーザー(Others – o): 所有者でもなく、そのファイルに紐付けられたグループにも属さない、システム上のすべてのユーザーです。インターネット経由でのアクセスなども、この「その他のユーザー」の権限で制御されることがあります。

これらの3つの要素(所有者、グループ、その他のユーザー)それぞれに対して、以下の3種類の基本的な権限を設定することができます。

  • 読み取り権限(Read – r): ファイルの内容を読み込むことができる権限です。ディレクトリの場合は、そのディレクトリに含まれるファイルやサブディレクトリの一覧を表示する権限を意味します(ただし、内容にアクセスするには実行権限も必要)。
  • 書き込み権限(Write – w): ファイルの内容を書き換えたり、削除したりすることができる権限です。ディレクトリの場合は、そのディレクトリ内に新しいファイルやサブディレクトリを作成したり、既存のファイルやサブディレクトリの名前を変更・削除したりすることができる権限を意味します。
  • 実行権限(Execute – x): ファイルをプログラムとして実行することができる権限です。ディレクトリの場合は、そのディレクトリ内に移動したり、そのディレクトリ内のファイルにアクセスしたりするための権限を意味します。ディレクトリに対する実行権限がないと、たとえ読み取り権限があっても、そのディレクトリの中に入ったり、中のファイル名を知ったりすることはできません。

これらの権限は、通常、ls -lコマンドを使って確認することができます。ls -lコマンドの出力は以下のようになります。

bash
$ ls -l my_file.txt my_directory
-rw-r--r-- 1 user group 1024 Jan 1 10:00 my_file.txt
drwxr-xr-x 2 user group 4096 Jan 1 10:00 my_directory

出力の最初の10文字が権限情報を表しています。

  • 1文字目: ファイルの種類を示します。-は通常ファイル、dはディレクトリ、lはシンボリックリンクなどを表します。
  • 2~4文字目: 所有者(Owner)に対する権限を示します。左から順に、読み取り(r)、書き込み(w)、実行(x)です。権限があればその文字が表示され、なければ-が表示されます。
  • 5~7文字目: グループ(Group)に対する権限を示します。所有者と同様に、r、w、x、または-が表示されます。
  • 8~10文字目: その他のユーザー(Others)に対する権限を示します。これも同様に、r、w、x、または-が表示されます。

上記の例では:

  • my_file.txtは、所有者には読み取りと書き込み権限(rw-)があり、グループには読み取り権限のみ(r--)があり、その他のユーザーにも読み取り権限のみ(r--)があります。
  • my_directoryは、所有者には読み取り、書き込み、実行権限(rwx)があり、グループには読み取りと実行権限(r-x)があり、その他のユーザーにも読み取りと実行権限(r-x)があります。

この権限の構造を理解することが、chmodコマンドを効果的に使うための第一歩となります。

chmodコマンドの基本構文

chmodコマンドの基本的な構文は以下の通りです。

bash
chmod [オプション] モード ファイル/ディレクトリ...

  • [オプション]: コマンドの挙動を制御するオプションを指定します(後述)。
  • モード: 変更したい権限を指定します。この指定方法には、主にシンボルモード数値(8進数)モードの2種類があります。
  • ファイル/ディレクトリ...: 権限を変更したいファイルまたはディレクトリの名前を1つ以上指定します。

ここからは、権限の指定方法である「モード」について、シンボルモードと数値モードのそれぞれを詳しく見ていきましょう。

モードの指定方法 その1:シンボルモード (Symbolic Mode)

シンボルモードは、権限を文字を使って直感的に指定する方法です。「誰に(u, g, o, a)」、「どうする(+, -, =)」、「何の権限を(r, w, x)」という形式で指定します。

シンボルモードの指定は、以下の3つの要素を組み合わせます。

  1. 対象ユーザー: 権限を変更したい対象を指定します。

    • u: 所有者(user)
    • g: グループ(group)
    • o: その他のユーザー(others)
    • a: 全て(all) – u, g, o の合計です。省略した場合のデフォルトは a ですが、これは = オペレーターを使用した場合のみです。+- を使用し、対象ユーザーを省略した場合は、カレントの umask 設定を考慮した上で u, g, o 全てに適用されます(ただし、umaskで拒否されている権限は設定されません)。混乱を避けるため、通常は a を明示するか、u, g, o のいずれかを指定することが推奨されます。
  2. オペレーター: 指定した権限をどのように変更するかを指定します。

    • +: 指定した権限を追加します。現在の権限に、指定した権限が加わります。
    • -: 指定した権限を削除します。現在の権限から、指定した権限が差し引かれます。
    • =: 指定した権限で置き換えます。指定したユーザーに対し、指定した権限のみを設定し、その他の権限は全て削除されます。これは非常に強力なオペレーターで、既存の権限をリセットして指定したものだけにしたい場合に便利です。
  3. 権限の種類: 設定したい権限の種類を指定します。

    • r: 読み取り権限(read)
    • w: 書き込み権限(write)
    • x: 実行権限(execute)
    • 複数の権限を指定する場合は、続けて記述します(例: rw, rwx)。

シンボルモードの指定は、これらの要素を 対象ユーザー オペレーター 権限の種類 の順で記述します。複数の対象ユーザーや権限の組み合わせを指定する場合は、カンマ (,) で区切って続けて記述します。

例:chmod u+rwx,g+rx,o+r my_script.sh

それでは、具体的な使用例を見ていきましょう。

シンボルモード 使用例

以下の例では、my_file.txt というファイルと my_directory というディレクトリに対して権限変更を行います。これらのファイルやディレクトリが既に存在するものとします。また、変更前の権限は例によって異なる場合があります。

例 1: 所有者に実行権限を追加する

ファイル my_script.sh を作成し、所有者だけが実行できるようにしたい場合。

“`bash
$ ls -l my_script.sh # 変更前を確認
-rw-r–r– 1 user group 0 Jan 1 10:00 my_script.sh

$ chmod u+x my_script.sh # 所有者(u)に実行権限(x)を追加(+)

$ ls -l my_script.sh # 変更後を確認
-rwxr–r– 1 user group 0 Jan 1 10:00 my_script.sh

所有者の権限が -rw- から -rwx に変わった

“`

例 2: グループから書き込み権限を削除する

my_shared_file.txt というファイルがあり、グループメンバーに誤って書き込み権限が付与されている場合。

“`bash
$ ls -l my_shared_file.txt # 変更前を確認
-rw-rw-r– 1 user group 100 Jan 1 10:00 my_shared_file.txt

$ chmod g-w my_shared_file.txt # グループ(g)から書き込み権限(w)を削除(-)

$ ls -l my_shared_file.txt # 変更後を確認
-rw-r–r– 1 user group 100 Jan 1 10:00 my_shared_file.txt

グループの権限が -rw- から -r– に変わった

“`

例 3: その他のユーザーから全ての権限を削除する

my_private_data.txt というファイルがあり、所有者以外には一切アクセスさせたくない場合。

“`bash
$ ls -l my_private_data.txt # 変更前を確認
-rw-r–r– 1 user group 500 Jan 1 10:00 my_private_data.txt

$ chmod o-rwx my_private_data.txt # その他のユーザー(o)から読み取り(r),書き込み(w),実行(x)権限を削除(-)

$ ls -l my_private_data.txt # 変更後を確認
-rw——- 1 user group 500 Jan 1 10:00 my_private_data.txt

その他のユーザーの権限が r– から — に変わった

``
または、より簡単に
= ` オペレーターを使って以下のように指定することもできます。

“`bash
$ ls -l my_private_data.txt # 変更前を確認 (上記と同じ状態と仮定)
-rw——- 1 user group 500 Jan 1 10:00 my_private_data.txt

$ chmod o= my_private_data.txt # その他のユーザー(o)の権限を何もなし(=)で置き換える

$ ls -l my_private_data.txt # 変更後を確認
-rw——- 1 user group 500 Jan 1 10:00 my_private_data.txt

結果は同じ — になります。

``=` オペレーターに何も権限を指定しない場合は、全ての権限が削除されます。

例 4: 所有者以外の全てのユーザー(グループとその他のユーザー)から書き込み権限を削除する

“`bash
$ ls -l my_file.txt # 変更前を確認
-rw-rw-rw- 1 user group 100 Jan 1 10:00 my_file.txt

$ chmod go-w my_file.txt # グループ(g)とその他のユーザー(o)から書き込み権限(w)を削除(-)

$ ls -l my_file.txt # 変更後を確認
-rw-r–r– 1 user group 100 Jan 1 10:00 my_file.txt

グループの権限が -rw- から -r– に、その他のユーザーの権限が -rw- から -r– に変わった

“`

例 5: 全てのユーザーに読み取り権限を追加する

“`bash
$ ls -l my_file.txt # 変更前を確認
–w——- 1 user group 100 Jan 1 10:00 my_file.txt

$ chmod a+r my_file.txt # 全てのユーザー(a)に読み取り権限(r)を追加(+)

$ ls -l my_file.txt # 変更後を確認
-rw-r–r– 1 user group 100 Jan 1 10:00 my_file.txt

所有者は -w- から -rw- に、グループとその他のユーザーは — から r– に変わった

``aを省略して+rとした場合も、umask設定が許せば同じ結果になることが多いですが、a+r` と明示する方が意図が明確です。

例 6: 所有者には読み書き実行権限、グループには読み取りと実行権限、その他のユーザーには読み取り権限のみを設定する(=オペレーター使用)

= オペレーターは、指定したユーザーに対して、指定した権限 のみ を設定し、それ以外の権限は 全て削除 します。現在の権限状態に関わらず、指定した状態に正確にしたい場合に便利です。

“`bash
$ ls -l my_script.sh # 変更前を確認
-rwxrwxrwx 1 user group 0 Jan 1 10:00 my_script.sh # 例として全権限が付与されている状態

$ chmod u=rwx,g=rx,o=r my_script.sh # 所有者(u)をrwxに、グループ(g)をrxに、その他のユーザー(o)をrに置き換える(=)

$ ls -l my_script.sh # 変更後を確認
-rwxr-xr– 1 user group 0 Jan 1 10:00 my_script.sh

所有者は rwx に、グループは r-x に、その他のユーザーは r– になった。

変更前の状態に関わらず、正確に指定した権限に設定された。

“`

シンボルモードは、現在の権限を基準に権限を追加・削除したり、指定した権限で置き換えたりする場合に柔軟に使えます。複数の権限設定をまとめて指定できる点も便利です。

モードの指定方法 その2:数値(8進数)モード (Octal Mode)

数値モードは、各権限(r, w, x)に数値を割り当て、それらを合計して権限を表す方法です。この数値は8進数として解釈されます。

各権限に割り当てられる数値は以下の通りです。

  • r (読み取り): 4
  • w (書き込み): 2
  • x (実行): 1
  • なし: 0

これらの数値を組み合わせて、設定したい権限の合計値を計算します。

  • 読み取りと書き込み (rw): 4 + 2 = 6
  • 読み取りと実行 (rx): 4 + 1 = 5
  • 書き込みと実行 (wx): 2 + 1 = 3
  • 読み取り、書き込み、実行 (rwx): 4 + 2 + 1 = 7
  • 権限なし (—): 0 + 0 + 0 = 0

数値モードでは、この計算結果を所有者グループその他のユーザーの順に3桁の数字として並べて指定します。

例:chmod 755 my_script.sh

この例では:

  • 1桁目の 7 は所有者の権限です。7 = 4(r) + 2(w) + 1(x) なので、所有者には読み取り、書き込み、実行権限 (rwx) が付与されます。
  • 2桁目の 5 はグループの権限です。5 = 4(r) + 1(x) なので、グループには読み取りと実行権限 (r-x) が付与されます。
  • 3桁目の 5 はその他のユーザーの権限です。5 = 4(r) + 1(x) なので、その他のユーザーには読み取りと実行権限 (r-x) が付与されます。

したがって、chmod 755 my_script.sh は、my_script.sh に対して所有者 rwx、グループ r-x、その他のユーザー r-x という権限を設定することになります。これはシンボルモードの chmod u=rwx,g=rx,o=rx my_script.sh と同じ結果になります。

数値モードは、設定したい最終的な権限状態が明確な場合に、一度にまとめて指定できるため非常に便利です。特に、よく使われる権限設定には決まった数値があるため、慣れると素早く入力できるようになります。

よく使われる数値モードの例

  • 777: 所有者、グループ、その他のユーザーの全てに読み書き実行権限 (rwxrwxrwx) を付与します。誰でもどんな操作でもできてしまうため、セキュリティ上のリスクが非常に高い設定です。 安易な使用は避けるべきです。
  • 755: 所有者 rwx、グループ r-x、その他のユーザー r-x。実行可能なプログラムやスクリプト、およびワールドリード可能だが書き込みは所有者のみのディレクトリによく使われます。
  • 700: 所有者 rwx、グループ ---、その他のユーザー ---。所有者以外には一切アクセスを許可しない、非常にプライベートなファイルやディレクトリに使われます。
  • 666: 所有者 rw-、グループ rw-、その他のユーザー rw-。誰でも読み書きできるが実行はできないファイルに使われることがありますが、777と同様にセキュリティリスクが高く、安易には使いません。
  • 644: 所有者 rw-、グループ r--、その他のユーザー r--。所有者のみが読み書きでき、他のユーザーは読み取りのみ可能なファイルによく使われます。設定ファイルのデフォルト権限など。
  • 600: 所有者 rw-、グループ ---、その他のユーザー ---。所有者のみが読み書きでき、他のユーザーは一切アクセスできないファイルに使われます。秘密鍵ファイルなど、機密性の高いファイルに必須の設定です。
  • 400: 所有者 r--、グループ ---、その他のユーザー ---。所有者のみが読み取りでき、他のユーザーは一切アクセスできないファイル。読み取り専用の機密ファイルなど。

数値モード 使用例

以下の例では、数値モードを使って権限変更を行います。

例 1: ファイルに 644 の権限を設定する

my_config.txt というファイルがあり、所有者のみ読み書き可能、その他は読み取りのみにしたい場合。

“`bash
$ ls -l my_config.txt # 変更前を確認
-rw-rw-rw- 1 user group 200 Jan 1 10:00 my_config.txt

$ chmod 644 my_config.txt # 644 を設定

$ ls -l my_config.txt # 変更後を確認
-rw-r–r– 1 user group 200 Jan 1 10:00 my_config.txt

所有者は rw-, グループは r–, その他のユーザーは r– になった。

“`

例 2: ディレクトリに 700 の権限を設定する

my_secret_project というディレクトリがあり、自分(所有者)以外には一切見せたくない場合。

“`bash
$ ls -ld my_secret_project # ディレクトリの権限を確認 (-d オプションを使う)
drwxr-xr-x 2 user group 4096 Jan 1 10:00 my_secret_project

$ chmod 700 my_secret_project # 700 を設定

$ ls -ld my_secret_project # 変更後を確認
drwx—— 2 user group 4096 Jan 1 10:00 my_secret_project

所有者は rwx, グループは —, その他のユーザーは — になった。

“`
ディレクトリに対する実行権限(x, 数値1)は、そのディレクトリの中に入るために必要です。700や755のようにディレクトリに実行権限を与えることは一般的です。ファイルに対する実行権限は、そのファイルをプログラムとして実行する場合にのみ必要です。

例 3: 実行可能なスクリプトに 755 の権限を設定する

run_me.sh というスクリプトファイルを作成し、自分は実行も編集もでき、他の人は実行だけできるようにしたい場合。

“`bash
$ ls -l run_me.sh # 変更前を確認 (例えば作成直後でrw-rw-r–)
-rw-rw-r– 1 user group 50 Jan 1 10:00 run_me.sh

$ chmod 755 run_me.sh # 755 を設定

$ ls -l run_me.sh # 変更後を確認
-rwxr-xr-x 1 user group 50 Jan 1 10:00 run_me.sh

所有者は rwx, グループは r-x, その他のユーザーは r-x になった。

“`

数値モードは、現在の権限状態に関わらず、指定した権限状態に必ず変更したい場合に適しています。シンボルモードのように現在の権限に追加・削除するわけではない点に注意が必要です。

シンボルモードと数値モードの比較

  • シンボルモード:
    • 直感的で分かりやすい (u+x, go-w など)。
    • 現在の権限設定に対して、権限を追加したり削除したりするのに便利。
    • 複数の対象や権限の組み合わせをカンマで区切って指定できる。
    • 特殊な権限を設定する際にも使用可能(後述)。
  • 数値モード:
    • 簡潔に記述できる(3桁または4桁の数値)。
    • 設定したい最終的な権限状態が明確な場合に便利。
    • ファイルタイプ(実行可能かどうか)と権限の対応が数値で把握しやすい。
    • 特殊な権限を設定する際によく使われる(後述)。

どちらのモードを使うかは、状況や個人の好みによります。両方のモードを理解しておくと、様々な状況に柔軟に対応できるようになります。多くのLinuxユーザーは、よく使う権限設定は数値で覚え、それ以外の細かい調整はシンボルモードで行うといった使い分けをしています。

特殊な権限:SetUID, SetGID, Sticky Bit

基本的な読み取り、書き込み、実行権限に加えて、Linux/Unixにはファイルやディレクトリに対して設定できる3種類の特殊な権限があります。これらは通常の3桁の数値モードに、さらに先頭に1桁加えて4桁の数値で表すことができます。シンボルモードでも設定可能ですが、数値モードで指定されることが多いです。

特殊権限は、ls -lコマンドの出力で、所有者の実行権限位置(9文字目)、グループの実行権限位置(10文字目)、その他のユーザーの実行権限位置(11文字目)に、通常の x の代わりに別の文字が表示されることで示されます。

特殊権限 意味 影響する対象 数値 (8進数) ls -l での表示場所と文字
SetUID ファイルを実行する際に、ファイルの所有者の権限で実行される。 ファイル 4000 所有者の実行権限位置 (通常 x の場所) に s (所有者に実行権限があれば) または S (所有者に実行権限がなければ)
SetGID ファイルを実行する際に、ファイルのグループの権限で実行される。 ファイル 2000 グループの実行権限位置 (通常 x の場所) に s (グループに実行権限があれば) または S (グループに実行権限がなければ)
ディレクトリ内に作成される新しいファイルやサブディレクトリが、そのディレクトリのグループを継承する。 ディレクトリ 2000 グループの実行権限位置 (通常 x の場所) に s (グループに実行権限があれば) または S (グループに実行権限がなければ)
Sticky Bit ディレクトリ内で、ファイルやサブディレクトリを削除・名前変更できるのは、そのアイテムの所有者、ディレクトリの所有者、またはrootユーザーのみとなる。 ディレクトリ 1000 その他のユーザーの実行権限位置 (通常 x の場所) に t (その他のユーザーに実行権限があれば) または T (その他のユーザーに実行権限がなければ)
(一部の古いUnixでは、ファイルに設定されるとスワップ領域にファイルの内容が残るよう指定するが、Linuxでは通常ディレクトリにのみ有効) ファイル (稀) 1000 その他のユーザーの実行権限位置に t または T

これらの数値 (4000, 2000, 1000) は、通常の3桁の権限数値(所有者、グループ、その他のユーザー)の先頭に加算して4桁の数値モードを構成します。

例:chmod 4755 my_program

  • 先頭の 4 は SetUID を意味します。
  • 続く 755 は通常の権限です。所有者 rwx (7)、グループ r-x (5)、その他のユーザー r-x (5)。

この設定の結果、ls -l my_program の出力は -rwsr-xr-x のようになります。所有者の実行権限位置 (x) が s に変わっています。これは、所有者自身には実行権限があり、かつ SetUID が設定されていることを意味します。もし所有者に実行権限がなく SetUID だけが設定されている場合は、S と表示されます。

SetUID (Set User ID)

  • 対象: ファイルのみに有効です。(ディレクトリに設定しても多くのシステムでは無視されます)
  • 目的: SetUIDが設定された実行可能ファイルは、そのファイルの所有者の権限で実行されます。これは、一般ユーザーがroot権限でしか実行できない操作を含むプログラム(例: passwdコマンド)を使用できるようにするために利用されます。passwdコマンドは/etc/shadowという、通常rootだけが書き込めるファイルにパスワード情報を書き込みます。SetUIDが設定されているため、一般ユーザーがpasswdを実行すると、rootの権限で/etc/shadowを書き換えることができるのです。
  • ls -lでの表示:
    • 所有者に実行権限(x)があり、SetUIDが設定されている場合: s (例: -rwsr-xr-x)
    • 所有者に実行権限がなく(-)、SetUIDが設定されている場合: S (例: -rwSr--r--)
  • 数値モード: 先頭に 4 を加えます。
  • シンボルモード: u+s で SetUID を設定し、u-s で解除します。

SetUID 使用例

例 1: my_root_tool というプログラムに SetUID を設定する (所有者は root と仮定)

“`bash
$ ls -l my_root_tool # 変更前を確認 (例えば root が所有し 755 の権限)
-rwxr-xr-x 1 root root 10000 Jan 1 10:00 my_root_tool

$ chmod 4755 my_root_tool # SetUID (4) と通常の 755 権限を設定

$ ls -l my_root_tool # 変更後を確認
-rwsr-xr-x 1 root root 10000 Jan 1 10:00 my_root_tool

所有者の実行権限位置が x から s に変わった。

``
これで、一般ユーザーが
my_root_tool` を実行すると、rootの権限で実行されるようになります。

例 2: SetUID をシンボルモードで設定・解除する

“`bash
$ ls -l my_program # 変更前を確認 (例えば 755)
-rwxr-xr-x 1 user group 1000 Jan 1 10:00 my_program

$ chmod u+s my_program # 所有者(u)に SetUID(s) を追加(+)

$ ls -l my_program # 変更後を確認
-rwsr-xr-x 1 user group 1000 Jan 1 10:00 my_program

$ chmod u-s my_program # 所有者(u)から SetUID(s) を削除(-)

$ ls -l my_program # 解除後を確認
-rwxr-xr-x 1 user group 1000 Jan 1 10:00 my_program
“`

SetUID の注意点: SetUID は非常に強力な権限であり、セキュリティ上のリスクを伴います。特にシェルスクリプトに SetUID を設定すると、悪意のあるコードが紛れ込んだ場合にroot権限で実行されてしまう可能性があるため、多くのシステムではシェルスクリプトに対する SetUID を無効にしています。C言語などで書かれたコンパイル済みのバイナリに対してのみ設定することが一般的です。安易な SetUID の設定は避けるべきです。

SetGID (Set Group ID)

SetGID は SetUID と似ていますが、グループ権限に影響します。ファイルとディレクトリで効果が異なります。

  • 対象: ファイルおよびディレクトリ
  • ファイルに対する効果: SetGID が設定された実行可能ファイルは、そのファイルのグループの権限で実行されます。これは、特定のグループに属するユーザーが、通常はアクセスできないリソースにグループ権限でアクセスする必要がある場合に利用されることがあります。
  • ディレクトリに対する効果: SetGID が設定されたディレクトリ内に新しく作成されるファイルやサブディレクトリは、そのディレクトリのグループを自動的に継承します(通常は親ディレクトリのグループではなく、ファイルを作成したユーザーのプライマリグループがグループになります)。これは、特定のグループで共同作業を行うディレクトリで非常に便利です。新しいファイルが作成されても、自動的にグループが揃うため、グループメンバー間のアクセス権限管理が容易になります。
  • ls -lでの表示:
    • グループに実行権限(x)があり、SetGIDが設定されている場合: s (例: drwxrwsr-x – ディレクトリの場合)
    • グループに実行権限がなく(-)、SetGIDが設定されている場合: S (例: -rwxrwSrwx – ファイルの場合)
  • 数値モード: 先頭に 2 を加えます。
  • シンボルモード: g+s で SetGID を設定し、g-s で解除します。

SetGID 使用例

例 1: 共同作業用ディレクトリに SetGID を設定する

shared_docs というディレクトリを、project_group というグループで共同利用する場合。ディレクトリの所有者は user、グループは project_group とします。

“`bash
$ mkdir shared_docs
$ chgrp project_group shared_docs # ディレクトリのグループを project_group に変更
$ ls -ld shared_docs # 変更前 (通常は rwxr-xr-x user user または rwxr-xr-x user project_group)
drwxr-xr-x 2 user project_group 4096 Jan 1 10:00 shared_docs

$ chmod 2775 shared_docs # SetGID (2) と通常の 775 権限を設定 (所有者 rwx, グループ rwx, その他 r-x)

$ ls -ld shared_docs # 変更後を確認
drwxrwsr-x 2 user project_group 4096 Jan 1 10:00 shared_docs

グループの実行権限位置が x から s に変わった。

``
このディレクトリ
shared_docsの中で、user1(project_group のメンバー) が新しいファイルを作成すると、そのファイルのグループは自動的にproject_group` になります。

“`bash

user1 として shared_docs ディレクトリ内でファイルを作成

$ touch shared_docs/new_file_by_user1
$ ls -l shared_docs/new_file_by_user1
-rw-rw-r– 1 user1 project_group 0 Jan 1 10:00 shared_docs/new_file_by_user1

ファイルのグループが自動的に親ディレクトリのグループ (project_group) になった。

``
もし SetGID を設定していなかった場合、
new_file_by_user1のグループはuser1のプライマリグループ(例えばuser1`)になる可能性が高く、グループメンバー間でのアクセスに問題が生じることがあります。

例 2: SetGID をシンボルモードで設定・解除する

“`bash
$ ls -ld my_directory # 変更前を確認 (例えば 755)
drwxr-xr-x 2 user group 4096 Jan 1 10:00 my_directory

$ chmod g+s my_directory # グループ(g)に SetGID(s) を追加(+)

$ ls -ld my_directory # 変更後を確認
drwxr-sr-x 2 user group 4096 Jan 1 10:00 my_directory # ディレクトリなのでグループの実行権限がなくても s になる場合がある

$ chmod g-s my_directory # グループ(g)から SetGID(s) を削除(-)

$ ls -ld my_directory # 解除後を確認
drwxr-xr-x 2 user group 4096 Jan 1 10:00 my_directory
``
ディレクトリの場合、グループに実行権限(
x)があるかどうかにかかわらずg+sで SetGID を設定するとsまたはSが表示されます。実行権限があるかどうかも重要なので、例えばchmod g+s,g+x my_directorychmod 2775 my_directory` のように、実行権限とSetGIDを同時に設定することが一般的です。

Sticky Bit

  • 対象: 主にディレクトリに有効です。(ファイルに設定しても、スワップ関連の特殊な挙動は現代のLinuxでは一般的ではありません)
  • 目的: Sticky Bit が設定されたディレクトリでは、そのディレクトリ内のファイルやサブディレクトリを削除したり名前を変更したりできるのは、以下のいずれかのユーザーに限られます。
    • そのファイル/サブディレクトリの所有者
    • そのファイル/サブディレクトリのディレクトリの所有者
    • root ユーザー
      この設定は、書き込み権限が与えられている共有ディレクトリで非常に役立ちます。例えば、/tmp ディレクトリはシステム上の全てのユーザーが書き込み可能ですが、他のユーザーが作成したファイルを勝手に削除できてしまうと問題が発生します。Sticky Bit を設定することで、自分が作成したファイルだけを削除できるようになり、共有ディレクトリの整合性を保つことができます。
  • ls -lでの表示:
    • その他のユーザーに実行権限(x)があり、Sticky Bitが設定されている場合: t (例: drwxrwxrwt)
    • その他のユーザーに実行権限がなく(-)、Sticky Bitが設定されている場合: T (例: drwxrwxrwT)
  • 数値モード: 先頭に 1 を加えます。
  • シンボルモード: o+t で Sticky Bit を設定し、o-t で解除します。

Sticky Bit 使用例

例 1: /tmp ディレクトリの権限を確認する

/tmp ディレクトリは通常、1777 という権限が設定されており、Sticky Bit が有効になっています。

“`bash
$ ls -ld /tmp
drwxrwxrwt 12 root root 4096 Jan 1 10:00 /tmp

その他のユーザーの実行権限位置が t になっている。

``
この
tは、その他のユーザーに実行権限 (x) もあり、かつ Sticky Bit (t) も設定されていることを示します。数値モードの1777は、Sticky Bit (1)、所有者rwx(7)、グループrwx(7)、その他のユーザーrwx` (7) を意味します。

例 2: 共有アップロードディレクトリに Sticky Bit を設定する

upload というディレクトリを複数のユーザーがファイルをアップロードするために使用し、お互いのファイルを削除できないようにしたい場合。

“`bash
$ ls -ld upload # 変更前を確認 (例えば 777)
drwxrwxrwx 2 user group 4096 Jan 1 10:00 upload

$ chmod 1777 upload # Sticky Bit (1) と通常の 777 権限を設定

$ ls -ld upload # 変更後を確認
drwxrwxrwt 2 user group 4096 Jan 1 10:00 upload

その他のユーザーの実行権限位置が x から t に変わった。

``
これで、
uploadディレクトリは誰でも書き込み可能ですが、自分が所有するファイルか、ディレクトリ所有者 (user`) または root でなければ、ディレクトリ内のファイルを削除したり名前を変更したりすることはできません。

例 3: Sticky Bit をシンボルモードで設定・解除する

“`bash
$ ls -ld my_shared_directory # 変更前を確認 (例えば 777)
drwxrwxrwx 2 user group 4096 Jan 1 10:00 my_shared_directory

$ chmod o+t my_shared_directory # その他のユーザー(o)に Sticky Bit(t) を追加(+)

$ ls -ld my_shared_directory # 変更後を確認
drwxrwxrwt 2 user group 4096 Jan 1 10:00 my_shared_directory

$ chmod o-t my_shared_directory # その他のユーザー(o)から Sticky Bit(t) を削除(-)

$ ls -ld my_shared_directory # 解除後を確認
drwxrwxrwx 2 user group 4096 Jan 1 10:00 my_shared_directory
``
ディレクトリの場合、その他のユーザーに実行権限(
x)があるかどうかにかかわらずo+tで Sticky Bit を設定するとtまたはTが表示されます。実行権限があるかどうかも重要なので、例えばchmod o+t,o+x my_shared_directorychmod 1777 my_shared_directory` のように、実行権限とSticky Bitを同時に設定することが一般的です。

特殊権限の組み合わせ (数値モード)

SetUID (4000)、SetGID (2000)、Sticky Bit (1000) の数値は、通常の権限数値 (0000-0777) の先頭に加算することで組み合わせることができます。

例:

  • SetUID と通常の 755: 4000 + 755 = 4755
    • ls -l 表示例: -rwsr-xr-x
  • SetGID と通常の 755 (ディレクトリの場合): 2000 + 755 = 2755
    • ls -ld 表示例: drwxr-sr-x
  • Sticky Bit と通常の 777 (ディレクトリの場合): 1000 + 777 = 1777
    • ls -ld 表示例: drwxrwxrwt
  • SetUID, SetGID, Sticky Bit を全て含む (非常に稀): 4000 + 2000 + 1000 + [通常の権限] = 7000 + [通常の権限]
    • 例えば、SetUID, SetGID, Sticky Bit と通常の 777 (ディレクトリの場合): 7777
    • ls -ld 表示例: drwsrwsrwt (ただし、ファイルとディレクトリで s/t の意味が異なるため、この組み合わせは通常意味を持ちません。ファイルには SetUID/SetGID、ディレクトリには SetGID/Sticky Bit を設定することがほとんどです。)

重要: 数値モードで特殊権限を設定する場合、必ず4桁の数値を指定します。例えば、SetUID と 755 を設定する場合は 4755 と指定します。単に 755 と指定した場合、特殊権限は解除されます(数値モードは指定された権限で置き換えるため)。もし既存の特殊権限は維持しつつ、通常の権限のみを数値モードで変更したい場合は、現在の特殊権限の状態を把握し、それに合わせた4桁の数値を計算する必要があります。あるいは、シンボルモードを使って通常の権限だけを変更する方が安全な場合もあります。

chmodコマンドのオプション

chmodコマンドには、操作をより詳細に制御するためのいくつかの便利なオプションがあります。

  • -R, --recursive: 指定したディレクトリとその中の全てのファイル、サブディレクトリに対して、権限を再帰的に変更します。これは、ディレクトリツリー全体に同じ権限設定を適用したい場合に非常に役立ちます。ただし、ファイルとディレクトリで適切な権限が異なる場合(例: ファイルには実行権限不要だがディレクトリには必要)、-R で一括変更すると問題が生じる可能性があります。その場合は、一度全てに基本的な権限を設定した後、findコマンドなどと組み合わせてファイルとディレクトリで異なる権限を設定する方が望ましいです。

    例: chmod -R 755 my_project
    (my_project ディレクトリ以下の全てのファイルとディレクトリの権限を 755 に変更します。)

  • -v, --verbose: 権限が変更されたファイルやディレクトリごとに、詳細な情報を出力します。どのファイルの権限がどのように変わったかを確認したい場合に便利です。

    例: chmod -v 600 private_file.txt
    (もし権限が変更されれば、その旨が出力されます。)

  • -c, --changes: -v と似ていますが、実際に権限が変更されたファイルやディレクトリについてのみ詳細な情報を出力します。権限が既に指定された状態と同じだった場合は何も出力しません。

    例: chmod -c 644 my_file.txt
    (my_file.txt の権限が 644 以外だった場合に、変更された旨が出力されます。)

  • --reference=FILE: 指定した FILE と同じ権限設定を、ターゲットのファイルやディレクトリに適用します。既存のファイルをテンプレートとして権限をコピーしたい場合に便利です。

    例: chmod --reference=template_file.txt new_file.txt
    (new_file.txt の権限を template_file.txt と同じにします。)

  • --no-preserve-root: -R オプションと組み合わせて使用する場合、ルートディレクトリ (/) に対する操作を許可します。非常に危険なオプションであり、通常は使用を避けるべきです。デフォルトでは、-R をルートディレクトリに指定しても操作は行われません。

これらのオプションを組み合わせることで、chmodコマンドの柔軟性が増します。例えば、chmod -Rv 644 my_directory とすると、my_directory 以下全てのファイルとディレクトリの権限を 644 に再帰的に変更し、変更があったファイルを全て詳細に表示します。

chmodコマンドを使用するための権限

chmodコマンドを使用してファイルやディレクトリの権限を変更できるのは、基本的に以下のユーザーのみです。

  1. そのファイルまたはディレクトリの所有者: ファイルを作成したユーザーか、chownコマンドで所有権を与えられたユーザーです。
  2. root ユーザー: システム上の全てのファイルやディレクトリの権限を変更できます。

したがって、「Permission denied」(権限がありません)というエラーが表示された場合、通常はあなたがそのファイルやディレクトリの所有者でないか、rootユーザーとしてコマンドを実行していないことが原因です。所有者を確認するには ls -l コマンドを使用します。

chmodと関連コマンド (chown, chgrp)

ファイルやディレクトリのアクセス制御には、権限だけでなく、誰が所有者であるか(chown)、誰がグループ所有者であるか(chgrp)も関わってきます。

  • chown (change owner): ファイルやディレクトリの所有者を変更します。通常、rootユーザーのみが実行できます。
    例: chown new_owner my_file.txt
    例: chown new_owner:new_group my_file.txt (所有者とグループを同時に変更)
  • chgrp (change group): ファイルやディレクトリのグループ所有者を変更します。所有者自身、またはrootユーザーが実行できます。所有者自身が実行する場合、変更先のグループはそのユーザーが所属しているグループである必要があります。
    例: chgrp new_group my_file.txt

これらのコマンドと chmod を組み合わせることで、ファイルやディレクトリに対するアクセス制御を完全に管理することができます。例えば、特定のグループのメンバーだけが読み書きできるようにしたい場合、まず chgrp でファイルのグループをそのグループに変更し、次に chmod g+rw,o-rw file.txt のように権限を設定します。

実際の使用例とベストプラクティス

ここでは、chmodコマンドのよくある使用例と、セキュリティ上のベストプラクティスをいくつか紹介します。

例 1: 実行可能なシェルスクリプト

自分だけが読み書き実行でき、他のユーザーは読み取りと実行のみできるスクリプトにしたい場合。

“`bash
chmod 755 my_script.sh

またはシンボルモードで:

chmod u=rwx,go=rx my_script.sh

“`
これは多くの実行可能ファイルやスクリプトの一般的な権限設定です。

例 2: 機密性の高い設定ファイル

自分だけが読み書きでき、他のユーザーには一切アクセスさせたくない設定ファイル(パスワードなどが含まれる場合)。

“`bash
chmod 600 my_private_config.conf

またはシンボルモードで:

chmod u=rw,go= my_private_config.conf

“`
これは SSH の秘密鍵ファイルなど、非常に重要なファイルの権限設定として必須です。権限がこれより緩いと、SSHクライアントが鍵ファイルの使用を拒否することもあります。

例 3: 共同作業用ディレクトリ

特定のグループのメンバー全員が読み書きでき、それ以外のユーザーは読み取りもできないディレクトリにしたい場合。さらに、Sticky Bit と SetGID を組み合わせて、新しいファイルが自動的に同じグループになり、かつ他のユーザーが勝手にファイルを削除できないようにしたい場合。

“`bash

ディレクトリを作成し、グループ所有者を変更

mkdir shared_project_dir
chgrp project_group shared_project_dir

権限設定 (Sticky Bit, SetGID, 所有者rwx, グループrwx, その他—)

chmod 1770 shared_project_dir

数値の内訳: 1 (Sticky) + 7 (所有者 rwx) + 7 (グループ rwx) + 0 (その他 —)

$ ls -ld shared_project_dir
drwxrws–t 2 user project_group 4096 Jan 1 10:00 shared_project_dir
``
この設定により、
project_groupのメンバーはディレクトリ内でファイルの作成、読み書き、削除が可能になりますが、他のメンバーが作成したファイルを削除することはできません。また、ディレクトリ内で作成された新しいファイルやディレクトリは自動的にproject_group` になります。

例 4: Webサーバーの公開ファイル

静的なHTMLファイルなど、Webサーバーから誰でも読み取り可能にしたいファイル。

“`bash
chmod 644 index.html

またはシンボルモードで:

chmod u=rw,go=r index.html

``
これは、Webサーバーのユーザー(例:
www-dataapache)がファイルを読み取れるようにするための一般的な設定です。ディレクトリの場合は、読み取りと実行権限 (755750`) が必要になります。

ベストプラクティス:最小権限の原則

セキュリティ上の最も重要な原則の一つに、「最小権限の原則(Principle of Least Privilege)」があります。これは、ユーザーやプログラムに、その機能遂行のために必要最低限の権限のみを与えるべきである、という考え方です。

  • 安易な chmod 777 は避ける: ファイルやディレクトリに 777 (rwxrwxrwx) の権限を設定すると、システム上の誰でも、インターネット経由でアクセスできるユーザーも含めて、そのファイルを読み書き実行できるようになります。これは重大なセキュリティホールとなり得ます。問題を解決するために一時的に 777 にすることは絶対避け、必要な権限だけを与える方法を検討してください。
  • ファイルとディレクトリで適切な権限は異なる: ファイルには読み書き権限、実行権限がそれぞれ個別に意味を持ちますが、ディレクトリに対する「実行権限」は「その中に入る」「中のアイテムにアクセスする」という全く別の意味を持ちます。ファイルに実行権限が必要ない場合でも、そのファイルが含まれるディレクトリには実行権限が必要です。-R オプションを使う際は、ファイルとディレクトリで異なる権限設定を考慮する必要があります(例えば、まず chmod -R a+rX directory でディレクトリには実行権限を、ファイルには実行可能なら実行権限を与える、その後必要に応じてファイルのみの書き込み権限などを調整する)。大文字の X は、ファイルが既に実行可能であるかディレクトリである場合にのみ実行権限を追加するという便利なシンボルモードの権限指定です。
  • SetUID/SetGID のリスクを理解する: 特殊権限は強力であると同時にリスクも伴います。特に SetUID は root 権限を一般ユーザーに与える可能性があるため、そのプログラムが安全であることが完全に保証されない限り、設定すべきではありません。シェルスクリプトへの SetUID は、その脆弱性からほとんどのシステムで効果がないように設計されています。

トラブルシューティング:Permission denied

chmodコマンドを実行しようとして「Permission denied」というエラーが表示された場合、前述の通り、そのファイルやディレクトリの所有者でないか、rootユーザーとして実行していないことがほとんどの原因です。

  1. 所有者を確認する: ls -l 対象ファイル/ディレクトリ コマンドを実行し、出力の3番目のカラム(所有者)を確認します。そのユーザー名があなたのアカウント名と異なる場合、所有者はあなたではありません。
  2. グループを確認する: ls -l の出力の4番目のカラム(グループ)を確認します。あなたがそのグループに属しているか確認します。
  3. root権限で再試行する: 所有者でない場合、権限を変更するにはroot権限が必要です。sudo chmod ... のようにコマンドの前に sudo をつけて実行してみてください(ただし、sudo を使用するには適切な設定が必要です)。
  4. ファイルシステムのマウントオプション: 極稀にですが、ファイルシステムが noexecnosuid といったオプションでマウントされている場合、特定の権限設定ができないことがあります。これは通常、システム管理者が設定するため、一般ユーザーが意識することは少ないですが、特殊な状況では原因となり得ます。

ファイルの所有権やグループを変更する必要がある場合は、chownchgrp コマンドを使用しますが、これらのコマンドも通常root権限が必要です。

まとめ

chmodコマンドは、Linux/Unixシステムにおいてファイルやディレクトリのアクセス権限を管理するための非常に強力で基本的なツールです。本記事では、以下の主要な概念を詳細に解説しました。

  • ファイル権限の基本構造(所有者、グループ、その他のユーザー)
  • 基本的な権限の種類(読み取り、書き込み、実行)
  • ls -l コマンドによる権限の確認方法
  • chmodコマンドの基本構文
  • 権限の指定方法:
    • シンボルモード: 誰に(u/g/o/a) どうする(+/=/-) 何の権限を(r/w/x) の形式で、現在の権限に加算・削除・置き換えを行います。柔軟な変更が可能です。
    • 数値(8進数)モード: 各権限に数値を割り当て(r=4, w=2, x=1)、それらを合計した3桁または4桁の数値で、設定したい最終的な権限状態を指定します。簡潔に記述でき、よく使われる設定には慣用的な数値があります。
  • 特殊な権限:
    • SetUID (4000): ファイルを実行ファイルの所有者の権限で実行させる(主にファイル)。
    • SetGID (2000): ファイルを実行ファイルのグループの権限で実行させる(ファイル)、またはディレクトリ内で作成されるアイテムがディレクトリのグループを継承する(ディレクトリ)。
    • Sticky Bit (1000): ディレクトリ内のアイテムを削除・名前変更できるユーザーを制限する(主にディレクトリ)。
    • これらの特殊権限が ls -l でどのように表示されるか(s, S, t, T)と、数値モードでの指定方法(先頭に4, 2, 1を加える)を理解しました。
  • chmodコマンドの便利なオプション (-R, -v, -c, --reference)
  • chmodを使用するための権限(所有者またはroot)と、関連コマンド (chown, chgrp)
  • 一般的な使用例とセキュリティ上のベストプラクティス(最小権限の原則、安易な 777 の回避、SetUID/SetGID の注意点)

chmodコマンドを使いこなすことは、Linux/Unixシステムを安全かつ効率的に利用するための鍵となります。ファイルやディレクトリの権限設定は、システム管理者だけでなく、一般ユーザーや開発者にとっても日常的に遭遇するタスクです。本記事で学んだ知識を活用し、自信を持ってファイル権限を管理できるようになることを願っています。

さらなる学習のために:

  • man chmod コマンドを実行して、システム上の chmod のマニュアルページを参照する。より詳細なオプションや挙動について確認できます。
  • umask コマンドについて学ぶ。これは、新しくファイルやディレクトリを作成したときに、デフォルトでどのような権限が付与されるかを制御する設定です。chmod とは異なり、umask は権限を「削除」するマスクとして機能します。
  • ACL (Access Control List) について学ぶ。これは、伝統的な所有者/グループ/その他のユーザーという権限モデルよりも、さらに詳細かつ柔軟な権限設定を可能にする高度な機能です。

これで、Linux/Unix chmodコマンドに関する詳細なガイドは終了です。この情報が、あなたのシステム管理や開発作業の一助となれば幸いです。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール