背景:
私は最近の記事を読んだ。freedesktop.org-bugすべてのコマンドを実行できますsystemctl
。 >。だから私は以下を実行しました。 uid
INT_MAX
root@host$> useradd -u 4000000000 largeuiduser
root@host$> su largeuiduser
largeuiduser@host$> systemctl ["whatever"]
[bug exists, and "whatever" gets executed]
largeuiduser@host$> exit
root@host$> userdel largeuiduser
後で見つけたよりきれいな方法を探しています。
root@host$> setpriv --reuid 4000000000 systemctl ["whatever"]
[bug exists, and "whatever" stuff gets executed]
このバグを悪用するために(一時的な)ユーザー名が必要ないことを示します。これはまた私がわからないことを示しています。ユーザー名は実際にどれほど重要ですか?。
質問 だから私の質問は次のとおりです。カーネル(linux/posix)の観点から、ユーザー名はどのくらい必要ですか?必ず必要で使用できますか?
私の疑いは、ユーザー名がユーザースペースでのみ使用される「利便性」にすぎないことです。
良い答えは、ユーザー名が「必須」になる設定と「消費可能」になる設定に関する情報を提供してこれを明確にすることです。
答え1
Linux と BSD の世界では、カーネルはほぼ排他的に数値ユーザーとグループ ID で動作します。以下をサポートする標準化されたCライブラリがあります。ユーザーデータベース、IDで名前を見つけることができ、その逆も同様です。これは、アプリケーションソフトウェアが人が提供した名前からシステムコールに必要なIDを取得してから再インポートする方法です。プロセス資格情報とアクセス制御リスト項目の両方がIDで機能します。
1つの例外は、setlogin()
BSDワールドの(標準化されていない)API関数で、数値ユーザーIDではなく文字列、ユーザー名で機能します。ただし、カーネルはこの文字列をどのようにも解釈しません。
一つできる完全に数値IDで実行されるアプリケーションを作成し、それを人間に提供します。しかし、人間が次のようなアカウントでうまく機能するという単純な理由から、ほとんどのソフトウェアはそう書かれていません。名前付き。
カーネルには存在しないアカウントという概念もありません。カーネルに関する限り、すべてのID(一部予約された値を除く)が有効です。 (スーパーユーザーとして)UID 24394で実行されるプロセスを開始し、そのUIDが所有するファイルシステムオブジェクトを作成できます(もちろん、権限がある場合)。これでカーネルは文句を言わない。
PolicyKit エラーは実際に UID とは関係ありません。異常終了(Abending)というプログラムに関するものですpkttyagent
。
エラー: pkttyagent.c:156:main: アサーションに失敗しました: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (トピック)) >= 0)...そして認証メカニズム開けません代わりにクローズ失敗この場合、復帰ユーザはデスクトップバスを介して認証された。
追加読書
- 「ユーザーデータベース」。 基本定義。単一のUNIX仕様。 IEEE 1003.1。 2018. グループを開きます。
getpwnam()
。 システムインターフェース。単一のUNIX仕様。 IEEE 1003.1。 2018. グループを開きます。getpwuid()
。 システムインターフェース。単一のUNIX仕様。 IEEE 1003.1。 2018. グループを開きます。- ジョナサンデボインポラード(2018)。
setlogin
。 スナックガイド。ソフトウェア。 - ジョナサンデボインポラード(2018)。
setuidgid
。 スナックガイド。ソフトウェア。 - 複数のUNIXユーザーがUIDを共有した場合、どのような副作用がありますか?
- https://news.ycombinator.com/item?id=18605607
- https://superuser.com/a/706578/38062