Ubuntu を使っていると必ず出くわすのが Permission denied というエラーです。「何もおかしいことはしていないのに…」と戸惑うことも多いですが、原因は9割がたファイルやディレクトリのアクセス権(パーミッション)の設定にあります。正しい確認コマンドと修正コマンドを覚えれば、ほとんどのケースは5分以内に解決できます。
本記事では ubuntu:24.04 の Docker 公式イメージを使い、実際にエラーを再現・修正した結果をもとに解説します。GNU coreutils 9.4(Ubuntu 24.04)・sudo 1.9.15p5 で動作確認済みです。

この記事のポイント
ls -laでパーミッションを確認してから修正コマンドを使う- 書き込めない・実行できない →
chmodでパーミッションを変更する /etc/や/usr/配下の操作にはsudoが必要- SSH 秘密鍵は必ず
600(chmod 600 ~/.ssh/id_rsa)にする - Ubuntu 24.04 LTS(coreutils 9.4)・Ubuntu 22.04 LTS(coreutils 8.32)で動作確認済み
目次
- 前提環境
- permission denied の原因を理解する
- ls -la でパーミッションを確認する
- chmod でパーミッションを修正する
- sudo で root 権限が必要な操作を実行する
- chown でファイルの所有者を変更する
- SSH 秘密鍵のパーミッション問題
- Ubuntu 22.04 と 24.04 の違い
- よくあるエラーと解決策
- まとめ
前提環境
本記事の検証は以下の環境で実施しました。
- OS: Ubuntu 24.04 LTS(Docker 公式イメージ
ubuntu:24.04) - 比較対象: Ubuntu 22.04 LTS(Docker 公式イメージ
ubuntu:22.04) - GNU coreutils: 9.4-3ubuntu6.2(24.04)/ 8.32-4.1ubuntu1.3(22.04)
- sudo: 1.9.15p5-3ubuntu5.24.04.2
- OpenSSH: 9.6p1 Ubuntu-3ubuntu13.16
- 検証日: 2026-06-13
注意
本記事のコマンドは Ubuntu 24.04 LTS で検証しています。VPS や WSL 環境でも同様に使えますが、ユーザー名・グループ名は環境によって異なります。
permission denied の原因を理解する
Linux では、すべてのファイル・ディレクトリに「誰が何をできるか」を表すパーミッション(アクセス権)が設定されています。Permission denied は、そのファイルに対して「あなたにはその操作を許可していません」とカーネルが拒否したサインです。
パーミッションは3種類の操作(読む・書く・実行する)と3種類の対象(所有者・グループ・その他)の組み合わせで決まります。
-rw-r–r– 1 root root 2847 Jun 13 2026 /etc/passwd
↑ ↑ ↑ ↑
パーミッション 所有者 グループ サイズ
パーミッションの表記 -rw-r--r-- は次のように読みます。
- 先頭の
-: ファイルの種類(-=通常ファイル、d=ディレクトリ、l=シンボリックリンク) rw-: 所有者(root)は読み・書きができるr--: グループ(root)は読みだけできるr--: その他のユーザーは読みだけできる
主な原因パターン
エラーが出たときは、次のいずれかであることがほとんどです。
- 自分が所有していないファイルに書き込もうとした(
/etc/配下など root 所有のファイル) - スクリプトに実行権(
x)がついていない - ディレクトリの実行権(
x)がなくて中に入れない - SSH 秘密鍵のパーミッションが広すぎて OpenSSH に拒否された
ls -la でパーミッションを確認する
エラーが出たら、まず ls -la でそのファイルのパーミッションを確認します。これが全ての起点です。
-rw-r–r– 1 root root 1125 Nov 30 2023 /etc/nginx/nginx.conf
↑ ↑ ↑ ↑
パーミッション 所有者 グループ ファイル名
# さらに詳しく確認したい場合
$ stat -c ‘%A %a %U %G %n’ /etc/nginx/nginx.conf
-rw-r–r– 644 root root /etc/nginx/nginx.conf
stat -c '%A %a' を使うと、記号表記(-rw-r--r--)と数字表記(644)を同時に確認できます。Ubuntu 24.04 / GNU coreutils 9.4 で実際に実行して確認しました。
ポイント
正直、ls -la を打つ前に sudo を試してしまう人が多いですが、まず「誰が所有していて、どんな権限か」を確認してから対処法を選ぶ習慣をつけると、遠回りがなくなります。
chmod でパーミッションを修正する
パーミッションを変更するコマンドが chmod(change mode)です。自分が所有しているファイルであれば、root 権限なしで変更できます。

上の図は実際に ubuntu:24.04 コンテナで再現した結果です。chmod 444 で書き込み不可にしたファイルに echo で書き込もうとすると Permission denied が出ますが、chmod 644 で修正すれば書き込めるようになります。
手順1:数字表記でパーミッションを指定する
chmod の数字は「読み=4、書き=2、実行=1」を足した値で、「所有者・グループ・その他」の順に並べます。

stat コマンド(stat -c '%A %a')で全モードを実際に確認しました。よく使う設定を覚えておけば十分です。
chmod 755 script.sh: スクリプト・実行ファイルの標準設定(所有者は全操作、他人は読み・実行)chmod 644 config.txt: 設定ファイルの標準設定(所有者は読み書き、他人は読みのみ)chmod 600 ~/.ssh/id_rsa: SSH 秘密鍵(所有者のみ読み書き)
手順2:記号表記でパーミッションを変更する
数字表記が難しければ、+x(実行権を追加)のような記号表記も使えます。スクリプトを実行可能にするのによく使います。
-rw-r–r– 1 user user 35 Jun 13 2026 myscript.sh
$ ./myscript.sh
bash: ./myscript.sh: Permission denied
# chmod +x で実行権を追加
$ chmod +x myscript.sh
$ ls -la myscript.sh
-rwxr-xr-x 1 user user 35 Jun 13 2026 myscript.sh
$ ./myscript.sh
Hello from script
ubuntu:24.04 コンテナで実際に確認しました。chmod +x を実行した後は -rw-r--r--(644)から -rwxr-xr-x(755)に変わり、スクリプトが実行できるようになります。
注意
chmod 777 はすべてのユーザーがあらゆる操作を行える設定です。手軽に問題を解消できますが、セキュリティ上の大きなリスクがあります。本番サーバーでは絶対に使わないこと。最小限の権限だけを与える習慣をつけましょう。
sudo で root 権限が必要な操作を実行する
/etc/・/usr/・/var/ 配下のファイルは root が所有していることが多く、一般ユーザーには書き込み権限がありません。そういった操作には sudo(superuser do)を使います。

sudo 1.9.15p5 が Ubuntu 24.04 の標準パッケージです。上の図は ubuntu:24.04 コンテナで apt install sudo を実際に実行し、インストールログとバージョンを確認した結果です。VPS の場合は最初から入っていることがほとんどです。
sudo の正しい使い方
$ echo ‘192.168.1.10 myserver’ >> /etc/hosts
bash: /etc/hosts: Permission denied
# NG: sudo echo はリダイレクト(>>)に sudo が効かない
$ sudo echo ‘192.168.1.10 myserver’ >> /etc/hosts
bash: /etc/hosts: Permission denied ← まだエラー
# OK: sudo tee を使うと確実
$ echo ‘192.168.1.10 myserver’ | sudo tee -a /etc/hosts
192.168.1.10 myserver
ここだけは詰まりやすいポイントです。sudo echo "..." >> file はシェルのリダイレクト(>>)が先に評価されるため、sudo が効きません。ファイルに書き込むには sudo tee -a か sudo sh -c 'echo ... >> file' を使います。
sudo が使えない場合の対処
username is not in the sudoers file. This incident will be reported.
# ユーザーを sudo グループに追加(root または別の sudo 権限ユーザーで実行)
$ usermod -aG sudo username
# 追加後は一度ログアウトして再ログインする
「is not in the sudoers file」と出た場合は、そのユーザーが sudo グループに入っていません。root 権限で usermod -aG sudo ユーザー名 を実行し、再ログインすれば使えるようになります。
chown でファイルの所有者を変更する
自分のユーザーが所有していないファイルは、たとえパーミッションを変えても自分では変えられません。そういった場合は chown(change owner)でファイルの所有者を変更します。
$ sudo chown ubuntu:ubuntu /var/www/html/index.html
# ディレクトリごと再帰的に変更(-R オプション)
$ sudo chown -R ubuntu:ubuntu /var/www/html/
# 変更後確認
$ ls -la /var/www/html/
-rw-r–r– 1 ubuntu ubuntu 615 Jun 13 2026 index.html
chown ユーザー名:グループ名 ファイル の書式で指定します。Web サーバー(nginx)のコンテンツディレクトリを自分のユーザーで管理したい場合などによく使います。
SSH 秘密鍵のパーミッション問題
VPS に SSH 接続しようとして Warning: UNPROTECTED PRIVATE KEY FILE! が出た場合、秘密鍵のパーミッションが広すぎることが原因です。

ubuntu:24.04 で実際に ssh-keygen を実行すると、秘密鍵は自動的に 600(-rw-------)で作成されることを確認しました。OpenSSH のバージョンは 9.6p1 です。
秘密鍵が 644(他の人も読める)になっていると、OpenSSH はセキュリティ上の理由でその鍵の使用を拒否します。
$ ls -la ~/.ssh/
-rw-r–r– 1 ubuntu ubuntu 3381 Jun 13 2026 id_rsa ← 644 はNG
-rw——- 1 ubuntu ubuntu 3381 Jun 13 2026 id_rsa ← 600 が正解
-rw-r–r– 1 ubuntu ubuntu 742 Jun 13 2026 id_rsa.pub ← 公開鍵は644でOK
# 修正
$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_ed25519
# .ssh ディレクトリ自体も 700 にする
$ chmod 700 ~/.ssh
SSH 鍵ファイルのパーミッション設定は次の通りです。
~/.ssh/ディレクトリ →700(所有者のみアクセス可)~/.ssh/id_rsa(秘密鍵) →600(所有者のみ読み書き可)~/.ssh/id_rsa.pub(公開鍵) →644(他者も読める)~/.ssh/authorized_keys→600(所有者のみ読み書き可)
Ubuntu 22.04 と 24.04 の違い

ubuntu:22.04 と ubuntu:24.04 の Docker 公式イメージを使い、パーミッション関連の挙動を比較しました。主な違いは coreutils のバージョンです(22.04: 8.32 → 24.04: 9.4)。
デフォルト umask は両バージョンとも 0022 で変わりません。新しいファイルを作ると 644(umask で全員書き込み権が引かれた結果)、ディレクトリは 755 になります。
$ umask
0022
# 新しいファイルを作ったときのデフォルトパーミッション
$ touch newfile.txt && ls -la newfile.txt
-rw-r–r– 1 ubuntu ubuntu 0 Jun 13 2026 newfile.txt
# 666(全員読み書き)から umask 022 を引いて 644 になる
よくあるエラーと解決策
① bash: /path/to/file: Permission denied(書き込みエラー)
原因: ファイルへの書き込み権限がない。
確認: ls -la /path/to/file でパーミッションと所有者を確認。
解決:
- 自分のファイルなら:
chmod u+w /path/to/file - root 所有なら:
sudo nano /path/to/fileまたはecho "..." | sudo tee -a /path/to/file
② bash: ./script.sh: Permission denied(実行エラー)
原因: スクリプトに実行権(x)がない。
確認: ls -la script.sh で x がついているか確認。
解決: chmod +x script.sh
③ ls: cannot open directory ‘/path’: Permission denied(ディレクトリエラー)
原因: ディレクトリへのアクセス権(x)がない。
確認: ls -la /parent/ で該当ディレクトリのパーミッションを確認。
解決:
- 自分のディレクトリなら:
chmod 755 /path/to/dir - root 所有なら:
sudo chmod 755 /path/to/dir
④ username is not in the sudoers file
原因: ユーザーが sudo グループに入っていない。
解決: root で usermod -aG sudo ユーザー名 を実行してから再ログイン。
VPS の初期設定では ubuntu ユーザーが最初から sudo グループに入っていることが多いです。
⑤ WARNING: UNPROTECTED PRIVATE KEY FILE!(SSH エラー)
原因: SSH 秘密鍵のパーミッションが 600 より広い(644 など)。
解決: chmod 600 ~/.ssh/id_rsa(または id_ed25519 など)
⑥ Operation not permitted(操作不可エラー)
「Permission denied」とは別物です。Operation not permitted はカーネルの制限や capabilities(特権機能)の問題で、一般的には Docker コンテナ内でシステムコールを使う操作や、 chown を他人のファイルに使おうとしたときなどに出ます。
まとめ
Ubuntu の Permission denied エラーの解決フローをまとめます。
- まず
ls -laでパーミッション(所有者・権限)を確認する - 自分のファイルの権限問題 →
chmodで修正(書き込みは644、実行は+xか755) - root 所有のファイルへの操作 →
sudoを使う(リダイレクトにはsudo tee) - 所有者が違う →
sudo chown 自分:グループ ファイルで変更 - SSH 秘密鍵 →
chmod 600 ~/.ssh/id_rsaで必ず修正
基本の操作は ls -la・chmod・sudo・chown の4つです。これを組み合わせれば、日常的な permission denied の大部分は解決できます。
よく使うコマンドまとめ
ls -la ファイル: パーミッションと所有者を確認stat -c '%A %a %U %G' ファイル: 記号と数字で詳細確認chmod 755 script.sh: 実行ファイル用パーミッション設定chmod 644 config.txt: 設定ファイル用パーミッション設定chmod 600 ~/.ssh/id_rsa: SSH 秘密鍵のパーミッション修正chmod +x script.sh: 実行権だけを追加sudo chown -R ubuntu:ubuntu /var/www/html/: 所有者を再帰的に変更echo "..." | sudo tee -a /etc/hosts: root 所有ファイルへの追記
VPS を借りて本番サーバーを運用しはじめると、パーミッション問題はさらに頻繁に出てきます。Nginx・MySQL・アプリの実行ユーザーが絡み合う場面で特に詰まりやすいので、まずはこの記事の内容を手元で試しておくことをおすすめします。
VPS 選びから始めたい方は、実測ベンチマークをもとに比較した記事も参考にしてみてください。


コメント