본문 바로가기
카테고리 없음

[Linux] Grub(개념+보안 설정) & 응급 복구(root 비밀번호 분실 시)

by 떵해이 2020. 12. 5.
300x250

각 운영체제마다 독자적인 부트로더를 가지고 있습니다.

리눅스에서 쓰이는 부트로더 grub(또는 grub2)에 대해 간단히 알아보도록하겠습니다.

간단히 알아본 뒤에 오늘 주요 목적인 root비밀번호 잃어버렸을 때 복구 방법을 알아보도록 하겠습니다.

 

부트로더는 운영체제를 메모리에 올려 부팅을 해주는 것이라고 생각하시면 됩니다.

 

○ 리눅스 부트로더 Grub

    ▷ GRUB GRand Unified Bootloader 의 약자

    ▷ 대부분의 운영체제에서 사용가능한 GNU프로젝트에서 만든 부트로더

    ▷ 대부분의 리눅스 배포판에서 주로 사용 (윈도우도에도 사용 가능)

    ▷ 최근 CentOS에는 이전Grub보다 향상된 Grub2를 사용합니다.

        (저는 centos7을 사용하는데 grub2를 사용합니다.)

    ▷ Grub 부트로더는 CentOS 부팅할 때 처음 나오는 검정 선택 화면을 지칭

 

Grub 특징

- 부트 정보를 사용자가 임의로 변경해 부팅 가능

- 다른 여러가지 운영체제와 멀티 부팅 가능

- 커널의 경로와 이름만 알면 부팅 가능

 

 

● Grub2의 설정파일

 

/boot/grub2/grub.cfg

/etc/grub2.cfg

이 파일은 일반 사용자에게 읽기 전용이고, root 관리자도 파일을 직접 편집하면 안됨

 

설정된 내용을 변경하고 싶으면

/etc/default/grub파일에서 설정을 변경해야합니다.

(/etc/grub.d디렉토리 파일 수정 후 grub2-mkconfig 명령어를 실행해서 변경가능)

 

# vi /etc/default/grub 명령어로 grub파일 들어가서 간단하게 설명하겠습니다.

그냥 개략적으로 이해하시면 됩니다. 필자도 몰라서 살짝 찾아서 알아보았습니다.

자세히 알고싶으시면 검색해보시면 좋을거 같습니다.

▷ TIMEOUT : 처음 화면 나오고 자동으로 부팅되는 시간(초)

               -1로 설정하면 자동으로 넘어 가지 않고 엔트리 직접 선택

 

DISTRIBUTOR : 초기 부팅 화면 엔트리 앞에 붙을 배포판 이름 추출

                        /etc/system-release파일에서 CentOS 글자 추출

 

DEFAULT : saved는 이전 선택한 엔트리가 기본 선택

                  0으로 하면 첫번째 엔트리

 

DISABLE_SUBMENU : 서브 메뉴 사용 여부

                                true 설정 시 서브 메뉴 사용 안함

 

TERMINAL_OUTPUT : Grub 화면이 나올 장치 설정 

                                기본 값 console로 지정하면 모니터로 설정됨

 

CMDLINE_LINUX : 부팅 시 커널에 파라미터 지정, Grub1의 파라미터도 일부 사용할 수 있음

                            응급 복구 모드로 접속하기 위해 이 행과 관련된 제일 뒤에 init=/bin/sh을 붙임

                            아래 글에서 참고

 

DISABLE_RECOVERY : true 설정 시 메뉴 엔트리에서 복구와 관련된 것을 비활성화

 

 

여러가지 특징들이 있지만 간단하게 알고 넘어가도록 하겠습니다.

grub2부터는 설정을 변경하기가 좀 복잡해졌지만 많은 장점이 있습니다.

 

VM을 새로 키면 이런 화면이 지나갑니다.

이 검은 화면이 바로 Grub2입니다.

 

이 검은 화면에서 어떤 커널(운영체제)를 선택해 부팅(메모리에 올림)할지를 선택하는 것입니다.

 

첫번째는 커널 버전을 나타내는 것

여러 버전이 나와 커널을 마음에 드는 버전으로 부팅을 할 수 있습니다.

(필자는 하나의 커널만 나왔지만 여러 버전이 나오는 경우도 있습니다.)

 

두번째 0-rescue가 있는 것은 부팅에 필요한 최소한의 검증된 커널 코드만 부팅을 하겠다라는 뜻

그래서 usb와 같은 용량이 적은 저장공간에서 부팅할 때 사용 or

검증 받은 최소한의 프로그램들이 있기 때문에 시스템 문제 생겼을 때 사용

 

간단히 grub에 대해 알아보았습니다.

이 grub을 알아야 응급 복구를 할 수 있기 때문에 간단히 설명해보았습니다.

 

아래에서 응급 복구에 대해 알아보도록 하겠습니다.

 

 

Grub의 부팅시 커널 인자 조정할 수 있는 기능을 이용해 root비밀번호 없이 root로 로그인이 가능한 방법을

이용하여 root인 관리자의 비밀번호를 잃어버렸을 때 사용합니다. 이것을 응급 복구라 합니다.

 

○ 응급 복구 (root관리자 비밀번호 찾기)

CentOS 7버전 미만은 복구하기가 정말 쉽습니다.

한번 인터넷 찾아보시길 바랍니다.

저는 CentOS 7버전 이상부터 grub2부터 다뤄보도록 하겠습니다.

 

CentOS 7 버전 이상부터는 쉽게 복구할 수 없습니다.

이유는 1. SELinux 등장

          2. '/' 디렉토리가 ro(read only)로 마운트 되기 때문입니다.

 

이유는 공부하시면서 이해하도록 합시다.

저 이유는 CentOS 7 미만인 버전들과 이상인 버전들의 차이이라고 생각하시면 됩니다.

7미만은 grub을 사용하고, 7이상부터 grub2를 사용한다고 생각하시면 됩니다.

 

 

● 응급 복구를 위한 방법

 

① 먼저 리눅스를 완전히 종료 후 다시 시작합니다.

응급 복구는 Grub2에서 해야하기 때문에 껐다 켜야 grub2화면이 나오기 때문입니다.

아래와 같은 화면이 나오면 to edit 하기 위해 e를 누르라는 문구가 나옵니다.

# e를 누르시면 됩니다.

 

 

② e를 누르시면 아래와 같은 화면이 나옵니다.

여기서 아래로 내리시면 위에서 grub화면에서 들어갈 때 보이는 커널 버전들이 보입니다.

(linux / linux16 /linuxefi 로 시작하는 부분을 찾으시면 됩니다.)

화면에서 마우스를 벗어나려면 Ctrl + Alt 누르시면 됩니다.

 

 

③ 커널 버전 확인을 확인하시고

 

ro로 되어있습니다. (화면이 글이 넘어가서 오타가 난 것)

ro   ->  # rw 로 바꿔줍니다.

ro는 read only를 의미합니다. 읽기 전용인데 그러면 수정이 안되기 때문에 rw로 수정해줍니다.

(root비밀번호 없이 로그인을 해서 root비밀번호를 수정해야하는데 ro는 수정 불가능)

 

rhgb quiet LANG=ko_KR. UFT-8 을 모두 지우고 # init=/bin/sh (/bin/bash도 상관없습니다.)

rhgb (redhat graphical boot) : gui환경으로 부팅

quiet : 중요한 부트 메세지를 보여주지 않고 조용히 실행

뒤에 LANG부터는 언어 한국어 사용한다는 뜻

 

리눅스가 처음 실행되면 제일 먼저 실행되는 프로세스가 init (centos 7이상 부터는 systemd)입니다.

그래서 init에게 /bin/bash파일을 실행시키라는 의미입니다.

(시스템 복구 모드에서 주로 사용하는 sh-4.*로 바로 접속할 수 있게 하기 위함입니다.)

 

 

④ rw로 수정, init=/bin/sh로 수정

수정을 다하고 나면 아래 문구처럼 # Ctrl + x 를 눌러서 리눅스를 시작하면 됩니다.

 

 

⑤ 단일(싱글) 모드로 리눅스가 시작이 됩니다.

# whoami 명령을 통해 root로 들어왔는지 확인합니다.

 

 

# mount 명령을 눌러서 ro가 아닌 rw로 잘 바뀌었는지 확인해줍니다.

 

 

⑥ 이제 root비밀번호만 바꿔주면 완료됩니다.

여기서 2가지 방법으로 나뉩니다.

개인적으로는 b방법을 더 선호합니다.

 

a) SELinux 끄는 방법

 

이 방법은 매우 간단합니다.

공부용이나 개인용이 아니라면 사실상 끄는 건 좋은 선택은 아닙니다.

 

# vi /etc/sysconfig/selinux 명령어로 selinux설정 파일 수정 모드에 들어갑니다.

 

 

SELINUX=enforcing 으로 되어있습니다.

# SELINUX=disabled 로 변경하여 SELinux를 사용하지 않겠다고 설정합니다.

# :wq 명령으로 저장하고 나갑니다.

 

 

이제 root 관리자의 계정의 비밀번호를 변경해주도록 합니다.

# passwd

비밀번호를 2번 똑같이 입력하시면 됩니다.

이렇게해서 root의 비밀번호를 새롭게 성공적으로 설정하였습니다.

 

 

단일(싱글) 모드에서는 reboot이나 halt같은 명령어가 먹히지 않습니다.

# /sbin/reboot -f 명령을 통해 재부팅을 합니다.

 

 

새로 설정한 비밀번호로 접속을 하면 잘됩니다.

 

 

b) SELinux 끄지 않고 하는 방법

 

일단 먼저 root 비밀번호를 재설정합니다.

# passwd

비밀번호를 2번 입력을 합니다. 비밀번호를 새롭게 설정을 완료합니다.

 

 

# touch /.autorelabel 명령어로 숨긴 파일하나를 생성합니다.

 

이 파일은 쉽게 말하면 자동으로 다시 이름 붙이는 것입니다.

SELinux가 이 파일을 보고 자기가 기억하고 있던 파일 정보를 갱신합니다.

 

SELinux작동 원리가 보안상 기존 파일들의 정보를 기억하고 있는데, 우리가 passwd명령어를 통해

비밀번호를 바꾸면 /etc/shadow파일의 내용이 바뀝니다.

그럼 원래 SELinux가 가지고 있던 /etc/shadow파일 정보와 다르기 때문에 보안상 적용을 안시킵니다.

그래서 재부팅하고나면 비밀번호가 바뀌어져있지 않습니다.

 

/.autorelabel 파일로 SELinux가 가지고 있던 파일 정보를 갱신하도록 해줍니다.

 

# exec /sbin/init 명령어를 통해 init(systemd)을 실행시킵니다.

 

 

조금만 기다리시면 새롭게 부팅이 됩니다.

바뀐 root의 비밀번호로 잘 접속이 되었습니다.

 

 

이렇게 하면 누구나 root 응급 복구로 관리자의 비밀번호를 바꿀 수 있습니다.

그걸 방지하기 위해 Grub에 비밀번호를 설정할 수 있습니다.

 

CentOS 7 에서 Grub2 비밀번호 설정하는 법

 

● Grub에 비밀번호를 설정하는 방법 (보안)

 

# vi /etc/grub.d/00_header 명령어로 수정모드로 들어갑니다.

 

 

# (shift + g)G를 눌려 맨 아래로 커서 이동하여 아래와 같이 입력해줍니다.

cat<<EOF

set superusers="[유저이름]"

password [유저이름] [비밀번호]

EOF

4줄을 입력하고 # :wq 저장하고 나옵니다.

 

 

# grub2-mkconfig -o /boot/grub2/grub.cfg

명령어를 통해 설정을 적용시킵니다.

 

 

# reboot 명령어로 시스템 재부팅하여 위에서 했던 것처럼 한번 해보시면 좋을 거 같습니다.

 

 

Grub화면으로 들어가서 e를 눌러 수정모드로 들어가면

이제는 유저이름과 비밀번호를 쳐야 grub 수정모드를 이용할 수 있습니다.

 

반응형

댓글