polkit 인증은 프로세스에 어떤 영향을 미치나요?

polkit 인증은 프로세스에 어떤 영향을 미치나요?

내 사용자가 /etc내 그래픽 C 응용 프로그램 내에서 구성 파일을 편집할 수 있기를 원합니다. 한 가지 방법은 다음과 같습니다.

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 에이전트가 팝업되어 관리자(루트) 인증이 필요합니다. 인증되면 작업을 수행한 다음 권한 없는 사용으로 돌아갑니다.

나는 구현했다클라이언트 참조 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권한이 거부됩니다. 새 파일을 생성하면 루트가 아닌 사용자가 소유하게 됩니다.

출처 조사프로그램 실행나는 그것이 자신의 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 규칙에 따라 작업을 수행할 권한이 있는지 확인하세요. 이는 일반적으로 이미 루트로 실행 중인 응용 프로그램/데몬이 호출자가 실제로 무언가를 수행할 수 있는지 확인한 다음 호출자를 대신하여 해당 작업을 수행하려고 함을 의미합니다. Polkit 자체는 애플리케이션이 이 작업을 수행하는 데 이미 필요한 추가 권한을 부여하지 않습니다. 그렇기 pkexec <command>때문에 유효 하다pkexecsetuid 바이너리따라서 프로세스는 루트로 실행되며 실행하려는 명령을 실행할 권한이 있는지만 확인합니다.

관련 정보