2016-08-24 4 views
4

タスク

にシステムコールでUID/GIDのチェックがRCUクリティカルセクションで実行されていることを確認してください。特別なユーザ( "root"や "pi"など)がそれを発行した場合にのみ呼び出されるようにシステムコールを修正したいと思います。それ以外の場合、呼び出しは本体の大部分をスキップして成功を返します。私は消費電力メトリックを生成するための追加のシステムコールを実装して、私のラズベリーパイ2のために書いた小さなカーネルモジュールを持っている


背景作業

私は長さで問題に読み込まれ、I've found a similar question on SOが、私の観点からそれで多くの問題は、(以下に記載)がありました。


質問

  • リンク質問がlinux/sched.hlinux/cred.hで定義されているようstruct task_structは、struct credへのポインタ要素が含まれていることを指摘しています。 2つのヘッダーの後者は私のシステムには存在しません。前者は、struct cred要素へのポインターの宣言を表示しません。 これは意味がありますか?
    • 愚かな間違い。これはカーネルヘッダー全体(つまり、/usr/src/linux-headers-$(uname -r)/include/linux/cred.h)にあり、gcc-buildヘッダーでは/usr/include/linuxを探していました。上記は、働いていた場合であっても
  • 私はthe real, effective, or saved UID for the processを取得するならば、それは言及していません。 これらの3つの値をシステムコールから得ることさえできますか?
    • cred.hには、すでにこれらがすべて含まれています。
  • 迅速ユーザーが/etc/groupを解析せずに属しているグループを決定するために、カーネルモジュール内の安全な方法はありますか?
    • cred.hには、すでにこれらがすべて含まれています。プロセスを反復処理し、処理の 資格情報を読み取りがRCUの下で行われるべきであること、

      注:更新が

      だから、唯一の有効な疑問が残り


は以下のとおりです。重要なセクション。

答えて

2

リンクされた質問は根本的に異なる問題に関係します。引用するには

私が取得したいuidは、現在のプロセスではないことに注意してください。

明らかに、現在実行中のスレッドではないスレッドは、原則として、いつでも終了したり、資格情報を変更することができます。私たちが手を動かしているものの安定性を確保するための措置を講じる必要があります。 RCUはしばしば正解です。そこに提供される答えには、他の方法もあるという意味でいくぶん間違っています。

一方、コードを実行しているスレッドで操作したい場合は、終了しないことがわかります(終了パスではなくコードを実行しているため)。資格情報の安定性については何が問題になるのですか?いいニュースです。彼らはそこにいることも保証されており、準備なしでアクセスすることができます。これは、資格情報の切り替えを行うコードをチェックすることで簡単に確認できます。

私たちは、アクセスを行うためにどのようなプリミティブが使用できるのかという疑問が残っています。そのために、make_kuid、uid_eqなどのプリミティブを使用できます。

実際の質問は、これが単に/ procファイルではなく、システムコールである理由です。 http://codingtragedy.blogspot.com/2015/04/weird-stuff-thread-credentials-in-linux.html

+0

良い読み。ありがとうございました。 – DevNull

+0

'/ proc'はプロセス情報です。いくつかの古いものもありますが、プロセス関連ではない新しいものは '/ sys'の下にあるはずです。 – Gilles

2

まず、新しいシステムコールを追加することが稀に物事を行うための正しい方法ではありません:やや資格取り扱いの説明精緻化のため

は、このブログ記事を参照してください。カーネル内の既存のユーティリティー機能、既存のlibc、ユーザーランドでの高水準言語サポートなど、既存のツールを両立させることで、既存のメカニズムを使って作業するのが最善です。ファイルはLinux(他のUnixシステムのような)の中心概念であり、ほとんどのデータはdevice filesまたはprocsysfsのような特殊なファイルシステムのいずれかでファイル交換されます。

システムコールを変更して、特別なユーザー(「root」や「pi」など)が発行した場合にのみ呼び出されるようにしたいと考えています。

これはカーネルでは実行できません。デザインの観点からは間違っているだけでなく、可能でもありません。カーネルはユーザー名について何も知らない。カーネル内のユーザーについての唯一の知識は、いくつかの特権的なアクションがルートnamespaceのユーザー0に予約されているということです(最後の部分を忘れないようにしてください)。それが新しい場合は、次のような高度な操作システムコールの追加)。多くのアクションは、実際にはルートではなくcapabilityを探します。

sysfsです。 kernel documentationを読んで、古いものではないオンラインチュートリアルや既存のカーネルコード(sysfsを使用しているコードは現在は一般的にはきれいです)を探してください。 sysfsを使用すると、/sysのファイルに情報が公開されます。アクセス制御はユーザランドに任されています - カーネルには正常なデフォルトがあり、ブートスクリプトにはchgrpchmod、またはsetfaclを呼び出すような作業を行います。これは、既存のメカニズムを使用する際にユーザー側で再考する必要のない多くのホイールの1つです。

sysfs showメソッドはファイルを自動的にロックするため、一度に1つのカーネルスレッドしか実行できません。これは、既存のメカニズムを使用するときにカーネル側で再考する必要のない多くのホイールの1つです。

+0

マイナーなタイプミス "これはカーネルで行うことができます"。 '/ etc/passwd'のユーザ名文字列にマッピングできない場合でも、少なくともゼロ以外のPID/GID値をカーネルは理解していますか?ありがとうございました。 – DevNull

+0

@DevNullカーネルはUIDとGIDの値を保持していますが、0 =他の人ができないことを多く許されているユーザーを除いて、それらの意味を理解していません。しかし、UID/GIDは名前空間でのみ意味があります:整数ではなく、{名前空間、整数}のペアです。ユーザランド内の異なる仮想環境に複数の '/ etc/passwd'が存在する可能性があります.UID値だけでは何も意味しません。 – Gilles

関連する問題