第2部 使いこなす
第5章 ユーザー・グループ・パーミッション
Linuxは「誰が」「何に対して」「何をしてよいか」を厳密に管理するOSです。この仕組みを理解すると、なぜ Permission denied と怒られるのか、どう直せばよいのかが手に取るように分かります。
🎯 この章で学ぶこと
- Linuxがマルチユーザーである理由と、権限が必要な背景
- root(管理者)と一般ユーザーの違い、最小権限の考え方
sudoで安全に管理者権限を使う方法- ユーザーとグループを管理するコマンド(
id/useradd/usermodなど) ls -lのパーミッション表記(-rwxr-xr--)の読み方と、chmod/chownでの変更
5.1 Linuxはマルチユーザー
Windowsの個人PCを一人で使っていると意識しにくいのですが、Linuxは「1台のマシンを複数の人が同時に使う」ことを大前提に設計されています。これをマルチユーザーと呼びます。
もともとLinuxの祖先であるUNIXは、高価な大型コンピュータを大勢で共有する時代に生まれました(第1章)。1台のサーバーに、開発者A、開発者B、運用担当のCさんが同時にログインして作業する——そんな状況が当たり前だったのです。現代のサーバーやクラウドでも事情は同じで、1台のマシンを複数の人・複数のプログラムが共有します。
複数人が同じマシンを使うなら、当然こういう疑問が出てきます。
- Aさんのファイルを、Bさんが勝手に消したり読んだりできてよいのか?
- 一般社員が、システム全体の設定を書き換えられてよいのか?
- あるプログラムのバグや乗っ取りが、システム全体に波及してよいのか?
これらを防ぐために、Linuxには「誰が(ユーザー)」「どのグループに属し」「何に対して何をしてよいか(パーミッション)」という権限の仕組みが最初から組み込まれています。この章はその全体像を扱います。
学習環境が自分だけのWSLやクラウドVMでも、この仕組みは常に働いています。あなた自身の一般ユーザーと、システムを動かすための特別なユーザー(root や各種サービス用ユーザー)が共存しているからです。つまり「一人で使っていても、実は多人数用の仕組みの上で動いている」のがLinuxです。
5.2 rootと一般ユーザー
Linuxのユーザーは、大きく2種類に分けて考えると理解しやすくなります。
| root(ルート) | 一般ユーザー | |
|---|---|---|
| 別名 | スーパーユーザー、管理者 | 普通のユーザー |
| 権限 | 何でもできる。すべてのファイルを読み書きでき、システム設定も変更可能 | 自分のホームディレクトリなど、許された範囲だけ |
| ユーザーID(UID) | 必ず 0 | 通常 1000 以降 |
| プロンプト表示 | 末尾が # | 末尾が $ |
| 使いどころ | ソフトの導入、システム設定など管理作業のときだけ | 普段の作業すべて |
root は「何でもできる」がゆえに危険です。たとえば rm -rf /(ルート以下をすべて削除)のような操作も、root なら止められることなく実行してしまい、システムが起動不能になります。権限がある分、ミスもそのまま通ってしまうのです。
そこでLinuxの鉄則は、「普段は一般ユーザーで作業し、管理作業が必要なときだけ一時的に管理者権限を借りる」という運用です。これは、コンピュータ大全コース第3章で触れた最小権限の原則——「必要最小限の権限しか与えない」——をユーザー運用に当てはめたものです。常に管理者でいると、ちょっとしたミスや、乗っ取られたプログラムの暴走が、システム全体に及んでしまいます。
初学者がやりがちな失敗が「面倒だから最初から root でログインして全部やる」です。確かに Permission denied は出なくなりますが、タイプミス1つでシステムを壊せる状態を常に維持することになります。プロの現場では、root での常用は事故のもととして厳しく戒められます。次の sudo を使いましょう。
5.3 sudo — 一時的に管理者権限を借りる
sudo(スードゥー / エスユードゥー)は「superuser do」の略で、そのコマンド1回だけを管理者権限で実行するためのものです。使い方はコマンドの前に sudo を付けるだけです。
$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
$ sudo apt update
[sudo] password for yuuki:
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Reading package lists... Done
1回目は一般ユーザーのまま apt update を実行したため、システム領域を触れず Permission denied で失敗しました。2回目は sudo を付けたことで、パスワード確認のうえ管理者としてコマンドが実行できています。ポイントは、聞かれるのがroot のパスワードではなく「あなた自身のパスワード」である点です。
なぜ sudo は「root で常用する」より安全なのでしょうか。
- 権限が一時的 — 管理者権限になるのはそのコマンドの実行中だけ。終われば一般ユーザーに戻ります。ずっと管理者でいる危険な状態を避けられます。
- 意識的な操作になる —
sudoを打つ手間が「今から危険な操作をする」という一呼吸になり、うっかりミスが減ります。 - 誰が何をしたか記録が残る —
sudoの使用は/var/log/auth.logなどに記録されます(第7章のログ参照)。「誰がいつ管理者操作をしたか」を後から追えます。 - root のパスワードを配らなくてよい — 管理を任せたい人を
sudoグループに入れるだけでよく、root のパスワードそのものを共有せずに済みます。
直前のコマンドを sudo 付きで実行し直したいときは sudo !! と打つと、直前のコマンドをそのまま管理者権限で再実行できます。また sudo -i や sudo su - で root のシェルに入れますが、これは「一時的に借りる」思想から外れるので、必要な作業だけ済ませたらすぐ exit で抜けましょう。
5.4 ユーザーとグループの管理
まずは「今の自分が誰なのか」を確認するコマンドからです。
$ whoami
yuuki
$ id
uid=1000(yuuki) gid=1000(yuuki) groups=1000(yuuki),4(adm),27(sudo),100(users)
whoami は現在のユーザー名だけを返します。id はより詳しく、ユーザーID(uid)、主グループ(gid)、所属している全グループを表示します。上の例では、yuuki さんは sudo グループに入っているので、sudo で管理者操作ができる、と読み取れます。
グループという考え方
グループは、複数のユーザーをまとめて扱うための仕組みです。たとえば「開発チーム」というグループを作り、そのグループに読み書きを許可すれば、メンバー全員が同じファイルを共有できます。一人ずつ許可を設定するより、ずっと管理が楽になります。所属グループの確認は groups でもできます。
$ groups
yuuki adm sudo users
ユーザーを作る・パスワードを設定する
新しいユーザーの作成には useradd(低レベル)と adduser(対話的で親切)の2つがあります。Debian系では adduser のほうが、ホームディレクトリ作成やパスワード設定まで案内してくれて便利です。いずれも管理作業なので sudo が必要です。
$ sudo adduser sato
Adding user `sato' ...
Adding new group `sato' (1001) ...
Adding new user `sato' (1001) with group `sato' ...
Creating home directory `/home/sato' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
...
低レベルな useradd を使う場合は、ホームディレクトリを同時に作る -m を付けるのが定番です。パスワードは別途 passwd で設定します。
$ sudo useradd -m tanaka
$ sudo passwd tanaka
New password:
Retype new password:
passwd: password updated successfully
ユーザーをグループに追加する(usermod)
作ったユーザーに管理者権限を与えたい(=sudo を使えるようにしたい)場合は、sudo グループに追加します。usermod -aG の -a は「追加(append)」、-G は「補助グループ」を意味します。-a を付け忘れると既存の所属グループが上書きされてしまうので注意してください。
$ sudo usermod -aG sudo sato
$ groups sato
sato : sato sudo
これで sato さんも sudo グループに入り、管理者操作ができるようになりました(反映には一度ログインし直す必要があります)。
ユーザーとグループの正体は「テキストファイル」
Linuxらしいのは、ユーザーやグループの情報が特別なデータベースではなくただのテキストファイルに書かれている点です。中身を見てみましょう(パスワードは別ファイルに暗号化して保存されるので、ここには出ません)。
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
yuuki:x:1000:1000:Yuuki Sato,,,:/home/yuuki:/bin/bash
sato:x:1001:1001:,,,:/home/sato:/bin/bash
$ cat /etc/group
root:x:0:
sudo:x:27:yuuki,sato
yuuki:x:1000:
sato:x:1001:
/etc/passwd の1行は ユーザー名:x:UID:GID:説明:ホーム:ログインシェル という形式です。root の UID が 0 であること、yuuki の UID が 1000 であることが読み取れます。/etc/group を見ると、sudo グループに yuuki と sato が入っているのが分かります。「設定はテキストで見て理解できる」——これはLinuxを扱ううえでの大きな安心材料です。
5.5 パーミッションの読み方
ここからがこの章の核心です。第4章で使った ls -l の左端に並ぶ文字列こそがパーミッション(アクセス権)です。
$ ls -l
total 12
-rwxr-xr-- 1 yuuki dev 220 Jul 8 10:30 backup.sh
drwxr-xr-x 2 yuuki dev 4096 Jul 8 10:31 logs
-rw------- 1 yuuki yuuki 1675 Jul 8 10:32 id_rsa
先頭の -rwxr-xr-- のような10文字を分解して読めるようになりましょう。この10文字は「1 + 3 + 3 + 3」の4ブロックに分けて考えます。
| 位置 | 例 | 意味 |
|---|---|---|
| 1文字目 | - | 種類。-=通常ファイル、d=ディレクトリ、l=シンボリックリンク |
| 2〜4文字目 | rwx | 所有者(user)の権限 |
| 5〜7文字目 | r-x | グループ(group)の権限 |
| 8〜10文字目 | r-- | その他(other)=それ以外の全員の権限 |
各ブロックの3文字は、いつも r w x の順で並び、その権限が「ある」なら文字、「ない」なら - で表されます。
| 記号 | 読み | ファイルに対して | ディレクトリに対して |
|---|---|---|---|
r | read(読み取り) | 中身を読める | 中の一覧(ls)ができる |
w | write(書き込み) | 内容を変更・上書きできる | 中にファイルを作成・削除・改名できる |
x | execute(実行) | プログラムとして実行できる | 中に入る(cd)・中のファイルにアクセスできる |
先ほどの backup.sh の -rwxr-xr-- を、対象ごとに読むとこうなります。
-… 通常ファイルrwx… 所有者(yuuki)は 読み・書き・実行 すべて可能r-x… グループ(dev)は 読みと実行は可能、書き込みは不可r--… その他の全員は 読みだけ可能
数字での表し方(rwx = 4・2・1)
パーミッションは記号のほかに数字3桁でも表せます。現場ではむしろ数字のほうがよく使われます。仕組みはシンプルで、各権限に重みを割り当てて足し算するだけです。
| 権限 | 数値 |
|---|---|
r(読み) | 4 |
w(書き) | 2 |
x(実行) | 1 |
1ブロック(3文字)ごとに、立っている権限の数値を合計します。たとえば rwx なら 4+2+1=7、r-x なら 4+0+1=5、r-- なら 4 です。これを所有者・グループ・その他の順に3桁並べます。
| 記号表記 | 所有者 | グループ | その他 | 数値表記 | よくある用途 |
|---|---|---|---|---|---|
-rwxr-xr-- | rwx=7 | r-x=5 | r--=4 | 754 | やや限定した実行ファイル |
-rwxr-xr-x | 7 | 5 | 5 | 755 | スクリプト・実行ファイル・ディレクトリの定番 |
-rw-r--r-- | 6 | 4 | 4 | 644 | 一般的なファイルの定番 |
-rw------- | 6 | 0 | 0 | 600 | 本人だけが読み書き(鍵・秘密情報) |
-rwxrwxrwx | 7 | 7 | 7 | 777 | 全員に何でも許可(原則使わない・危険) |
この 755 644 600 の3つは、実務で毎日のように目にする「定番」です。丸暗記してしまってかまいません。
5.6 パーミッションの変更 — chmod と chown
chmod で権限を変える
パーミッションの変更には chmod(change mode)を使います。指定方法は数値形式と記号形式の2通りです。まず数値形式です。
$ ls -l report.txt
-rw-rw-rw- 1 yuuki yuuki 320 Jul 8 11:00 report.txt
$ chmod 644 report.txt
$ ls -l report.txt
-rw-r--r-- 1 yuuki yuuki 320 Jul 8 11:00 report.txt
chmod 644 で「所有者は読み書き、グループとその他は読みだけ」に整えました。次に記号形式です。u(所有者)g(グループ)o(その他)a(全員)に対し、+(付与)-(剥奪)=(指定どおりに設定)で調整します。
$ ls -l backup.sh
-rw-r--r-- 1 yuuki yuuki 210 Jul 8 11:05 backup.sh
$ chmod u+x backup.sh
$ ls -l backup.sh
-rwxr--r-- 1 yuuki yuuki 210 Jul 8 11:05 backup.sh
chmod u+x で「所有者に実行権を追加」しました。スクリプトを実行可能にする典型的な操作です。「その他から書き込みを外す」なら chmod o-w、「全員に読みを付ける」なら chmod a+r のように書きます。数値形式は権限を丸ごと指定し直すのに向き、記号形式は今ある状態に少しだけ足し引きするのに向いています。
ディレクトリの x は「実行」ではなく「その中に入れる・中のファイルにアクセスできる」という意味です。だから r があっても x がないと、一覧名は見えてもファイルの中身にはたどり着けません。ディレクトリが 755(rwxr-xr-x)なのは、「誰でも通り抜けて中のファイルにアクセスできるが、ファイルの作成・削除は所有者だけ」という、公開ディレクトリとして自然な設定だからです。
chown で所有者を変える
ファイルの所有者やグループを変更するのが chown(change owner)です。他人の所有物にすることは通常できないため、多くの場合 sudo が必要になります。書式は chown 所有者:グループ 対象 です。
$ ls -l app.log
-rw-r--r-- 1 root root 0 Jul 8 11:10 app.log
$ sudo chown yuuki:dev app.log
$ ls -l app.log
-rw-r--r-- 1 yuuki dev 0 Jul 8 11:10 app.log
所有者を root から yuuki に、グループを dev に変更できました。ディレクトリ以下をまとめて変えたいときは、第4章でも登場した再帰オプション -R を付けて sudo chown -R yuuki:dev /var/www/myapp のようにします。グループだけ変えたいなら chgrp という専用コマンドもあります。
5.7 実務での勘所
コマンドが分かったところで、「実際にどう設定するのが正しいのか」という現場の勘所を押さえましょう。
- 鍵ファイルは 600 — SSHの秘密鍵(
~/.ssh/id_rsa)や証明書の秘密鍵、パスワードを含む設定ファイルは、必ず本人だけが読める600にします。他人が読めてはいけない情報だからです。 - 公開して読ませたいファイルは 644、ディレクトリは 755 — Webサーバーが配信するファイルやスクリプトはこの組み合わせが基本。「所有者は編集でき、他は読む(通り抜ける)だけ」という安全な形です。
- 実行させたいスクリプトは 755(または 750) — 実行権
xが必要です。ただし全員に実行させる必要がなければ、その他の実行権を外した750のほうが安全です。 - 777 は原則使わない — 次で詳しく説明します。
chmod 777 は「所有者・グループ・その他の全員に、読み・書き・実行のすべてを許可する」設定です。つまりそのサーバーにいる誰でも、そのファイルを書き換えたり、悪意あるコードに置き換えたりできる状態になります。ネット上には「動かないときは 777 にすれば直る」という乱暴な情報があふれていますが、これは問題を「権限を全部開放する」ことで無理やり黙らせているだけで、セキュリティ上の大穴を開けています。特にWebで公開しているディレクトリを 777 にすると、攻撃者にファイルの設置や書き換えを許す典型的な侵入口になります。正しくは「本当に必要な権限だけを、必要な相手にだけ」与えます。
この章で繰り返し出てきた最小権限の原則——「必要最小限の権限しか与えない」——は、セキュリティ設計のもっとも基本的な考え方の一つです。root で常用しないのも、鍵を 600 にするのも、777 を避けるのも、すべて同じ思想の現れです。
パーミッションは、防御の一枚の壁にすぎません。ファイアウォールで守り、パスワードで守り、さらにファイル単位の権限でも守る——このように複数の壁を重ねる考え方を「多層防御」と呼びます(セキュリティ中級・上級コース参照)。どこか一枚が破られても、次の壁で食い止めるのが狙いです。パーミッションは、その最後の砦の一つとして「万一侵入されても、被害をそのファイル・そのユーザーの範囲に閉じ込める」役割を果たします。
実践的な例として、SSHは秘密鍵の権限が緩いと、そもそも接続を拒否します。~/.ssh/id_rsa がグループや他人にも読める状態(たとえば 644)だと、SSHクライアントは Permissions 0644 for 'id_rsa' are too open. という警告を出して鍵の使用を止めます。これは「秘密であるべき鍵が他人に見える時点で危険」という判断を、ツール自身が下しているのです。この場合の正解は chmod 600 ~/.ssh/id_rsa です。パーミッションは飾りではなく、実際にツールの動作を左右する「効く」仕組みだと実感できる好例です。
まとめ
- Linuxは複数人での利用を前提としたマルチユーザーOSで、だからこそ権限の仕組みが不可欠
- root は何でもできる管理者で危険。普段は一般ユーザーで作業する(最小権限の原則)
sudoはコマンド1回だけ管理者権限を借りる仕組みで、記録が残り事故を減らせるid/whoami/groupsで自分の権限を確認、adduser/useradd/passwd/usermodで管理。実体は/etc/passwdと/etc/group- パーミッションは
種類 + 所有者rwx + グループrwx + その他rwx。r=4・w=2・x=1 の合計で数値化(755644600が定番) chmodで権限、chownで所有者を変更。鍵は600、777は原則使わない
練習問題
あるファイルを ls -l したところ、先頭が -rwxr-x--- と表示されました。(1)これは何のファイルですか。(2)所有者・グループ・その他は、それぞれ何ができますか。(3)このパーミッションを数値3桁で表すと何になりますか。
解答を見る
(1)先頭が - なので通常ファイルです。(2)所有者(rwx)は読み・書き・実行のすべてが可能、グループ(r-x)は読みと実行が可能で書き込みは不可、その他(---)は何もできません。(3)所有者 rwx=7、グループ r-x=5、その他 ---=0 なので、750 です。「所有者だけが編集でき、同じグループのメンバーは実行だけできる、部外者は一切触れない」実行ファイルとしてよくある設定です。
SSHの秘密鍵 ~/.ssh/id_rsa を使ってサーバーに接続しようとしたら、Permissions 0644 for 'id_rsa' are too open. と表示されて接続できませんでした。(1)なぜSSHはこれを拒否するのですか。(2)どのコマンドで直せますか。
解答を見る
(1)0644(-rw-r--r--)は、所有者以外(グループやその他)にも読み取りを許しています。秘密鍵は本人だけが持つべき秘密なのに、他人に読める状態は危険だと判断され、SSHは安全のために鍵の使用を拒否します。(2)本人だけが読み書きできる 600 に変更します。chmod 600 ~/.ssh/id_rsa
これで -rw------- になり、正常に接続できるようになります。
同僚が「新しく入った sato さんにも sudo で管理作業をさせたい」と言っています。(1)そのために sato さんをどのグループに追加すればよいですか。(2)実行するコマンドを書いてください。(3)このとき、うっかり usermod -G sudo sato のように -a を付け忘れると、どんな問題が起きますか。
解答を見る
(1)sudo グループに追加します。(2)sudo usermod -aG sudo sato です。-a は追加、-G は補助グループの指定を意味します。(3)-a(追加)を付けないと、-G で指定したグループだけに置き換えられ、sato さんがそれまで所属していた他の補助グループから外れてしまいます。所属グループを丸ごと上書きしてしまうため、意図せず必要な権限を失わせる事故につながります。補助グループへの追加では必ず -aG をセットで使うのが鉄則です。