LFCS 사용자·그룹·SGID 핵심 정리

사용자, 기본·보조 그룹, 디렉터리 권한과 SGID의 동작을 명령 예시로 정리


이 문서는 local user·group의 기초 층이다. 환경 profile·limits·ACL·LDAP는 고급 개념에서 이어진다.

작성·검증 상태: AI가 구조화와 설명 초안을 보조했다. 계정·group·permission 명령은 GNU/Linux의 일반 동작을 설명하며, UID·GID 정책과 기본값은 현재 배포판 설정을 우선한다.

이 영역을 끝내는 순서

  1. 이 문서에서 account·primary/supplementary group·directory permission·SGID·umask를 구분한다.
  2. 기본 안내형 lab에서 공유 directory를 직접 구성한다.
  3. 고급 개념과 고급 lab에서 공식 나머지 네 항목을 수행한다.
  4. 영문 단계별 실전을 풀이 없이 두 번 완료한다.

완료 기준은 getent·id·stat 같은 상태 조회뿐 아니라 실제 user의 file 생성·읽기·쓰기와 새 login session에서의 적용을 확인하는 것이다.

공식 Users and Groups 영역 중 local user·group account의 기초를 다룬다. environment profile, resource limit, ACL, LDAP는 시험 범위 체크리스트에서 별도로 확인한다.

SGID는 공식 competency 이름에는 없지만 local user/group와 공유 디렉터리 권한의 상호작용을 이해하는 데 유용하다.

사용자와 그룹의 최소 모델

프로세스의 파일 접근 판단에는 숫자 ID가 사용된다.

  • 사용자: 이름과 UID
  • 기본 그룹: 사용자마다 하나의 primary GID
  • 보조 그룹: 사용자가 추가로 속한 supplementary group 목록

주요 로컬 데이터는 다음 파일에 저장되지만, 조회할 때는 파일을 직접 검색하기보다 NSS를 거치는 getent와 id를 먼저 사용한다.

파일역할
/etc/passwd사용자명, UID, 기본 GID, 홈, 로그인 셸
/etc/shadow비밀번호 해시와 만료 정책
/etc/group그룹명, GID, 명시된 멤버
/etc/gshadow그룹 관리·인증 정보
getent passwd lfcsuser
getent group devops
id lfcsuser

/etc/group의 멤버 목록만 보면 사용자의 기본 그룹 관계가 보이지 않을 수 있다. 최종 소속을 볼 때는 id username을 함께 확인한다.

생성과 수정을 구분한다

다음 계정 변경 명령은 root 권한으로 실행하는 예시다.

# 새 그룹과 새 사용자
groupadd devops
useradd -m -s /bin/bash lfcsuser

# 기존 사용자의 보조 그룹에 devops 추가
usermod -aG devops lfcsuser

useradd는 새 사용자를 만들고 usermod는 기존 사용자를 바꾼다. 이미 있는 사용자를 그룹에 넣기 위해 삭제 후 재생성하지 않는다.

usermod -G가 위험한 이유

usermod -G devops lfcsuser

-G는 보조 그룹 목록을 새로 지정한다. 명령에 적지 않은 기존 보조 그룹에서 사용자가 빠질 수 있다. 기존 목록을 유지하면서 추가하려면 -aG를 사용한다.

변경 전후를 비교하면 부수 효과를 확인할 수 있다.

id lfcsuser
usermod -aG devops lfcsuser
id lfcsuser

디렉터리 접근 권한

디렉터리에서 권한의 의미는 일반 파일과 다르다.

권한디렉터리에서의 의미
r항목 이름 목록을 읽음
wx와 함께 디렉터리 항목을 생성·삭제·이름 변경
x경로를 통과하고 항목에 접근

공유 디렉터리를 root:devops, 2770으로 만들면 다음 상태가 된다.

chown root:devops /srv/project
chmod 2770 /srv/project
drwxrws--- root devops /srv/project
  • 소유자 root: rwx
  • 그룹 devops: rwx
  • 기타 사용자: 접근 불가
  • 앞자리 2: SGID

디렉터리에 SGID가 설정되면 새 항목의 그룹 ID는 생성 프로세스의 effective GID가 아니라 부모 디렉터리의 그룹 ID를 따른다. 새 하위 디렉터리에는 SGID 비트도 설정된다.

SGID는 파일의 읽기·쓰기 권한을 자동 상속하지 않는다. default ACL이 없으면 프로그램이 요청한 생성 모드에서 umask가 권한을 제한한다. default ACL이 있으면 그 ACL을 상속한 뒤 프로그램이 요청한 생성 모드에 없는 권한을 제거하며, 이 경로에서는 umask를 별도로 적용하지 않는다.

검증은 설정값에서 끝내지 않는다

1. 상태

id lfcsuser
getent group devops
stat -c '%A %a %U:%G %n' /srv/project

2. 동작

devops에 속한 사용자로 실제 파일과 디렉터리를 만들고 그룹 소유권을 확인한다.

runuser -u lfcsuser -- bash -c \
  'umask 0002; touch /srv/project/from-lfcsuser; mkdir /srv/project/child'

stat -c '%A %a %U:%G %n' \
  /srv/project/from-lfcsuser \
  /srv/project/child

확인할 것은 다음과 같다.

  • lfcsuser가 /srv/project 안에 항목을 만들 수 있는가?
  • 생성된 항목의 그룹이 devops인가?
  • 하위 디렉터리에 SGID가 설정됐는가?
  • 파일의 그룹 쓰기 권한이 umask 예상과 맞는가?

3. 새 세션

이미 로그인한 셸은 변경된 보조 그룹 목록을 자동으로 반영하지 않는다. 조회 대상을 구분한다.

id                                  # 이 명령을 실행한 현재 프로세스의 그룹
id lfcsuser                         # NSS가 반환한 lfcsuser의 현재 계정 정보
runuser -u lfcsuser -- id           # root가 새 프로세스로 초기화한 lfcsuser의 그룹

lfcsuser에 비밀번호나 SSH 키를 설정하지 않았다면 그 계정으로 새 SSH 로그인을 요구하지 않는다. 이 실습은 root 셸에서 runuser로 새 프로세스를 시작해 반영 여부를 확인한다. newgrp로 현재 셸의 그룹 상태를 바꾸는 것과 새 프로세스에서 계정 상태를 확인하는 것도 구분한다.

안전한 풀이 순서

  1. getent, id, stat로 초기 상태를 확인한다.
  2. 새 객체는 groupadd, useradd로 만든다.
  3. 기존 사용자 변경은 usermod -aG처럼 부수 효과가 적은 명령을 고른다.
  4. chown과 chmod로 요구된 최종 상태를 만든다.
  5. 상태, 실제 동작, 새 세션을 검증한다.
  6. 요구하지 않은 사용자 삭제, 재생성, 재귀 권한 변경은 하지 않는다.

스스로 설명할 질문

  • 기본 그룹과 보조 그룹은 어떻게 다른가?
  • usermod -G와 usermod -aG의 결과는 어떻게 다른가?
  • 디렉터리에 x가 없으면 r이 있어도 무엇을 할 수 없는가?
  • 2770의 첫 번째 숫자 2는 어떤 동작을 만드는가?
  • SGID와 umask는 새 파일의 그룹과 권한에 각각 어떤 영향을 주는가?

답을 설명한 뒤 Users & Groups 실습을 풀이를 펼치지 않고 수행한다.

참고 자료