sudo는 “superuser do”의 약자로, Unix 및 Linux 운영 체제에서 특정 사용자가 관리자 권한을 임시로 얻어 명령을 실행할 수 있게 해주는 명령어입니다. 일반적으로 시스템 관리 작업이나 설치 작업 등 관리자 권한이 필요한 작업을 수행할 때 사용됩니다.
주요 특징
- 관리자 권한: sudo 명령어를 사용하면 사용자는 일시적으로 관리자(root) 권한을 얻어 명령을 실행할 수 있습니다.
- 보안: sudo를 사용하면 사용자의 활동을 로깅하고, 권한 있는 사용자를 제한할 수 있어 시스템 보안을 강화할 수 있습니다.
- 유연성: sudo 설정 파일인 /etc/sudoers를 통해 특정 사용자나 그룹에게 특정 명령어에 대해 관리자 권한을 부여할 수 있습니다.
root 권한 양도
root 권한을 특정 사용자에게 모두 양도합니다. 권한을 주고 싶은 유저명을 정해서 “유저명 ALL=(ALL) ALL” 을 가장 마지막 줄에 추가해줍니다.
[root]# visudo
다음과 같이 마지막 줄에 testuser01을 추가합니다. 이렇게 함으로써 root 권한을 모두 이용할 수 있게 됩니다.
...중간 생략...
## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
user01 ALL=(ALL) ALL
user01유저로 로그인하여 아래 커맨드를 예시로 사용하겠습니다. 아래의 커맨드는 root 외의 유저로는 실행이 거부됩니다.
[user01]$ /usr/bin/cat /etc/shadow
/usr/bin/cat: /etc/shadow: 허가 거부
앞에 sudo를 넣어 사용하면 정상적으로 실행됩니다.
[user01]$ sudo /usr/bin/cat /etc/shadow
root:$6$t2nIFcqLPgyolvnp$FfOhRDJ0y8jOQwbT3hvtCctuJg1l1FX9.klUpUI9sBWbqMvltBH27hJ3V8VzjEDORQth14mG2ynAd/37nV3JZ0::0:99999:7:::
bin:*:19820:0:99999:7:::
...중간 생략...
postgres:!!:19923::::::
user01:$6$wx9hySdms0BxP8DN$Fpd61moGT8P.iu/AZyW1QQ4P.tWARxBL3eH9TUOOvjnW2WhO6i6IgGGOmk7QGSMUJb/HRntovpZDle0RvwLzP0:19936:0:99999:7:::
하지만 sudo를 넣어도 visudo를 통해 root 권한을 부여하지 않은 유저로는 실행할 수 없습니다. 다음은 root권한을 부여하지 않은 유저 user02로 실행해 본 결과 입니다.
[user02]$ sudo /usr/bin/cat /etc/shadow
로컬 시스템 관리자에게 일반적인 지침을 받았으리라 믿습니다.
보통 세가지로 요약합니다:
#1) 타인의 사생활을 존중하십시오.
#2) 입력하기 전에 한 번 더 생각하십시오.
#3) 막강한 힘에는 상당한 책임이 뒤따릅니다.
[sudo] user02의 암호:
user02은(는) sudoers 설정 파일에 없습니다. 이 시도를 보고합니다.
특정 명령어 제한
sudo 권한을 모두 양도했지만 특정 명령어들은 제한할 수 있습니다. 49번째 줄에 아래 붉은색으로 된 내용을 추가로 기입합니다. 이 글에서는 시스템 정지 커맨드 앨리어스 중 하나를 설정합니다.
[root]# visudo
...중간 생략...
## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe
Cmnd_Alias SHUTDOWN = /usr/sbin/halt, /usr/sbin/shutdown, \/usr/sbin/poweroff, /usr/sbin/reboot, /usr/sbin/init, /usr/bin/systemctl
# Defaults specification
...중간 생략...
그리고 위에서 권한을 양도하기 위해 추가했던 마지막 줄에 아래 붉은색으로 된 내용을 추가 기입합니다. 해당 유저에게는 앨리어스 “SHUTDOWN”을 허가하지 않는다는 설정입니다.
user01 ALL=(ALL) ALL, !SHUTDOWN
유저 testuser01로 동작을 확인하면 거부 당하는 것을 확인할 수 있습니다.
[user01]$ sudo /usr/sbin/reboot
[sudo] user01의 암호:
죄송하지만 user01 사용자는 '/usr/sbin/reboot'을(를) samplehost의 root(으)로 실행하도록 허가받지 않았습니다.
root 권한이 필요한 명령어를 특정 그룹 사용자에게 양도
51번째 줄(위의 특정 명령어 제한에서 기입한 줄 아래)에 아래 붉은색으로 된 내용을 추가합니다. 이 글에서는 예시로서 유저 관리 커맨드 앨리어스를 설정합니다.
[root]# visudo
...중간 생략...
## Drivers
# Cmnd_Alias DRIVERS = /sbin/modprobe
Cmnd_Alias SHUTDOWN = /usr/sbin/halt, /usr/sbin/shutdown, \/usr/sbin/poweroff, /usr/sbin/reboot, /usr/sbin/init, /usr/bin/systemctl
Cmnd_Alias USERMGR = /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, \/usr/bin/passwd
# Defaults specification
...이하 생략...
그리고 마지막 줄에 아래 내용을 추가 기입합니다. 그룹 “usergrp”에 속한 사용자에게 “USERGRP”에서 정의한 명령어를 사용할 수 있도록 허가하는 것입니다.
%usergrp ALL=(ALL) USERMGR
테스트를 위해 아래와 같이 유저 그룹 “usergrp”을 만들어주고 유저를 지정해줍니다.
[root]# groupadd usergrp
[root]# usermod -aG usergrp user01
유저 user01으로 동작을 확인하면 일반 커맨드로는 useradd나 passwd가 실행되지 않지만 sudo를 넣으면 실행되는 것을 알 수 있습니다.
[user01]$ /usr/sbin/useradd user03
useradd: Permission denied.
useradd: /etc/passwd을(를) 잠글 수 없습니다. 나중에 다시 시도하십시오.
[user01]$ sudo /usr/sbin/useradd user03
[sudo] testuser01의 암호:
user01]$ /usr/bin/passwd user03
passwd: root로만 사용자 이름을 지정할 수 있습니다.
[user01]$ sudo /usr/bin/passwd user03
user03 사용자의 비밀 번호 변경 중
새 암호:
새 암호 재입력:
passwd: 모든 인증 토큰이 성공적으로 업데이트 되었습니다.
root 권한이 필요한 명령어를 특정 사용자에게 양도
visudo의 마지막 줄에 설정하고자 하는 각 사용자에게 특정 명령의 허가를 추가합니다.
[root]# visudo
...중간 생략...
user03 ALL=(ALL) /usr/sbin/visudo
user04 ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/bin/passwd
user05 ALL=(ALL) /usr/bin/vi
예시로서 유저 user03로 동작을 확인하면 실행되는 것을 알 수 있습니다. 아래 실행 내역은 visudo를 성공적으로 실행했으나 아무 수정도 하지 않고 종료한 내용입니다.
[user03]$ /usr/sbin/visudo
visudo: /etc/sudoers: 허가 거부
[user03]$ sudo /usr/sbin/visudo
로컬 시스템 관리자에게 일반적인 지침을 받았으리라 믿습니다.
보통 세가지로 요약합니다:
#1) 타인의 사생활을 존중하십시오.
#2) 입력하기 전에 한 번 더 생각하십시오.
#3) 막강한 힘에는 상당한 책임이 뒤따릅니다.
[sudo] user03의 암호:
visudo: /etc/sudoers.tmp 바꾸지 않음
sudo 로그를 별도로 기록
sudo 로그는 기본적으로 로그 관리 서비스 Journal 및 Rsyslog([/var/log/secure] 파일로서 로그를 열람) 경유에 보관이 되는데 sudo 로그만 별도 파일로 기록할 수도 있습니다. 이 글에서는 예시로서 퍼실리티 “user04″에 로그를 출력해보도록 하겠습니다.
먼저 로그의 위치를 관리하는 파일을 열어 46,47번째 줄에 아래 내용을 추가합니다.
[root]# vi /etc/rsyslog.conf
...중간 생략...
#kern.* /dev/console
*.info;mail.none;authpriv.none;cron.none;user04.none /var/log/messages
user04.* /var/log/sudo.log
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log anything (except mail) of level info or higher.
...이하 생략...
그리고 visudo를 열어 가장 마지막 줄에 아래의 붉은색으로 된 내용을 추가합니다.
[root]# visudo
...중간 생략...
Defaults syslog=user04
수정이 끝났다면 시스템을 재기동 해줍니다.
[root]# systemctl restart rsyslog
댓글