컴퓨터 관련/리눅스(유닉스) 일반

sudoers 및 PAM 보안 설정 - sudo, su 권한 조정

sunyzero 2025. 1. 12. 12:21

sudo 권한을 세밀하게 조정하기 위해서는 /etc/sudoers.d 밑에 세부 설정 파일을 작성해야만 한다. 그리고 su의 권한은 /etc/pam.d/su 파일을 설정한다. 집에서 개인이 사용하는 경우와 달리 회사나 개발팀에서는 특히 보안을 중시해야 하기 때문에 sudoers 나 PAM 설정을 잘 해두는 것이 무엇보다 중요하다.

참고로 su는 substitute user의 약자로 유저를 변경한다는 의미이다. sudo는 su에 do(한다)는 의미를 붙인 것이다. 약어는 본래 용어를 알아두면 이해가 빠르기 때문에 모든 용어는 원어를 알아두는 것이 좋다.

sudo meme

 

1. 설정 파일

기본적으로 sudoers 설정 파일은 /etc/sudoers 이다. 그러나 이 파일을 직접 수정하는 것은 아주 구식 방법이고, 최근 대부분의 설정은 override 파일을 사용하는 방식을 사용한다. 따라서 뒤에 .d 가 붙는 디렉터리에 파일을 추가하는 방법을 사용한다. 참고로 원래 설정 파일을 수정하지 않는 이유는 패키지가 새로 업데이트 되면서 기존 설정이 다 날라가는 경우가 발생할 수 있기 때문이다.

 

2. 설정 방법 : visudo

sudoers 파일은 그냥 에디터로 편집하기보다는 visudo를 사용한다. 이 프로그램은 vi를 실행하지만 문법 검사 기능이 들어가 있어서 설정 파일을 저장할 때 문법에 맞지 않는 경우에는 에러를 발생시킨다. 예를 들어 다음과 같이 명령하면 된다.

visudo -f /etc/sudoers.d/admin

위 visudo 의 -f 옵션은 저장할 파일이다. 파일은 나중에 저장하는 시점에 문법 검사에 성공하면 온전히 저장된다.

 

3. sudoers 설정 내용 예시

sudoers는 기본적으로 EBNF(확장 배커스 나우어 폼 or 확장 배커스 노이르 폼)로 작성한다. EBNF는 보통 학부 시절에 배우지만 배우지 않았다면 man sudoers를 실행하여 quick manual로 배우도록 하자. 사실 어렵지 않기 때문에 1~2시간이면 다 배울 것이라고 생각된다.

그러면 아래의 설정 내용을 넣어보자.

User_Alias ADMINS = sunyzero, linuxer

Cmnd_Alias CMD_ADMIN = /usr/bin/systemctl, /usr/bin/journalctl
Cmnd_Alias CMD_DEVICE = /usr/sbin/grubby, /usr/sbin/hdparm, /usr/sbin/hddtemp, /usr/bin/cpupower, /usr/sbin/smartctl
Cmnd_Alias CMD_FILESYSTEM = /usr/sbin/fdisk
Cmnd_Alias CMD_NETWORK = /usr/bin/nmcli, /usr/sbin/ss, /usr/sbin/ifconfig, /usr/sbin/ip
Cmnd_Alias CMD_PACKAGE = /usr/bin/rpm, /usr/bin/dnf, /usr/bin/yum
Cmnd_Alias CMD_SECURITY = /usr/bin/lastb, /usr/bin/fail2ban-client

ADMINS  ALL=NOPASSWD: CMD_ADMIN, CMD_DEVICE, CMD_NETWORK, CMD_PACKAGE, CMD_SECURITY

위 내용 중에 _Alias로 끝나는 부분은 전부 별칭이다. 변수 같은 것이라고 생각하면 쉬울 것이다. User_Alias는 유저에 대한 설정이고, Cmnd_Alias는 커맨드(명령어)에 대한 부분이다. 명령어의 경로는 절대경로를 사용하도록 한다.

그리고 맨 아래를 보면 ADMINS에 해당하는 유저에게는 root를 포함한 모든 유저의 권한으로 전환할 수 있게 해주고, 뒤에 명령어들을 실행할 때 root 권한 사용시 패스워드를 묻지 않는다는 것이다.

 

4. wheel 그룹 설정

여기서 조금 더 보안을 설정하기 위해 wheel 그룹에 속한 경우에만 su를 허용하도록 하는 경우도 있다. 혹은 그룹을 새로 만들어서 해당 권한을 부여하는 경우도 있다. 보안을 강하게 하려면 wheel이 아닌 새로운 그룹을 만드는 경우를 추천한다.

이 기능은 PAM(Pluggable Authentication Module)의 pam_wheel.so 기능을 설정하려면 /etc/pam.d/su 파일에 다음과 같이 작성한다.

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth           required        pam_wheel.so use_uid
auth            substack        system-auth
auth            include         postlogin
account         sufficient      pam_succeed_if.so uid=0 use_uid quiet
account         include         system-auth
password        include         system-auth
session         include         system-auth
session         include         postlogin
session         optional        pam_xauth.so

위와 같이 "auth required pam_wheel.so. use_uid"를 설정(uncomment)하면 wheel 그룹에 속한 유저만 su를 할 수 있게 된다. 만일 suwheel이라는 새로운 그룹을 만들고 해당 그룹에 속한 경우만 su를 허용하려면 "auth required pam_wheel.so. use_uid group=suwheel" 로 수정하면 된다.

참고로 required는 남아있는 모듈 스택을 테스트하는 기능인데, 자세한 사용법은 PAM 문법을 알아야 하기 때문에 여기서는 그냥 그런가보다 하고 넘어가면 된다. 관리자나 보안을 담당한다면 PAM 기능에 대한 이해는 필수이므로 나중에라도 공부해두는 것을 권장한다. 더불어서 RUID, EUID와 SID의 소유권자 등에 대한 개념도 알아두어야 한다. 특히 session 리더를 의미하는 SID에 대한 공부는 관리자 뿐만 아니라 프로그래머도에게도 매우 중요한 개념이다.

 

5. 기타

sudo는 조심스럽게 사용해야 하는 권한이다. root 권한이면 뭐든 다 되니까 마구잡이로 남발하면 곤란한 경우가 발생한다. 실제로 예전에 어떤 분이 자신의 홈 디렉토리에서 build를 할 때 sudo를 사용해서 gradle이나 maven 같은 프로그램이 생성하는 파일 권한이 root 권한으로 생성되어 파일 권한이 엉망진창이 된 경우가 있었다.

따라서 sudo는 항상 최소한으로만 사용할 수 있도록 설정 해야 하고, sudo의 정확한 의미를 이해하고 사용하는 것이 좋다.

 

히스토리

2025-01-12 처음 글 씀

반응형