Bash環境やLinuxサーバーを操作する際、ファイルやディレクトリの操作で「Permission denied」というエラーに遭遇したことはないでしょうか。
このエラーを解決し、ファイルを適切に管理するために不可欠なのがchmodコマンドによる権限設定です。
本記事では、初心者の方でも迷わずに権限操作ができるよう、パーミッションの基礎知識から具体的なコマンドの使い方までを網羅して解説します。
適切な権限設定を身につけることは、システムのセキュリティを守り、スムーズな開発環境を構築するための第一歩となります。
Linuxにおけるパーミッションの基本概念
LinuxやUnix系OSでは、すべてのファイルやディレクトリに対して「誰が」「どのような操作をできるか」という権限(パーミッション)が設定されています。
まずは、この権限がどのような要素で構成されているのかを正確に理解しましょう。
所有者・グループ・その他のユーザー
権限は、以下の3つの区分に対して個別に設定されます。
- 所有者(User):そのファイルを作成したユーザー本人を指します。
- グループ(Group):ファイルが属する特定のユーザーグループを指します。
- その他(Others):所有者でもグループメンバーでもない、すべての第三者を指します。
これらの区分を意識することで、特定のユーザーにだけ編集を許可し、他のユーザーには閲覧のみを許可するといった柔軟な運用が可能になります。
読み取り・書き込み・実行権限の意味
各ユーザー区分に対して設定できる権限には、主に3つの種類があります。
1つ目は、ファイルの内容を読み出すための「読み取り権限(Read)」です。
2つ目は、ファイルの内容を変更したり削除したりするための「書き込み権限(Write)」です。
3つ目は、プログラムファイルを実行したり、ディレクトリの中に移動したりするための「実行権限(Execute)」です。
これらの組み合わせによって、ファイルの安全性が保たれています。
chmodコマンドの基本的な構文
chmod(change mode)コマンドは、ファイルやディレクトリの権限を変更するためのコマンドです。
基本的な使い方は「chmod [オプション] モード ファイル名」という形式で記述します。
この「モード」の指定方法には、数字を使う方法と記号を使う方法の2種類が存在します。
数値(8進数)による指定方法
数値指定は、3桁の数字を使って「所有者」「グループ」「その他」の権限を一括で指定する方法です。
それぞれの権限には以下の数値が割り振られています。
| 権限の種類 | 記号 | 数値 |
|---|---|---|
| 読み取り(Read) | r | 4 |
| 書き込み(Write) | w | 2 |
| 実行(Execute) | x | 1 |
| 権限なし | – | 0 |
これらを足し合わせた合計値が、1つの区分に対する権限を表します。
例えば、「読み取り(4) + 書き込み(2) + 実行(1)」であれば合計は「7」となります。
数値指定の計算方法と具体例
3桁の数字は、左から「所有者」「グループ」「その他」の順に並べます。
以下のコードは、所有者にフル権限(7)、グループとその他に読み取りと実行の権限(5)を与える例です。
# ファイル「script.sh」に権限「755」を設定する
chmod 755 script.sh
設定後の状態を確認するには、ls -lコマンドを使用します。
# ファイルの詳細情報を表示して権限を確認する
ls -l script.sh
-rwxr-xr-x 1 user user 0 May 22 10:00 script.sh
この結果の「rwxr-xr-x」という表示が、数値「755」に対応しています。
記号による指定方法(シンボリックモード)
記号指定は、現在の権限に対して「特定の権限を追加・削除」したい場合に便利です。
「対象」「操作」「権限」の3つの要素を組み合わせて指定します。
対象には、u(所有者)、g(グループ)、o(その他)、a(全員)を使用します。
操作には、+(追加)、-(削除)、=(指定した権限に書き換え)を使用します。
記号指定の具体例
例えば、すべてのユーザーに対して実行権限を付与したい場合は、以下のように記述します。
# すべてのユーザー(a)に実行権限(x)を追加(+)する
chmod a+x script.sh
また、グループとその他のユーザーから書き込み権限を剥奪したい場合は、以下のように記述します。
# グループ(g)とその他(o)から書き込み権限(w)を削除(-)する
chmod go-w memo.txt
このように、特定の権限だけをピンポイントで変更できるのが記号指定のメリットです。
chmodコマンドの主なオプションと便利な使い方
chmodコマンドには、効率的な作業を助けるいくつかのオプションが用意されています。
再帰的な変更(-Rオプション)
ディレクトリ内のすべてのファイルやサブディレクトリの権限をまとめて変更したい場合は、-R(recursive)オプションを使用します。
これは、プロジェクト全体の公開設定を変更する際などに非常によく使われます。
# 「project」ディレクトリ以下のすべてのファイルの権限を755にする
chmod -R 755 project/
一括で変更されるため、実行前に指定するディレクトリが正しいかを必ず確認するようにしてください。
変更内容の表示(-v, -cオプション)
どのファイルがどのように変更されたかを確認しながら作業したい場合は、-v(verbose)オプションが有効です。
# 変更結果を詳細に表示する
chmod -v 644 document.txt
mode of 'document.txt' changed from 0755 (rwxr-xr-x) to 0644 (rw-r--r--)
また、実際に変更が行われたファイルのみを表示したい場合は-cオプションを使用しましょう。
実践的なパーミッション設定の例
日常的な作業でよく使われる、具体的な設定パターンをいくつか紹介します。
シェルスクリプトを実行可能にする
新しく作成したシェルスクリプトは、デフォルトでは実行権限がついていないことが一般的です。
そのため、スクリプトを実行しようとすると「Permission denied」となります。
# 作成したばかりのスクリプト
ls -l my_script.sh
-rw-r--r-- 1 user user 100 May 22 10:05 my_script.sh
これを実行可能にするためには、自分自身に実行権限を付与する必要があります。
# 自分自身に実行権限を付与する
chmod u+x my_script.sh
これにより、./my_script.shという形式でコマンドとして実行できるようになります。
Webサーバー公開用ファイルの権限設定
Webサーバー(ApacheやNginxなど)でWebサイトを公開する場合、ファイルの権限設定は非常に重要です。
HTMLファイルや画像ファイルなどは、サーバープログラムが読み取れるように設定しなければなりません。
一般的には、ファイルには「644」、ディレクトリには「755」を設定するのが標準的です。
# 公開用ディレクトリ内の全ファイルの読み取りを許可する
chmod 644 index.html
もし、書き込み権限を過剰に与えてしまうと、第三者にファイルを改ざんされるリスクが高まるため注意が必要です。
パーミッション変更時の注意点とセキュリティ
権限設定を誤ると、システムの脆弱性を生んだり、逆に必要な操作ができなくなったりすることがあります。
777権限のリスク
「動かないからとりあえず何でもできる権限にしよう」という理由で、「777」(全ユーザーに全権限を付与)を設定するのは極めて危険です。
誰でもファイルを削除したり、悪意のあるプログラムを上書きしたりできる状態を意味します。
トラブルシューティングの際の一時的な確認であっても、そのまま放置することは絶対に避けてください。
常に「必要最小限の権限(最小権限の原則)」を意識することが、セキュリティの鉄則です。
特殊な権限(スティッキービットなど)
高度な設定として、chmodでは特殊な権限ビットを扱うこともできます。
例えば「スティッキービット」を設定すると、そのディレクトリ内ではファイルの所有者だけが自分のファイルを削除できるようになります。
# ディレクトリにスティッキービットを付与する(数値の先頭に1を付ける)
chmod 1777 /tmp/shared_folder
不特定多数がファイルを書き込む共有ディレクトリなどで利用される手法です。
まとめ
chmodコマンドは、Linux環境におけるファイル管理の根幹を成す重要なツールです。
数値指定と記号指定のどちらも使いこなせるようになると、作業の効率が飛躍的に向上します。
特にWebサーバーの管理や開発環境の構築においては、パーミッションの理解不足が思わぬ不具合やセキュリティ事故に繋がることがあります。
「r(4)」「w(2)」「x(1)」という基本の数値を覚え、常に適切な権限を割り当てる習慣をつけましょう。
まずは自分の環境でls -lを実行し、現在の権限がどのようになっているかを確認するところから始めてみてください。
