4:パーミッションと所有権

目次

はじめに

Linux では、すべてのファイルとディレクトリに「誰が・何をしてよいか」というルールが設定されています。これをパーミッション(権限) と呼びます。パーミッション(permission)とは、英語で「許可」という意味で、ここでは「このファイルを読んでよい・書き換えてよい・実行してよい」といったアクセスの許可設定のことです。権限は不正なアクセスを防ぐセキュリティの土台であると同時に、「実行できない」「書き込めない」といった“動かない原因” の正体になることもよくあります。

この回では、L2 で「詳しくは L4 で」と保留にしていた ls -l の先頭の文字列(drwxr-xr-x など)の読み方を回収します。権限の意味を理解し、chmod で変更し、chown で所有者を確認できるようになることを目指します。


1. ls -l の読み方

L2 で ls -l を使うと、ファイルやディレクトリの詳しい情報が1行ずつ表示されることを学びました。あらためて出力を見てみましょう。

$ ls -l

期待される出力(例):

total 12
drwxr-xr-x  2 username username 4096 May 29 14:30 docs
-rwxr-xr--  1 username username   58 May 29 14:31 hello.sh
-rw-r--r--  1 username username   42 May 29 14:31 memo.txt

各行のいちばん左にある 10文字 が、そのファイルの種別と権限を表しています。たとえば hello.sh の -rwxr-xr-- を分解すると、次のようになります。

位置文字意味
1文字目-ファイル種別-=ファイル、d=ディレクトリ)
2〜4文字目rwx所有者(user) に許された操作
5〜7文字目r-xグループ(group) に許された操作
8〜10文字目r--その他(others) に許された操作

つまり 10文字は「種別(1文字)+ 3つの権限グループ(3文字×3)」という構造です。1文字目が d なら、それはファイルではなくディレクトリ(フォルダ)です。docs の行頭が d で始まっているのがその例です。

3つの権限グループは、それぞれ対象となる相手が違います。所有者とは、そのファイルを作った(持っている)本人のことです。グループとは、複数のユーザーをひとまとめにした「チーム」のようなもので、同じグループに属する人たちにまとめて同じ権限を与えられる仕組みです(たとえば開発チーム全員に同じファイルを編集させたいとき)。

区分英語誰のことか
所有者user(uそのファイルを持っている本人
グループgroup(gそのファイルが属するグループのメンバー
その他others(oそれ以外の全員

各グループの3文字は、左から rwx の順に並びます。許可されていない部分は -(ハイフン)で表されます。


2. パーミッションの意味

rwx の3文字は、それぞれ次の操作を表します。

文字英語意味
rread読み取り(中身を見る・コピーする)
wwrite書き込み(中身を変える・上書きする)
xexecute実行(プログラムとして動かす)

たとえば所有者の権限が rwx なら「読める・書ける・実行できる」、r-- なら「読めるだけ」という意味になります。

数値での表し方(r=4 w=2 x=1

パーミッションは、文字だけでなく数値でも表せます。各文字に次の値が割り当てられています。

文字数値
r4
w2
x1

1つの権限グループ(3文字)について、許可されている文字の数値を足し算します。

権限計算数値
rwx4 + 2 + 17
r-x4 + 0 + 15
rw-4 + 2 + 06
r--4 + 0 + 04

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

数値所有者グループその他文字表記
755rwx(7)r-x(5)r-x(5)-rwxr-xr-x
644rw-(6)r--(4)r--(4)-rw-r--r--

755 は「本人は全部できる、他の人は読めて実行できるが書き換えはできない」、644 は「本人は読み書きできる、他の人は読めるだけ」という意味になります。プログラムやスクリプトは 755、ただのテキストファイルは 644 がよくある設定です。

ディレクトリにおける x の意味

x(実行)は、ファイルでは「プログラムとして動かす」という意味でした。一方、ディレクトリに付いた x は「その中に入れる(cd できる)」という意味になります。

  • ディレクトリに r がない → 中のファイル一覧(ls)が見られない
  • ディレクトリに x がない → そのディレクトリに cd で入れない

そのため、ディレクトリの権限は r と x がセットで rwxr-xr-x(=755)になっていることが多いのです。ファイルとは x の意味が違う、という点を覚えておきましょう。


3. chmod:権限を変更する

権限を変更するコマンドが chmod です。change mode(モードを変える) の略です。指定のしかたには記号方式数値方式の2通りがあり、どちらでも同じことができます。

記号方式:u+x のように足し引きする

記号方式は「誰に・どうする・どの権限を」を組み合わせて書きます。

部品記号意味
誰にu / g / o / a所有者 / グループ / その他 / 全員(all)
どうする+ / -付ける / 外す
権限r / w / x読み / 書き / 実行

たとえば hello.sh(最初は 644)に、所有者の実行権限 x を付けてみましょう。変更前後で ls -l を見比べます。

変更前:

$ ls -l hello.sh

期待される出力(例):

-rw-r--r--  1 username username 58 May 29 14:31 hello.sh

u+x(所有者に実行権限を付ける)を実行します。

$ chmod u+x hello.sh
$ ls -l hello.sh

期待される出力(例):

-rwxr--r--  1 username username 58 May 29 14:31 hello.sh

所有者の部分が rw- から rwx に変わり、x が付きました。

記号方式は複数まとめて指定することもできます。たとえば「全員に読み(a+r)を付けつつ、グループとその他から書き(go-w)を外す」といった書き方ができます。

$ chmod go-w hello.sh
$ chmod a+r hello.sh

数値方式:755 のように3桁で指定する

セクション2で学んだ数値を使い、3桁まとめて権限を一気に設定する方法です。記号方式が「足し引き」なのに対し、数値方式は「上書き設定」になります。

hello.sh(いま -rwxr--r--)を、スクリプトの定番である 755 にしてみましょう。

変更前:

$ ls -l hello.sh

期待される出力(例):

-rwxr--r--  1 username username 58 May 29 14:31 hello.sh

755 を指定します。

$ chmod 755 hello.sh
$ ls -l hello.sh

期待される出力(例):

-rwxr-xr-x  1 username username 58 May 29 14:31 hello.sh

rwxr--r--(744)が rwxr-xr-x(755)に変わり、グループとその他にも x が付きました。逆に、ただのテキストに戻したいときは 644 を指定します。

$ chmod 644 hello.sh
$ ls -l hello.sh

期待される出力(例):

-rw-r--r--  1 username username 58 May 29 14:31 hello.sh

【注意】chmod 777 の乱用に気をつけましょう。 777 は「全員に読み・書き・実行をすべて許可」という設定です。一見便利ですが、誰でもファイルを書き換え・実行できてしまうため、セキュリティ上とても危険です。「とりあえず 777」は避け、必要最小限の権限(多くは 644 か 755)を選ぶ習慣をつけましょう。


4. 所有者とグループ

権限の3グループ(所有者・グループ・その他)の判定には、「そのファイルの所有者は誰か」「どのグループに属しているか」という情報が使われます。これは ls -l の中ほどに username username(左が所有者、右がグループ)として表示されていた部分です。

-rw-r--r--  1 username username 42 May 29 14:31 memo.txt
                ^^^^^^^^ ^^^^^^^^
                所有者    グループ

この所有者・グループを変更するコマンドが chown(change owner の略)です。chown 所有者:グループ ファイル名 の形で指定します。

$ chown username:staff memo.txt
$ ls -l memo.txt

期待される出力(例):

-rw-r--r--  1 username staff 42 May 29 14:31 memo.txt

グループ部分が username から staff に変わりました。

管理者権限が必要になる場面

自分が所有しているファイルの権限を変更する場合は、通常は特別な許可は必要ありません。しかし、他のユーザーが所有しているファイルや、システム管理用のファイルを変更しようとすると、権限不足でエラーになることがあります。

$ chown username:staff sample-file
権限不足のため処理できません

このようなエラーが表示された場合は、現在のユーザーに十分な権限がないことを意味します。Linuxには、一時的に管理者権限でコマンドを実行する仕組みが用意されています。

【注意】管理者権限での操作は慎重に行いましょう。 管理者権限ではシステム全体に影響を与える操作が可能です。重要なファイルの設定を誤って変更すると、OSやアプリケーションが正常に動作しなくなることがあります。学習段階では、自分のホームディレクトリ内のファイルだけで練習するのがおすすめです。

管理者権限の詳しい仕組みや安全な使い方については、L6で解説します。ここでは「通常ユーザーでは実行できない操作が存在する」という点を押さえておきましょう。


演習

課題:hello.sh に実行権限を付けて、644 ↔ 755 を行き来する

スクリプト風のファイルを作り、権限を記号方式と数値方式の両方で変更してみましょう。hello.sh の中身は、いまは深く考えず「画面に文字を出すだけの2行」と思っておけば大丈夫です(シェルスクリプト自体の解説はここでは行いません)。

まず、ホームで練習用ファイルを作ります。

$ cd ~
$ echo "echo Hello TechVillage" > hello.sh
$ ls -l hello.sh

期待される出力(例):

-rw-r--r--  1 username username 23 May 29 15:20 hello.sh

作りたてのファイルには実行権限 x が付いていません(-rw-r--r--)。記号方式で実行権限を付けます。対象を省略した +x は a+x(全員)と同じ意味で、所有者・グループ・その他すべてに実行権限が付きます。

$ chmod +x hello.sh
$ ls -l hello.sh

期待される出力(例):

-rwxr-xr-x  1 username username 23 May 29 15:20 hello.sh

x が付いて -rwxr-xr-x(=755)になりました。次に、数値方式で 644 に戻してみます。

$ chmod 644 hello.sh
$ ls -l hello.sh

期待される出力(例):

-rw-r--r--  1 username username 23 May 29 15:20 hello.sh

x が外れ、ただのテキストと同じ 644 に戻りました。最後に、もう一度数値方式で 755 に戻して、行き来できることを確認します。

$ chmod 755 hello.sh
$ ls -l hello.sh

期待される出力(例):

-rwxr-xr-x  1 username username 23 May 29 15:20 hello.sh

演習の確認ポイント

  • ☐ ls -l の先頭10文字を「種別+所有者+グループ+その他」に分解して読み解けましたか?
  • ☐ 記号方式(+x)と数値方式(644755)の両方で権限を変更できましたか?
  • ☐ なぜプログラムの実行に x(execute)が必要なのか、自分の言葉で説明できますか?
目次