명령을 사용하여 그룹 구성원과 관리자를 수정 gpasswd
하고 사용자를 그룹 관리자로 추가하면 Linux에서는 해당 사용자가 루트에 예약된 작업을 수행하도록 허용합니다.
전임자.
[test1@centos ~]$ gpasswd -a test6 test
Adding user test6 to group test
관리자로 추가되지 않은 사용자로 동일한 작업을 수행하려고 하면 허용되지 않습니다.
[test2@centos ~]$ gpasswd -a test7 test
gpasswd: Permission denied.
이것은 어딘가에서 추적되어야 합니다. 이 gpasswd
명령은 SUID 비트를 설정하지만 제한 대상을 나타내지는 않습니다.
이것은 어디에서 추적됩니까? gpasswd
누가 높은 권한을 부여받았는지 명령은 어떻게 알 수 있나요 ?
답변1
이것은 어디에서 추적됩니까? gpasswd 명령은 누가 상승된 권한을 부여받았는지 어떻게 알 수 있나요?
실제로 그 자체로는 "추적"이 아닙니다. gpasswd
사용자가 다양한 방법으로 명령을 사용할 수 있는 권한을 갖고 있다는 규칙을 갖고 이러한 규칙/권한은 명령이 실행될 때마다 테스트됩니다. 이러한 테스트의 결과는 캐시되거나 저장되지 않습니다.
일반적으로 실행하려면 gpasswd
루트이거나 대상 그룹의 관리 구성원으로 정의되어야 합니다.첫 번째귀하가 타겟팅하는 그룹의 구성원입니다.
구체적인 내용을 알고 싶으시면 gpasswd
다음 내용의 출처와 기타 부분을 확인해 보시기 바랍니다.섀도우 유틸리티 프로젝트.
~에 따르면gpasswd 소스(GitHub 미러#ifdef SHADOWGRP
), 그리고 sum 결과 에 따라 #ifdef FIRST_MEMBER_IS_ADMIN
또는 플래그를 사용하지 않는 호출에 대해 함수에서 세 가지 검사 중 하나를 실행합니다 check_perms
(아래 설명은 제가 작성한 것입니다).gpasswd
-A
-M
/* Check 1 */
if (!amroot && !is_on_list (sg->sg_adm, myname)) {
failure ();
}
/* Check 2 */
if (!amroot) {
if (gr->gr_mem[0] == (char *) 0) {
failure ();
}
if (strcmp (gr->gr_mem[0], myname) != 0) {
failure ();
}
}
/* Check 3 */
if (!amroot) {
failure ();
}
amroot
루트 사용자가 호출하면 true가 되는 부울 값입니다 gpasswd
. 그것은 다음과 같이 정의된다여기:
/* The UID of the caller */
static uid_t bywho;
/* Indicate if gpasswd was called by root */
#define amroot (0 == bywho)
루트가 되면 검사 1, 검사 2, 검사 3을 "통과"(건너뛰기)합니다( amroot
will be true
, 즉 !amroot
will be 를 의미 false
하므로 if 문을 건너뜁니다).
루트가 아닌 사용자는 대상 그룹의 관리 구성원인 경우 확인 1을 통과할 수 있습니다. 이는 대상 그룹(sg->sg_adm)의 관리 구성원 목록과 gpasswd
호출하는 사용자의 사용자 이름(myname)을 함수에 전달하여 테스트됩니다 is_on_list
.여기. 호출 사용자가 그룹 관리자 목록에 있는 경우 반전되어 사용자가 확인 1을 통과할 수 있도록 is_on_list
반환합니다 .true
false
루트가 아닌 사용자는 확인 2를 통과할 수 있습니다(루트가 아닌 경우).변경하려는 그룹의 첫 번째 나열된 구성원. 이는 대상 그룹의 첫 번째 사용자가 호출되는 사용자와 동일한지 확인하여 테스트됩니다 gpasswd
.
루트가 아닌 사용자는 검사 3을 통과할 수 없습니다.
참고: 모든 소스 링크는 소스 저장소의 "debian/4.2-3" 태그에 대한 링크를 제공합니다. 이는 일관된 참조를 제공하기 위한 것입니다.