루트 쉘 설정에서 잘못된 파일로 복구


23

루트 사용자의 쉘을 잘못된 파일 경로로 변경하기 위해 'chsh'를 사용하는 것과 같은 바보 같은 일을했다고 가정 해 봅시다. / bin / 찾을 수없는 것을 인용하여 향후 루트 계정 로그인이 갑자기 실패하고 로그인 화면으로 다시 부팅됩니다. 복구 모드를 차단하거나 LiveCD를 삽입하여 / etc / passwd를 편집 할 때 시스템을 복구하는 옵션은 무엇입니까? 휠에 다른 사용자가 없다고 가정하십시오 (재미 있습니까?). 생각?


이것은 당신이 제안하는 가상의 상황입니까?
Chris Down

나는 실제로 (상대적으로 신선한) FreeBSD 설치에서 이것을 정확하게 수행했습니다. 그 후 다시 설치되었으므로 이제는 다소 가상적인 것으로 생각되지만 실제로 전체 시스템이있는 경우 복구를위한 최상의 경로가 무엇인지 궁금합니다.
noffle

거기에 있었고, 티셔츠를 입었습니다. 그러나 내가 관리하는 모든 컴퓨터에서 결과적으로 백업 루트 계정을 유지 관리합니다.
Mark D

답변:


30

부팅 할 때 부팅 옵션에 추가 init=/bin/bash(또는 다른 기능 셸의 경로)를 추가 하면 단일 사용자 셸로 바로 연결됩니다. 해당 환경 mount -o remount,rw /에서 /etc/passwd항목을 수정하기 전에 수행해야 할 수도 있습니다. 그런 다음 재부팅하거나 수행하십시오 exec /sbin/init 3. 그냥 않습니다 하지 입력 exit이 커널 패닉이 발생할 것 같은 *에서 Ctrl + D 또는.

2 단계 모드로로드 된 일부 시스템 (initrd 이미지 포함)에서는이 방법의 추가 변형이 필요할 수 있습니다. 부팅 옵션에 init=및 가장 중요한가 포함되어있는 것을 발견하면 real_init=넣을 위치 /bin/bash는 후자의 매개 변수 (예 :) 여야합니다 real_init=/bin/bash.

그 환경에서 쉘은 커널 이 init 프로그램 ( 커널이 알고있는 유일한 프로세스)으로 인식하기 때문에 커널의 눈 아래에 실행중인 시스템을 나타냅니다. 커널에게 시스템 종료를 지시하지 않고 프로세스를 갑자기 종료하면 커널 패닉이 발생해야합니다. (주변의 모든 것이 어둡고 조용 해지면 당황하지 않겠습니까?)


에 대한 좋은 exec,하지만 난 너무 많은 사전에 마운트 포인트와 엉망으로 좋은 것은 아닙니다 같아요.
Stéphane Gimenez

2
스테파니 @ 당신은 루트를 마운트하지 않습니다 커널이 경우 있음을 읽기 - 쓰기 작업을 수행 할 수 있습니다. 그렇지 않으면 파일 (을 포함하여 /etc/passwd) 을 수정할 수 없습니다 .
rozcietrzewiacz

좋은 생각이야! 나는 단일 사용자 모드로 들어갈 수 있었지만 / etc / passwd를 수정하기 위해 / remount / read / write로 다시 마운트해야한다고 생각하지 않았습니다. 감사!
noffle

@roz 물론, /init를 실행하기 전에 다른 모든 마운트 (마운트 이외의 ) 마운트 해제를 처리하려고한다고 말하고있었습니다 .
Stéphane Gimenez

@ Stéph 마운트에 문제가 없어야합니다. 공지 사항 /bin/bash시점에서 정확히 실행은 다음 /sbin/init정상 부팅시 실행됩니다. 따라서 당시 시스템에서 수행 할 수있는 조치는 없습니다.
rozcietrzewiacz

10

su실행할 쉘을 사용 하고 지정할 수 있습니다 (다른 사용자가 없음에 대한 메모로는 이것이 불가능하다는 것을 암시하려고하는지 확실하지 않습니다 wheel).

su -c /bin/bash

그렇지 않으면 ssh 데몬이 루트에 로그인을 허용하면 비슷한 것을 할 수 있습니다.

ssh root@localhost /bin/bash

예를 들어 부트 로더에서 쉘을 init로 설정할 수도 있습니다 init=/bin/ksh.


1
좋은 생각. =) 의심 한 것처럼 다른 사용자는 'su'를 사용할 수 없습니다. sshd에는 루트 로그인도 비활성화되어 있습니다.
noffle

6

부트 로더가 커널 매개 변수를 실시간으로 편집 할 수 있도록 구성된 경우 해결책은 재부팅하여 셸을 초기화 프로세스로 사용하는 것입니다 (예 :) init=/bin/bash. 그런 다음 손으로 마운트해야하는 모든 것을 마운트하고 편집하십시오 /etc/passwd. sync평소와 같이 다시 부팅하십시오 init.


와우, 나는 당신이 같은 분 안에 자신과 같은 대답을 게시 한 것을 알았습니다 :-)
rozcietrzewiacz

6

당신의 질문의 요점이 당신이 뿌리가 될 수있는 모든 길을 가졌다는 것이라면, 정의상 당신은 뿌리가 될 수 없습니다.

유닉스 시스템에서 3 가지 방법으로 루트가되는 것이 일반적이다 :

  • 입력하여 루트로 로그인 root프롬프트 로그인에 루트 암호를 입력. 이것은 루트 쉘을 실행합니다.
  • 일반 사용자로 로그인 한 다음 su루트 암호를 실행 하고 입력하여 루트가됩니다. 일부 시스템에서는 특정 그룹에 속해 있어야합니다 (종종이라고도 함 wheel). 다른 시스템에서 루트 암호를 아는 사람은 누구나 루트가 될 수 있습니다. 인증을 위해 PAM을 사용 pam_wheel하는 시스템 은 휠 그룹 (있는 경우)을 관리하는 데 사용 됩니다. 로 명령을 지정하면 su -c루트 쉘을 통해 실행됩니다.
  • 일반 사용자로 로그인 한 다음 sudo자신의 암호를 실행 하고 입력하여 루트가 됩니다. 관리자는 사용자 계정에 sudo 권한을 부여해야합니다. sudoers파일에 제한이없는 한 , 루트 쉘에 관계없이 모든 명령을 실행할 수 있습니다.

루트 쉘을 사용할 수 없도록 보호하는 전통적인 방법은 UID 0으로 다른 계정을 정의하고 다른 쉘 ( toor일반 이름)을 정의하는 것입니다. 예를 들어, 루트 셸이 동적으로 연결된 실행 파일 (메모리를 절약하는 것이 좋습니다)이고 라이브러리 업그레이드가 잘못되면 루트 셸을 사용하지 못할 수 있습니다. 대체 루트 계정에는 정적으로 링크 된 실행 파일이있을 수 있으며, BusyBox 와 같은 공통 유틸리티가 내장되어있을 수 있습니다 .


5

위의 답변은 훌륭하며 읽을 수 있습니다. 이러한 접근 방식의 세부 사항을 기억하지 못하고 재부팅하지 않아도되는 경우, 항상 라이브 CD 배포판을 사용하여 시스템을 부팅하고 / 파티션을 마운트 한 다음 / etc / passwd를 편집하고 재부팅 할 수 있습니다. 위의 솔루션만큼 우아하지는 않지만 기억하기 쉽습니다.


/etc/passwd파일 을 수동으로 편집 할 때 발생하는 위험을 지적해야 합니다. 이것 이외의 좋은 점-방금 내 대답에 동일한 제안을 추가하고 싶었습니다.
rozcietrzewiacz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.