コンテンツにスキップ

ファイルとディレクトリ権限

対象ファイルに加え、親ディレクトリ、ACL、マウントオプション、ファイルの capability、SUID/SGID を確認する。root 権限の処理がそのパスを読む場合は、root が読む書き込み可能パスで詳しく調べる。

追加確認例:

ターミナルウィンドウ
namei -l <path>
stat <path>
ls -la <path>
findmnt
getfacl <path>
getcap <file>
getcap -r / 2>/dev/null
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null
  • 目的: owner、group、mode、ACL、symlink、mount option、capabilities、SUID/SGID を確認する。
  • 前提条件: 全ファイルシステム探索は重い。まず /opt, /srv, /var/www, /home/<user>, /etc/systemd/system, /usr/local/bin、アプリディレクトリに絞る。
  • 何を確認しているか: 親ディレクトリの書き込み可否、nosuid, noexec, nodev、bind mount、root プロセスが読む user-writable path。
  • 期待される出力: drwxrwxr-x root <group> ... <app>/plugins、/tmp に nosuid がない、共有パスが bind mount になっている。
  • 出力の解釈: ファイル本体が root 所有でも、親ディレクトリを書けるなら置換、symlink、race の余地がある。nosuid なら、そのマウント上の SUID shell は効かない。
  • 失敗した場合の切り分け: ACL、supplementary group、container 側の UID/GID、mount namespace、symlink の解決先を確認する。
  • 代替コマンド: find <DIR> -maxdepth 4 -writable -ls, find <DIR> -xtype l -ls, readlink -f <path>。
  • 状態変更: 読み取り専用。find / は負荷と大量の Permission denied を生む。対象を絞る。

優先度の高い範囲:

ターミナルウィンドウ
find /opt /srv /var/www /usr/local -maxdepth 5 -type d -writable -ls 2>/dev/null
find /opt /srv /var/www /usr/local -maxdepth 5 -type f -writable -ls 2>/dev/null
find /home -maxdepth 4 -type f \( -name '*.conf' -o -name '*.env' \) 2>/dev/null

共有マウントはコンテナの境界にも関わる。コンテナと名前空間の findmnt と合わせて確認する。

  • root が読む path に symlink、writable な親、race、archive 展開が絡むと権限境界になる。
  • SUID binary は nosuid のマウントでは効かない。bash は -p がないと、実行時に権限を落とす。
  • getcap の結果は、コンテナと名前空間で確認するプロセスの CapEff と分けて記録する。ファイルの capability とプロセスの実効 capability は別物である。

権限の差が境界になる形は次のとおり。

  • root で動くスクリプトが site.addsitedir() する plugin directory が group writable だと、そのグループが import 経路を書ける。
  • log ディレクトリへの symlink は1段で終わらない。高権限の閲覧処理が、2段目の先を root で読むことがある。
  • container と host の共有 mount では、container 側の chmod が host 側ユーザーの書き込み可否を変える。
  • Web の実行ユーザーがテーマや公開ディレクトリを書ける場合、そこへの書き込みはそのユーザーでのコード実行になる。
  • root の開発用 HTTP サーバの document root に、処理結果がスクリプトとして保存されると、そのプロセスの権限で実行される。

高権限プロセスがこれらのパスを読む流れは独自コードの信頼境界に図で残してある。