Linux에서 sudo 액세스를 제어하는 ​​방법

리눅스 환경에서 sudo 명령어는 마치 루트 사용자나 다른 사용자인 것처럼 명령을 실행할 수 있도록 해줍니다. sudo를 통해 사용자는 루트 권한을 세밀하게 제어할 수 있습니다. 특정 사용자에게 모든 권한을 부여하거나, 제한된 명령어 세트만 사용할 수 있도록 설정할 수 있습니다. 지금부터 그 방법을 자세히 알아보겠습니다.

sudo와 루트 권한

리눅스에서는 ‘모든 것이 파일이다’라는 말을 자주 듣습니다. 물론 완전히 정확한 표현은 아니지만, 프로세스, 파일, 디렉터리, 소켓, 파이프 등 운영체제의 거의 모든 요소가 파일 디스크립터를 통해 커널과 통신합니다. 따라서, 리눅스 및 유닉스 계열 운영체제 설계는 가능한 한 이러한 원칙을 따릅니다.

이러한 “모든 것이 파일이다”라는 개념은 리눅스 전반에 깊이 뿌리내려 있습니다. 리눅스에서 파일 권한이 사용자 권한 및 권한 관리의 핵심이 되는 이유도 여기서 찾을 수 있습니다. 사용자가 파일이나 디렉토리(특수한 종류의 파일)의 소유자라면, 편집, 이름 변경, 이동, 삭제 등 원하는 대로 조작할 수 있습니다. 또한, 파일 권한을 설정하여 다른 사용자나 그룹이 파일을 읽거나 수정하거나 실행할 수 있도록 할 수도 있습니다. 하지만 이러한 권한은 모든 사용자에게 적용됩니다.

예외는 바로 ‘루트’로 알려진 슈퍼유저 계정입니다. 루트 계정은 특별한 권한을 가지며, 운영체제의 객체에 대한 사용 권한에 구속받지 않습니다. 루트 사용자는 거의 모든 작업을, 언제든지 수행할 수 있습니다.

물론, 루트 계정의 비밀번호를 아는 사람은 누구든 동일한 권한을 갖게 됩니다. 고의든 실수든 시스템에 혼란을 야기할 수 있습니다. 루트 사용자조차도 실수를 할 수 있으며, 이는 심각한 결과를 초래할 수 있습니다. 이러한 위험성 때문에, 루트로 직접 로그인하는 것은 좋지 않은 방법으로 간주됩니다. 대신 일반 사용자 계정으로 로그인한 후 sudo를 사용하여 필요한 순간에만 권한을 상승시키는 것이 권장됩니다. 대부분의 경우, 이는 단일 명령을 실행하는 데 충분합니다.

sudoers 목록

이 글을 작성하기 위해 사용된 Ubuntu 18.04.3, Manjaro 18.1.0, Fedora 31 시스템에는 sudo가 이미 설치되어 있었습니다. sudo는 1980년대 초부터 사용되어 왔으며, 대부분의 배포판에서 슈퍼유저 작업을 위한 표준 방법으로 자리 잡았습니다.

최신 배포판을 설치할 때 생성되는 사용자는 sudoers라는 사용자 목록에 자동으로 추가됩니다. sudoers 목록에 있는 사용자만이 sudo 명령을 사용할 수 있습니다. sudo 권한이 있는 사용자는 이 권한을 사용하여 다른 사용자를 sudoers 목록에 추가할 수도 있습니다.

물론, 모든 권한을 아무에게나 주거나, 특정 권한만 주거나, 혹은 특정 요구 사항만 충족시켜 주는 것은 신중해야 합니다. sudoers 목록을 사용하면, 사용자가 sudo를 사용할 수 있는 명령을 구체적으로 지정할 수 있습니다. 이렇게 함으로써 사용자에게 완전한 권한을 부여하지 않으면서도 필요한 작업을 수행하도록 할 수 있습니다.

다른 사용자로 명령 실행하기

원래 슈퍼유저로 실행하던 작업을 “슈퍼유저로 실행”이라고 불렀지만, 이제는 sudo를 사용하여 다른 사용자인 것처럼 명령을 실행할 수 있게 되었습니다. 따라서, 이러한 변화를 반영하여 “다른 사용자로 실행”이라는 새로운 이름으로 변경되었습니다.

sudo를 사용하여 다른 사용자로 명령을 실행하려면, -u (사용자) 옵션을 사용해야 합니다. 예를 들어, 다음 명령은 whoami 명령을 mary 사용자 계정으로 실행합니다. -u 옵션 없이 sudo 명령을 사용하면 해당 명령은 루트 사용자로 실행됩니다.

sudo를 사용하고 있기 때문에, 비밀번호를 입력하라는 메시지가 표시됩니다.

sudo -u mary whoami

whoami 명령어의 출력 결과는 현재 명령을 실행하는 사용자 계정이 mary임을 보여줍니다.

sudo 명령을 사용하여 암호를 모르는 다른 사용자로 로그인할 수도 있습니다. 이때는 자신의 암호를 입력하라는 메시지가 표시됩니다. -i (로그인) 옵션을 사용해야 합니다.

sudo -i -u mary
pwd
whoami
ls -hl
exit

이제 mary 사용자로 로그인되었습니다. mary 사용자 계정의 .bashrc, .bash_aliases, .profile 파일은 mary 사용자가 직접 로그인한 것과 똑같이 처리됩니다.

명령 프롬프트가 변경되어 현재 세션이 mary 사용자의 것임을 나타냅니다. pwd 명령어는 현재 mary의 홈 디렉토리임을 알려줍니다. whoami 명령어는 mary 사용자 계정을 사용하고 있음을 나타냅니다. 디렉토리의 파일은 mary 사용자 계정에 속합니다. exit 명령어는 일반 사용자 계정 세션으로 되돌아갑니다.

sudoers 파일 편집하기

sudo를 사용할 수 있는 사용자 목록에 사용자를 추가하려면 sudoers 파일을 편집해야 합니다. 반드시 visudo 명령을 사용해야 합니다. visudo 명령은 여러 사용자가 동시에 sudoers 파일을 편집하려고 하는 상황을 방지합니다. 또한 파일 내용을 저장할 때 구문 검사 및 분석을 수행합니다.

편집한 내용이 검사를 통과하지 못하면 파일이 무조건적으로 저장되지 않습니다. 변경 사항을 취소하고 종료하거나, 변경 사항을 다시 편집하거나, 잘못된 편집 사항을 강제로 저장할 수 있는 옵션이 제공됩니다. 마지막 옵션은 매우 위험한 선택입니다. 절대로 그렇게 하지 마십시오. 모든 사람이 실수로 sudo를 사용할 수 없게 될 수도 있습니다.

visudo 명령을 사용하여 편집 프로세스를 시작하더라도, visudo 자체가 편집기는 아닙니다. 파일 편집을 위해 기존 편집기 중 하나를 호출합니다. Manjaro와 Ubuntu에서 visudo 명령은 간단한 편집기인 nano를 실행합니다. Fedora에서 visudo는 더 강력하지만, 직관성이 떨어지는 vim을 실행합니다.

Fedora에서 nano를 사용하고 싶다면 쉽게 변경할 수 있습니다. 먼저 nano를 설치합니다.

sudo dnf install nano

그리고 다음 명령을 사용하여 visudo를 호출해야 합니다.

sudo EDITOR=nano visudo

이 명령어는 별칭으로 지정하기에 적합합니다. nano 편집기는 sudoers 파일이 로드된 상태로 열립니다.

sudo 그룹에 사용자 추가하기

visudo를 사용하여 sudoers 파일을 엽니다. 위의 명령이나, 원하는 편집기를 지정하는 명령을 사용할 수 있습니다.

sudo visudo

sudoers 파일에서 %sudo 항목 정의가 나올 때까지 스크롤합니다.

백분율 기호(%)는 이것이 사용자 정의가 아닌 그룹 정의임을 나타냅니다. 일부 배포판에서는 %sudo 줄의 시작 부분에 해시(#) 기호가 있습니다. 이 경우 해당 줄은 주석 처리되어 있으므로 해시 기호를 제거하고 파일을 저장해야 합니다.

%sudo 줄은 다음과 같이 나뉩니다.

%sudo: 그룹의 이름입니다.
ALL=: 이 규칙이 모든 호스트에 적용됨을 의미합니다.
(ALL:ALL): 이 그룹의 구성원은 모든 사용자와 모든 그룹으로 명령을 실행할 수 있음을 의미합니다.
ALL: 이 그룹의 구성원은 모든 명령을 실행할 수 있음을 의미합니다.

다시 말해, 이 그룹의 구성원은 이 컴퓨터나 네트워크의 다른 호스트에서 모든 명령을 사용자와 그룹으로 실행할 수 있습니다. 따라서, 사용자에게 루트 권한과 sudo 사용 권한을 부여하는 가장 간단한 방법은 sudo 그룹에 추가하는 것입니다.

tommary라는 사용자 계정을 가진 TomMary라는 두 명의 사용자가 있다고 가정합니다. usermod 명령을 사용하여 tom 사용자 계정을 sudo 그룹에 추가합니다. -G (그룹) 옵션은 tom 계정을 추가할 그룹을 지정합니다. -a (추가) 옵션은 사용자 계정 tom이 이미 속해 있는 그룹 목록에 해당 그룹을 추가합니다. 이 옵션이 없으면 사용자 계정 tom은 새로운 그룹에만 속하게 되고, 다른 그룹에서는 제거됩니다.

sudo usermod -a -G sudo tom

이제 Mary가 어떤 그룹에 속해 있는지 확인해 보겠습니다.

groups

사용자 계정 marymary 그룹에만 속해 있습니다.

이제 Tom을 확인해 보겠습니다.

groups

tom 사용자 계정(따라서 Tom)은 tomsudo 그룹에 속해 있습니다.

이제 Marysudo 권한이 필요한 작업을 수행하도록 시도해 보겠습니다.

sudo less /etc/shadow

Mary는 제한된 파일인 /etc/shadow를 볼 수 없습니다. sudo를 허가 없이 사용하려고 했기 때문에 가벼운 질책을 받습니다. 이제 Tom이 동일한 작업을 수행해 보겠습니다.

sudo less /etc/shadow

Tom은 암호를 입력하자마자 /etc/shadow 파일 내용을 볼 수 있습니다.

sudo 그룹에 추가하는 것만으로도 sudo를 사용할 수 있는 사용자 등급으로 바로 승격되었습니다. 이제 모든 권한이 부여된 것입니다.

사용자에게 제한된 sudo 권한 부여하기

Tom은 완전한 sudo 권한을 받았습니다. 이는 루트(또는 sudo 그룹의 다른 사용자)가 할 수 있는 모든 작업을 할 수 있다는 의미입니다. 사용자에게 필요한 권한 이상을 부여했을 수 있습니다. 때때로 사용자에게 루트 권한이 필요한 기능을 수행하도록 해야 할 필요가 있지만, 그렇다고 해서 모든 sudo 액세스 권한이 필요한 것은 아닙니다. sudoers 파일에 사용자를 추가하고, 사용할 수 있는 명령어를 나열함으로써 균형을 맞출 수 있습니다.

사용자 계정 harry의 소유자인 Harry를 만나보겠습니다. Harrysudo 그룹에 속해 있지 않으며, sudo 권한이 없습니다.

groups

Harry가 소프트웨어를 설치할 수 있도록 하는 것은 유용하지만, 완전한 sudo 권한을 부여하고 싶지는 않습니다. 걱정하지 마세요. 가능합니다. visudo를 실행해 보겠습니다.

sudo visudo

그룹 정의 부분을 지나 파일 아래로 스크롤합니다. 이제 Harry를 위한 줄을 추가할 것입니다. 이것은 그룹 정의가 아닌 사용자 정의이므로, 줄을 백분율 기호로 시작할 필요가 없습니다.

사용자 계정 harry에 대한 항목은 다음과 같습니다.

harry  ALL=/usr/bin/apt-get

harryALL= 사이에는 탭이 있습니다.

이는 harry 사용자 계정이 이 네트워크에 연결된 모든 호스트에서 지정된 명령을 사용할 수 있음을 의미합니다. 지정된 명령어는 /usr/bin/apt-get 하나입니다. 쉼표로 구분하여 명령어 목록에 추가하여 Harry에게 하나 이상의 명령에 대한 액세스 권한을 부여할 수 있습니다.

sudoers 파일에 줄을 추가하고 파일을 저장합니다. 추가한 줄이 올바른 구문을 갖고 있는지 다시 한번 확인하기 위해, -c (검사만) 옵션을 사용하여 visudo에게 파일의 구문 검사를 요청할 수 있습니다.

sudo visudo -c

검사가 완료되었고, visudo는 모든 것이 정상이라고 보고합니다. 이제 Harryapt-get을 사용하여 소프트웨어를 설치할 수 있습니다. 그러나 sudo가 필요한 다른 명령을 사용하려고 하면 거부되어야 합니다.

sudo apt-get install finger

Harry에게 적절한 sudo 권한이 부여되었으며, 그는 소프트웨어를 설치할 수 있습니다.

이제 Harrysudo가 필요한 다른 명령을 사용하려고 하면 어떻게 될까요?

sudo shutdown now

Harry는 해당 명령을 실행할 수 없습니다. 우리는 성공적으로 특정하고 제한된 액세스 권한을 부여했습니다. 그는 지정된 명령만 사용할 수 있습니다.

sudoers 사용자 별칭 사용

Mary에게 동일한 권한을 부여하려면, Harry와 정확히 같은 방식으로 사용자 계정 mary에 대한 sudoers 파일에 줄을 추가할 수 있습니다. 같은 결과를 얻는 또 다른 효과적인 방법은 User_Alias를 사용하는 것입니다.

sudoers 파일에서 User_Alias는 사용자 계정 이름 목록을 포함합니다. 정의에서 User_Alias 이름을 사용하여 해당 사용자 계정을 모두 나타낼 수 있습니다. 해당 사용자 계정에 대한 권한을 변경하려면 한 줄만 편집하면 됩니다.

User_Alias를 만들고 sudoers 파일에서 사용해 보겠습니다.

sudo visudo

파일에서 User_Alias 지정 줄이 나올 때까지 스크롤합니다.

다음과 같이 입력하여 User_Alias를 추가합니다.

User_Alias INSTALLERS = harry, mary

각 요소는 탭이 아닌 공백으로 구분됩니다. 논리는 다음과 같이 나뉩니다.

User_Alias: 이것은 visudo에게 이것이 User_Alias가 될 것임을 알립니다.
INSTALLERS: 이것은 이 별칭에 대한 임의의 이름입니다.
= harry, mary: 이 별칭에 포함할 사용자 목록입니다.

이제 사용자 계정 harry에 대해 이전에 추가한 줄을 편집합니다.

harry  ALL=/usr/bin/apt-get

다음과 같이 변경합니다.

INSTALLERS  ALL=/usr/bin/apt-get

이는 INSTALLERS User_Alias 정의에 포함된 모든 사용자 계정이 apt-get 명령을 실행할 수 있음을 의미합니다. 이제 소프트웨어를 설치할 수 있는 Mary로 이를 테스트해 볼 수 있습니다.

sudo apt-get install colordiff

MaryINSTALLERS User_Alias에 있고, 해당 User_Alias가 해당 권한을 받았기 때문에 소프트웨어를 설치할 수 있습니다.

세 가지 유용한 sudo

명령에 sudo를 추가하는 것을 잊은 경우, 다음을 입력하세요.

sudo !!

그러면 마지막 명령이 재실행되며, sudo가 줄 앞에 추가됩니다.

sudo를 사용하고 비밀번호로 인증하면 15분 동안 추가 sudo 명령에 비밀번호를 다시 입력할 필요가 없습니다. 인증을 즉시 재설정하려면 다음을 사용하십시오.

sudo -k

실패한 sudo 명령 시도를 어디에서 볼 수 있는지 궁금한가요? /var/log/auth.log 파일로 이동하십시오. 다음을 사용하여 확인할 수 있습니다.

less /var/log/auth.log

TTY pts/1에 로그인한 사용자 계정 mary에 대한 항목을 보면, 그녀가 사용자 rootshutdown 명령을 실행하려고 시도한 것을 확인할 수 있습니다.

큰 권한과 함께…

… 다른 사용자에게 권한을 위임할 수 있는 능력도 생깁니다. 이제 다른 사용자에게 선택적으로 권한을 부여하는 방법을 알았습니다.