Extra Form
PHP PHP 7.4
CMS Rhymix 2.1

오라클 서버에 ubuntu 계정으로 접속해서

sudo su 명령으로 관리자 권한으로 /etc/passwd 를 수정하였습니다.

 

아래 내용을 수정하였더니 ubuntu로 접속이 안됩니다.

원본으로 되돌리고 싶은데 방법이 있을까요?

원본

ubuntu:x:1001:1001:Ubuntu:/home/ubuntu:/bin/bash

 

수정

ubuntu:x:1001:1001:Ubuntu:/var/www/html

  • profile

    홈 경로 뒤에 붙는 /bin/bash는 해당 사용자가 사용할 쉘 바이너리 정보인데, 이걸 제외해 버렸으니 접속이 될리가 없습니다. 쉘 바이너리는 해당 유저가 로그인하면 실행을 해줄 파일인데, 지정된게 없으니 아무 파일도 실행되지 않고 로그인이 되지 않는 것입니다.

     

    ubuntu 유저 이외 sudo 권한이 있는 다른 유저(root 유저 등)가 있다는 전제하에 다음 경로로 수정할 수 있습니다.

    1. 오라클 클라우드 대시보드로 접속
    2. 인스턴스 세부 정보 페이지에서 "콘솔 접속" 페이지 접근(리소스 아래 위치해 있습니다)
    3. "Cloud Shell 접속 실행"을 누르고 기다립니다.
    4. ubuntu 계정 이외 sudo 권한이 있는 계정으로 접속합니다. ubuntu 계정은 쉘 지정이 없으므로 로그인할수 없을겁니다.
    5. /etc/passwd를 재수정합니다.(:/bin/bash 붙여서 ubuntu:x:1001:1001:Ubuntu:/var/www/html:/bin/bash 만드시면 됩니다) 이후 ssh 접속이 가능한지 테스트해보시면 됩니다.

     

    ubuntu 유저 이외 sudo 권한이 있는 다른 유저가 없다면 일반적인 방법으로는 복구할 수 없습니다. 먼저, 위 절차 중 3번까지 따라합니다. 그 다음, 쉘 접속을 유지하고 있는 상태에서 서버를 강제 재부팅합니다. 서버가 재부팅되는 모습이 보일텐데, ESC키를 계속 연타해서 GRUB 메뉴를 띄웁니다.

     

    아마 Ubuntu가 기본 선택되어 있을텐데, e키를 누르면 부팅 옵션을 수정할 수 있습니다. linux /boot/ 로 시작하는 줄 맨 뒤 init=/bin/bash를 붙인 뒤 컨트롤+X 혹은 F10키를 누릅니다. 비밀번호 없이 접속이 될텐데, mount -o remount,rw / 명령으로 / 폴더를 rw(읽기, 쓰기)로 재마운트해서 쓰기 기능을 활성화하고 /etc/passwd 파일을 다시 수정(역시 :/bin/bash 붙여서 ubuntu:x:1001:1001:Ubuntu:/var/www/html:/bin/bash 만드시면 됩니다)한뒤 저장후 재부팅합니다.

     

    리눅스에서 설정 파일은 관련 지식이 없다면 절대 임의 수정하지 마시고, 해당 파일을 수정해주는 도구를 사용하세요. 글 본문에 작성하신것과 같은 홈 폴더 변경은 sudo usermod -d /var/www/html ubuntu 명령 하나로 수정 가능합니다.

  • profile profile
    답변 주셔서 감사합니다.
    ubuntu 계정 이외 sudo 권한이 있는 계정이 없습니다.

    오라클에 Cloud Shell 기능이 있던데
    여기서 해당 인스턴스에 접근해서 수정은 불가능한걸까요?
  • profile profile

    네. 콘솔도 결국 그냥 서버에 모니터 키보드 연결한것과 같은데 쉘 지정을 날려버리셨으니 로컬로도 접속은 불가능할겁니다. 시도해 보시고 불가능하시다면 싱글모드 부팅(init=/bin/bash 지정)하셔서 복구하셔야 합니다.

     

    힘드시면 제작의뢰 게시판에 올려서 의뢰 맡기셔도 됩니다. 단순 작업이니 비용은 공임비 제외 그렇게까지 크게 발생하진 않을겁니다.

  • profile profile
    싱글모드로 재부팅하는 방법이 가장 확실할 것 같네요. 무조건 루트 권한이 보장되니까요.
  • profile

    저런... 질문과는 별개로, shell access 가능한 어카운트의 홈 디렉토리를 웹사이트 루트로 지정하는 것은 보안상 좋지 못합니다.

    (한 서버에서 여러 웹사이트를 운영할 경우) 각 웹사이트별로 각각의 user ID를 만들고, 각각의 user ID의 루트를 각각의 웹사이트 루트의 한단계 상위 디렉토리로 지정하고, (혼자 관리한다면 옵션으로) 그 user ID들에 대해서는 login을 못하게 막는 것이 좋죠.

     

    가령 예를들면,

     

    관리용 ID = ubuntu, 홈 디렉토리 = /home/ubuntu

    aaa.com 용 ID = aaacom, 홈 디렉토리 = /var/www/aaacom

    nginx나 apache에서 지정하는 aaa.com 웹사이트 디렉토리 = /var/www/aaacom/html

    bbb.com 용 ID = bbbcom, 홈 디렉토리 = /home/bbbcom

    nginx나 apache에서 지정하는 bbb.com 웹사이트 디렉토리 = /home/bbbcom/html

     

  • profile profile
    진짜 말씀해주신 사항 이제야 필요성을 느꼈습니다.
    루트 아이디를 하나 놔두고 사이트별로 아이디를 만들었어야 했는데...
    다행히도 이번에 좋은 경험 했지만 큰 피해는 없어서 다행입니다.
    싸게 배웠다고 생각합니다.
  • ?
    일단 부득이하게 관련없는 댓글단점은 죄송합니다, 보내주신 쪽지 확인은 했는데 제가 정회원이 아니라서 꼭 도움이 필요해도 쪽지를 보낼수가 없습니다. 카톡 아이디 알려주시면 친추하겠습니다. 쪽지는 답장을 할수가 없으니 [email protected] 메일로 연락 부탁드립니다