LFCS 사용자·그룹·ACL 단계별 실전

영어 문제 해석부터 계정, SGID, ACL, profile, limits와 LDAP 조회까지 단계적으로 연습


실제 시험문항이 아닌 공식 Users and Groups 범위 기반 독립 연습이다. 1~2번의 핵심 동작은 Rocky Linux 10.2 실습 VM에서 확인했고, LDAP 문제는 별도의 identity provider가 준비된 환경에서만 수행한다.

작성·검증 상태: AI가 영문 task·힌트·풀이의 구조화를 보조했다. 실제 검증 범위는 위 문장과 각 문제의 prerequisite를 따른다.

풀기 전 연결표

요구사항명령·설정
사용자·홈·shell 생성useradd -m -s
기존 보조 그룹을 보존하며 추가usermod -aG
새 파일의 그룹 상속directory SGID, chmod 2770
특정 사용자 예외 권한setfacl -m u:...
신규 항목 ACL 상속setfacl -d -m ...
사용자 로그인 환경~/.bash_profile
사용자 resource limit/etc/security/limits.d/*.conf
LDAP 포함 계정 조회getent, id

문제마다 마지막에는 설정 파일을 눈으로 보는 데서 끝내지 말고 그 사용자로 실제 동작을 확인한다. root가 성공하는 것은 일반 사용자의 권한이 맞다는 증거가 아니다.

확인하려는 것검증 방법
사용자·그룹 DBgetent passwd, getent group, id
디렉터리 소유권·SGIDstat -c '%A %a %U:%G %n'
사용자별 실제 접근runuser -u USER -- COMMAND
access/default ACLgetfacl -p PATH
새 로그인 환경runuser -l USER -c '...'
directive나 option을 모를 때man useradd, man limits.conf, man acl, man sssd.conf

문제 1 — 협업 디렉터리

English

Create group project9 with GID 4909. Create users dev9a and dev9b, add both to the group without replacing existing supplementary groups, and configure /srv/project9 as root:project9 with mode 2770. Newly created files must inherit group project9.

한국어

GID 4909인 project9 그룹과 사용자 두 명을 만들고, 기존 보조 그룹을 지우지 않은 채 그룹에 추가한다. /srv/project9는 root:project9, mode 2770이며 새 파일은 그룹 project9를 상속해야 한다.

1차 가이드

group → users → supplementary group → directory owner/group/mode
→ 두 사용자로 파일 생성 → 파일 group 확인
풀이 예시
groupadd -g 4909 project9
useradd -m -s /bin/bash dev9a
useradd -m -s /bin/bash dev9b
usermod -aG project9 dev9a
usermod -aG project9 dev9b
install -d -o root -g project9 -m 2770 /srv/project9

runuser -u dev9a -- touch /srv/project9/from-dev9a
runuser -u dev9b -- touch /srv/project9/from-dev9b
id dev9a
id dev9b
stat -c '%A %a %U:%G %n' /srv/project9 /srv/project9/*

주의: usermod -G project9 USER는 기존 보조 그룹을 교체한다. 추가 요구에는 -aG를 사용한다.

변형: 사용자를 만들지 말고 기존 사용자만 그룹에 추가하라고 하면 useradd를 실행하지 않는다. primary group을 바꾸라는 문장은 usermod -g, supplementary group 추가는 usermod -aG다.

문제 2 — 특정 사용자와 신규 파일 ACL

English

User auditor9 must be able to read and traverse /srv/project9 but must not modify existing files. Newly created entries must inherit equivalent access. Do not add auditor9 to project9.

한국어

auditor9를 그룹에 추가하지 않고 /srv/project9를 읽고 진입하게 한다. 기존 파일은 수정하지 못해야 하며 신규 항목에도 같은 ACL이 상속돼야 한다.

연결할 ACL

대상ACL 종류
현재 디렉터리 접근access ACL
앞으로 생성되는 항목default ACL
상세 확인getfacl
+ 존재 확인ls -ld
풀이 예시
id auditor9 >/dev/null 2>&1 || useradd -m auditor9
setfacl -m u:auditor9:rx /srv/project9
setfacl -d -m u:auditor9:rx /srv/project9
getfacl -p /srv/project9

runuser -u dev9a -- touch /srv/project9/report.txt
getfacl -p /srv/project9/report.txt
runuser -u auditor9 -- test -r /srv/project9/report.txt
runuser -u auditor9 -- test ! -w /srv/project9/report.txt

setfacl -x u:auditor9 PATH는 해당 named entry만 삭제한다. 모든 extended access ACL을 지우려면 setfacl -b PATH, default ACL만 지우려면 setfacl -k DIR를 사용한다. ls -l의 +는 ACL 존재만 표시하고 상세 내용은 getfacl로 확인한다.

변형: new files must inherit가 없으면 default ACL은 요구되지 않는다. 반대로 신규 항목 상속이 있으면 access ACL만 설정해서는 부족하다. ACL의 실제 유효 권한은 mask::의 제한도 받으므로 getfacl의 effective: 표시를 확인한다.

문제 3 — 로그인 환경과 limits

English

For new login shells of dev9a, set EDITOR=vim, prepend /opt/project9/bin to PATH, and configure the open-files soft limit to 2048 and hard limit to 4096. Do not apply the environment changes system-wide.

한국어

dev9a의 새 로그인 shell에만 환경변수와 PATH를 적용하고, open files soft/hard limit을 설정한다.

1차 가이드

  • 사용자 전용 로그인 환경과 PAM resource limit은 서로 다른 파일에 둔다.
  • 현재 root shell이 아니라 runuser -l로 새 로그인 session을 검증한다.
풀이 예시

/home/dev9a/.bash_profile에 다음을 추가한다.

export EDITOR=vim
export PATH="/opt/project9/bin:$PATH"

/etc/security/limits.d/dev9a.conf:

dev9a soft nofile 2048
dev9a hard nofile 4096
chown dev9a:dev9a /home/dev9a/.bash_profile
runuser -l dev9a -c 'printf "%s\n%s\n" "$EDITOR" "$PATH"; ulimit -Sn; ulimit -Hn'

soft는 사용자가 현재 session에서 올릴 수 있는 기본값이고 hard는 넘을 수 없는 상한이다. limits.d 수정은 이미 열린 shell에 소급되지 않으므로 반드시 새 로그인 session에서 확인한다.

문제 4 — 시스템 전체 환경 profile

English

Set PROJECT_ENV=production and prepend /opt/project9/bin to PATH for future Bash login sessions of all users. Do not edit every user’s home directory.

한국어

모든 사용자의 앞으로 생성되는 Bash 로그인 session에 환경변수와 PATH를 적용한다. 사용자별 home 파일을 반복 수정하지 않는다.

범위 연결

범위대표 위치
사용자 한 명~/.bash_profile, ~/.profile
모든 사용자의 shell 환경/etc/profile.d/*.sh
새 계정에 복사할 skeleton/etc/skel/
풀이 예시

/etc/profile.d/project9.sh:

export PROJECT_ENV=production
export PATH="/opt/project9/bin:$PATH"
chmod 644 /etc/profile.d/project9.sh
runuser -l dev9a -c 'printf "%s\n%s\n" "$PROJECT_ENV" "$PATH"'
runuser -l dev9b -c 'printf "%s\n%s\n" "$PROJECT_ENV" "$PATH"'

/etc/environment와 /etc/profile.d는 같은 것이 아니다. 문제에서 Bash login profile을 요구하면 /etc/profile.d가 의도가 분명하다. 현재 shell에 source하는 것만으로 영속성 검증을 대신하지 않는다.

문제 5 — LDAP 계정 조회 문제의 경계

English

Configure the host to resolve users and groups from the provided LDAP identity service while preserving local account access. Verify user ldapuser9 using standard system lookup tools.

한국어

문제에서 제공된 LDAP identity service로 계정을 조회하되 로컬 계정 접근은 보존하고, 표준 조회 도구로 ldapuser9를 확인한다.

이 문제는 서버 URI, base DN, CA 또는 enrollment 정보가 제공돼야 실제 구성할 수 있다. 임의의 값을 만들지 않는다. 시험 환경에서 제공된 패키지와 구성 도구를 확인한 뒤 다음 최종 상태를 검증한다.

요구와 구성 요소

요구확인할 구성
LDAP identity 조회SSSD 또는 제공된 NSS provider
로컬 계정 보존nsswitch.conf의 files 유지
인증 연동PAM/authselect와 SSSD service
TLS 신뢰제공된 CA와 URI, 인증서 검증
SSSD를 사용하는 일반적인 답안 틀

환경이 제공한 URI, BASE_DN, CA, bind 방식으로 placeholder를 치환한다. 아래 값을 그대로 복사해서는 안 된다.

# /etc/sssd/sssd.conf
[sssd]
services = nss, pam
domains = exam

[domain/exam]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://<PROVIDED_SERVER>
ldap_search_base = <PROVIDED_BASE_DN>
ldap_tls_cacert = <PROVIDED_CA_PATH>
cache_credentials = true
chmod 600 /etc/sssd/sssd.conf
sssctl config-check
authselect select sssd with-mkhomedir
systemctl enable --now sssd
getent passwd root
getent passwd ldapuser9
id ldapuser9
getent passwd ldapuser9
id ldapuser9
getent passwd root

SSSD가 아니라 realm join 또는 배포판 전용 enrollment 명령을 문제에서 제공하면 그 흐름을 따른다. 정보가 부족한 상태에서 임의 LDAP server를 구성하는 것은 정답이 아니다.

조건 변형 대비

문제 표현핵심 선택
inherit group ownershipdirectory SGID
inherit ACL permissionsdefault ACL
existing entries onlyaccess ACL
without changing group membershipnamed user ACL
all userssystem-wide profile
only one userpersonal profile
preserve supplementary groupsusermod -aG

자가 채점

  • 기존 보조 그룹을 보존했다.
  • SGID 디렉터리에서 서로 다른 사용자가 만든 파일의 그룹이 같다.
  • ACL 권한을 실제 사용자로 확인했다.
  • access ACL과 default ACL을 구분했다.
  • profile과 limits를 새 로그인 session에서 확인했다.
  • 개인 profile과 시스템 전체 profile을 구분했다.
  • LDAP 정보가 없는 문제에서 값을 임의로 만들지 않았다.