Linux Command 중 sudo command에 대해서 알아보겠습니다.
우리가 일반 사용자에게 “root”권한을 허가해 주기 위해서는 root사용자의 패스워드를 제공해야 합니다. 그러면 그 사용자는 su 명령을 이용해 루트유저로 로그인 할 수 있게 됩니다. root 사용자는 리눅스 시스템에서 어떠한 명령도 실행할 수 있는 막강한 권력을 가지게 됩니다.
root 권한이 리눅스에 미숙한 사용자들에 의해 사용되면서 OS운영에 사용되는 필수 파일이 제거된다거나, 권한이 변경되는 사례들이 종종 발생하고 있습니다. sudo 기능을 이용하면 root전체 권한이 아닌 특정 명령어만 일반 사용자들에게 허가해 줄 수 있게 됩니다.
또 좋은 점 한가지는 권한은 허용해 주지만 root패스워드는 공개하지 않아도 된다는 장점이 있습니다.
환경 : Red Hat Enterprise Linux (RHEL)
sudo command 개념
명령어 사용법을 알아보기 전에 sudo 기능으로 어떤걸 할 수 있는지 같이 보도록 하겠습니다.
일반 유저로 /etc/shadow 파일을 오픈하려고 하면 권한 문제로 인해서 열리지 않습니다.
아래처럼 Permission denied 라는 오류 메세지가 출력 됩니다.
-
일반유저로 shadow파일 오픈 실패
[user1@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
또한 마운트 명령을 실행할 수도 없습니다.
-
일반 유저로 mount 명령 실패
[user1@localhost sbin]$ mount /dev/sr0 /media
mount: only root can do that
자, 그럼 여기서 일반 유저에게 mount라는 명령만 root권한으로 실행할 수 있도록 sudo설정을 변경해보면 어떻게 되는지 보겠습니다.
[user1@localhost ~]$ sudo mount /dev/sr0 /media
[sudo] password for user1:
mount: /media: WARNING: device write-protected, mounted read-only.
위에 보시는 바와 같이 마운트가 정상적으로 이루어졌습니다. WARNING이 나오는데 CD-ROM이라서 read-only로 마운트된다는 경고이므로 무시할 수 있습니다.
그럼 /etc/shadow파일은 열릴까요?
sudo 파일에는 mount 명령만 사용할 수 있도록 설정했기 때문에 /etc/shadow 파일은 열리지 않습니다.
[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 옵션
-i, –login run login shell as the target user; a command may also be specified
로그인 쉘을 실행합니다. 로그인 쉘이란 홈 디렉토리의 .bash_profile및 /etc/profile의 환경 설정을 불러오는걸 말합니다.
-i 옵션 사용 예제)
sudo -i 옵션을 이용하면 root유저로 로그인 할 수 있습니다.
[user1@localhost ~]$ sudo -i
[sudo] password for user1:
[root@localhost ~]#
-u, –user=user run command (or edit file) as specified user name or ID
지정된 사용자 권한으로 명령을 실행합니다. -u를 통한 사용자 지정이 없는 경우 기본 사용자는 “root”유저 입니다.
-u 옵션 사용 예제)
-u 옵션 뒤에 유저명을 기재합니다. id란 명령이 user2 권한으로 실행되었습니다.
[user1@localhost ~]$ sudo -u user2 id
uid=1003(user2) gid=1003(user2) groups=1003(user2)...
sudoers 설정
sudo command 사용을 위해서는 설정이 필요합니다.
설정은 /etc/sudoers 파일을 직접 변경할 수도 있으며, /etc/sudoers.d 디렉터리 하위에 파일을 생성하여 룰을 적용할수도 있습니다. /etc/sudoers파일과 /etc/sudoers.d/ 아래의 파일들이 결합되어 최종적인 룰이 완성됩니다.
그럼 바로 룰을 보도록 하겠습니다.
아까 위에서 보여드렸던 user1 사용자가 mount 명령을 root권한으로 실행할 수 있도록 하는 설정입니다.
[root@localhost ~]# cat /etc/sudoers.d/mount
user1 ALL=(ALL) /usr/bin/mount ## user1이 root권한으로 mount 명령어 실행 가능
설정은 딱 1줄입니다. /etc/sudoers.d 디렉토리 내에 파일을 만들고 위에 보이는 user1로 시작하는 줄을 추가해 주면 됩니다.
공백기준으로 각 필드에 대해 확인해보겠습니다.
첫번째 필드: sudo 명령어를 실행하는 ****user 또는 group (group의 경우 %표시)
두 번째 필드: 어떤 유저의 권한으로 실행할지 표시
ALL=(ALL)인 경우 모든 유저의 권한으로 실행이 가능합니다.
세 번째 필드: 사용을 허가할 명령어
두 번째로 user1사용자가 cat 명령어를 root권한으로 실행하는 rule을 보도록 하겠습니다.
/etc/sudoers.d/mount 가 아닌 다른 파일을 만들어서 추가해 보겠습니다.
[root@localhost ~]# cat /etc/sudoers.d/cat
user1 ALL=(ALL) /usr/bin/cat
동일한 사용자에게 여러 명령어를 추가하는 것이라면 위에 mount나 cat 명령을 아래처럼 한번에 설정할 수도 있습니다.
# cat /etc/sudoers.d/user1
user1 ALL=(ALL) /usr/bin/mount,/usr/bin/cat
아래는 가장 많이 사용되는 설정으로서 모든 명령어를 다 사용 가능하게 하는 설정입니다.
[root@localhost ~]# cat /etc/sudoers.d/user1_rule
user1 ALL=(ALL) ALL
위 내용처럼 설정된 경우에는 root 사용자나 다름 없습니다. 모든 명령어를 root 권한으로 사용할 수 있기 때문입니다. 그리고 root로 로그인도 가능합니다.
[user1@localhost ~]$ sudo -i ## root 계정 로그인
[sudo] password for user1:
[root@localhost ~]#
그래도 장점은 sudo사용 시에 물어보는 패스워드는 root패스워드가 아닌 user의 패스워드 라는 부분입니다.
따라서 sudo는 root패스워드를 제공하는 것이 아니라 일반 유저에게 권한을 허용해주는 방식이라고 보실 수 있습니다.
wheel 그룹
OS가 설치되면 기본적으로 sudo 설정이 있습니다.
위에서 봤던 사용자 지정 파일을 만들지 않아도 아래와 같은 설정이 존재합니다.
어떤 설정이 기본적으로 있는지 확인을 위해 /etc/sudoers 파일을 열어보겠습니다.
저는 내용이 많아서 “wheel” 문자만 grep으로 필터링 했습니다.
[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) ALL
이 라인의 내용은 wheel그룹원들에게 모든 명령을 root 권한으로 사용할 수 있도록 하고 있습니다.
이 설정이 기본값으로 존재하기 때문에 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분동안은 물어보지 않고 사용할 수 있습니다.
자기 자신의 패스워드 조차 물어보지 않도록 하는 설정이 존재합니다.
다시 /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:” 라는 구문이 있는데 이 내용이 포함되어 있으면 자기 자신의 패스워드 조차 입력할 필요가 없게 됩니다.
/etc/sudoers에서 기본으로 설정되어 있는 wheel그룹 설정을 주석처리하고 패스워드 없이 사용할 수 있는 줄을 주석해제 하도록 하면 설정이 완료됩니다.
** /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 command을 사용하는 방법을 확인했습니다.
이 명령어는 운영 환경에서 root 패스워드를 공개하지 않고 특정 사용자에게 root권한 또는 특정 명령어 사용을 부여할 때 유용하게 사용할 수 있습니다.