こんにちは、かつコーチです。
前回の記事ではrwxというパーミッションの仕組みを解説しました。
今回はその権限を実際に変更するchmod・chownコマンドを、Ubuntu 26.04 LTSでの実例を交えて解説します。
chmod・chownとは?
chmodの定義:パーミッションを変更するコマンド
chmod(change mode)とは、ファイルやディレクトリの読み取り・書き込み・実行権限(rwx)を変更するコマンドです。
「change mode」の略で、権限の“モード”を変えるという意味を持っています。
chownの定義:所有者・所有グループを変更するコマンド
chown(change owner)とは、ファイルやディレクトリの所有者・所有グループを変更するコマンドです。
権限そのものではなく「誰が所有しているか」を変更する点がchmodとの違いです。
なぜこの2つが必要なのか
サーバー運用では、Webサーバーのプロセスが特定のディレクトリに書き込む必要があったり、デプロイしたファイルの所有者がデプロイユーザーのままで困ったりする場面が頻繁に発生します。
chmodとchownを使い分けられないと、「動くはずのアプリが権限エラーで動かない」というトラブルへの対処が一気に難しくなります。
基本の書き方:chmod・chownの使い方
手順1:chmodで数字指定を使う
前回解説した数字表記(r=4, w=2, x=1)を使い、chmodで権限を変更します。
$ chmod 644 sample.txt
$ ls -l sample.txt
-rw-r--r-- 1 katsu katsu 1024 9月 2 10:00 sample.txt
644は「所有者は読み書き、グループとその他は読み取りのみ」という意味です。
ディレクトリに実行権限(移動できる権限)も含めたい場合は755をよく使います。
$ chmod 755 deploy.sh
手順2:chmodで記号指定を使う
数字表記だけでなく、u(所有者)・g(グループ)・o(その他)・a(全員)と+(付与)・-(削除)・=(設定)を組み合わせた記号指定も使えます。
$ chmod u+x deploy.sh
$ chmod go-w config.php
1つ目は「所有者に実行権限を付与」、2つ目は「グループとその他から書き込み権限を削除」を意味します。
数字表記が「全体を上書き」するのに対し、記号指定は「一部だけを変更」できるのが特徴です。
手順3:chownで所有者・グループを変更する
chownはchown 所有者:グループ 対象という書式で使います。
$ sudo chown katsu:www-data app.php
$ ls -l app.php
-rw-r--r-- 1 katsu www-data 2048 9月 2 10:00 app.php
グループだけを変更したい場合はchgrpコマンドを使うか、chownで:グループ名のみを指定します。
$ sudo chown :www-data storage
chownは他人のファイルの所有者を変更する強い操作のため、多くの場合sudoが必要になります。
つまずきやすい設定・注意点
-Rオプションを付けると、ディレクトリ以下を再帰的に変更できますが、範囲を間違えると想定外のファイルまで巻き込みます。
$ sudo chown -R katsu:www-data /var/www/app
対象ディレクトリを実行直前にもう一度目で確認してから-Rを付ける習慣をつけましょう。
よくあるつまずきポイント・エラー対処
chmod 777で「とりあえず動く」にしてしまう
私が駆け出しの頃、アップロード用ディレクトリで権限エラーが出たとき、原因を調べずに777にして解決したつもりになったことがあります。
❌Before:エラーが出たらchmod 777で全員に全権限を与えて済ませる
$ chmod -R 777 /var/www/app/storage
これは「誰でも読み書き実行できる」状態です。
一時的にエラーは消えますが、他のユーザーやプロセスが誤ってファイルを書き換えたり、セキュリティ上の穴になったりするリスクを抱えたままになります。
✅After:本当に必要な権限だけを、必要なユーザー・グループに絞って付与する
$ sudo chown -R katsu:www-data /var/www/app/storage
$ sudo find /var/www/app/storage -type d -exec chmod 775 {} \;
$ sudo find /var/www/app/storage -type f -exec chmod 664 {} \;
Webサーバーの実行ユーザーが属するグループ(例:www-data)に所有グループを合わせ、ディレクトリは775、ファイルは664のように最小限の権限で運用するのが基本です。777は原因調査を後回しにするための一時しのぎであって、解決策ではないと覚えておいてください。
所有者を変更したらSSH接続できなくなった
もう1つの実体験として、.sshディレクトリごとchownしたつもりが、範囲指定を誤ってホームディレクトリの所有者まで変えてしまい、SSHでログインできなくなったことがあります。
❌Before:chownの対象範囲を確認せず、思い込みで-Rを実行する
✅After:実行前に対象パスをechoやlsで確認し、影響範囲を最小限にする
$ ls -ld /home/katsu/.ssh
$ sudo chown -R katsu:katsu /home/katsu/.ssh
$ chmod 700 /home/katsu/.ssh
$ chmod 600 /home/katsu/.ssh/authorized_keys
SSHは秘密鍵・公開鍵ディレクトリの権限が緩いと接続を拒否する仕様になっています。.sshは700、authorized_keysは600が定番の設定値です。
応用・一歩先の使い方
chmod・chownをスクリプトに組み込む
デプロイスクリプトの中で、アップロードしたファイルの権限を自動で整えることもよくあります。
#!/bin/bash
sudo chown -R deploy:www-data /var/www/app
sudo find /var/www/app -type d -exec chmod 755 {} \;
sudo find /var/www/app -type f -exec chmod 644 {} \;
デプロイのたびに手動で権限を直す必要がなくなり、ヒューマンエラーを減らせます。
ACL(アクセス制御リスト)という選択肢
chmod・chownは「所有者・グループ・その他」の3種類でしか権限を分けられません。
複数のユーザーやグループごとに異なる権限を細かく設定したい場合は、ACL(setfacl・getfacl)という仕組みも存在します。
最初はchmod・chownの基本を固め、それでも表現しきれない要件が出てきたときにACLの学習に進むのがおすすめです。
まとめ
この記事のポイント
- chmodは権限(
rwx)を、chownは所有者・所有グループを変更するコマンド - chmodは数字指定(
644など)と記号指定(u+xなど)の2通りの書き方がある - chownは
chown 所有者:グループ 対象の書式で、多くの場合sudoが必要 - 権限エラーへの対処として
chmod 777は避け、必要最小限の権限を付与する -Rで再帰的に変更する際は、対象範囲を必ず確認する
次に読むべき記事
ユーザーやグループそのものの作成・管理方法を知りたい方は、次の「ユーザー・グループ管理の基本(useradd・usermod)」に進んでみてください。
所有者・所有グループの変更先を自分で作れるようになります。
タグ: Linux, 初心者向け, 権限管理