
私の Ubuntu Focal インストールでは、kernel.perf_event_paranoid
デフォルトで 4 に設定されています。
$ sysctl kernel.perf_event_paranoid
kernel.perf_event_paranoid = 4
/etc/sysctl.conf
(関連する設定ディレクトリを確認しましたが、これを設定していません。)
これは奇妙に思えます。カーネルのドキュメントには、2 より大きい値に対する追加の効果については何も説明されていないからです。
perf_event_paranoid:
Controls use of the performance events system by unprivileged
users (without CAP_SYS_ADMIN). The default value is 2.
-1: Allow use of (almost) all events by all users
Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>=0: Disallow ftrace function tracepoint by users without CAP_SYS_ADMIN
Disallow raw tracepoint access by users without CAP_SYS_ADMIN
>=1: Disallow CPU event access by users without CAP_SYS_ADMIN
>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN
(ソース。
perf_event_paranoid
メインラインカーネルのソースコードを簡単に検索してみましたが、 2 より大きい数値と比較されている箇所は見つかりませんでした。
しかし、4に設定すると効果があります。次のperfコマンドをperf_event_paranoid
4に設定して実行しました。非ルートユーザー:
perf stat -e context-switches,cpu-migrations -r 1 -- sleep 1
次のエラーが表示されます:
Error:
Access to performance monitoring and observability operations is limited.
Consider adjusting /proc/sys/kernel/perf_event_paranoid setting to open
access to performance monitoring and observability operations for processes
without CAP_PERFMON, CAP_SYS_PTRACE or CAP_SYS_ADMIN Linux capability.
More information can be found at 'Perf events and tool security' document:
https://www.kernel.org/doc/html/latest/admin-guide/perf-security.html
perf_event_paranoid setting is 4:
-1: Allow use of (almost) all events by all users
Ignore mlock limit after perf_event_mlock_kb without CAP_IPC_LOCK
>= 0: Disallow raw and ftrace function tracepoint access
>= 1: Disallow CPU event access
>= 2: Disallow kernel profiling
To make the adjusted perf_event_paranoid setting permanent preserve it
in /etc/sysctl.conf (e.g. kernel.perf_event_paranoid = <setting>)
3 に変更しkernel.perf_event_paranoid
て同じコマンドを実行すると、非 root ユーザーとして次の結果が得られます。
Performance counter stats for 'sleep 1':
0 context-switches:u
0 cpu-migrations:u
1.000502603 seconds time elapsed
0.000460000 seconds user
0.000000000 seconds sys
したがって、perf_event_paranoid
Linux カーネルのドキュメントに何の効果があるか書かれていなくても、設定をデフォルトの 4 から 3 に変更すると、何らかの効果があります。
何が起こっているのでしょうか? Ubuntu には、新しい、より偏執的なパフォーマンス レベルを追加するカスタム パッチが付属しているのでしょうか?
その他のディストリビューション
perf_event_paranoid
Debian はレベル 3を作成する非標準パッチを適用しているようです。
Jeff Vander Stoep 氏は 7 月 27 日にパッチを投稿しました。このパッチは、機能を持つプロセスに
kernel.perf_event_paranoid=3
制限する sysctl パラメータ (つまり )に設定できる別の値を追加します。現在、はデフォルトで 2 に設定されており、適切な機能を持たないプロセスは一部の perf 機能 (raw トレースポイント アクセス、CPU イベント アクセス、カーネル プロファイリング) にアクセスできません。このパッチではデフォルトは変更されません。また、彼はカーネルを設定して 3 をデフォルトの perf_event_paranoid 値にできるようにする別のパッチも投稿しました。perf_event_open()
CAP_SYS_ADMIN
perf_event_paranoid
(ソース。)
しかし、Ubuntu はそれよりもさらに偏執的であるように思われます。
答え1
レベル 4 は Debian パッチとまったく同じことを行います。つまり、権限のないプロセスによる の使用を無効にしますperf_event_open()
。ただし、制限はパラノイア レベル 3 ではなく、パラノイア レベル 4 で適用されます。
現在のパラノイア レベルは、ファイル のカーネル ソースのコメントに記載されていますkernel/events/core.c
。
/*
* perf event paranoia level:
* -1 - not paranoid at all
* 0 - disallow raw tracepoint access for unpriv
* 1 - disallow cpu events for unpriv
* 2 - disallow kernel profiling for unpriv
* 4 - disallow all unpriv perf event use
*/
この変更を行ったコミットはここ(注: コミット メッセージとカーネル コメントは矛盾しています。カーネル コメントの方が正しいように思えます。)
要約する:
- レベル -1 から 2: メインライン カーネルと同じです。
- レベル 3: レベル 2 と同じですか? 100% 確認できませんでした。3 に設定された定数があり
PERF_SECURITY_TRACEPOINT
、まだいくつかの場所で使用されています。 - レベル 4: 権限のないユーザーに対して perf_event_open を完全に無効にします。
答え2
Nick が正しく指摘しているように、非特権ユーザーに対して無効にするだけでなく、パラノイア レベル 4 では特権ファイルにも同じ制限が適用されるようです。
たとえば、私のUbuntu 20.04システムでは、perf_usersグループを次のように設定しました。公式文書、perf
以下の機能を備えています
$ getcap perf
perf = cap_sys_ptrace,cap_syslog,38+ep
パラノイア レベル 3 で実行すると、非特権ユーザーに対しては期待どおりに動作します。ただし、パラノイア レベル 4 では、perf
ファイルの機能に関係なく、質問からエラーが返されます。