1

Linux では、ユーティリティに特定のユーザー/グループを割り当てて、それらへのアクセスを制限できます。それはわかりましたが、Linux はシステム コール レベルでパーミッションをどのように適用するのでしょうか。たとえば、スケジューリング ポリシーを変更しようとしたり、pthread_setschedparam を使用してスレッドの優先順位を上げようとすると、プロセスをルートとして実行しない限り、呼び出しは失敗します。

だから私の質問は、Linux のどのコンポーネントがシステム コールにパーミッションを適用する責任があるのですか? システム コール レベルでパーミッションを担当するコンポーネントを理解していれば、システム管理者に、特定のシステム コールへのユーザー アクセスを許可するように要求できます。おそらくパーミッションはシステムコールではなく、スレッド優先度の変更などの特定のアクションでのものです。システム管理者がそのようなアクションへの選択的なアクセスを許可できるようにするには、システム管理者に何を伝える必要がありますか?

4

4 に答える 4

6

カーネルのソースコードは次のようになります。

settimeofday()ルート権限が必要なカーネル時間を設定する例を見てみましょう

security_settime()セキュリティをチェックして時刻を設定する機能があります

関数cap_settime(を使用する ) を呼び出しますcapable()

capable(int capability)[カーネル/capability.c]

これは、現在のユーザーが特定のことを行う能力を持っているかどうかを確認し、設定された時間の場合、その上限はCAP_SYS_TIME


int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
{
    static int firsttime = 1;
    int error = 0;

    if (tv && !timespec_valid(tv))
        return -EINVAL;

    error = security_settime(tv, tz);
    if (error)
        return error;

    if (tz) {
        sys_tz = *tz;
        update_vsyscall_tz();
        if (firsttime) {
            firsttime = 0;
            if (!tv)
                warp_clock();
        }
    }
    if (tv)
        return do_settimeofday(tv);
    return 0;
}
于 2013-02-08T19:40:05.760 に答える
1

pthread_setschedparam(3) の特定のケースでは、答えは Linux カーネルのバージョンに依存し、やや複雑です。で参照されているマンページの特権とリソース制限のセクションを見てください。sched_setscheduler(2)pthread_setschedparam(3)

一般に、一部のシステム コールを使用する許可は、呼び出し元の権限によって管理される場合があります。capabilites(7)

于 2013-02-08T19:49:55.103 に答える
1

それはかなり自明です。システム コールはカーネルへの呼び出しであるため、カーネルはいくつかのシステム コールにセキュリティ ポリシーを適用する責任があります。

Linux 2.6 以降、カーネル内の特定のアクセスを制御するモジュールの開発を可能にする Linux Security Modules (LSM) フレームワークが導入されました。LSM を使用した最も一般的な実装は、おそらくSELinuxです。別の既知の実装はAppArmorです。

さらに、capabilities(7)2.6+ カーネルに組み込まれているものでは、特定の特権システム コールを非特権ユーザーが実行できるかどうかを制御できます。

于 2013-02-08T19:42:20.887 に答える
0

rootCPUがカーネル空間にジャンプするとすぐに、 [*]として効果的に実行されます。

つまり、ユーザーの観点から考えているのとは正反対に機能します。通常のユーザーとして実行し、通常rootはアクセスできないファイルやデバイスにアクセスするために何らかの方法で昇格する必要がある代わりに、カーネルスペースコードは常に実行されます。また、ユーザーに代わって実行することを、そのユーザーに許可さrootれている操作のみに制限するように、ユーザー特権チェックを行う必要があります。


[*]もちろん、SELinuxのようなMACシステムはこれを変更します。

于 2013-02-11T19:52:33.697 に答える