[Linux Command] sudo command 설명

 



이번 글에서는 Linux 명령어 중 sudo 명령어에 대해 알아보겠습니다.

일반 사용자에게 "root" 권한을 부여하려면 보통 root 계정의 비밀번호를 제공해야 합니다. 이후 사용자는 su 명령어를 통해 root 계정으로 로그인할 수 있습니다. root 계정은 시스템 내 모든 명령을 실행할 수 있는 강력한 권한을 가지고 있기 때문에, 신중한 관리가 필요합니다.

리눅스에 익숙하지 않은 사용자가 root 권한을 사용할 경우, 시스템 운영에 필요한 핵심 파일이 삭제되거나 권한 설정이 변경되는 등의 사고가 발생할 수 있습니다. sudo 기능을 사용하면 root 전체 권한이 아닌 특정 명령어만 일반 사용자에게 허용할 수 있어 이러한 위험을 줄일 수 있습니다.

또한, 사용 권한은 부여하되 root 비밀번호를 공개하지 않아도 된다는 점도 sudo의 중요한 장점 중 하나입니다.

 

환경 : Red Hat Enterprise Linux (RHEL)

 

sudo command 개념

명령어 사용법을 보기 전에, sudo 명령어로 어떤 작업이 가능한지 먼저 알아보겠습니다.

일반 사용자가 /etc/shadow 파일을 열려고 하면 권한 부족으로 인해 파일을 열 수 없습니다. 아래는 실제 출력 예시입니다.

  • 일반유저로 shadow파일 오픈 실패

[user1@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied

또한 mount 명령어도 일반 사용자 권한으로는 실행할 수 없습니다.

  • 일반 유저로 mount 명령 실패

[user1@localhost sbin]$ mount /dev/sr0 /media
mount: only root can do that


이제 일반 사용자에게 mount 명령어만 sudo를 통해 root 권한으로 실행할 수 있도록 설정해보겠습니다.

[user1@localhost ~]$ sudo mount /dev/sr0 /media
[sudo] password for user1: 
mount: /media: WARNING: device write-protected, mounted read-only.

위와 같이 마운트가 정상적으로 수행되었습니다. 경고 메시지는 CD-ROM 장치이기 때문에 읽기 전용으로 마운트되었다는 알림이며, 무시해도 됩니다.

그렇다면 /etc/shadow 파일은 열 수 있을까요? sudo 설정에서 mount 명령만 허용했기 때문에 여전히 접근이 불가능합니다.

[user1@localhost ~]$ sudo cat /etc/shadow
[sudo] password for user1: 
Sorry, user user1 is not allowed to execute '/bin/cat /etc/shadow' as root on localhost.localdomain.


이처럼 sudo는 특정 명령어에 대해서만 root 권한을 부여할 수 있으며, root 비밀번호를 공유하지 않아도 되므로 실무에서 매우 유용하게 활용할 수 있습니다.

다음은 설정 방법에 대해 설명하겠습니다.

 

sudo command 옵션


suo 명령어에는 다양한 옵션이 존재합니다. 대표적인 옵션 두 가지를 살펴보겠습니다.

-i, --login: 로그인 셸 실행

이 옵션은 지정한 사용자로 로그인 셸을 실행합니다. 로그인 셸은 해당 사용자의 홈 디렉터리에 있는 .bash_profile이나 /etc/profile 같은 환경 설정 파일을 불러오는 셸을 의미합니다.

-i 옵션 사용 예시:

sudo -i 옵션을 이용하면 root유저로 로그인 할 수 있습니다.

[user1@localhost ~]$ sudo -i
[sudo] password for user1: 
[root@localhost ~]#


-u, --user=<user>: 지정한 사용자로 명령 실행

지정한 사용자 계정의 권한으로 명령을 실행할 수 있습니다. -u 옵션이 생략되면 기본적으로 root 권한으로 실행됩니다.

-u 옵션 사용 예시:

[user1@localhost ~]$ sudo -u user2 id
uid=1003(user2) gid=1003(user2) groups=1003(user2)...

 이 명령은 id 명령어를 user2의 권한으로 실행한 결과입니다.


sudoers 설정

sudo 명령어를 사용하려면 설정이 필요합니다.

설정 방법은 두 가지입니다

  1. /etc/sudoers 파일을 직접 수정하는 방법

  2. /etc/sudoers.d/ 디렉터리에 개별 파일을 생성하여 룰을 적용하는 방법

이 두 방법은 병행되어 사용되며, 최종적으로 두 설정이 합쳐져 하나의 룰로 동작합니다.

예를 들어, 앞서 보았던 user1 사용자가 mount 명령어를 root 권한으로 실행할 수 있도록 설정하려면 아래와 같이 구성할 수 있습니다.

[root@localhost ~]# cat /etc/sudoers.d/mount 
user1  ALL=(ALL)     /usr/bin/mount   ## user1이 root권한으로 mount 명령어 실행 가능

설정은 위와 같이 한 줄이면 충분합니다. /etc/sudoers.d/ 디렉터리 내에 파일을 생성하고, 해당 내용을 추가하면 됩니다.

필드 설명 (공백 기준)

  • 첫 번째 필드: sudo 명령을 실행할 사용자 또는 그룹 (%로 시작하면 그룹)

  • 두 번째 필드: 어떤 사용자 권한으로 실행할지를 지정 (ALL=(ALL)이면 모든 사용자 권한으로 실행 가능)

  • 세 번째 필드: 실행을 허가할 명령어 경로



여러 명령어 허용 및 전체 권한 부여

이번에는 user1 사용자가 cat 명령어를 root 권한으로 실행할 수 있도록 하는 설정 예시입니다. 이전 예제와 마찬가지로 /etc/sudoers.d/ 디렉터리에 파일을 생성합니다.

[root@localhost ~]# cat /etc/sudoers.d/cat
user1  ALL=(ALL)     /usr/bin/cat

 

동일한 사용자에게 여러 명령어를 허용하고자 할 경우, 하나의 줄에 쉼표로 구분하여 명령어들을 나열할 수도 있습니다.

# cat /etc/sudoers.d/user1 
user1  ALL=(ALL)     /usr/bin/mount,/usr/bin/cat

 

모든 명령어에 대한 root 권한을 허용하는 가장 일반적인 설정은 다음과 같습니다.

[root@localhost ~]# cat /etc/sudoers.d/user1_rule 
user1  ALL=(ALL)    ALL

위 설정은 사실상 user1이 root 사용자와 동일한 권한을 갖게 되는 것으로, 모든 명령어를 sudo를 통해 실행할 수 있습니다. 또한 sudo -i 명령어를 이용해 root 셸로도 진입할 수 있습니다.

[user1@localhost ~]$ sudo -i              ## root 계정 로그인
[sudo] password for user1: 
[root@localhost ~]#

다만 이 경우에도 sudo 명령어 실행 시 입력하는 비밀번호는 root 비밀번호가 아닌 user1의 비밀번호입니다. 따라서 sudo는 root 비밀번호를 제공하는 방식이 아니라, 일반 사용자에게 선택적으로 권한을 위임하는 방식이라고 이해할 수 있습니다.

 

wheel 그룹

리눅스 시스템에는 기본적으로 sudo 설정이 포함되어 있습니다. 따라서 앞서처럼 사용자별 설정 파일을 생성하지 않아도, 기본 설정을 통해 sudo 사용이 가능합니다.

설정 내용을 확인하기 위해 /etc/sudoers 파일을 열어보면 wheel 그룹에 대한 설정이 포함되어 있습니다. 내용이 많기 때문에 grep 명령을 사용하여 wheel 관련 설정만 필터링해 보겠습니다.

[root@localhost ~]# cat /etc/sudoers | grep wheel
## Allows people in group wheel to run all commands
%wheel	ALL=(ALL)	ALL
# %wheel	ALL=(ALL)	NOPASSWD: ALL

주석(#)이 없는 줄만 실제로 적용되는 설정입니다. 아래의 설정은 wheel 그룹에 속한 사용자들에게 모든 명령어를 root 권한으로 실행할 수 있도록 허용하는 내용입니다.

%wheel	ALL=(ALL)	ALL

이 설정이 존재하기 때문에, sudo를 사용하고 싶은 사용자를 wheel 그룹에만 추가해주면 root 권한을 획득할 수 있습니다.

 “%”기호는 그룹을 의미하며, 일반 사용자와 구분됩니다.

다음은 user3 사용자를 wheel 그룹에 추가하고, sudo 명령어를 통해 root로 로그인하는 예시입니다.

[root@localhost ~]# usermod -aG wheel user3    ## wheel 그룹에 user3 유저 추가
[root@localhost ~]# su - user3

[user3@localhost ~]$ sudo -i                   ## user3 계정에서 root로그인 시도
[sudo] password for user3:                     ## user3의 패스워드 입력
[root@localhost ~]#                            ## 로그인 성공

 

sudo 패스워드 자동 입력

기본적으로 sudo 명령어를 사용할 때는 사용자 본인의 비밀번호를 입력해야 합니다. 이 비밀번호는 일시적으로 캐시되며, 기본 설정 기준으로 약 5분 동안은 추가로 입력하지 않아도 됩니다.

하지만 아예 비밀번호 입력 없이 sudo를 사용할 수 있도록 설정할 수도 있습니다.

다시 /etc/sudoers 파일을 열어보겠습니다.

[root@localhost ~]# cat /etc/sudoers | grep wheel
## Allows people in group wheel to run all commands
%wheel	ALL=(ALL)	ALL
# %wheel	ALL=(ALL)	NOPASSWD: ALL

이번에 볼 부분은 주석처리되어 설정이 적용되어 있지 않던 맨 마지막 줄입니다.

# %wheel	ALL=(ALL)	NOPASSWD: ALL

여기서 주석 처리된 마지막 줄을 보면 NOPASSWD:라는 구문이 포함되어 있습니다. 이 설정을 적용하면 sudo 명령 실행 시에도 비밀번호를 묻지 않게 됩니다.

이 기능을 사용하려면 기존 설정을 다음과 같이 변경합니다.

 /etc/sudoers의 설정은 visudo 명령으로 할 수 있습니다 

[root@localhost ~]# visudo
## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL                    ## 주석 처리

## Same thing without a password
 %wheel        ALL=(ALL)       NOPASSWD: ALL     ## 주석 해제

위 설정이 적용되면 wheel 그룹에 속한 사용자는 비밀번호 없이도 sudo 명령어를 실행할 수 있습니다. 단, 보안상 모든 사용자에게 이 설정을 적용하는 것은 신중하게 판단해야 합니다.

 

마무리

지금까지 sudo 명령어의 개념과 설정 방법에 대해 알아보았습니다.

suo는 운영 환경에서 root 비밀번호를 공개하지 않고, 특정 사용자에게 root 권한 또는 특정 명령어 실행 권한을 위임할 수 있는 유용한 도구입니다. 실무에서는 전체 권한을 부여하기보다는, 필요한 명령어만 선별하여 설정하는 방식이 권장됩니다.

보안성과 편의성을 모두 고려한 sudo 설정을 통해 안정적인 시스템 운영을 할 수 있습니다.

댓글

이 블로그의 인기 게시물

[Linux] RHEL Local YUM Repository 구성

[Ansible Modules] Fetch module 설명 및 활용