polkit認証はプロセスにどのような影響を与えますか?

polkit認証はプロセスにどのような影響を与えますか?

私のユーザーが/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>有効だpkexecsetuid バイナリしたがって、プロセスはrootとして実行され、実行したいコマンドを実行する権限がありますが、確認します。

おすすめ記事