連載第5回】Linuxの「権限(パーミッション)」完全攻略!Permission Deniedに勝つ方法

LAMP講座

【連載第5回】初心者の最大の壁「Permission Denied」を完全理解する

未経験からWebアプリ開発を目指す「AlmaLinux 9とLAMP環境で作る!Webアプリ開発完全ロードマップ(全12回)」の第5回です。

前回は、プログラミング言語「PHP」を導入し、Webサーバー(Apache)とデータベース(MariaDB)を繋ぐ準備を整えました。
しかし、実際にWebアプリを作り始めると、初心者が必ずと言っていいほど直面する「巨大な壁」があります。

それが、「権限(パーミッション)」です。

「画像がアップロードできない」「設定ファイルを書き換えられない」「画面が真っ白になった」
これらのトラブルの原因の9割は、この「権限設定のミス」にあると言っても過言ではありません。

今回は、コマンド操作だけでなく、LinuxというOSの根本的な設計思想である「ユーザーとグループ」の概念から、プロの現場で使われるセキュリティ設定までを徹底的に解説します。
少し長いですが、ここを理解すればあなたは「ただコマンドをコピペするだけの人」から「Linuxを理解しているエンジニア」へと進化できます。

コウ君

先生、実はこっそりPHPで「ファイル保存」のプログラムを書いてみたんですけど、エラーが出て全然動かないんです…。
Permission denied って言われるんですけど、僕はこのサーバーの契約者(所有者)なのに、なんで拒否されるんですか!?

リナックス先生

いい経験をしたわね。
Windowsのようなパソコンと違って、Linuxは「サーバー(給仕人)」や「管理者」など、明確な役割分担がされているの。
コウ君が「root」としてログインしていても、Webサイトを表示しているのは「apache」さんなのよ。
今回はその「人間関係(権限関係)」を整理していきましょう。

本講座のカリキュラム(全12回)

現在地は第5回です。ここはWebアプリ開発の最重要ポイントです。

  1. サーバー準備編:なぜVPSが必要?AlmaLinux 9の初期設定とSSH接続
  2. Webサーバー編:Apache(httpd)のインストールとファイアウォール設定
  3. データベース編:MariaDB(MySQL)のインストールとセキュリティ設定
  4. プログラミング言語編:PHP 8.xの導入と設定ファイルのチューニング
  5. 【今回】権限・パーミッション編:LinuxでWebサイトを公開するための「所有者」の概念
  6. 接続テスト編:PHPからデータベース(DB)に接続してみよう
  7. アプリ開発①:HTML/CSSで掲示板の「見た目」を作る
  8. アプリ開発②:投稿機能(Create)の実装とデータの保存
  9. アプリ開発③:一覧表示機能(Read)と画像表示の仕組み
  10. アプリ開発④:編集・削除機能(Update/Delete)の実装
  11. セキュリティ編:XSSやSQLインジェクション対策の基礎
  12. 公開編:独自ドメイン設定と無料SSL(Let’s Encrypt)でHTTPS化

なぜ「権限エラー」が起きるのか?仕組みを理解する

Linuxは「マルチユーザー」のOS

WindowsやMacなどの個人用PCを使っているとあまり意識しませんが、Linuxはもともと「1台の大型コンピューターを、何百人もの人間で同時に使う」ために作られたOSです。

そのため、「Aさんのファイルは、Bさんには見せない」「Cさんのファイルは、Dさんには書き込ませない」といったセキュリティ機能が、OSの根幹に非常に厳しく組み込まれています。
これを「パーミッション(Permission)」と呼びます。

Webサーバーにおける「登場人物」

ここで重要なのが、Webサーバーにおける登場人物の整理です。
今、あなたのVPSの中には、主に以下の2人のユーザーが存在しています。

ユーザー名 役割 権限の強さ
root
(ルート)
あなた自身。
SSHでログインして、インストールや設定を行う管理者。
最強。
あらゆるファイルの読み書き、削除が可能。
apache
(アパッチ)
Webサーバーソフト。
ブラウザからのリクエストに応答し、PHPを実行する係。
弱い。
許可された場所(ディレクトリ)しか触れない。

ここがトラブルの元凶です。

  • あなたは root としてログインし、HTMLファイルやPHPファイルを作成します。
  • すると、そのファイルの持ち主(所有者)は root になります。
  • しかし、そのファイルを実際に動かしたり、画像を保存しようとしたりするのは apache ユーザーです。
  • apache ユーザーは、root 様の持ち物に対して勝手に書き込みを行うことはできません。

これが、「Permission denied(権限がありません)」エラーの正体です。
つまり、ファイルの持ち主を変更するか、apache さんに許可証を渡してあげる必要があるのです。

実習1:現在の権限を確認してみよう(ls -l)

それでは、実際の画面で確認してみましょう。
SSHで接続し、Webサイトのデータが入っているディレクトリに移動します。

cd /var/www/html

次に、ファイルの一覧を「詳細情報付き」で表示するコマンドを入力します。

ls -l

前回作成した index.htmlinfo.php があれば、以下のような表示が出るはずです。

-rw-r--r--. 1 root root  45  1月 5 10:00 index.html
-rw-r--r--. 1 root root  20  1月 5 10:05 info.php

この呪文のような文字列を読み解けるようになることが、脱初心者の第一歩です。
左から順に解説します。

部分 表示例 意味
パーミッション -rw-r--r-- 誰が、何をできるか(後述)。
所有者 root このファイルの持ち主(ユーザー)。
所有グループ root このファイルを持つグループ。
ファイル名 index.html ファイルの名前。

ここで注目すべきは、所有者が root になっている点です。
このままでは、PHP(apacheユーザー)を使ってこのファイルを書き換えたり、この場所に画像をアップロードしたりすることはできません。

実習2:所有者をWebサーバーに変更する(chown)

Webサイトの公開ディレクトリ(/var/www/html)は、基本的にWebサーバーが自由に使えるようにしておくのが定石です。
そこで、このディレクトリとその中身の持ち主を、root から apache に変更します。

所有者を変更するコマンドは chown (チェンジ・オーナー)です。

chown -R apache:apache /var/www/html

コマンド解説:

  • -R : 「Recursive(再帰的)」の略。指定したディレクトリの中にあるファイルやフォルダも、すべてまとめて変更するという意味です。これを忘れると、フォルダの持ち主だけ変わって中身が変わらないので注意。
  • apache:apache : 「ユーザー名 : グループ名」の順で指定します。

もう一度 ls -l で確認してみましょう。

ls -l

以下のように変わっていれば成功です。

-rw-r--r--. 1 apache apache  45  1月 5 10:00 index.html

これで、Webサーバー(PHP)がこのファイルを「自分の持ち物」として扱えるようになりました。

深掘り:「755」や「644」という数字の正体(chmod)

所有者の変更だけで解決する場合もありますが、より細かく「読み取りだけ許可したい」「書き込みも許可したい」といった設定が必要になることもあります。
そこで登場するのが chmod (チェンジ・モード)コマンドと、謎の数字です。

よくネットの記事で「パーミッションを755にしてください」と書かれていますが、この数字の意味を理解していますか?
これは、以下の3つの数字の足し算でできています。

数字 権限の種類 記号 意味
4 Read(読み取り) r ファイルの中身を見ることができる。
2 Write(書き込み) w ファイルを修正・保存・削除できる。
1 Execute(実行) x プログラムとして実行できる。ディレクトリなら中に入れる。
0 None(なし) - 何もできない。

3桁の数字の内訳

パーミッションの数字は、必ず「3桁」で指定します(例:755)。
これは、「誰に対して」権限を与えるかを表しています。

  • 1桁目(百の位):所有者(User)
    ファイルの持ち主(今回はapacheさん)。
  • 2桁目(十の位):所有グループ(Group)
    持ち主と同じチームに所属する人。
  • 3桁目(一の位):その他(Other)
    上記以外の赤の他人(世界中のアクセス者)。

計算クイズ

例題:パーミッション「755」とはどういう状態?

  • 所有者(7): 4(読) + 2(書) + 1(実行) = 全部できる(最強)
  • グループ(5): 4(読) + 0(書) + 1(実行) = 読むことと実行はできるが、書き換えは不可
  • その他(5): 4(読) + 0(書) + 1(実行) = 読むことと実行はできるが、書き換えは不可

これが、Webサイトのディレクトリ(フォルダ)によく使われる設定です。
「Webサーバー自身は自由にファイルをいじれるけど、外部の人は見るだけで、勝手に書き換えられない」という安全な状態です。

【警告】絶対にやってはいけない「777」の罠

コウ君

計算面倒くさいなぁ。
全部「7」にしちゃえば、エラーも出なくなるし楽なんじゃないですか?
chmod 777 ってやつ!ネットで見ました!

リナックス先生

絶対にダメ!!
それは家の玄関の鍵を開けっ放しにして、「誰でも自由に入って、家具を壊していいですよ」という看板を出しているのと同じよ。
ハッカーの格好の餌食になるわ。

なぜ777が危険なのか

パーミッション「777」は、「その他(Other)」の人にも「書き込み権限(2)」を与える設定です。

もし、あなたのWebサイトのお問い合わせフォームなどに脆弱性(セキュリティの穴)があった場合、777に設定されたディレクトリがあると、攻撃者はそこに「ウイルスプログラム」をアップロードして実行できてしまいます。
その結果、サイトが乗っ取られたり、踏み台にされて他社への攻撃に使われたりします。

教訓: エラーが出たからといって安易に chmod 777 で解決しようとするのは、初心者が卒業すべき一番の悪癖です。
必ず「適切な所有者(chown)」を設定し、権限は最小限(755や644)に留める癖をつけましょう。

実習3:画像の保存用ディレクトリを作る

それでは、今後のアプリ開発のために、画像保存用のディレクトリを作成し、正しい権限を設定する練習をしましょう。

1. ディレクトリの作成

mkdir /var/www/html/images

この時点では、このフォルダの持ち主はまだ root です。

2. 所有者の変更

Apacheが画像を保存できるように、持ち主を変更します。

chown apache:apache /var/www/html/images

3. パーミッションの確認と設定

通常、ディレクトリは「755」になっていればOKです。確認してみましょう。

ls -ld /var/www/html/images

もし drwxr-xr-x (rwx, r-x, r-x つまり 755)になっていれば完璧です。
もし違っていたら、以下のコマンドで修正します。

chmod 755 /var/www/html/images

これで、「PHPプログラムからは自由に画像を保存できるけれど、外部の悪い人からは勝手に操作されない」安全なフォルダができあがりました。

おまけ:自分のPCからファイルをアップロードする方法

ここまでは「サーバーの中での権限」の話でした。
最後に、あなたのPC(Windows/Mac)で作ったHTMLファイルや画像を、VPSにアップロードする方法を簡単に紹介します。

これには「SFTPソフト」を使います。おすすめは以下の通りです。

  • Windows: WinSCP(ウィン・エスシーピー)
  • Mac: Cyberduck(サイバーダック)

これらのソフトに、SSH接続と同じ情報(IPアドレス、ユーザー名root、パスワード)を入力すれば、ドラッグ&ドロップでファイルを転送できます。

注意点:
SFTPで root としてファイルをアップロードすると、そのファイルの持ち主は root になります。
アップロードした後、PHPでそのファイルをいじる必要がある場合は、今回習った chown apache:apache ... コマンドを実行して、持ち主を変更してあげるのを忘れないでくださいね!

次回予告:PHPからデータベースに接続する

今回は、少し難解だけど避けては通れない「権限」のお話でした。
これで、ファイル操作でエラーが出ても「ああ、所有者が違うんだな」と冷静に対処できるようになったはずです。

次回はいよいよ、バラバラだったWebサーバーとデータベースを合体させます。
PHPプログラムを書いて、「データベースに接続成功!」という文字を表示させてみましょう。

リナックス先生

今日の話は奥が深いから、一度で全部覚えなくても大丈夫よ。
「Permission deniedが出たら、ls -l で所有者を見る」これだけは覚えて帰ってね。
まだサーバー構築が終わっていない人は、次の実践編に入る前に準備を済ませておくのよ!

▼この講座で使用している推奨VPS

コメント