root以外のユーザーに対するパフォーマンス権限

root以外のユーザーに対するパフォーマンス権限

ユーザーがサービス(sudoで始まるnginxプロセス)のパフォーマンス統計を収集できない理由はわかりません。ご覧のとおり、カーネルバージョンとパフォーマンスバージョンが一致しています。

$ uname -r
4.19.125
$ which perf
/home/mahmood/bin/perf
$ /home/mahmood/bin/perf --version
perf version 4.19.125

ただし、実行するとperf record -e cycles:u -j any,u -a -o perf.data -p 4018このエラーが発生します。

Warning:
PID/TID switch overriding SYSTEM
Error:
You may not have permission to collect stats.

Consider tweaking /proc/sys/kernel/perf_event_paranoid,
which controls use of the performance events system by
unprivileged users (without CAP_SYS_ADMIN).

The current value is -1:

  -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

To make this setting permanent, edit /etc/sysctl.conf too, e.g.:

        kernel.perf_event_paranoid = -1

値が-1、-1の場合、すべてのユーザーがデータを収集できることは明らかです。

それでは、この問題をどのように解決するのですか?

ベストアンサー1

@waltinatorでコメント

従業員の読み取りとユーザーIDの割り当てCAP_SYS_ADMIN

おすすめ能力(7)、現在、次のように言います。

CAP_PERFMON(Linux 5.8以降)以下を含むさまざまなパフォーマンス監視メカニズムを使用します。

  • perf_event_open(2) を呼び出します。
  • パフォーマンスに影響を与えるさまざまなBPF操作を使用します。

この機能は次に追加されました。Linux 5.8過負荷機能と性能監視機能の分離 CAP_SYS_ADMIN能力。カーネルソースファイルも参照してください。 Documentation/admin-guide/perf-security.rst

これについては詳しく説明しません。どのようにこれを行うために、最後に、以下を含むプログラムのリストが提供されます。getcap(8)そしてsetcap(8)特定のファイルに追加された機能を確認し、機能を変更するために使用できます。

OPの質問には、Ubuntu(Debianなど)というタグが付けられています。一部の他のシステムでは、これらの設定を適用する構成ファイルがある可能性があります。たとえば、次のようになります。CentOS 7でcap_sys_adminユーザーに権限を追加する方法は?しかし、Debianなどでは通常、パッケージのインストールスクリプトを介して行われます。

たとえば、Ubuntu 18.04を実行すると、次のようになりますgetcap /usr/bin/*

/usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep                                 
/usr/bin/mtr-packet = cap_net_raw+ep 

mtr-tinyはの一部でありmtrパッケージファイルpostinstallこれにはスクリプトが含まれています。

#!/bin/sh

set -e

if [ "$1" = configure ]; then
    # If setcap is installed, try setting cap_net_raw+ep,
    # which allows us to install our binaries without the setuid
    # bit.
    if command -v setcap > /dev/null; then
        if ! setcap cap_net_raw+ep /usr/bin/mtr-packet; then
            echo "Setcap failed on /usr/bin/mtr-packet, falling back to setuid" >&2
            chmod u+s /usr/bin/mtr-packet
        fi
    else
        echo "Setcap is not installed, falling back to setuid" >&2
        chmod u+s /usr/bin/mtr-packet
    fi
fi

#DEBHELPER#

exit 0

関連コマンドで

setcap cap_net_raw+ep /usr/bin/mtr-packet

これはcap_net_raw明らかでなければなりません。それepあまり明確ではありません。見ているソースコード

        printf("%s differs in [%s%s%s]\n", *argv,
           CAP_DIFFERS(cmp, CAP_PERMITTED) ? "p" : "",
           CAP_DIFFERS(cmp, CAP_INHERITABLE) ? "i" : "",
           CAP_DIFFERS(cmp, CAP_EFFECTIVE) ? "e" : "");

この段落を明確にするのに役立ちます。テキストにキャップ(3):

各句のカンマ区切りの機能名(または単語)のリストall) の後にタスクリストが表示されます。タスクリストは、一連の演算子とフラグのペアで構成されています。法的演算子には以下が含まれます。=「+」-。法的フラグは次のとおりです。eip。これらのフラグは大文字と小文字を区別し、有効なセット、継承可能なセット、および許可されるセットをそれぞれ指定します。

つまり、setcap使用しているカーネルに必要なすべての機能を追加できます。perf適切なフラグを含むプログラムファイル。

おすすめ記事