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


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.