第6章 パーミッションと所有者

Linuxは複数のユーザーが同じシステムを使うことを前提に設計されています。そのため、ファイルごとに「誰が」「何をできるか」を細かく制御する仕組みがあります。

ls -l の見方

-rwxr-xr--  user user   220  deploy.sh

先頭の10文字がパーミッション(権限)情報です。次の4つのブロックに分かれています。

位置意味
1文字目種別(-=ファイル、d=ディレクトリ)
2〜4文字目所有者(owner)の権限
5〜7文字目所有グループ(group)の権限
8〜10文字目その他のユーザー(other)の権限

各3文字は r(read=読む)、w(write=書く)、x(execute=実行する)の有無を表し、権限がない場合は - になります。

ls -l の行に含まれるその他の情報

実機で ls -l を実行すると、権限表記の後ろにもいくつかの情報が続けて表示されます。実際の1行は次のような形になります。

-rwxr-xr--  1 user user   220 Aug 10 09:15 deploy.sh
項目この例での値意味
パーミッション-rwxr-xr--種別と権限(本章のメインテーマ)
リンク数1そのファイル・ディレクトリを指すハードリンクの数
所有者userファイルの所有者ユーザー名
所有グループuserファイルの所有グループ名
サイズ220ファイルサイズ(バイト単位)
更新日時Aug 10 09:15最後にファイル内容が更新された日時
ファイル名deploy.shファイル・ディレクトリの名前

初心者のうちは先頭の権限部分だけに注目しがちですが、「誰の持ち物で、いつ更新されたか」まで含めて読めるようになると、トラブルシューティングの際に役立ちます。たとえば「昨日デプロイしたはずなのに更新日時が古いままだ」といった気づきは、この欄を見る習慣があってこそ得られるものです。

ディレクトリに対するx権限の意味

ファイルの場合、x(実行権限)は「プログラムとして実行できるか」を意味しますが、ディレクトリに対するxは少し意味が異なり、「そのディレクトリにcdで入れるか、中のファイルの詳細情報にアクセスできるか」を表します。rはあってもxがないディレクトリは、lsでファイル名の一覧は見えても、cdで中に入ったり中のファイルを開いたりすることはできません。逆にxだけあってrがない場合は、ファイル名が分かっていれば中に入れますが、一覧表示はできないという少し変わった状態になります。

この違いはよく「本棚の扉」に例えられます。rだけの本棚は扉のガラス越しに背表紙(ファイル名)だけは見えるけれど扉が開けられない状態、xだけの本棚は扉は開けられるけれど中に何があるか目次(一覧)が見えない状態、というイメージです。実務では「ディレクトリには最低でも r と x をセットで与える」のが基本形になります。

数字で表すパーミッション

r・w・x はそれぞれ 4・2・1 という数値に対応し、その合計で権限を表せます。

数字権限意味
7rwx読む・書く・実行すべて可能
6rw-読み書きは可能、実行は不可
5r-x読む・実行は可能、書き込み不可
4r--読むことだけ可能

これを所有者・グループ・その他の順に3桁並べたものが、chmodでよく見る 755 や 644 という数値です。

$ chmod 755 deploy.sh   # 所有者=rwx, グループ=r-x, その他=r-x
$ chmod 644 memo.txt    # 所有者=rw-, グループ=r--, その他=r--
種別 - 所有者 (u) グループ (g) その他 (o) r 4 w 2 x 1 r 4 - 2 x 1 r 4 - 2 x 1 = 7 = 5 = 5 所有者・グループ・その他の順に3桁並べると chmod 755
パーミッションの9ビット構造。rwxrwxrwxの各文字は所有者・グループ・その他の3人分×3ビットに分かれ、それぞれ4・2・1の重みを持ちます。オンになっているビットの重みを足すと、chmodで使う数字(この例では755)になります。

よく使う権限の組み合わせ

数値用途の例
755スクリプトや実行ファイル。所有者は全権限、他は読み取り・実行のみ。
644一般的な設定ファイルやテキストファイル。所有者のみ書き込み可能。
700所有者のみアクセス可能。SSHの秘密鍵など機密性の高いファイルに使う。
777誰でも読み書き実行可能。セキュリティ上ほぼ推奨されない。
600所有者のみ読み書き可能、実行不可。設定ファイルやAPIキーなど、より機密性の高い情報に使う。
664所有者・グループが読み書き可能、その他は読み取りのみ。チームで共同編集するファイルに使われることがある。

迷ったときの目安として、「実行するファイル(スクリプトやプログラム)には755」「実行しない一般のファイル(設定ファイルやテキスト)には644」「秘密鍵や認証情報など特に守りたいファイルには600や700」と覚えておくと、実務で遭遇するケースの大半をカバーできます。逆に777や666のように「その他」にまで書き込み権限を与える設定は、サーバーが外部からの攻撃を受けたときにファイルを書き換えられてしまうリスクに直結するため、基本的には避けるべき設定だと考えてください。

記号表記(symbolic mode)について: 実機の chmod では chmod u+x file.sh(所有者に実行権限を追加)のような記号表記も使えます。u=所有者、g=グループ、o=その他、a=全員、+=権限追加、-=権限削除、==権限を指定の状態に設定、を表します。たとえば chmod go-w file.txt はグループとその他から書き込み権限を取り除く、という意味になります。このサイトの練習用ターミナルは数値表記(3桁の8進数)のみに対応しています。

よくある間違い

  • 桁の順番を勘違いする: 3桁は必ず「所有者・グループ・その他」の順です。「自分だけに権限を絞りたい」つもりで 004 のように順序を逆にしてしまうと、逆に自分だけアクセスできなくなってしまいます。
  • とりあえず777にしてしまう: 「動かないから777にする」は権限トラブルの応急処置としてよく見られますが、誰でも書き換え・実行できる状態になり非常に危険です。まずは755や644で足りないか確認しましょう。
  • ディレクトリのx権限を忘れる: ファイルに644を付けたのに親ディレクトリにxがなく、結局アクセスできない、というのはよくあるつまずきです。ディレクトリにはrとxをセットで意識しましょう。
  • chmod 000 で自分自身を締め出す: 誤って所有者からも権限を外してしまうと、一般ユーザーでは元に戻せなくなることがあります(管理者権限があれば復旧できます)。心配なときは ls -l で現在の権限を確認してから変更しましょう。

chown / chgrp — 所有者・グループを変更する

ファイルの所有者やグループを変更するには chown を使います(多くの場合、管理者権限が必要です)。所有グループだけを変更したい場合は chgrp というコマンドも用意されています。

$ chown alice memo.txt        # 所有者をaliceに変更
$ chown alice:staff memo.txt  # 所有者とグループを同時に変更
$ chgrp staff memo.txt        # グループだけをstaffに変更

Web サーバーの設定ファイルなど、特定のプログラム専用ユーザー(例: www-data)が読み書きする必要があるファイルでは、chown で所有者をそのユーザーに合わせておく、という使い方がよくあります。

豆知識: SUID・SGID・スティッキービット
実機のパーミッションには、本章で扱った9桁に加えて「特殊権限」と呼ばれるもう1桁分の情報があります。代表的なものに、実行時に所有者の権限で動作するSUID、ディレクトリ内に作成したファイルのグループを自動的に親と揃えるSGID、共有ディレクトリで他人のファイルを誤って削除できないようにするスティッキービット(/tmpなどに設定される)があります。これらは中級以降で扱う、少し発展的なテーマです。

豆知識: 新しいファイルの既定の権限(umask)

新しくファイルやディレクトリを作成すると、何もしなくてもある程度の権限が最初から設定されています。この既定値をコントロールしているのが、実機の umask(ユーザーマスク)という設定です。多くのLinux環境では、umaskの既定値は 022 に設定されており、その結果、新しく作られるファイルは 644、新しく作られるディレクトリは 755 になることが一般的です。umaskは「本来与えられるはずの権限から、どれだけ差し引くか」を表す値で、chmodのように直接権限を指定する数値とは考え方が逆になっている点に注意しましょう。

具体的には、ファイルの最大権限である666(実行権限は自動では付与されないため、rwx合計の777ではなく666が基準になります)から、umaskの値022を桁ごとに差し引くと644になります。同様にディレクトリの最大権限777から022を引くと755になります。実機で現在のumask値を確認したいときは、ターミナルでumaskとだけ入力すると現在の設定値が表示されます。

試してみよう: 練習用ターミナルで ls -l と chmod 755 ファイル名 を実行し、権限表記がどう変わるか確認してみましょう。うまくいったら chmod 644 や chmod 700 も試して、権限表記の違いを見比べてみてください。

なぜ「自分のファイルなのにアクセスできない」ことがあるのか

パーミッションの仕組みでもう1つ、初心者が驚きやすい挙動があります。それは、Linuxが権限を判定するのは「所有者→グループ→その他」の順で、たった1回だけということです。「所有者・グループ・その他のどれか1つでも許可されていればアクセスできる」というOR(どれか1つ)の判定ではなく、「自分がこの4つのうちどれに該当するかをまず1つだけ決めて、その枠の権限だけを見る」という判定方法になっています。

具体的には、Linuxはアクセスしてきたユーザーに対して、次の順序でたった1つだけ「立場」を確定させます。

判定順条件
① 所有者アクセスしてきたユーザーが、そのファイルの所有者本人であるか
② グループ①に該当しない場合、そのファイルの所有グループに自分が所属しているか
③ その他①にも②にも該当しない場合、「その他」の権限が適用される

ポイントは、①に該当した時点で判定が確定し、②・③の権限は一切見に行かないという点です。この仕組みが分かると、次のような一見不思議な状況が起こり得ることが理解できます。

$ ls -l script.sh
----rwxrwx  1 user  staff   220  script.sh

この例では、所有者(user)の権限が---(何も許可されていない)ですが、グループとその他にはrwxが与えられています。もし所有者であるuser自身がこのファイルを実行しようとすると、どうなるでしょうか。「グループやその他には実行権限があるのだから、動くはずでは」と思うかもしれませんが、答えはPermission denied(実行できない)です。userはこのファイルの所有者に該当するため、①の時点で判定が確定し、たとえグループやその他により広い権限があっても、そこから先の②・③はいっさい参照されないからです。

注意: 「所有者の権限を厳しくしすぎたつもりが、逆に自分自身が締め出される」という事故は実務でも起こり得ます。chmodで数値を指定するときは、必ず所有者(1桁目)に自分が必要とする権限が含まれているかを確認しましょう。

パーミッションエラーに出会ったときの考え方

「Permission denied」というエラーは、Linuxを使っていると必ず一度は遭遇します。焦らず落ち着いて、まずls -lで対象ファイルの権限・所有者を確認し、次に自分が「所有者・グループ・その他」のどれに該当するのかを整理しましょう。自分に必要な権限が足りていない場合は、権限を持つユーザー(多くの場合は所有者やroot)に付与を依頼するか、自分がその操作を行う正当な理由があるかを見直すのが基本的な対応の流れです。安易に777にして問題を回避しようとせず、原因を切り分ける癖をつけておくことが、セキュリティ意識の高いエンジニアへの第一歩になります。

手を動かす小課題

練習用ターミナルで、次の課題を実際に試してみましょう。答えは見出しをクリックすると表示されます。

課題1: ls -lで、既存のファイルの権限表記を確認してみましょう。

答え: ls -lと入力すると、各ファイルの先頭に-rwxr-xr--のような10文字の権限表記が表示されます。1文字目が種別、残り9文字が所有者・グループ・その他の権限であることを、実際の表示で確認してみましょう。

課題2: chmod 600 memo.txtを実行し、ls -lで権限表記がどう変わるか確認してみましょう。

答え: chmod 600 memo.txtのあとls -lを実行すると、権限表記が-rw-------になっているはずです。所有者だけが読み書きでき、グループ・その他には何の権限も無い状態です。

課題3: chmod 755 memo.txtとchmod 644 memo.txtを続けて実行し、権限表記の違いを見比べてみましょう。

答え: chmod 755は-rwxr-xr-x、chmod 644は-rw-r--r--になります。755は実行ファイル・スクリプト向け、644は一般的なテキストファイル向けの定番設定でした。

確認クイズ

Q1. ls -l の結果の先頭が d rwxr-xr-x だった場合、これは何を表していますか?

解説: 先頭の1文字が d の場合はディレクトリを表します。ファイルの場合は - です。

Q2. chmod 644 file.txt を実行すると、その他のユーザー(other)に与えられる権限はどれですか?

解説: 644 は所有者=rw-、グループ=r--、その他=r-- を意味します。その他のユーザーには読み取り権限のみが与えられます。

Q3. ファイルの所有者を変更するコマンドはどれですか?

解説: chown(change owner)がファイルの所有者・所有グループを変更するコマンドです。chmodは権限を変更します。

Q4. あるファイルの権限が ----rwxrwx(所有者=---、グループ=rwx、その他=rwx)のとき、そのファイルの所有者本人がアクセスしようとするとどうなりますか?

解説: Linuxは所有者→グループ→その他の順で、アクセスしてきたユーザーの立場をたった1つだけ確定させます。所有者本人は①の時点で判定が確定するため、グループやその他により広い権限があっても参照されず、所有者自身の権限(この例では---)だけが適用されます。