
私のユーザーが/etc
私のグラフィックCアプリケーション内で設定ファイルを編集できるようにしたいです。 1つの方法は次のとおりです。
fprintf( fopen("/tmp/tmpfile", "w+") , "content\n"); // Write to a tmpfile
system("pkexec mv /tmp/tmpfile /etc/myapp.conf"); // Use pkexec to move that tmpfile to our file
しかし、私はポルケットを実装したいと思います。顧客(私がやろうとしているのは単一の書き込みよりも少し複雑です。)これはデスクトップのpolkitエージェントをポップアップし、管理者(root)認証を必要とします。認証されたら、操作を実行してから無許可の使用に戻ります。
私は実装しましたクライアント参照API/usr/share/polkit-1/actions
この関数によって返された点まで累積されます(ここでは単純化されたバージョン)TRUE
。
int IsAuthorized(const char* action) {
PolkutAuthorizationResult* r = polkit_authority_check_authorization_sync(
polkit_authority_get_sync(NULL, &error),
polkit_unix_process_new_for_owner( getpid(), 0, getuid() ),
"org.myapp.editconfig",
NULL, /* details */
POLKIT_CHECK_AUTHORIZATION_FLAGS_ALLOW_USER_INTERACTION,
NULL, /* cancellable */
&error
);
return polkit_authorization_result_get_is_authorized( r );
}
これにより、次の操作が承認されます。
<action id="org.myapp.editconfig">
<description>Edit myapp config</description>
<message>Authentication is required to edit this system-wide config file</message>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
</action>
しかし、私の質問は:今は何ですか? 「権限付与」が私にとってどんな意味なのかよく分からない。書き込み用にファイルを開こうとすると、root:root
権限が拒否されます。新しいファイルを作成すると、root以外のユーザーが所有します。
ソース調査プログラムの実行私はそれが自分のuid / gidを変更するのを見ます。単に認証が与えられますか?CAP_SETUID
そしてCAP_SETGID
プロセスに?
これが本当だと仮定してsetreuid()
そしてsetregid()
:
int uid = getuid(); int euid = geteuid();
int gid = getgid(); int egid = getegid();
setregid(0,0); // Switch to root
setreuid(0,0);
fprintf( fopen("/etc/myapp.conf", "w+"), "content\n"); // Write the file
setregid(gid,egid); // Switch back
setreuid(uid,euid);
私はこれがsetreuid(0,0)
失敗したことがわかりました。私はこのようにユーザーを切り替えたことがありませんプログラムの実行する。環境やすべてのファイル記述子のpkexec
設定など、いくつかのことをスキップしました。set_close_exec
私が何かを見逃しているようです。
答え1
polkit_authority_check_authorization_sync
発信者がpolkitルールに従って操作を実行する権限を持っていることを確認してください。これは通常、すでにrootとして実行されているアプリケーション/デーモンが、呼び出し元が実際に何かを実行できることを確認し、呼び出し元に代わってそのタスクを実行しようとしていることを意味します。 Polkit自体は、アプリケーションがこれを実行するためにすでに必要な追加の権限を付与しません。だからpkexec <command>
有効だpkexec
setuid バイナリしたがって、プロセスはrootとして実行され、実行したいコマンドを実行する権限がありますが、確認します。