내 사용자가 /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>
때문에 유효 하다pkexec
setuid 바이너리따라서 프로세스는 루트로 실행되며 실행하려는 명령을 실행할 권한이 있는지만 확인합니다.