리눅스 환경에서 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
그룹에 추가하는 것입니다.
tom
과 mary
라는 사용자 계정을 가진 Tom
과 Mary
라는 두 명의 사용자가 있다고 가정합니다. usermod
명령을 사용하여 tom
사용자 계정을 sudo
그룹에 추가합니다. -G
(그룹) 옵션은 tom
계정을 추가할 그룹을 지정합니다. -a
(추가) 옵션은 사용자 계정 tom
이 이미 속해 있는 그룹 목록에 해당 그룹을 추가합니다. 이 옵션이 없으면 사용자 계정 tom
은 새로운 그룹에만 속하게 되고, 다른 그룹에서는 제거됩니다.
sudo usermod -a -G sudo tom
이제 Mary
가 어떤 그룹에 속해 있는지 확인해 보겠습니다.
groups
사용자 계정 mary
는 mary
그룹에만 속해 있습니다.
이제 Tom
을 확인해 보겠습니다.
groups
tom
사용자 계정(따라서 Tom)은 tom
및 sudo
그룹에 속해 있습니다.
이제 Mary
가 sudo
권한이 필요한 작업을 수행하도록 시도해 보겠습니다.
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
를 만나보겠습니다. Harry
는 sudo
그룹에 속해 있지 않으며, sudo
권한이 없습니다.
groups
Harry
가 소프트웨어를 설치할 수 있도록 하는 것은 유용하지만, 완전한 sudo
권한을 부여하고 싶지는 않습니다. 걱정하지 마세요. 가능합니다. visudo
를 실행해 보겠습니다.
sudo visudo
그룹 정의 부분을 지나 파일 아래로 스크롤합니다. 이제 Harry
를 위한 줄을 추가할 것입니다. 이것은 그룹 정의가 아닌 사용자 정의이므로, 줄을 백분율 기호로 시작할 필요가 없습니다.
사용자 계정 harry
에 대한 항목은 다음과 같습니다.
harry ALL=/usr/bin/apt-get
harry
와 ALL=
사이에는 탭이 있습니다.
이는 harry
사용자 계정이 이 네트워크에 연결된 모든 호스트에서 지정된 명령을 사용할 수 있음을 의미합니다. 지정된 명령어는 /usr/bin/apt-get
하나입니다. 쉼표로 구분하여 명령어 목록에 추가하여 Harry
에게 하나 이상의 명령에 대한 액세스 권한을 부여할 수 있습니다.
sudoers
파일에 줄을 추가하고 파일을 저장합니다. 추가한 줄이 올바른 구문을 갖고 있는지 다시 한번 확인하기 위해, -c
(검사만) 옵션을 사용하여 visudo
에게 파일의 구문 검사를 요청할 수 있습니다.
sudo visudo -c
검사가 완료되었고, visudo
는 모든 것이 정상이라고 보고합니다. 이제 Harry
는 apt-get
을 사용하여 소프트웨어를 설치할 수 있습니다. 그러나 sudo
가 필요한 다른 명령을 사용하려고 하면 거부되어야 합니다.
sudo apt-get install finger
Harry
에게 적절한 sudo
권한이 부여되었으며, 그는 소프트웨어를 설치할 수 있습니다.
이제 Harry
가 sudo
가 필요한 다른 명령을 사용하려고 하면 어떻게 될까요?
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
Mary
는 INSTALLERS
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
에 대한 항목을 보면, 그녀가 사용자 root
로 shutdown
명령을 실행하려고 시도한 것을 확인할 수 있습니다.
큰 권한과 함께…
… 다른 사용자에게 권한을 위임할 수 있는 능력도 생깁니다. 이제 다른 사용자에게 선택적으로 권한을 부여하는 방법을 알았습니다.