Search
Duplicate
🐧

리눅스에서 “root”는 무엇일까? (feat.sudo)

간단소개
born2beroot를 하면서 root, sudo에 관련하여 학습한 내용을 정리했습니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Linux
42cursus
Scrap
태그
linux
born2beroot
9 more properties

root

root

root..?

root는 UNIX 혹은 그 이전 운영체제부터 사용되던 단어로 root directory (/) 에서 기인한다.
rootsuperuser 즉, 모든 권한을 가지고 있는 유저를 일컫는 말이다.
root 계정은 시스템의 모든 자원, 프로그램, 파일에 대해서 모두 접근이 가능하다.

무엇이 root를 특별하게 할까?

Linux에서는 root 계정에 대해서 UID0으로 설정한다. (root라는 사용자의 이름이 root를 특별한 계정으로 만드는 것이 아니라, root에 부여되어 있는 0이라는 UIDroot 계정이 superuser의 역할을 하도록 한다.
UID0인 유저는 root와 동등한 권한을 갖는다!

root를 안전하게 이용하기

root 계정은 항상 비밀번호를 가지고 있어야하며, 관리자 이외에 공유해서는 안된다!
그래서 시스템이 설치될 때 root의 비밀번호를 설정하도록 한다.
root가 모든 권한을 갖고 있기 때문에 강력한 힘만큼 시스템에 위험하다!
해커들은 root 에 대한 권한을 얻고싶어하기 때문에, root에 대해 직접 접근하도록하지 못하도록 하고, sudo 명령어를 통해서 관리를 하도록 하는 것이 바람직하다.
/etc/security/user 파일을 수정을 통해서 root 계정의 직접 접근을 막을 수 있다.
또한 어떤 유저가 su - , su, sudo 명령어를 사용했는지 확인하기 위해서 로그 파일에 이를 기록하는 것이 좋다.

sudo

sudo는 원래 “superuser do” 라는 의미를 가지고 있었다. 그런데, sudo의 기능 중에 특정 유저의 권한으로 실행할 수 있는 기능이 만들어지면서 sudo“substitute user do” 라는 의미로 바뀌었다.
sudo -u $USER_NAME command 를 통해서 명령을 실행하면 해당 유저의 권한을 갖고 명령을 실행할 수 있다.
sudo 명령어를 통해서 사용자는 root 계정의 권한을 획득하여 명령어를 실행할 수 있다.
물론, sudo 명령어를 사용하기 위해서 해당 유저에게 sudo 명령어를 사용할 수 있도록 권한을 부여하는 작업이 필요하다.
/etc/sudoers 파일의 수정을 통해서 유저, 그룹에게 sudo 권한을 부여한다.
그런데 해당 파일은 읽기 전용 파일로 되어있어, 별도의 권한 변경이 필요하고 이는 위험하다.
따라서 visudo 명령어를 이용하여 해당 파일을 수정한다.
sudo의 경우 별개의 프로그램이기 때문에 sudo를 사용하기 위해서는 sudo 프로그램의 설치가 필요하다. (*기본적으로 내장되어 있지 않을 경우)

sudo vs su

sudosu는 명백히 다른 명령어이다.
su의 경우 “switch user”를 의미한다. 즉, 계정을 전환하는데 이용하는 명령어이다.
susu -를 실행하면 root의 비밀번호를 요구하고, root의 계정에서 쉘이 실행된다.
반면, sudo의 경우 계정을 전환하지 않고 root의 권한만을 얻어 명령어를 실행한다. 때문에 root의 비밀번호가 아닌 현재 로그인한 유저의 비밀번호를 요구한다.

sudo 로그 남기기

유저들이 sudo를 통해서 어떤 명령어를 실행했는지 확인하기 위해서 sudo 명령어에 대해 로깅을 할 수 있다.
visudo 를 통해 파일을 다음과 같이 편집하여 해결 할 수 있다.
# visudo Defaults log_output Defaults log_input Defaults iolog_dir=$SUDO_LOG_DIR
Plain Text
복사

su 없이 root 권한으로 실행하기

sudo 명령어를 매번 명령어 앞에 붙이는 것은 귀찮다. 그래서 su 명령어처럼 root의 계정으로 전환하여 명령을 실행할 수도 있다.
그러나 보안적인 문제로 추천하지는 않음
sudo bash 명령어를 실행하게 되면 bashroot의 계정에서 실행된다. (bash 말고 zsh 같은 것도 됨)
이렇게 사용하면 매번 명령어를 실행할 때 앞에 sudo를 안붙여도 된다.

sudo를 통해 실행되는 명령어의 PATH 지정하기

1. sudo 실행 권한이 있는 사용자가 개인적으로 사용하기 위해 인터넷을 통해 프로그램을 다운받고, 이를 사용자 권한으로 실행했습니다. 2. 이 프로그램에 현재 사용자의 PATH 정보를 변경하는 악성 코드가 숨어있었고, 프로그램이 실행되면서 사용자의 PATH 맨 앞부분에 /path/to/trojan:을 추가합니다. 이 디렉토리 안에는 루트 패스워드를 변경하고 외부 서버로 이 사실을 통보하는 cp라는 프로그램(변조된 cp)이 위치합니다. PATH의 맨 앞부분에 이 경로가 위치하므로, 이제부터 사용자가 cp 명령을 실행할때는 이 '변조된 cp'가 실행됩니다. 3. 사용자가 자신의 소유가 아닌 디렉토리로 파일을 복사 하기 위해 sudo cp 명령을 사용합니다. 이 때, 본래 시스템에 설치되어 있는 cp가 아닌 '변조된 cp'가 실행되며, sudo를 통해 실행되었기 때문에 루트 패스워드를 성공적으로 변경하고 외부 서버로 정보를 전송합니다. 명령을 실행한 사용자에게는 정상적인 cp를 실행한 것처럼 위장하기 위해 실제 파일을 복사하는 작업도 수행합니다. 사용자가 볼 때는 파일 복사가 정상적으로 이루어졌으므로, 아무런 이상도 알아차리지 못합니다. https://www.tuwlab.com/ece/24044
위와 같은 이유에서 sudoPATH 환경변수에 대해서 정의해둘필요가 있다.
이를 설정하기 위해서, 마찬가지로 visudo를 통해 수정한다.
born2beroot에서 제시하는 secure_path를 예시로 하면 다음과 같다.
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Plain Text
복사
쉘에서 PATH란? echo $PATH 를 쉘에서 입력해보자. 어떤 경로들이 나타날 것이다. 대표적으로 /bin 이 존재하는데, 이 디렉토리에는 우리가 쉘에서 자주 사용했던, cp, mv, rm 등의 프로그램이 들어있다. 이와 같이, 쉘에서 PATH는 내가 쉘에서 명령어를 통해 실행할 프로그램의 경로를 저장하는 역할을 한다. 따라서, 만약 새로 설치한 프로그램을 쉘에서mv 와 같이 명령어처럼 입력하고 싶다면, PATH에 해당 프로그램이 있는 경로를 추가시켜주면된다.
PATH 지정 예시
ft_hexdump 가 존재하는 디렉토리를 PATH에 추가
이제는 ft_hexdumpPATH를 통해 읽혀 편리하게 사용할 수 있다.

참고 문서