目次
- パーミッションの基本概念
- 3つの権限の種類
- 3つの対象者
- パーミッションの確認方法
- 数値表記(8進数)による権限の理解
- 数値の計算方法
- よく使われるパーミッションの数値
- chmodコマンド:パーミッションの変更
- 数値指定(8進数モード)
- 記号指定(シンボリックモード)
- 再帰的な変更(-Rオプション)
- chownコマンド:所有者とグループの変更
- 基本的な使い方
- chgrpコマンド
- 実務で使えるパーミッション設定例
- Webサーバーの公開ディレクトリ
- SSH鍵の権限設定
- シェルスクリプトの実行権限
- チームでの共有ディレクトリ
- 特殊なパーミッション:SUID, SGID, スティッキービット
- SUID(Set User ID)
- SGID(Set Group ID)
- スティッキービット
- パーミッション設定の注意点とセキュリティ
- 避けるべき設定
- umaskの理解
- セキュリティ強化のために
- まとめ
「Permission denied」――Linuxを使っていると、このエラーメッセージに遭遇した経験がある方は多いでしょう。これはLinuxのファイル権限(パーミッション)によるアクセス制御が機能している証拠です。
パーミッションはLinuxのセキュリティを支える基本中の基本です。正しく設定すればシステムを安全に保てますが、設定を誤るとセキュリティホールや動作不良の原因になります。特に中小企業のサーバー管理では、Webアプリケーションのファイル権限設定が不適切なために問題が起きるケースが少なくありません。
本記事では、Linuxのパーミッションの仕組みからchmod・chownコマンドの実践的な使い方まで、実例を交えて初心者向けに解説します。
パーミッションの基本概念
Linuxでは、すべてのファイルとディレクトリに「誰が」「何をできるか」を制御するパーミッション(権限)が設定されています。
3つの権限の種類
Linuxのパーミッションには、以下の3つの権限があります。
| 権限 | 記号 | 数値 | ファイルに対する意味 | ディレクトリに対する意味 |
|---|---|---|---|---|
| 読み取り(Read) | r | 4 | ファイルの内容を読める | ディレクトリの一覧を表示できる |
| 書き込み(Write) | w | 2 | ファイルの内容を変更できる | ファイルの作成・削除ができる |
| 実行(Execute) | x | 1 | プログラムとして実行できる | ディレクトリに移動(cd)できる |
3つの対象者
権限は以下の3つの対象者に対して個別に設定されます。
- 所有者(Owner / User):ファイルの持ち主。記号は「u」
- グループ(Group):ファイルが属するグループのメンバー。記号は「g」
- その他(Others):上記以外のすべてのユーザー。記号は「o」
ユーザーとグループの仕組みの詳細についてはユーザー・グループ管理ガイドをご覧ください。
パーミッションの確認方法
ls -lコマンドでファイルのパーミッションを確認できます。
$ ls -l example.txt
-rw-r--r-- 1 tanaka developers 1024 Mar 22 10:00 example.txt
この出力の読み方を分解してみましょう。
- rw- r-- r--
| | | |
| | | └── その他(Others): r--(読み取りのみ)
| | └── グループ(Group): r--(読み取りのみ)
| └── 所有者(Owner): rw-(読み取り・書き込み)
└── ファイルタイプ(-: 通常ファイル、d: ディレクトリ、l: シンボリックリンク)
この例では、所有者「tanaka」はファイルの読み取りと書き込みが可能で、「developers」グループのメンバーとその他のユーザーは読み取りのみ可能です。Linuxコマンド一覧でlsコマンドの詳しい使い方を確認できます。
数値表記(8進数)による権限の理解
パーミッションは3桁の数値で表現されることもあります。この数値表記は実務で頻繁に使われるため、確実に覚えておきましょう。
数値の計算方法
各権限には数値が割り当てられており、それを合計して表現します。
- 読み取り(r)= 4
- 書き込み(w)= 2
- 実行(x)= 1
- 権限なし(-)= 0
例えば「rwx」は4+2+1=7、「r-x」は4+0+1=5、「r--」は4+0+0=4となります。
よく使われるパーミッションの数値
| 数値 | 記号表記 | 意味 | 主な用途 |
|---|---|---|---|
| 755 | rwxr-xr-x | 所有者:全権限、他:読み取り・実行 | ディレクトリ、実行ファイル |
| 644 | rw-r--r-- | 所有者:読み書き、他:読み取り | 一般的なファイル |
| 600 | rw------- | 所有者のみ読み書き | 秘密鍵ファイル、設定ファイル |
| 700 | rwx------ | 所有者のみ全権限 | .sshディレクトリ |
| 777 | rwxrwxrwx | 全員に全権限(危険) | 原則として使用しない |
| 750 | rwxr-x--- | 所有者:全権限、グループ:読み実行 | チーム共有ディレクトリ |
chmodコマンド:パーミッションの変更
chmod(change mode)は、ファイルやディレクトリのパーミッションを変更するコマンドです。数値指定と記号指定の2つの方法があります。
数値指定(8進数モード)
# ファイルを644に設定
chmod 644 index.html
# ディレクトリを755に設定
chmod 755 /var/www/html/
# SSH秘密鍵を600に設定
chmod 600 ~/.ssh/id_rsa
# シェルスクリプトに実行権限を付与(755)
chmod 755 deploy.sh
記号指定(シンボリックモード)
記号指定は、対象者 + 操作 + 権限の形式で指定します。
# 所有者に実行権限を追加
chmod u+x script.sh
# グループの書き込み権限を削除
chmod g-w config.txt
# その他のすべての権限を削除
chmod o-rwx secret.key
# 全員に読み取り権限を追加
chmod a+r readme.txt
# 所有者に読み書き、グループに読み取りを設定
chmod u=rw,g=r,o= data.csv
再帰的な変更(-Rオプション)
ディレクトリ配下のすべてのファイルとサブディレクトリに対してまとめて変更する場合は、-Rオプションを使います。
# /var/www/html配下すべてを再帰的に変更
chmod -R 755 /var/www/html/
ただし、-Rオプションの使用は慎重に行いましょう。ファイルとディレクトリでは適切なパーミッションが異なるためです。例えば、Webサーバーのコンテンツでは、ディレクトリは755、ファイルは644が一般的です。
# ディレクトリだけ755に設定
find /var/www/html -type d -exec chmod 755 {} \;
# ファイルだけ644に設定
find /var/www/html -type f -exec chmod 644 {} \;
chownコマンド:所有者とグループの変更
chown(change owner)は、ファイルやディレクトリの所有者とグループを変更するコマンドです。
基本的な使い方
# 所有者を変更
sudo chown tanaka file.txt
# 所有者とグループを同時に変更
sudo chown tanaka:developers file.txt
# グループのみ変更
sudo chown :developers file.txt
# 再帰的に変更
sudo chown -R www-data:www-data /var/www/html/
chownコマンドの実行には通常root権限(sudo)が必要です。一般ユーザーが任意のユーザーへ所有権を変更することはセキュリティ上許可されていません。
chgrpコマンド
chgrp(change group)はグループのみを変更する専用コマンドです。
# グループを変更
sudo chgrp developers project/
chown :groupnameと同等の機能ですが、グループの変更のみを行う場合はchgrpのほうが意図が明確です。
実務で使えるパーミッション設定例
実際の業務でよく必要になるパーミッション設定のパターンを紹介します。
Webサーバーの公開ディレクトリ
Nginx(やApache)でWebサイトを公開する場合、Webサーバーの実行ユーザー(通常「www-data」)がファイルを読み取れる必要があります。
# 所有者をWebサーバーユーザーに変更
sudo chown -R www-data:www-data /var/www/html/
# ディレクトリは755、ファイルは644
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
Nginx環境の構築手順はNginx構築ガイドを参考にしてください。
SSH鍵の権限設定
SSHでは、鍵ファイルの権限が緩すぎるとセキュリティ上の理由で接続が拒否されます。
# .sshディレクトリ
chmod 700 ~/.ssh/
# 秘密鍵
chmod 600 ~/.ssh/id_rsa
# 公開鍵
chmod 644 ~/.ssh/id_rsa.pub
# authorized_keys
chmod 600 ~/.ssh/authorized_keys
SSH接続の設定方法はSSHリモート接続ガイドで詳しく解説しています。
シェルスクリプトの実行権限
シェルスクリプトを作成したら、実行権限を付与する必要があります。
# スクリプトファイルの作成
touch deploy.sh
# 実行権限を付与
chmod 755 deploy.sh
# または所有者のみ実行可能にする
chmod 700 deploy.sh
チームでの共有ディレクトリ
複数のユーザーが共有するプロジェクトディレクトリの設定例です。
# 共有ディレクトリの作成
sudo mkdir /opt/project
# グループを設定
sudo chown root:developers /opt/project
# グループ書き込み可、その他はアクセス不可
sudo chmod 770 /opt/project
# SGIDビットの設定(新規作成ファイルにグループを継承)
sudo chmod g+s /opt/project
特殊なパーミッション:SUID, SGID, スティッキービット
基本の3つの権限に加え、特殊なパーミッションも存在します。知っておくとトラブルシューティングに役立ちます。
SUID(Set User ID)
SUIDが設定された実行ファイルは、実行者ではなくファイル所有者の権限で動作します。典型的な例がpasswdコマンドです。
# SUIDの確認(sが表示される)
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 22 10:00 /usr/bin/passwd
# SUIDの設定
chmod u+s executable
# 数値では4000を加算
chmod 4755 executable
一般ユーザーがpasswdコマンドでパスワードを変更できるのは、SUIDによりroot権限で動作するためです。
SGID(Set Group ID)
ディレクトリにSGIDを設定すると、そのディレクトリ内で新規作成されたファイルやサブディレクトリは、親ディレクトリのグループを自動的に継承します。
# SGIDの設定
chmod g+s /opt/shared/
# 数値では2000を加算
chmod 2775 /opt/shared/
スティッキービット
スティッキービットが設定されたディレクトリでは、ファイルの削除は所有者とrootのみが行えます。/tmpディレクトリに設定されており、他のユーザーの一時ファイルを勝手に削除できないようになっています。
# スティッキービットの確認(tが表示される)
$ ls -ld /tmp
drwxrwxrwt 12 root root 4096 Mar 22 10:00 /tmp
# スティッキービットの設定
chmod +t /shared/
# 数値では1000を加算
chmod 1777 /shared/
パーミッション設定の注意点とセキュリティ
パーミッション設定で、特に注意すべきポイントを整理します。
避けるべき設定
- chmod 777の多用:全ユーザーに全権限を与えるため、セキュリティリスクが極めて高い。トラブル時に安易に777に設定するのは厳禁
- Webサーバーで実行権限不要なファイルに755を設定:HTMLやCSS、画像ファイルに実行権限は不要。644が適切
- root所有でSUID設定:不要なSUID設定は特権昇格攻撃のリスクを生む
umaskの理解
umaskは、新規作成されるファイルやディレクトリのデフォルトパーミッションを制御する仕組みです。
# 現在のumask値を確認
$ umask
0022
# umaskの計算
# ファイルのデフォルト: 666 - 022 = 644 (rw-r--r--)
# ディレクトリのデフォルト: 777 - 022 = 755 (rwxr-xr-x)
umask値は環境変数の設定と合わせて、~/.bashrcなどで調整できます。
セキュリティ強化のために
パーミッション管理はLinuxセキュリティの第一歩です。さらに詳しいセキュリティ対策についてはLinuxセキュリティ強化ガイドを、ファイアウォールとの連携についてはファイアウォール設定ガイドをご覧ください。
まとめ
Linuxのファイル権限(パーミッション)は、システムのセキュリティと正常な動作を支える重要な仕組みです。本記事のポイントを振り返ります。
- パーミッションは「読み取り・書き込み・実行」の3権限を「所有者・グループ・その他」の3対象者に設定する
- 数値表記(644、755など)は実務で頻繁に使われるため、主要なパターンは暗記しておくと効率的
- chmodで権限を変更し、chownで所有者を変更する
- SUID、SGID、スティッキービットなどの特殊パーミッションも理解しておく
- chmod 777のような過剰な権限付与はセキュリティリスクになるため避ける
パーミッションを正しく理解したら、次はシェルスクリプトによる自動化や、ディレクトリ構造の知識と組み合わせて、実務に活かしていきましょう。Linuxの基礎を体系的に学びたい方はLinuxとは?初心者向け解説もご参考ください。
Harmonic Society
この記事の内容、自社の業務でも活かせそうですか?
ローカルLLM・AI・クラウドなどの技術導入を、要件整理からPoC・社内展開まで代表エンジニアが伴走します。オンライン対応・全国OK。まずは30分の無料相談から。売り込みはしません。
関連記事
Related / 9 articles
Notes & Insights
- プログラミング
DDoS攻撃の仕組みと対策入門|レイヤー別の防御とCDN・クラウドの活用
DDoS攻撃をボリューム型・プロトコル型・アプリ層に分けて仕組みを解説し、自前サーバーで防げない理由、CloudflareやAWS Shieldの標準防御、オリジンIPの隠し方、レートリミットとBot対策、攻撃を受けたときの初動、費用が跳ね上がるDenial of Walletへの備えまでわかります。
- プログラミング
WAFとは?仕組み・導入パターン・誤検知対策|Webアプリを攻撃から守る実践ガイド
WAFがファイアウォールやIDSと何が違うのか、シグネチャとマネージドルールの仕組み、Cloudflare WAF・AWS WAF・ModSecurityの比較、フォーム送信がブロックされる誤検知の調査と例外設定、ログ監視、WAFが代替できないことまで実践的に解説します。
- プログラミング
セキュリティヘッダー入門|CSP・HSTS・X-Frame-Optionsの設定と効果を実践解説
CSP・HSTS・X-Frame-Options・X-Content-Type-Optionsなど主要セキュリティヘッダーが防ぐ攻撃と、CSPのReport-Onlyからの段階導入、nonce/hash、HSTS preloadの不可逆リスク、Nginx・Next.js・Astroでの設定例、確認方法を解説します。
- プログラミング
クラウドの通信費(Egress)入門|データ転送量課金の仕組みと転送コストを抑える設計
クラウドの「受信無料・送信有料」の原則、AZ間・リージョン間・インターネット向けの単価差、NATゲートウェイ処理料の罠、CDNで転送量を減らす方法、バックアップやログ転送の見落とし、請求書で転送料を特定する手順を解説。想定外の請求を防げます。
- プログラミング
秘密情報をGitに入れない仕組み|.gitignore・git-secrets・履歴から漏れた鍵の削除
APIキーや.envをGitにコミットしてしまう典型経路と、.gitignore・.env.exampleの運用、pre-commitでのgitleaks検知、GitHub secret scanningの活用、漏れた鍵の無効化と履歴書き換え(git filter-repo)の手順を解説。仕組みで再発を防げます。
- プログラミング
開発・ステージング・本番環境の分離設計|環境差分をなくす構成とアクセス制御
開発・ステージング・本番それぞれの目的と、構成をコードで揃える方法、環境別の設定注入、本番データを使わないテストデータ戦略、ステージングの保護(Basic認証・IP制限・noindex)、コストを抑える運用までを解説。環境差分による本番障害を防げます。
- プログラミング
ngrok・Cloudflare Tunnelでローカルを公開|Webhook開発とデモ環境の作り方
NAT内のローカル環境にStripeやLINEのWebhookを届けるトンネリングの仕組みを解説。ngrok・Cloudflare Tunnel・localtunnelの比較、固定ドメインと認証、リクエスト検査、公開時のセキュリティ、自宅サーバー公開への応用までわかります。
- プログラミング
ローカル開発環境のHTTPS化|mkcert・hostsファイル・自己署名証明書の正しい使い方
ローカル開発をHTTPS前提にすべき理由(Secure Cookie・Service Worker・OAuth)と、mkcertでローカルCAを作りhostsで独自ドメインを割り当ててVite・Next.js・Dockerで使う手順を解説。証明書警告を無視する癖の危険も理解できます。
- プログラミング
localhost・0.0.0.0・127.0.0.1の違い|ポートとUnixソケットを理解して「つながらない」を解決
localhost・127.0.0.1・0.0.0.0の意味の違い、Dockerで外から接続できない原因、host.docker.internal、ポート競合の調べ方、Unixソケットの利点と権限、1024未満ポートの制約を解説。「つながらない」を仕組みから解決できます。
Harmonic Society
「読んで終わり」にせず、自社の業務で試してみませんか?
AI・ローカルLLM・クラウドの導入を、要件整理からPoC・社内展開まで代表エンジニアが伴走します。オンライン対応・全国OK・売り込みなし。
無料・30分・オンラインOK|1営業日以内に返信します