sudo/root-ness 감지 작동 방식

sudo/root-ness 감지 작동 방식

시스템 전체를 변경하는 프로그램에는 다음이 필요합니다.sudo 이미 루트 사용자가 아닌 이상.

이제 질문은 다음과 같습니다.어떻게정확히시스템은 내가 루트가 아님을 알고 있습니까?

할 수 있다:

  • 내가 특정 그룹에 속해 있는지 확인해보세요. 그렇다면 어떤 그룹에 가입해야 합니까?

  • 루트 자체의 잘 알려진 ID를 확인하십시오(예: "루트 사용자"가 소스 코드에 하드코딩되어 있음)?
    그렇다면 내 루트 계정이 손상되면 어떻게 되나요? 루트 권한으로 다른 계정을 만들 수 없으니 운영체제를 강제로 다시 설치해야 하나요?

  • 일부 파일의 내용을 기준으로 내 이름/그룹을 확인하고 올바른 권한을 부여하시겠습니까? 그렇다면 이 정보가 포함된 파일은 무엇입니까?

  • 다른 일을 하시나요? 그렇다면 무엇을 합니까?

답변1

Unix의 사용자 이름은 중요하지 않습니다. 숫자로 된 사용자 ID만 있습니다. 루트의 숫자 ID는 항상 0입니다. 이는 모든 곳(커널, 유틸리티 등)에 하드코딩되어 있습니다.

를 실행하여 숫자로 된 사용자 ID를 찾을 수 있습니다 id.

숫자로 된 사용자 ID는 실행 중인 프로세스의 속성입니다. 로그인하면 login( 등)을 통해 로그인한 프로세스가 sshd루트(UID 0)로 실행되고, 로그인이 승인되면 사용자 ID로 전환되어 쉘(passwd에 지정된 /etc/에서)이 실행됩니다. ). 거기에서 또는 다른 것을 사용하여 사용자 ID를 전환하려면 sudosu프로그램에는설정값비트는 실행될 때 프로세스가 프로그램 소유자(루트, UID 0)로 실행되도록 설정( chmod u+s또는 설정될 예정)됩니다. chmod 4xxx마찬가지로 일단 권한이 부여되면 sudo모든 프로그램을 루트로 실행합니다(실행, 셸 등 무엇을 지시하든 관계 없음). (이 su경우 전환할 다른 사용자를 지정하면 해당 UID로 전환한 후 쉘 등을 실행하게 됩니다.)

당신의 대답을다른문제는 루트 계정이 숫자에 불과하기 때문에 루트 계정을 "해제"할 수 있는 방법은 없지만 루트로 로그인할 수 없는 데에는 몇 가지 이유가 있을 수 있다는 것입니다(예: 비밀번호를 잊어버린 경우). 이 중 어느 것도 운영 체제를 다시 설치할 필요가 없지만 문제를 해결하려면 약간의 기술적 능력이 필요할 수 있습니다. (예를 들어, 루트 비밀번호를 잊어버린 경우 sudo를 사용하여 비밀번호로 루트에 액세스하거나, 단일 사용자 모드로 부팅하여 비밀번호를 재설정하거나, 라이브 미디어 또는 복구 환경에서 부팅할 수 있습니다.)

답변2

25년 동안 유닉스를 사용하면서 루트 계정이 손상되어 시스템 자체를 사용할 수 없게 되는 상황을 본 적이 없습니다. 잊어버린 비밀번호는 쉽게 재설정할 수 있으며 비밀번호가 손상된 것 같지 않습니다. BSD를 실행하는 Vax에서 한 가지 기억에 남는 사건이 발생했는데, 실수로 (묻지 않고) 테이프 드라이브(1/4" 릴 테이프)에 대한 항목을 포함하여 /dev에서 모든 것을 삭제했습니다. 이로 인해 /dev에서 모든 것을 삭제할 수 있게 되었습니다. 개발자 백업은 복원하기가 약간 어렵습니다.

유닉스에서는 실제로 깨질 수 있는 것이 아무것도 없습니다. 로그인 프로세스는 단순히 쉘을 시작하고 루트의 홈 디렉토리에서 rc 파일을 실행합니다. rc 파일을 제외하고 나머지 파일이 루트에서 작동하지 않으면 아마도 다른 누구에게도 작동하지 않을 것입니다. 그래픽 시스템(KDE 또는 Gnome)에 루트로 로그인한 경우 제가 할 수 있는 말은 "하지 마세요"라는 것뿐입니다.

uid 0으로 여러 계정을 가질 수 있습니다. 컴퓨터에 관리자가 여러 명 있는 경우 sudo 대신 사용할 수 있습니다. 단점은 이제 보호해야 할 루트 계정이 여러 개 있다는 것입니다. 또한 sudo가 수행하는 로깅을 얻지 못합니다.

답변3

스티븐 프리처드의 답변훌륭하지만 유사한 정보에 대해 다른 프레젠테이션을 제공해야 한다고 생각했습니다.

각 프로세스는 특정 사용자로 실행됩니다. 사용자는 커널에서만 사용할 수 있는 프로세스 정보에 저장되는 사용자 ID인 숫자로 식별됩니다. 사용자 ID 0을 가진 사용자는 일반적으로 이라는 특별한 권한을 가집니다 root. 이 이름은 root커널에 특별하지 않습니다(그러나 이름을 변경하면 많은 응용 프로그램이 혼동될 수 있습니다). 커널 모듈 로드, 대부분의 하드웨어 장치에 대한 직접 액세스 등 많은 작업을 수행하려면 작업을 수행하는 프로세스가 사용자 ID 0²로 실행되어야 합니다.

시스템이 부팅되면 커널에 의해 시작된 첫 번째 프로세스가 수퍼유저로 실행됩니다. 이 프로세스가 호출 init되고 결국 많은 시스템 서비스( cron, syslogd, ,...)와 로그인 프로그램( login, sshd, 등)이 시작됩니다.

로그인할 때 자격 증명(이름, 비밀번호 등)을 입력하면 로그인 프로그램이 이러한 자격 증명을 확인합니다. 자격 증명이 수락되면 로그인 절차가 사용자 ID(수퍼유저에게 부여된 권한 중 하나)로 변경됩니다.

사용자 데이터베이스를 망친 경우(루트로 임의의 파일을 편집하거나 삭제하지 않으면 이런 일이 발생하지 않음) 더 이상 로그인하지 못할 수 있습니다. 여전히 단일 사용자 모드로 부팅하거나 Live CD에서 시스템을 복구할 수 있습니다.

이 프로그램을 사용 sudo하면 루트로 명령을 실행할 수 있습니다. 일반적으로 프로그램을 실행하면 해당 프로그램을 시작한 프로세스의 사용자 ID를 상속받습니다. sudo하지만설정값/usr/bin/sudoroot: 이는 사용자 ID 0으로 실행되도록 하는 의 권한 비트에 의해 결정되는 예외입니다 . sudo이를 호출하는 사용자가 상승된 권한으로(lookup 을 통해 /etc/sudoers) 명령을 실행할 수 있는지 확인한 다음 명령을 실행하거나 오류 신호를 보냅니다.

1은 때로는 2개 이상이지만 이 답변에는 표시되지 않습니다.
²조건부 권리능력, 하지만 지금은 걱정하지 마세요.

답변4

"루트" 권한의 개념은 다양한 제어 메커니즘으로 확산됩니다.

  1. 하드웨어: Intel CPU(및 일반적으로 다른 모든 CPU)에는 다양한 "권한 상태"가 있습니다. 각 권한 상태에서는 특정 클래스의 어셈블리 명령어를 실행할 수 있거나 실행할 수 없습니다. 일반적으로 더 많은 권한이 있는 상태는 더 많은 다중 명령어를 수행할 수 있는 권한을 갖습니다.

https://stackoverflow.com/questions/18717016/what-are-ring-0-and-ring-3-in-the-context-of-operating-systems

https://en.wikipedia.org/wiki/Protection_ring

특권 명령어 중 하나는 메모리 페이지 테이블을 제어하는 ​​것입니다. 이러한 다양한 링은 커널 대 사용자 공간 실행 스레드도 제공합니다.

  1. (1)부터 시작하여 페이지 테이블 메커니즘을 통해 링 0 또는 링 3 메모리와 같은 다양한 유형의 메모리도 갖게 됩니다.

https://en.wikipedia.org/wiki/Kernel_page-table_isolation

https://manybutfinite.com/post/cpu-rings-privilege-and-protection/

링 0은 더 많은 권한을 가지며 USERID 정보를 포함한 모든 민감한 정보를 저장합니다. userid=0이면 권한이 있는 사용자이고, 그렇지 않으면 일반 사용자입니다. 각 사용자 ID는 커널에 서로 다른 페이지 테이블을 가지고 있습니다. 이것이 바로 각 프로세스가 서로의 메모리를 직접 수정할 수 없는 이유입니다. 사용자 ID는 Ring0 메모리에 저장되어 있습니다. Ring 3에서 실행 중인 프로세스는 이 정보를 수정할 수 없으며, 가능하다면 이를 수정하려면 어떻게든 커널로 업그레이드해야 합니다("권한 확대"). .

자신이 루트인지 루트가 아닌지 확인하려면 커널에서 다음을 수행하십시오.

  if (current_cred()->uid != 0)
     return -EPERM;

커널에 있지 않으면 커널에 저장된 모든 자격 증명에 액세스할 수 없습니다. 그리고 하나의 프로세스는 다른 프로세스의 메모리를 읽을 수 없습니다. 따라서 모든 프로세스의 모든 메모리를 볼 수 있는 커널에 있지 않은 경우 이러한 검사를 수행할 필요가 없습니다.

요약하자면, 실행 중인 모든 프로세스는 항상 링 3 권한(Intel의 경우)으로 실행됩니다.사용자 ID 정보는 커널에 유지됩니다. 이 정보는 원래 다른 커널 구성 요소에서 생성된 것이어야 합니다.또는 루트 프로세스(userid = 0)입니다. 모든 루트 소유 프로세스(여전히 Ring3에서 실행 중)에는 해당 기능이 있습니다(이유는 무엇입니까? Linux 커널 소스 코드 자체에 작성되어 있기 때문입니다:

https://stackoverflow.com/questions/15774548/check-for-user-root-within-linux-kernel)링 0 권한으로 쉽게 전환. 이는 자신의 메모리(모두 링 3에서 실행)를 어떻게 수정하더라도 사용자 ID를 보거나 변경할 수 없는 이유를 설명합니다.

파일에 소유권이 저장되어 있는지 물으셨습니다. 예, 파일에 사용자 ID 소유권이 포함되어 있습니다. 그리고 특정 사용자 ID를 사용하여 실행 중인 프로세스는 다른 사용자 ID를 사용하여 다른 파일을 수정할 수 없습니다. 보안은 이러한 방식으로 파일과 실행 중인 프로세스(사용자 ID가 커널 메모리에 저장됨)로 나누어집니다. 그러나 다른 사람이 귀하의 실제 파일을 읽을 수 없다고 완전히 확신할 수는 없습니다.

하드 드라이브를 가져갈 수 있는 경우다른 기계루트 제어 권한이 있는 경우 하드 드라이브에서 특정 사용자 ID가 소유한 실제 파일을 읽는 데 필요한 모든 사용자 ID를 가정할 수 있습니다. 즉, 물리적 보안이 없으면 암호화되지 않는 한 하드 드라이브의 모든 보안 메커니즘을 우회할 수 있습니다.

관련 정보