This page is a beginner-friendly note about aggregating CSP report logs across multiple days, focusing on sudo, wildcard expansion, permissions, and how to read the results without panic.
CSPログを「全日分で集計したい」ときに、sudo と * の挙動で迷わないための判断だけまとめます。
最初は「CSPログを全日分で集計したい」だけでした。
でも実際にやると、No such file or directory と Permission denied が交互に出て、どこが問題なのか分からなくなりました。
ls /var/www/.../logs/csp-report-YYYYMMDD.jsonl は見えるgrep ... csp-report-*.jsonl は No such になるsudo を付けても直らない(むしろ No such に戻る)原因はだいたい「ワイルドカード(*)の展開は sudo の前に起きる」と、「logs が apache:apache で閉じてある」の組み合わせでした。
自分が一番勘違いしていたのはここです。
sudo wc -l /var/www/.../logs/csp-report-*.jsonl の * は、root ではなく自分のシェル(alma)側で展開されます。
そして alma が /var/www/.../logs を一覧できないなら、* は展開されず、文字列のまま root に渡ります。
csp-report-*.jsonl という名前のファイル」を探しに行くNo such file or directoryなので、「root側で * を展開させる」のが最初の一手になります。
ここから一気に迷いが減りました。
sudo bash -c 'ls -lh /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl'
これで一覧が出れば、「ファイルが無い」問題ではありません。
sudo bash -c 'wc -l /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl'
行数が 1 以上なら、次は「grep条件が合ってない」側を疑えます。
ここも「直さなきゃ」と思いがちですが、私は直さない方針にしました。
ls -ld /var/www/sakura.yugien.xyz/logs
drwxr-x--- かつ apache:apache のように「other が ---」なら、alma が入れないのは仕様どおりです。
ログは証跡なので、閲覧者を増やすより、必要なときだけ sudo で読むほうが安心でした。
ログは見えているのに集計が「何も出ない」場合、ここにハマります。
effective_directiveviolated_directiveblocked_uridocument_uri(effective-directive みたいなハイフン区切りではなかった)
sudo bash -c 'head -n 1 /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl'
キー名が分かれば、その形式に合わせて集計できます。
「どれが多い?」を先に出すと、次の判断が早いです。
sudo bash -c '
grep -h -E ""(effective_directive|violated_directive)"" /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl | sed -E "s/.*\"(effective_directive|violated_directive)\":\"([^\"]+)\".*/\2/" | sort | uniq -c | sort -nr | head -5
'
sudo bash -c '
grep -h ""blocked_uri"" /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl | sed -E "s/.*\"blocked_uri\":\"([^\"]+)\".*/\1/" | sort | uniq -c | sort -nr | head -10
'
sudo bash -c '
grep -h ""document_uri"" /var/www/sakura.yugien.xyz/logs/csp-report-*.jsonl | sed -E "s/.*\"document_uri\":\"([^\"]+)\".*/\1/" | sort | uniq -c | sort -nr | head -10
'
ログを見ると全部怖く見えますが、私は「まず分ける」ことにしました。
browser-extension://(拡張機能由来)data: / about:script-src / script-src-elemblocked_uri: "inline" → インラインstyle/scriptがある(または計測系が混ざる)img-src が多い → 外部画像(CDN/別ドメイン)を使っている最終的に「楽さ」より「証跡」を優先することにしました。
sudo bash -c で root 側に * を展開させる運用を楽にしたいなら、権限を緩めるよりrootで動く集計スクリプトを1つ置くほうが安全だと感じました。
sudo を付けたのに No such file になるのはなぜ?A. ワイルドカード(*)は sudo の前に展開されます。展開できない権限だと、* が文字列のまま root に渡り、存在しないファイル名として扱われます。
logs を alma が読めるようにしてもいい?A. できますが、ログは証跡なので閲覧者を増やすのはリスクも増えます。私は「都度 sudo で読む」方針にしました。
violated-directive で grep しても出ませんA. ログのキー名が violated_directive のようにアンダースコアになっている可能性があります。まず head -n 1 で実物を見てください。
A. いきなり強制にすると、外部JS/解析/広告/外部画像が止まりやすいです。まずは Report-Only で「何が起きているか」を把握するのが安全です。