Red Hat Certified System Administrator (RHCSA) #11 사용자/그룹: UID/GID, sudo, ACL, 비밀번호 정책
#10 기본 네트워킹에서 nmcli로 영구 연결을 잡았다면, 이제 시스템을 누가 어떻게 쓰는지를 통제하는 차례입니다. RHCSA에서 사용자와 그룹, sudo, ACL, 비밀번호 정책은 작업 수가 많고 채점 포인트가 명확해 점수를 안정적으로 챙길 수 있는 영역입니다. 이번 글은 useradd부터 setfacl까지 시험에 그대로 나오는 명령을 직접 쳐 보며 정리하겠습니다.
계정 정보가 저장되는 세 파일 #
사용자를 다루기 전에, 계정 정보가 어디에 어떤 형식으로 저장되는지를 알아야 합니다. 핵심 파일은 세 개입니다.
| 파일 | 담는 정보 |
|---|---|
/etc/passwd | 사용자명, UID, GID, GECOS, 홈 디렉터리, 로그인 셸 |
/etc/shadow | 암호화된 비밀번호, 비밀번호 만료 정책 |
/etc/group | 그룹명, GID, 보조 그룹 구성원 |
/etc/passwd의 한 줄은 콜론으로 구분된 7개 필드입니다.
alice:x:1001:1001:Alice Kim:/home/alice:/bin/bash왼쪽부터 사용자명, 비밀번호 자리표시자(x는 실제 해시가 shadow에 있다는 뜻), UID, 기본 GID, GECOS(설명), 홈 디렉터리, 로그인 셸입니다.
/etc/shadow도 콜론으로 구분되며, 비밀번호 해시와 만료 관련 필드를 담습니다.
alice:$6$xyz...:19500:0:90:7:::사용자명, 해시, 마지막 변경일(1970-01-01부터의 일수), 최소 사용일, 최대 사용일, 경고일 순입니다. 이 파일은 root만 읽을 수 있습니다.
/etc/group은 그룹명, 비밀번호 자리표시자, GID, 보조 그룹 구성원 목록을 담습니다.
developers:x:2000:alice,bob이 세 파일은 직접 편집하기보다 useradd,usermod,passwd,chage 같은 명령으로 다루는 것이 안전합니다. 직접 편집해야 한다면 무결성 검사를 거는 vipw(passwd)와 vigr(group)를 쓰겠습니다.
사용자 생성과 변경 #
useradd로 사용자 만들기 #
가장 단순한 사용자 생성은 다음과 같습니다. 홈 디렉터리와 기본 그룹이 자동으로 만들어집니다.
useradd alice
passwd aliceRHCSA에서는 단순 생성보다 옵션을 지정한 생성이 자주 나옵니다. 자주 쓰는 옵션은 다음과 같습니다.
| 옵션 | 의미 |
|---|---|
-u | UID 지정 |
-g | 기본 그룹(primary group) 지정 |
-G | 보조 그룹(supplementary group) 지정 |
-s | 로그인 셸 지정 |
-d | 홈 디렉터리 경로 지정 |
-c | GECOS(설명) 지정 |
-M | 홈 디렉터리를 만들지 않음 |
UID와 기본 그룹, 보조 그룹, 셸을 한 번에 지정하는 예는 다음과 같습니다.
useradd -u 1500 -g developers -G wheel,docker -s /bin/bash -c "Alice Kim" alice이 명령은 UID 1500, 기본 그룹 developers, 보조 그룹 wheel과 docker, 로그인 셸 bash로 alice를 만듭니다. 기본 그룹과 보조 그룹은 미리 존재해야 하므로, 없다면 먼저 groupadd로 만들어야 합니다.
로그인을 막는 서비스 계정은 셸을 /sbin/nologin으로 지정하는 경우가 많습니다.
useradd -s /sbin/nologin -M appsvcusermod로 기존 사용자 변경 #
이미 있는 사용자의 속성을 바꿀 때는 usermod를 씁니다. 옵션 이름은 useradd와 대체로 같습니다.
# 로그인 셸 변경
usermod -s /bin/bash alice
# 보조 그룹을 developers 하나로 교체
usermod -G developers alice
# 보조 그룹에 docker를 추가(-a 없이 -G만 쓰면 기존 보조 그룹이 사라짐)
usermod -aG docker alice
# UID 변경
usermod -u 1600 alice-aG의 -a(append)가 핵심입니다. -a 없이 -G만 쓰면 기존 보조 그룹이 통째로 교체되어 사라지므로, 보조 그룹을 추가할 때는 반드시 -aG를 함께 씁니다.
userdel로 사용자 삭제 #
사용자를 지울 때 홈 디렉터리와 메일 스풀까지 함께 지우려면 -r를 붙입니다.
# 계정만 삭제(홈 디렉터리는 남음)
userdel alice
# 홈 디렉터리와 메일 스풀까지 삭제
userdel -r aliceRHCSA에서 “사용자와 그 홈 디렉터리를 삭제하라"는 문제는 -r를 빠뜨리면 감점이므로 주의하겠습니다.
passwd로 비밀번호 관리 #
비밀번호 설정과 잠금을 다루는 명령입니다.
# 비밀번호 설정(대화형)
passwd alice
# 표준 입력으로 비밀번호 설정(스크립트용)
echo 'NewP@ss123' | passwd --stdin alice
# 계정 잠금과 잠금 해제
passwd -l alice
passwd -u alice--stdin은 RHEL 계열에서만 동작하므로, 시험 환경처럼 사람이 직접 칠 때는 대화형 passwd가 안전합니다.
그룹 관리 #
기본 그룹과 보조 그룹 #
리눅스의 그룹은 두 종류입니다. 기본 그룹(primary group)은 사용자가 새 파일을 만들 때 부여되는 그룹이고, 한 사용자에 하나뿐입니다. 보조 그룹(supplementary group)은 추가 권한을 위해 속하는 그룹으로, 여러 개를 가질 수 있습니다.
id 명령으로 현재 소속을 확인합니다.
id alice
# uid=1500(alice) gid=2000(developers) groups=2000(developers),10(wheel),990(docker)gid=가 기본 그룹이고, groups=에 나열된 것이 전체 소속 그룹입니다.
groupadd로 그룹 만들기 #
# 그룹 생성
groupadd developers
# GID를 지정해 생성
groupadd -g 2000 developers
# 시스템 그룹으로 생성
groupadd -r appgroup그룹에 사용자를 넣는 작업은 앞서 본 usermod로 합니다. 여러 사용자를 한 그룹의 보조 구성원으로 만들 때는 각 사용자에게 usermod -aG를 적용하겠습니다.
usermod -aG developers alice
usermod -aG developers bobgpasswd로 그룹 구성원을 직접 다룰 수도 있습니다.
# 그룹에 사용자 추가
gpasswd -a carol developers
# 그룹에서 사용자 제거
gpasswd -d carol developerssudo 권한 부여 #
sudo가 동작하는 구조 #
일반 사용자가 root 권한이 필요한 명령을 실행하도록 허용하는 도구가 sudo입니다. 누가 무엇을 할 수 있는지는 /etc/sudoers 파일과 /etc/sudoers.d/ 디렉터리에 정의됩니다.
/etc/sudoers는 직접 편집하지 않고 반드시 visudo로 엽니다. visudo는 저장 시 문법을 검사해, 오타로 sudo 자체가 망가지는 사고를 막아 줍니다.
visudo%wheel 그룹 #
RHEL에서는 기본적으로 wheel 그룹에 속한 사용자가 sudo로 모든 명령을 실행할 수 있습니다. /etc/sudoers에 다음 줄이 들어 있습니다.
%wheel ALL=(ALL) ALL%는 그룹을 의미합니다. 따라서 “어떤 사용자에게 sudo 전체 권한을 주라"는 문제는 그 사용자를 wheel 그룹의 보조 구성원으로 넣으면 끝납니다.
usermod -aG wheel alicedrop-in 파일로 권한 정의 #
/etc/sudoers를 직접 고치기보다, /etc/sudoers.d/ 아래에 파일을 두는 방식이 권장됩니다. 이 디렉터리의 파일도 visudo로 문법을 검사하며 만듭니다.
visudo -f /etc/sudoers.d/developers파일 안에 규칙을 한 줄로 적습니다. 예를 들어 developers 그룹에 전체 sudo 권한을 주는 규칙은 다음과 같습니다.
%developers ALL=(ALL) ALL특정 사용자에게 특정 명령만 허용하려면 다음처럼 명령 경로를 나열합니다.
alice ALL=(ALL) /usr/bin/systemctl, /usr/sbin/lvextendNOPASSWD #
sudo 실행 시 비밀번호를 묻지 않게 하려면 NOPASSWD:를 붙입니다.
%developers ALL=(ALL) NOPASSWD: ALL특정 명령만 비밀번호 없이 허용할 수도 있습니다.
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart httpdRHCSA에서는 “비밀번호 없이 sudo를 쓰게 하라” 또는 “특정 명령만 sudo로 허용하라” 같은 변형이 나오므로, NOPASSWD와 명령 경로 지정을 함께 익혀 두겠습니다.
ACL: 파일별 세밀한 권한 #
표준 권한의 한계 #
전통적인 rwx 권한은 소유자, 그룹, 기타 세 주체에만 권한을 줄 수 있습니다. “이 파일을 그룹 전체가 아니라 특정 사용자 한 명에게만 읽게 하라” 같은 요구는 표준 권한으로 풀 수 없습니다. 이때 쓰는 것이 ACL(Access Control List)입니다.
getfacl로 현재 ACL 확인 #
getfacl /data/report.txt출력에서 user::, group::, other::는 표준 권한이고, user:alice:처럼 이름이 붙은 항목이 ACL로 추가된 권한입니다.
setfacl로 ACL 부여 #
-m(modify)으로 권한을 추가하거나 변경합니다.
# 사용자 alice에게 읽기,쓰기 부여
setfacl -m u:alice:rw /data/report.txt
# 그룹 developers에게 읽기,실행 부여
setfacl -m g:developers:rx /data/report.txt-x(remove)로 특정 ACL 항목을 제거합니다.
setfacl -x u:alice /data/report.txt디렉터리 아래 모든 파일에 재귀로 적용하려면 -R를 붙입니다.
setfacl -R -m g:developers:rwx /data/projectACL을 모두 지우려면 -b(remove all)를 씁니다.
setfacl -b /data/report.txtmask이해하기 #
ACL이 걸린 파일에는 mask:: 항목이 생깁니다. mask는 이름이 붙은 사용자,그룹 항목과 기본 그룹에 허용되는 권한의 상한입니다. 즉 user:alice:rwx가 있어도 mask가 r--이면 alice의 실효 권한은 읽기뿐입니다. getfacl 출력에서 #effective: 주석이 실효 권한을 알려 줍니다. mask는 보통 setfacl이 자동으로 조정하지만, 직접 지정할 수도 있습니다.
setfacl -m m:rx /data/report.txtdefault ACL #
디렉터리에 default ACL을 걸면, 그 디렉터리 안에 새로 만들어지는 파일과 하위 디렉터리가 해당 권한을 상속합니다. d: 접두사를 붙입니다.
setfacl -m d:g:developers:rwx /data/project이렇게 하면 앞으로 /data/project 아래에 만들어지는 파일은 developers 그룹에 rwx ACL을 갖고 태어납니다. 기존 파일에는 영향을 주지 않으므로, 기존 파일까지 한 번에 처리하려면 -R로 일반 ACL을 함께 걸어 주겠습니다.
setfacl -R -m g:developers:rwx -m d:g:developers:rwx /data/project비밀번호 만료 정책 #
chage로 계정별 정책 보기와 바꾸기 #
chage(change age)는 사용자별 비밀번호 만료 정책을 다룹니다. 현재 정책은 -l로 확인합니다.
chage -l alice자주 쓰는 옵션은 다음과 같습니다.
| 옵션 | 의미 |
|---|---|
-M | 비밀번호 최대 사용 일수(이후 변경 강제) |
-m | 비밀번호 최소 사용 일수 |
-W | 만료 전 경고 일수 |
-E | 계정 만료일(이 날짜 이후 로그인 불가) |
-d | 마지막 변경일 조정(0이면 다음 로그인 시 변경 강제) |
예를 들어 비밀번호를 90일마다 바꾸게 하고, 계정 만료일을 지정하는 작업은 다음과 같습니다.
# 비밀번호 최대 사용 90일
chage -M 90 alice
# 계정 만료일을 2026-12-31로 지정
chage -E 2026-12-31 alice
# 다음 로그인 시 비밀번호 변경 강제
chage -d 0 alice계정 만료를 풀려면 -E -1로 지정합니다.
chage -E -1 alice/etc/login.defs: 신규 사용자 기본값 #
chage는 이미 있는 사용자에 적용하는 명령이고, 앞으로 만들 사용자의 기본 정책은 /etc/login.defs에서 정합니다. 주요 항목은 다음과 같습니다.
PASS_MAX_DAYS 90
PASS_MIN_DAYS 0
PASS_WARN_AGE 7
UID_MIN 1000이 값을 바꾸면 이후 useradd로 만드는 사용자에 적용됩니다. 다만 기존 사용자에는 적용되지 않으므로, 이미 있는 계정은 chage로 따로 조정하겠습니다.
계정 잠금 #
비밀번호 정책과 별개로, 계정을 임시로 막아야 할 때가 있습니다. usermod의 -L(lock)은 비밀번호 해시 앞에 !를 붙여 비밀번호 로그인을 막고, -U(unlock)는 해제합니다.
# 계정 잠금
usermod -L alice
# 잠금 해제
usermod -U alicepasswd -l과 usermod -L은 같은 효과를 냅니다. 로그인 자체를 완전히 막으려면 셸을 /sbin/nologin으로 바꾸는 방법도 함께 씁니다.
usermod -s /sbin/nologin alice시험 포인트 #
- 보조 그룹 추가는
usermod -aG.-a를 빠뜨리면 기존 보조 그룹이 통째로 사라집니다. 추가할 때는 항상 append를 붙이겠습니다. - 사용자 삭제 시 홈까지 지우려면
userdel -r.-r를 빠뜨리면 홈 디렉터리가 남아 감점됩니다. - sudo 전체 권한은 wheel 그룹. “이 사용자에게 sudo를 주라"는 문제는
usermod -aG wheel로 끝나는 경우가 많습니다. - sudoers는 visudo로만 편집. drop-in은
visudo -f /etc/sudoers.d/파일명으로 만들어 문법 검사를 거치겠습니다. - ACL은
setfacl -m u:이름:권한, 확인은getfacl. 디렉터리 상속이 필요하면d:default ACL을, 기존 파일까지면-R를 함께 씁니다. - mask가 실효 권한의 상한. ACL을 걸었는데 권한이 안 먹으면 getfacl의
#effective:와 mask를 확인하겠습니다. - 만료 정책은 chage, 신규 기본값은 /etc/login.defs. 둘의 적용 대상이 다르다는 점을 기억하겠습니다.
작업을 마친 뒤에는 id, getfacl, chage -l, sudo -l -U 사용자로 결과 상태를 직접 확인하는 습관을 들이겠습니다. RHCSA는 채점 스크립트가 결과 상태를 검사하므로, 명령을 친 것으로 끝내지 않고 의도한 상태가 되었는지 검증하는 것이 점수로 이어집니다.
정리 #
이번 글에서 잡은 것:
- 계정 정보는 /etc/passwd,shadow,group 세 파일에 저장되며, useradd,usermod,passwd,chage로 안전하게 다룹니다.
- 사용자 생성은 useradd -u/-g/-G/-s/-d, 변경은 usermod, 보조 그룹 추가는
-aG, 삭제는userdel -r입니다. - 그룹은 groupadd로 만들고, 보조 그룹 소속은 usermod나 gpasswd로 관리합니다.
- sudo는 visudo로 /etc/sudoers나 /etc/sudoers.d/ 편집. wheel 그룹, NOPASSWD, 명령별 허용이 단골 변형입니다.
- ACL은 getfacl/setfacl -m/-x/-R, mask와 default ACL(
d:)까지 다룹니다. - 비밀번호 정책은 chage -l/-M/-m/-E, 신규 기본값은 /etc/login.defs, 계정 잠금은 usermod -L입니다.
다음: firewalld와 SSH 키 #
사용자와 권한을 잡았으니, 이제 시스템 외부 경계를 지키는 차례입니다. #12 firewalld와 SSH 키 인증에서는 firewall-cmd로 포트와 서비스를 영구 규칙으로 여는 법, zone 개념, 그리고 ssh-keygen과 ssh-copy-id로 비밀번호 없는 키 인증을 구성하는 법까지 직접 쳐 보며 정리하겠습니다.