「あれ…?Webサーバーにファイルをアップしたのに、ブラウザで表示されない(403 Forbidden)!」
「シェルスクリプトを実行しようとしたら、Permission denied(許可がありません)って怒られたんだけど!?」
ある日突然、あなたが運用しているLinuxサーバーがそんな状態になって、スマホで慌てて「linux パーミッション」とか「linux アクセス権」なんて検索して、このページにたどり着いてくれたんじゃないでしょうか。
もしかして、「sudo を付けないと、自分の作ったファイルさえ編集できない!」ってイライラしていませんか…?
それとも、「ネットに『とりあえず chmod 777 すれば動く』って書いてあったけど、これって一体何なの…?実行しても大丈夫なの…?」って、もう途方に暮れていたり…?
わかります、わかります!私もLinuxを学び始めた頃、全く同じ経験があります。
ファイルが全然思い通りに動いてくれないし、「もしかして、サーバー壊した…?」「もうOS入れ直さないとダメなの…?」って、もうパニックになっちゃいますよね😥
でも、大丈夫です!
その焦る気持ち、よーくわかります。でも、慌ててOSを再インストールするのは、絶対に待ってください!
これらの問題の多くは、Linuxの「パーミッション(アクセス権)」と「所有者」っていう、とっても大事なルールの設定ミスが原因なんです。Linuxの根幹となる仕組みなので、最初は難しく感じちゃうんですよね😲
この記事は、そんな「Permission denied 地獄」に陥ってしまったあなたを救うための、安全な対処法をステップバイステップで徹底的に解説する「完全ガイド」です🕵️♀️✨
「ls -l で表示される -rwxr-xr-x の見方」っていう基本のキから、「chmod コマンド(数値と記号)」「chown コマンド(linux オーナー変更)」、そして「linux 権限 777 がなぜ危険なのか」っていう超重要な話まで。
私と一緒に、一つずつ冷静に確認していきましょうね🥰
Linuxパーミッション(アクセス権)の基礎知識:ls -l を解読する
Linuxのパーミッションと所有者を理解するための第一歩は、なんと言っても ls -l コマンドの実行結果を、正確に読み解けるようになることです!
ls -l は、ファイルやディレクトリの詳細情報(「誰が」「何をしていいか」)を一覧表示する、魔法の呪文なんですよ。
[user@server ~]$ ls -l 合計 12 drwxr-xr-x. 2 user user 4096 11月 10 10:00 Documents -rw-r--r--. 1 user user 123 11月 10 10:01 sample.txt -rwxr-xr-x. 1 root root 5678 11月 10 10:02 script.sh lrwxrwxrwx. 1 user user 10 11月 10 10:03 link -> sample.txt
この「うわっ、複雑…」って思っちゃう出力結果に、必要な情報がぜーんぶ詰まってるんです。
特に重要なのは、先頭の10文字(例: -rw-r–r–)と、3番目・4番目のカラム(例: user user)です。ここ、テストに出ますよ!💪
10文字のパーミッション表記を分解する
先頭の10文字の記号は、「ファイルの種類」と「3種類の対象者」への「3種類の権限」を示しています。
例えば -rwxr-xr-x を見てみましょう。
[ファイルタイプ] [所有者の権限] [グループの権限] [その他の権限]
(-) (rwx) (r-x) (r-x)
1文字目:ファイルタイプ
- – : 通常のファイル(テキストファイル、画像、バイナリなど)
- d : ディレクトリ(フォルダのことですね!)
- l : シンボリックリンク(別のファイルへのショートカット)
- c : キャラクタデバイス(端末とか)
- b : ブロックデバイス(ディスクドライブとか)
まずは、対象が「ファイル(–)」なのか「ディレクトリ(d)」なのかを区別することが、すっごく重要です!
2〜10文字目:3種類のアクセス権(r, w, x)
続く9文字は、3文字ずつの3ブロックに分かれています。ここが「linux アクセス権」のキモです!
1. 2〜4文字目: 所有者 (User) の権限
そのファイルやディレクトリの「オーナーさん」が持つ権限です。
例: rwx
2. 5〜7文字目: グループ (Group) の権限
そのファイルやディレクトリが所属する「グループ」のメンバーが持つ権限です。
例: r-x
3. 8〜10文字目: その他 (Other) の権限
上記(所有者でもグループメンバーでもない)その他ぜんいんのユーザーが持つ権限です。
例: r-x
誰がアクセスするのか?:「所有者」「グループ」「その他」
ls -l の3番目と4番目のカラムは、それぞれ「所有者(オーナー)」と「グループ」を示しています。これが「linux 所有者 変更」でイジる部分ですね。
-rwxr-xr-x. 1 root root 5678 11月 10 10:02 script.sh
この場合、script.sh というファイルの「所有者」は root ユーザーで、「所属グループ」も root グループです。
Linuxシステムは、ファイルにアクセスしようとしているユーザーが「所有者」「グループ」「その他」のどれに当てはまるかを判断して、対応するパーミッション(rwx のブロック)を適用するんです。
▼所有者 (User / u)
通常、そのファイルを作成したユーザーです。「このファイルの持ち主」っていう名札ですね。
ファイルのパーミッションや所有者を変更できる(chmod, chown)唯一の(root を除けば)存在です。
ls -l の3カラム目に表示されます。
▼グループ (Group / g)
ファイルやディレクトリが所属するグループです。「どのチームに所属しているか」ってことですね。
Linuxでは、すべてのユーザーが一つ以上のグループに所属しています(例: user ユーザーは user グループにも所属)。
「developers グループのメンバーには書き込みを許可する」みたいに、チームでの共同作業のために使われます。
ls -l の4カラム目に表示されます。
▼その他 (Other / o)
ファイルの所有者でもなく、そのグループのメンバーでもない、まったくの他人です。
この権限が「rwx」になっている(例: 777)と、システム上の誰でもそのファイルを操作できちゃって、すっごく危険なんですよ!🚨
3つの基本権限「r」「w」「x」の完全ガイド (linux アクセス権)
「linux パーミッション」の核心は、「r(読み取り)」「w(書き込み)」「x(実行)」の3つの権限です。
ここで、初心者が100人いたら99人がハマる(私もハマりました😅)最大の罠があります。
それは…これらの権限の意味が「ファイル」と「ディレクトリ」で、根本的にぜんぜん違うっていうことです!
この違いを理解することが、Permission denied 地獄から抜け出すための最大の鍵となります。
r (読み取り権限)
▼ファイルの場合:
cat や less コマンドなんかで、ファイルの中身のテキストデータを読むことができます。シンプルですね!
▼ディレクトリの場合:
ls コマンドなんかで、そのディレクトリの中に入っているファイルやサブディレクトリの名前一覧を表示することができます。
(注意!)r 権限だけがあっても、x 権限がないと cd でそのディレクトリに入ることさえできないので、結果として ls -l なんかも失敗しちゃうんです…。
w (書き込み権限)
▼ファイルの場合:
vi や nano などのエディタで、ファイルの内容を変更・編集・上書きすることができます。
> や >> といったリダイレクトでファイルに書き込むこともできます。
(最重要注意点!)ファイルに w 権限があっても、そのファイル自体を「削除」する権限は含まれません!
ファイルの削除は、そのファイルが置かれている「親ディレクトリ」の w 権限によって管理されてるんですよ。
▼ディレクトリの場合:
これが非常に、非常に重要です。
そのディレクトリ内で、ファイルの「作成」(touch や cp)ができます。
そのディレクトリ内で、ファイルの「削除」(rm)ができます。
そのディレクトリ内で、ファイルの「名前変更」(mv)ができます。
「rm file.txt」を実行する時、file.txt 自体の権限は関係なくて、今いるディレクトリ(.)に w 権限がなかったら Permission denied って怒られちゃうんです。
x (実行権限)
▼ファイルの場合:
そのファイルをプログラムやシェルスクリプトとして実行することができます。
自作したシェルスクリプト(script.sh)を実行しようとして Permission denied って言われたら、ほぼ100%この x 権限が設定されてないのが原因です(chmod +x script.sh が必要なんですね!)。
▼ディレクトリの場合:
これも非常に、非常に重要です。
cd コマンドで、そのディレクトリに「入る(移動する)」ことができます。
x 権限がないディレクトリは、たとえ r 権限があっても ls で中身を一覧表示することさえできません(だって、ディレクトリに「入って」から中を見る必要があるからです)。
Webサーバーがサブディレクトリ(例: /images)にアクセスできない時、親ディレクトリ(/ や /var/www/html)から目的のディレクトリまでのすべての通り道で x 権限(実行権限=通過権限)が許可されてないとダメなんです!
(表1)「ファイル」と「ディレクトリ」でのr/w/x権限の意味の違い
この表は、Linuxパーミッションを理解する上で、もう本当に一番大事な「虎の巻」です!
| 権限 | ファイル (-) の場合 | ディレクトリ (d) の場合 |
|---|---|---|
r (Read) | ファイルの中身を読むことができる (cat, less) | ディレクトリ内のファイル名一覧を見ることができる (ls) |
w (Write) | ファイルの内容を変更・上書きできる (vi, >) | ディレクトリ内でファイルを作成・削除・名前変更できる (touch, rm, mv) |
x (Execute) | ファイルをプログラムとして実行できる (./script.sh) | ディレクトリに入る(移動する)ことができる (cd) |
【chmod】Linuxパーミッションを変更する最強コマンド (linux chmod)
ファイルやディレクトリの「linux アクセス権」を変更するコマンドが chmod (Change Mode) です。
chmod コマンドには、パーミッションを指定する方法が大きく分けて2つあります。
1. 数値モード(絶対モード): 3桁の8進数(例: 755)で、User, Group, Other の権限を一度に「絶対的」に指定する方法。プロっぽい!
2. 記号モード(相対モード): +x や g-w のように、現在の権限に対して「相対的」に権限を追加・削除する方法。こっちも便利!
どちらも一長一短があって、プロは状況に応じて使い分けます。
まずは、より直感的でミスの少ない「数値モード」からマスターしちゃいましょう!💪
① 数値モード(8進数)での chmod
数値モードでは、r, w, x の権限を「数値」に置き換えて表現します。
これは、内部的にビット演算(ON/OFF)で管理されてるからなんですね。
- r (読み取り) = 4 (100)
- w (書き込み) = 2 (010)
- x (実行) = 1 (001)
そして、これらの数値を足し算することで、権限の組み合わせを表現します。
- — = 0 + 0 + 0 = 0 (すべての権限がない)
- –x = 0 + 0 + 1 = 1 (実行のみ)
- -w- = 0 + 2 + 0 = 2 (書き込みのみ)
- -wx = 0 + 2 + 1 = 3 (書き込みと実行)
- r– = 4 + 0 + 0 = 4 (読み取りのみ)
- r-x = 4 + 0 + 1 = 5 (読み取りと実行)
- rw- = 4 + 2 + 0 = 6 (読み取りと書き込み)
- rwx = 4 + 2 + 1 = 7 (すべての権限がある)
chmod コマンドでは、この数値を「[User] [Group] [Other]」の順番で3桁並べて指定します。
chmod [UGOの数値] [ファイル名]
実践例1: chmod 755 script.sh
これはシェルスクリプトや実行可能ファイル、Webサーバーがアクセスするディレクトリなんかで、すっごく一般的に使われる設定です。
- User (所有者) = 7 (
rwx) → 読み書き実行ぜんぶOK! - Group (グループ) = 5 (
r-x) → 読み取りと実行OK(書き込みはダメ) - Other (その他) = 5 (
r-x) → 読み取りと実行OK(書き込みはダメ)
ls -l での表示: -rwxr-xr-x
所有者だけが自由に編集できて、他の人は内容を見たり実行したりすることだけが許可される、っていう安全な設定ですね。
実践例2: chmod 644 text.txt
これは一般的なテキストファイルや、Webサーバー上のHTML、CSS、画像ファイルみたいに、実行する必要がないファイルで最も一般的に使われる設定です。
- User (所有者) = 6 (
rw-) → 読み書きOK(実行はダメ) - Group (グループ) = 4 (
r--) → 読み取りのみOK - Other (その他) = 4 (
r--) → 読み取りのみOK
ls -l での表示: -rw-r--r--
所有者だけが編集できて、他の人は内容を見ることだけが許可されます。これも安全!
【警告】「linux 権限 777」の意味と絶対に使ってはいけない理由
検索キーワードにも含まれる「linux 権限 777」…。
これは、多くの初心者が「動かないから、とりあえずこれで!」って安易に使ってしまいがちな、最も危険な設定なんです。
chmod 777 [ファイル名] とは、一体何を意味するんでしょうか?
- User (所有者) = 7 (
rwx) → 読み書き実行OK - Group (グループ) = 7 (
rwx) → 読み書き実行OK - Other (その他) = 7 (
rwx) → 読み書き実行OK
ls -l での表示: -rwxrwxrwx (ファイル) または drwxrwxrwx (ディレクトリ)
これは、システム上の誰でも、そのファイルやディレクトリに対して、読み取り、書き込み、実行のすべてを許可するっていう、セキュリティ皆無の「フルオープン」「鍵開けっ放し」な状態を意味します。
なぜ chmod 777 は危険なのか?
「動かないからとりあえず777にする」っていう考え方は、家の玄関の鍵を開けっ放しにして、「ご自由にお入りください」って看板を立てるような行為なんです😭
- Webサイトの改ざん
Webサーバーのドキュメントルート(例: /var/www/html)やその中のファイルに 777 を設定しちゃうと、サーバーに侵入した攻撃者や、サーバー上の他の(悪意ある)ユーザーが、あなたのWebサイトの index.html やPHPファイルを自由に改ざんできちゃいます。
不正なスクリプト(バックドア)を設置されて、サーバー乗っ取りの踏み台にされちゃいます…。 - 不正なスクリプトの実行
誰でも w (書き込み) と x (実行) ができるため、攻撃者は悪意のあるスクリプトをアップロードして、それをサーバー上で実行できてしまいます。 - ファイルの破壊
ディレクトリに 777 を設定すると、その中のファイルは誰でも削除(rm)し放題になります。大事なファイルが消されちゃうかも…!
⚠️「動かない」ときの正しい対処法⚠️
Webサーバーがファイルにアクセスできずに「403 Forbidden」エラーが出る場合、本当の原因は「Webサーバーの実行ユーザー(例: apache や nginx, www-data)が、そのファイルを読み取る権限(r–)を持っていない」ことです。
この正しい解決策は 777 ではありません!
解決策1(推奨): chown で所有者を変更する
ファイルの所有者自体を、Webサーバーの実行ユーザーに変更します。
sudo chown nginx:nginx /var/www/html/image.jpg
(chown については後で詳しく解説しますね!)
解決策2: グループ権限を適切に設定する
ファイルのグループをWebサーバーの実行グループ(例: www-data)に変更して、グループに読み取り権限(644 や 755)を与えます。
sudo chgrp www-data /var/www/html/image.jpg
chmod 644 /var/www/html/image.jpg
結論として、本番環境のサーバーで chmod 777 を使うことは、どのような理由があっても絶対に避けてください!
② 記号モード(相対モード)での chmod
数値モードが権限を「絶対的」に指定し直す(リセットする感じ)のに対して、記号モードは「現在の権限をベースに、一部だけ変更したい」っていう場合に、すっごく便利なんです。
構文: chmod [対象] [演算子] [権限] [ファイル名]
- 対象 (誰に)
u: User (所有者)g: Group (グループ)o: Other (その他)a: All (全員 = ugo) (対象を省略した場合は a になることが多いですが、umask の影響を受けるので a を明記するのが確実ですよ)
- 演算子 (どうする)
+: 権限を追加する (Add)-: 権限を削除する (Remove)=: 権限を指定通りに設定する (Set)
- 権限 (何を)
r: 読み取りw: 書き込みx: 実行
実践的な例
▼ chmod +x script.sh (または chmod a+x script.sh)
シェルスクリプトに実行権限を与えたい場合に、世界中で一番よく使われるコマンドです!
所有者、グループ、その他の全員に x 権限を追加します。
rw-r–r– (644) が → rwxr-xr-x (755) になります。
▼ chmod u+x script.sh
所有者(自分)にだけ実行権限を追加します。
▼ chmod g-w shared_file.txt
グループから書き込み権限を削除します。
rw-rw-r– (664) が → rw-r--r-- (644) になります。
▼ chmod o-rwx secret_file.txt
その他(他人)からすべての権限(rwx)を削除します。これで安心!
rw-r–rwx (647) が → rw-r----- (640) になります。
▼ chmod u=rw,g=r,o=r file.txt
= を使うと、その権限に「設定」します。
これは数値モードの chmod 644 file.txt とまったく同じ意味になりますね。
▼ chmod g+w,o-r file.txt
カンマ(,)で区切ることで、複数の操作を一度に指定できます。便利!
「グループに書き込み権限を追加」し、かつ「他人から読み取り権限を削除」します。
数値モードと記号モードは、どちらが優れているっていうものではありません。
- 数値モード: 644 や 755 など、権限を「あるべき姿」に絶対的にリセットしたい場合に適しています。
- 記号モード: +x や g-w など、既存の権限がどうであれ「実行権限だけ追加したい」みたいな相対的な操作に適しています。
ディレクトリ配下のファイルを一括で変更する (-R オプション)
Webサイトのファイル群や、プロジェクトのディレクトリ全体のパーミッションを一度に変更したい場合、-R (Recursive: 再帰的) オプションが使えます。
chmod -R [権限] [ディレクトリ名]
例えば、/var/www/html ディレクトリ配下をすべて 755 にする場合:
chmod -R 755 /var/www/html
【プロの警告】-R オプションの重大な落とし穴
…と、カンタンに説明しましたが、実はこの chmod -R 755 ... には、すっごく重大な落とし穴があるんです!😥
これを実行しちゃうと、そのディレクトリの中にあるファイルもサブディレクトリも、ぜーんぶ 755 になっちゃいます。
でも、Webサーバーの運用では、本当はこう設定するのが理想的なんです。
- ディレクトリ: 755 (
rwxr-xr-x) (ディレクトリに「入る」ために x が必要だから) - ファイル (HTML, CSS, JPG): 644 (
rw-r--r--) (「実行」する必要はないから x は不要)
すべてを 755 にしちゃうと、画像ファイルみたいな実行する必要のないファイルにまで実行権限が付いちゃって、セキュリティ上とっても好ましくないんです…。
かといって chmod -R 644 ... を実行しちゃうと、今度はディレクトリの x 権限が失われて、cd でディレクトリに入れなくなり、Webサーバーがアクセスできなくなっちゃいます。あぁ、もうパニック!
find コマンドと組み合わせた正しい一括変更(プロの技✨)
この問題をスマートに解決する、プロフェッショナルが使う実践的なテクニックが find コマンドとの組み合わせです!
1. ディレクトリだけを検索して 755 に変更する
find /var/www/html -type d -print0 | xargs -0 chmod 755 -type d : タイプが「ディレクトリ」のものだけを検索します。
2. ファイルだけを検索して 644 に変更する
find /var/www/html -type f -print0 | xargs -0 chmod 644 -type f : タイプが「ファイル」のものだけを検索します。
(xargs の -print0 と -0 は、ファイル名にスペースが含まれていても正しく処理するためのおまじない、って覚えておいてくださいね!)
この2つのコマンドを実行することで、chmod -R 777 みたいな危険な操作を避けつつ、ディレクトリとファイルのパーミッションを理想的な状態に一括設定できます!やったー!🎉
【chown】Linuxのオーナー・所有者変更コマンド (linux オーナー変更)
「linux パーミッション」と対をなす、もう一つのすっごく重要な概念が「所有者」です。
ファイルやディレクトリの「所有者(オーナー)」や「所属グループ」を変更するコマンドが chown (Change Owner) です。これぞ「linux オーナー変更」ですね!
なぜ chown (linux 所有者 変更) が必要なのか?
chmod が「できること(権限)」を変更するのに対して、chown は「誰のものか(所有権)」を変更します。
これがなぜ必要かというと…
- Webサーバーの運用:
FTPソフトで user ユーザーとしてアップロードした index.html は、所有者が user:user になりますよね。
でも、Webサーバー(nginx ユーザー)は「その他(Other)」扱いになっちゃうので、パーミッションが 640 なんかになってるとファイルを読み取れず、403エラーになります。
そこで!sudo chown nginx:nginx index.htmlを実行してファイルの所有者をWebサーバー自身に変更することで、nginx ユーザーは「所有者」としてファイルにアクセスできるようになるんです! - システム管理:
一般ユーザーが作成したファイルを、システム管理者(root)が引き継いで管理する場合なんかに使います。
chown コマンドの実行には、基本的に管理者権限(sudo)が必要です。
(セキュリティのため、一般ユーザーが自分のファイルの所有権を、他人に勝手に「はい、あげる」って譲渡することはできないんですね)
chown の基本的な使い方
所有者だけを変更する
構文: sudo chown [新しい所有者] [ファイル名]
# sample.txt の所有者を nginx ユーザーに変更 sudo chown nginx sample.txt
ls -l 結果: -rw-r--r--. 1 nginx user 123 ... sample.txt
2. 所有者とグループを同時に変更する(最重要・推奨)
現場で最もよく使う、chown の基本形です!これだけ覚えておけばOKかも!
所有者とグループをコロン(:)で区切って指定します。
構文: sudo chown [新しい所有者]:[新しいグループ] [ファイル名]
# sample.txt の所有者を nginx、グループも nginx に変更 sudo chown nginx:nginx sample.txt
ls -l 結果: -rw-r--r--. 1 nginx nginx 123 ... sample.txt
3. グループだけを変更する
コロン(:)の前に所有者名を省略すると、グループだけを変更できます。
構文: sudo chown :[新しいグループ] [ファイル名]
# sample.txt のグループを www-data に変更 (所有者は元のまま) sudo chown :www-data sample.txt
ls -l 結果: -rw-r--r--. 1 user www-data 123 ... sample.txt
(補足)グループ変更専用の chgrp (Change Group) コマンドも存在しますが、機能的には chown :group ... と同じです。sudo chgrp www-data sample.txt って打ってもOKですよ。
ディレクトリ配下を chown で一括変更する (-R オプション)
chmod と同じように、chown にも -R (Recursive) オプションがあります。
これは、Webサーバーのドキュメントルート全体の所有権を設定する際なんかに、すっごく強力です。
構文: sudo chown -R [所有者]:[グループ] [ディレクトリ名]
# /var/www/html ディレクトリと、その中身(サブディレクトリ、ファイル)すべてを
nginx:nginx に一括で変更する
sudo chown -R nginx:nginx /var/www/html
このコマンド一つで、Webサイトのコンテンツ全体の所有権を、Webサーバー(nginx)が管理しやすいように設定できます。
chmod -R と違って、chown -R はディレクトリとファイルで所有者を変える必要はあんまりないので、安全かつ頻繁に使われますよ!
【上級者向け】Linuxパーミッションの応用と特殊な権限
ここまでの chmod と chown の知識で、日常的な「linux パーミッション」管理の90%はバッチリ対応可能です!
でも、もっと深く理解したい!っていうあなたのために、さらに一歩進んだ「特殊なパーミッション」と「umask」について、こっそり解説しちゃいますね。
デフォルトの権限を決める「umask」とは?
「あれ? touch でファイルを作ると 644 (rw-r--r--) になって、mkdir でディレクトリを作ると 755 (rwxr-xr-x) になるのって、なんでだろ?」って思ったことありませんか?
これは umask (User Mask) っていう設定によって、作成時のデフォルト権限がコントロールされてるからなんです。
umask は「マスク(覆い隠す)」っていう名前の通り、「新しく作成するファイルやディレクトリから、デフォルトで『差し引く』権限」を指定します。
umask コマンドを実行すると、現在の設定値(通常は 0022 や 0002)が表示されます。
umask の計算はちょっと特殊なんですよ。
▼ファイル作成時の計算:
Linuxのファイルが持つ「最大権限」は 666 (rw-rw-rw-) です。(実行権限 x は、危ないからデフォルトでは付与されないんですね)
umask が 022 の場合:
666 (最大権限) – 022 (umask) = 644 (rw-r--r--)
▼ディレクトリ作成時の計算:
Linuxのディレクトリが持つ「最大権限」は 777 (rwxrwxrwx) です。
umask が 022 の場合:
777 (最大権限) – 022 (umask) = 755 (rwxr-xr-x)
もし、グループでの共同作業を優先して、グループメンバーが書き込めるように umask 002 に設定すると…
- ファイル:
666–002= 664 (rw-rw-r--) - ディレクトリ:
777–002= 775 (rwxrwxr-x)
…っていう風に、デフォルトの権限が変わるんです!
umask は、/etc/profile や各ユーザーの ~/.bashrc なんかで設定されてて、システム全体のセキュリティポリシーの土台になってるんですね。
特殊なパーミッション「SUID」「SGID」「スティッキービット」
chmod の数値モードは、実は3桁じゃなくて、先頭に「特殊権限」を指定する桁を加えた「4桁」で表現されることがあるんです。(例: chmod 4755 …)
この4桁目(1000の位)は、セキュリティ上すっごく重要な3つの特殊パーミッションを指定します。
| 特殊権限 | 数値 | ls -l 表示 (xがある時) | ls -l 表示 (xがない時) |
|---|---|---|---|
| SUID (Set User ID) | 4000 | rwsr-xr-x (所有者の x が s) | rwSr--r-- (所有者の x が S) |
| SGID (Set Group ID) | 2000 | rwxr-sr-x (グループの x が s) | rw-r-Sr-- (グループの x が S) |
| Sticky Bit (スティッキー) | 1000 | rwxrwxrwt (その他の x が t) | rwxrwxrwT (その他の x が T) |
SUID (Set User ID) – 数値 4000
- 設定対象: 実行可能ファイル(シェルスクリプトには通常無効です)
- 意味: そのファイルを実行したユーザーに関わらず、ファイルの「所有者」の権限で実行される。(一時的に変身するイメージ!)
- 例: passwd コマンド (
-rwsr-xr-x. 1 root root ... /usr/bin/passwd)
一般ユーザーは /etc/shadow(パスワードが保存されてる秘密のファイル)に書き込めませんよね。
でも、passwd コマンドは所有者が root で SUID が設定されています。
一般ユーザーが passwd を実行すると、そのプロセスは一時的に root 権限で動作するので、自分のパスワード(に対応する /etc/shadow の記述)だけを変更できるんです!すごい仕組み! - 危険性: 非常に強力です。SUID が設定されたファイル(特に所有者が root のもの)にバグがあると、システム全体を乗っ取られる可能性があります。
chmod 4777みたいな設定はもう論外ですよ!
2. SGID (Set Group ID) – 数値 2000
SGID には「ファイル」と「ディレクトリ」で2つの意味があります。
- 意味(ファイル):
実行可能ファイルに設定。実行したプロセスの実効グループIDが、ファイルの「グループ」の権限になります。SUID のグループ版ですね。 - 意味(ディレクトリ):
こちらが非常に重要で、すっごく実用的です!
ディレクトリに設定すると、そのディレクトリ内で新しく作成されたファイルやサブディレクトリは、作成したユーザーに関わらず、親ディレクトリの「グループ」を自動的に継承するようになります! - 例: 複数の開発者(dev1, dev2)が www-data グループに所属しているとします。
sudo chmod 2775 /var/www/shared_dir(またはsudo chmod g+s /var/www/shared_dir)と設定します。
dev1 が /var/www/shared_dir 内に file.txt を作成すると、普通は dev1:dev1 になっちゃいますが、SGID の効果で所有権がdev1:www-dataとなります。
これで、グループ(www-data)に属する他のメンバー(dev2 やWebサーバー)が、パーミッション(例: 775)に基づいてファイルにアクセスできるようになるんです!
チームでの共有ディレクトリ管理に必須のテクニックですよ!💪
3. スティッキービット (Sticky Bit) – 数値 1000
- 設定対象: ディレクトリ
- 意味: そのディレクトリは誰でも(パーミッションが 777 や 775 の場合)ファイルやディレクトリを作成できる。でも、そのディレクトリ内のファイルやディレクトリを「削除」または「名前変更」できるのは、そのアイテムの「所有者」本人か、ディレクトリの所有者、または root だけに制限する、っていう特別なルールです。
- 例: /tmp ディレクトリ (
drwxrwxrwt. ... root root ... /tmp)
/tmp は、システム上のすべてのユーザーが一時ファイルを作成するための共有スペースです。
パーミッションは 777 (rwxrwxrwx) ですが、最後に t(スティッキービット)が付いていますよね。
これのおかげで、ユーザーAはファイルAを、ユーザーBはファイルBを作成できますが、ユーザーBがユーザーAのファイルAを勝手に削除することはできないんです!賢い!
chmod 777 と chmod 1777 は、セキュリティ上まったく異なる意味を持つんですね。
まとめ
「linux パーミッション」と「linux オーナー変更」は、Linuxのセキュリティと安定運用の根幹をなす、本当に本当に、最も重要な知識です。
最後に、この記事で学んだ最重要ポイントを、もう一度おさらいしますね。
✅ ls -l を制する者がパーミッションを制する!
(-/d/l) (タイプ), (rwx) (所有者), (rwx) (グループ), (rwx) (その他)、そして [所有者] [グループ] の見方をマスターすることが、すべての始まりです。
✅ rwx は「ファイル」と「ディレクトリ」で意味が全然違う!
特に「ディレクトリの w(作成/削除)」と「ディレクトリの x(cd する能力)」を混同しないことが、すっごく重要です。
✅ chmod(権限変更)は2種類ある!
数値モード (755, 644): 権限を「あるべき姿」に絶対的に指定します。
記号モード (+x, g-w): 権限を「今をベースに」相対的に追加・削除します。
✅ 「linux 権限 777」は絶対悪!🚨
「動かないから」っていう理由で chmod 777 を使うのは、セキュリティを全部捨てる行為です。
問題の本当の原因(r がない、x がない、所有者が違う)を突き止めて、chmod 644 や chmod 755、あるいは chown を使って正しく対処してくださいね!
✅ chown(所有者変更)は chmod の相棒!
ファイルにアクセスできない原因が権限(chmod)じゃなくて、所有権(chown)にあるケースは、すっごく多いんです。
sudo chown -R nginx:nginx /var/www/html みたいに、-R オプションと 所有者:グループ の指定が基本です。
✅ 応用編がプロへの道!
find と chmod を組み合わせて、ディレクトリとファイルを別々の権限で一括変更するテクニック。
SGID (g+s または 2000) をディレクトリに設定して、グループでの共有作業を効率化する方法。
/tmp で使われる スティッキービット (+t または 1000) の役割。
Linuxのアクセス権管理は、一見すると複雑で難解に見えるかもしれません…。
でも、今日学んだこれらのコマンドと概念は、すべて「マルチユーザーOSとして、ファイルとユーザーを安全に守るため」っていう、一つのちゃんとした論理に基づいているんです。
Permission denied っていうエラーは、あなたを困らせる敵じゃなくて、「現在の設定では安全性が確保できませんよ!」って教えてくれる、Linuxからの親切なメッセージなんだって思ってくださいね。
この記事をリファレンス(辞書代わり)にして、安全で堅牢なLinuxサーバー運用を目指しましょう!💪✨


コメント