시스템 · 서버기초 · 18분 읽기

사용자·그룹과 최소 권한

사용자 이름은 식별자를 읽기 쉽게 표현한 것입니다. 서비스 계정과 관리 계정을 분리하고 필요한 권한만 부여합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 계정 저장 정보와 실행 중 프로세스의 자격 정보를 구분한다.
  2. 기본 그룹·보조 그룹·서비스 계정이 파일 접근에 미치는 영향을 설명한다.
  3. 그룹 변경이 기존 세션에 곧바로 반영되지 않는 이유를 추적한다.
먼저 알면 좋은 개념Linux 파일과 경로 읽기

01passwd·shadow·group이 담는 필드를 분해하기

  • /etc/의 한 줄은 이름:암호표시:UID:GID:설명:홈:로그인셸의 일곱 필드다.
  • 암호표시 x는 보통 암호 검증 자료가 에 따로 있다는 뜻이다.
  • /etc/는 와 암호 변경·만료 정보를 관리하므로 공개 본문이나 로그에 내용 자체를 옮기지 않는다.
  • /etc/은 그룹 이름과 GID, 보조 구성원을 담는다.
  • 사용자의 기본 GID는 에 있으므로 의 구성원 문자열에 없어도 해당 그룹을 기본 그룹으로 사용할 수 있다.
  • getent는 설정에 따라 로컬 파일뿐 아니라 SSSD· 등 외부 계정 공급자를 포함하여 조회한다.
  • 그래서 /etc/에 없다는 이유만으로 존재하지 않는 계정이라고 단정할 수 없다.
  • 커널은 파일 소유권에 문자열 이름이 아니라 숫자 UID/GID를 저장하며, ls가 그 숫자를 이름으로 바꾸어 표시한다.
  • 계정 이름을 바꾸는 작업과 저장된 숫자 식별자를 바꾸는 작업은 결과가 다르다.
bash
getent passwd learner
getent group team
id learner
# 설명용 passwd 한 줄
# learner:x:1500:1500:Lab user:/home/learner:/bin/bash

교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.

02계정을 만들 때 홈·셸·기본 그룹을 함께 정하는 이유

  • useradd -m은 홈을 만들고, -d는 홈 경로, -s는 로그인 셸, -u는 UID, -g는 기본 그룹, -G는 보조 그룹을 지정한다.
    • 배포판의 기본값과 /etc/skel 내용에 따라 생성 결과가 달라지므로 옵션 의미와 정책 파일을 분리해서 이해한다.
  • learner는 대화형으로 인증 암호를 설정하는 단계이며 계정 생성 자체가 항상 사용 가능한 암호를 만들어 주는 것은 아니다.
  • 서비스 계정은 사람의 대화형 로그인과 프로그램의 파일 접근을 분리한다.
  • 서비스 프로그램이 UID를 가질 필요는 있지만 일반 로그인 셸은 필요하지 않은 경우 nologin을 지정한다.
  • nologin은 정상적인 프로그램 경로이며 단순히 존재하지 않는 셸 경로를 적는 방식이 아니다.
  • 의 User=는 서비스가 어떤 UID로 실행되는지를 정하므로 서비스 계정의 로그인 허용 여부와 별개로 의미가 있다.
bash
# 별도 실습 VM에서 계정 생성 과정을 설명하는 예시
sudo useradd -m -s /bin/bash -c "Lab user" learner
sudo passwd learner
# 서비스 계정은 일반 로그인과 분리
sudo useradd --system --home-dir /srv/demo --shell /sbin/nologin demo

교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.

03기본 그룹과 보조 그룹은 새 프로세스의 자격 정보가 된다

  • 새 파일의 그룹은 보통 생성 의 유효 그룹과 부모 디렉터리의 setgid 정책 등에 의해 결정된다.
  • 기본 그룹은 계정의 기본값이고 보조 그룹은 추가 접근 범위다.
  • usermod -aG team learner는 기존 보조 그룹에 team을 추가하지만 -G team만 쓰면 목록을 지정한 집합으로 바꾼다.
    • -g는 기본 그룹을 바꾸므로 -G와 교환해서 쓸 수 없다.
  • 그룹 데이터베이스를 수정해도 이미 로그인한 셸의 커널 자격 정보가 모두 즉시 바뀌지는 않는다.
  • 새 로그인에서 다시 계산하거나 newgrp가 만드는 새 셸을 사용하면 변화가 나타난다.
  • id learner는 계정 데이터베이스의 상태를, 인자 없는 id는 현재 의 상태를 비교하는 데 도움이 된다.
  • 기본 그룹을 바꿀 때 usermod가 홈 아래 일부 소유 그룹을 바꾸는 동작이 있을 수 있지만 시스템 전체 파일과 실행 중 까지 모두 변환하는 작업은 아니다.
bash
id learner
id
sudo usermod -aG team learner
# 새 로그인 뒤 id로 실제 보조 그룹을 비교한다.

교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.

LEARN THROUGH PRACTICE

passwd 필드와 id 출력으로 로그인 자격 정보 추적하기

계정 레코드, 보조 그룹 소속, 실제 의 자격 정보를 서로 다른 증거로 읽는다.

실습 구성과 전제

  • 세 화면은 서로 다른 계정·시스템의 조회 사례다. 한 계정에 그룹을 추가한 연속 전후 사진이 아니다.
  • 계정 데이터는 읽기 전용으로 조회한다. 아래 labuser·labteam은 실제 계정명을 대신한 예시다.
  1. 계정 레코드의 필드를 나눈다

    • 형식은 이름:암호표시:UID:GID:설명:홈:셸이다. x는 보통 가 별도 데이터에 있다는 표시이며, 사용자 암호 자체가 아니다.
    • 서비스 계정의 nologin과 일반 계정의 bash를 비교하면 대화형 로그인 용도를 구분할 수 있다. 셸 설정만으로 모든 인증 방식이나 서비스 실행을 금지했다고 단정하지 않는다.
    bash
    getent passwd labuser
    getent group labteam

    계정·그룹 레코드를 조회한다. 해시를 출력할 필요는 없다.

    9/1 - beat, nessus · 실습·개념 참고 화면 25원본 크기로 보기 ↗
    • 화면의 레코드들은 콜론으로 구분되며 UID·GID·홈 경로·셸이 연속해 나온다.
    • 서비스 계정에는 nologin, 일반 계정에는 /bin/bash가 나타나므로 계정 목적에 따른 차이를 읽을 수 있다.
    확인 기준

    getent는 시스템의 이름 조회 설정을 따른다. /etc/에 없더라도 외부 계정 저장소에서 조회되는 계정이 있을 수 있다.

  2. 기본 그룹과 보조 그룹 목록을 대조한다

    • 첫 화면의 user2는 groups에 자신의 그룹 하나가 보인다. 두 번째 user1은 자신의 그룹과 tester가 함께 보인다. 이 둘은 서로 다른 계정의 구성 비교다.
    • 의 GID 한 필드만 읽어서는 보조 그룹까지 알 수 없다. id 대상계정 출력으로 전체 그룹 목록을 보완한다.
    Linux 사용자와 특수 권한 · 기본 그룹과 보조 그룹 (2)원본 크기로 보기 ↗
    • uid=1001, gid=1001이 표시된다.
    • groups에는 1001 그룹 하나만 나열되어 있다.
    Linux 사용자와 특수 권한 · 그룹 생성 및 관리 (6)원본 크기로 보기 ↗
    • 다른 계정의 기본 GID는 1002다.
    • groups에는 1002 외에 1003(tester)가 함께 나열된다.
    확인 기준

    동명이인 그룹을 피하려면 이름뿐 아니라 숫자 GID도 대조한다. 현재 셸의 그룹 상태와 조회 대상 계정의 목록도 구별한다.

  3. 새 로그인 전후를 프로세스 관점에서 확인한다

    • 보조 그룹을 바꾼 뒤 기존 셸이 자동으로 새 자격 정보를 얻는 것은 아니다. 새 세션은 계정 조회 결과를 바탕으로 새 의 그룹 목록을 설정한다.
    • id labuser와 인자 없는 id를 나란히 기록한다. 전자는 지정 계정의 소속 조회이고 후자는 명령을 실행한 현재 의 자격 정보이므로 결과가 다를 이유가 있다.
    bash
    id labuser
    id
    printf "effective UID: "; id -u
    printf "group IDs: "; id -G

    현재 세션과 지정 계정의 자격 정보 비교 예시다.

    확인 기준

    새로 로그인한 대상 계정에서 id를 다시 확인해 그룹이 반영되었는지 판단한다. 로 실행한 결과를 일반 로그인 상태와 섞지 않는다.

실습에서 확인한 동작 원리

  • 계정 레코드는 로그인에 사용할 신원 정보이고, 접근 판정에는 실행 중 의 자격 정보가 쓰인다.
  • 기본 GID 한 개와 보조 그룹 집합은 역할이 다르며, 그룹 변경의 적용 시점은 새 세션 생성과 연결된다.

설정·출력 추가로 확인하기 12장

아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.

실습 화면 묶음 01 1장
Linux 계정 전환과 비밀번호 설정원본 크기로 보기 ↗
  • 학습 원본 · Linux 계정 전환과 비밀번호 설정의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 02 1장
Linux 계정 전환과 비밀번호 설정원본 크기로 보기 ↗
  • 학습 원본 · Linux 계정 전환과 비밀번호 설정의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 03 10장
Linux 사용자와 특수 권한 · REAL UID, Effective UID (8)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「REAL UID, Effective UID」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · SetGID (9)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「SetGID」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · SetUID (7)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「SetUID」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · Sticky bit (11)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · Sticky bit (12)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · Sticky bit (13)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · 그룹 생성 및 관리 (3)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · 그룹 생성 및 관리 (4)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · 그룹 생성 및 관리 (5)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
Linux 사용자와 특수 권한 · 암호 설정 (1)원본 크기로 보기 ↗
  • 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「암호 설정」에 배치된 그림 또는 화면이다.
동작·명령 참고 문서
원리 심화

04계정 레코드가 실행 자격으로 바뀌는 경계

  • getent와 로그인 서비스는 등 설정된 조회 경로로 이름을 UID·GID와 연결한다. 파일 접근 때마다 커널이 에 계정 이름을 질의하는 구조는 아니다.
  • 에는 real/effective/saved UID·GID와 보조 그룹 집합 등이 있다. 파일 접근에는 의 fsuid/fsgid도 관계하며 일반적으로 effective 값과 함께 움직인다.
  • 한 자식은 부모의 자격 정보를 상속한다. 일반적인 로 다른 프로그램을 실행해도 보조 그룹을 계정 저장소에서 자동 갱신하지 않는다.
  • setuid 실행 파일이나 권한을 가진 로그인 도구는 정해진 규칙으로 자격을 바꿀 수 있다. 이를 모든 가 로그인 절차를 다시 수행한다는 뜻으로 확대하면 안 된다.
  • 계정 데이터베이스 수정은 새 세션 생성 시 참조할 입력을 바꾼다. 기존 장기 실행 서비스와 터미널의 권한을 바꾸려면 해당 실행 자격이 어떻게 새로 만들어지는지 따로 봐야 한다.
예제로 추적

05그룹 추가 전후의 세 가지 id 결과

  • 가상 계정 learner의 UID는 1200, 기본 GID는 1200이고 기존 셸의 보조 그룹은 1200뿐이라고 가정한다. reports의 GID는 1300이다.
  • 관리자가 learner를 reports 구성원으로 추가하면 계정 조회 id learner는 1300을 보여 줄 수 있다. 기존 셸의 인자 없는 id는 여전히 1200만 보일 수 있다.
  • 기존 셸에서 새 명령을 실행해도 부모의 그룹을 상속하므로 reports 파일에 대한 거부가 계속될 수 있다. 새 프로그램 실행과 새 로그인은 서로 다른 사건이다.
  • 새 로그인 절차가 현재 계정 정보를 읽어 그룹을 설정하면 1300이 포함된다. =1300, mode=0640 파일의 그룹 읽기를 사용할 수 있다.
  • 다른 호스트에서 reports가 GID 1400이라면 이름이 같아도 파일의 숫자 1300과 일치하지 않는다. ls -n과 id의 숫자를 함께 읽어 이름 표시의 착시를 제거한다.
관찰 대상변경 뒤 그룹 예의미
id learner1200,1300조회 저장소의 현재 정보
기존 셸의 id1200이미 생성된 실행 자격
새 로그인 셸의 id1200,1300갱신 정보를 반영한 자격
검증·예외

06인증 실패를 계정·자격·위임 단계로 구별하기

  • getent에 계정이 없다면 이름· 공급자·외부 조회 상태의 문제를 먼저 다룬다. 암호가 틀렸다는 결론은 계정 조회 결과만으로 나오지 않는다.
  • 저장된 암호 잠금 상태는 암호 인증의 근거다. 공개키와 이미 발급된 세션 등 다른 경로가 같은 조건으로 막히는지는 서비스· 정책에 달렸다.
  • 인증이 성공해도 파일의 UID/GID· 또는 명령 위임이 맞지 않으면 작업은 거부된다. 로그인 로그의 success를 후속 작업의 성공으로 합치지 않는다.
  • 인증 요구를 만족하는 것과 가 해당 대상 사용자·명령·인자를 허용하는 것은 별개다. 는 두 번째 권한을 자동으로 넓히지 않는다.
  • 이름을 삭제한 뒤에도 숫자 UID가 붙은 파일과 실행 는 남을 수 있다. 소유권 인계와 UID 재사용을 함께 관리해야 다른 계정으로 자료가 연결되는 일을 피할 수 있다.

07암호 잠금·암호 만료·계정 만료는 다른 상태다

  • -l은 일반적으로 저장된 암호 표현을 잠가 암호 인증을 막는 작업이다.
  • 이미 연결된 세션을 끊거나 모든 SSH 공개키·토큰을 자동 폐기하는 기능과 같지 않다.
  • chage -M은 암호 최대 사용 기간, -m은 최소 변경 간격, -W는 만료 전 경고 일수를 다룬다.
  • 계정 만료일은 암호 만료와 별도이며 과 서비스가 이 상태를 어떻게 검사하는지도 인증 경로에 영향을 준다.
  • 계정을 퇴역시키는 과정은 먼저 새 인증을 막고, 키·토큰과 위임 권한을 회수하며, 남은 세션·예약 작업·소유 파일의 를 처리한 뒤 계정을 제거하는 순서로 생각한다. 계정 레코드를 지워도 다른 디렉터리에 남은 UID 소유 파일이 모두 사라지는 것은 아니다.
  • UID를 재사용하면 새 계정이 그 파일의 소유자로 해석될 수 있으므로 숫자 식별자의 수명까지 고려한다.
bash
passwd -S learner
chage -l learner
# 공개 예시에서는 shadow 해시를 출력하지 않는다.

교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.

08sudoers의 대상과 실행 인자를 정확히 읽기

  • 는 누가, 어느 호스트에서, 누구로, 어떤 명령을 실행할 수 있는지 표현한다.
  • learner ALL=(root) /usr/bin/systemctl restart demo.service는 learner가 root로 해당 경로와 지정 인자에 맞는 명령을 실행하도록 위임하는 예다.
  • %team은 사용자 한 명 대신 그룹을 뜻한다.
    • 실제 실행 파일 경로와 서비스 이름은 배포 환경에 맞아야 한다.
  • visudo는 구문 검사를 포함한 편집 도구이며 -l은 현재 위임 내용을 보여 준다. 는 자체의 추가 암호 요구를 생략하는 태그이지 명령의 위험을 줄이는 설정이 아니다.
  • 셸·편집기·패키지 관리자처럼 다른 명령을 실행할 수 있는 도구나 사용자가 수정 가능한 스크립트를 root로 허용하면 좁은 위임처럼 보여도 권한 확대가 가능하다.
  • 단순한 명령 이름뿐 아니라 인자와 그 명령이 읽는 파일의 쓰기 권한까지 권한 모델에 포함한다.
text
# /etc/sudoers.d/demo의 교육용 한 줄
learner ALL=(root) /usr/bin/systemctl restart demo.service
# 구문 검사
sudo visudo -c

교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.

09로그인 사용자와 실행 주체 대조하기

  • 조회 시에는 현재 로그인 사용자와 실제 의 실행 사용자를 구분한다.
  • 관리 작업은 수행 주체와 결과를 기록하고, 공동으로 사용하는 하나의 관리자 계정보다 책임을 식별할 수 있는 계정을 사용한다.
bash
id
groups
getent passwd "$USER"

현재 계정의 식별자·그룹·계정 정보를 조회한다.

10계정 조회에서 프로세스 자격 정보까지

  • 계정 이름 operator와 보조 그룹 reports를 사용하는 예를 생각한다.
  • 계정 조회 계층은 로컬 파일이나 설정된 외부 디렉터리에서 이름에 대응하는 UID와 그룹 정보를 구한다.
  • 로그인 프로그램 등은 인증을 수행한 뒤 세션과 를 적절한 UID·GID·보조 그룹으로 시작한다.
  • 이후 파일 접근은 사용자가 입력한 계정 이름 문자열 자체보다 가 가진 자격 정보와 대상 소유권을 대조하는 방식으로 이루어진다.
  • 관리자가 계정 저장소에 reports 그룹 멤버십을 추가해도 실행 중인 모든 의 보조 그룹 목록이 자동으로 교체되지는 않는다.
  • 기존 셸과 그 자식은 이전 자격 정보를 계속 사용할 수 있고, 새 은 갱신된 그룹 정보를 받아 시작할 수 있다.
    • 서비스에도 같은 구분이 필요하다.
  • 저장소의 멤버십, 현재 터미널의 그룹, 서비스 의 그룹을 세 가지 관찰 대상으로 나누면 변경 직후의 혼란을 줄일 수 있다.
  1. 저장소와 기존 세션 모두 reports 그룹이 없다.
  2. 계정 멤버십은 갱신됐지만 기존 는 그대로다.
  3. 로그인 과정에서 갱신된 그룹 정보를 반영한다.
  4. 다른 조건이 같으면 새 세션은 그룹 권한으로 읽고 기존 세션은 거부될 수 있다.

설명과 함께 보는 보조 도식

처리 과정

그룹 변경 전후의 두 세션

reports 그룹을 추가한 뒤 기존 세션과 새 세션을 비교한다.

전체 단계를 한 번에 읽기
  1. 01

    변경 전

    저장소와 기존 세션 모두 reports 그룹이 없다.

    기존 그룹
    reports 없음
  2. 02

    저장소 변경

    계정 멤버십은 갱신됐지만 기존 프로세스는 그대로다.

    저장소
    reports 포함
    기존 세션
    이전 목록 유지
  3. 03

    새 세션 생성

    로그인 과정에서 갱신된 그룹 정보를 반영한다.

    새 그룹
    reports 포함
  4. 04

    접근 결과 비교

    다른 조건이 같으면 새 세션은 그룹 권한으로 읽고 기존 세션은 거부될 수 있다.

    차이의 원인
    프로세스 자격 정보
학습 모식도. 표시한 조건에서의 객체와 상태 변화를 설명하며 운영 환경의 모든 분기와 내부 구현은 생략한다.

11같은 이름으로 접속했는데 결과가 다른 경우

  • 터미널에서는 파일을 읽는데 서비스에서는 거부된다면 서비스의 User· 설정과 보조 그룹을 먼저 확인한다.
  • 로그인 셸 제한은 대화형 로그인을 막는 한 방법이지만 Samba 같은 별도 서비스의 인증 정책을 모두 대신하지 않는다.
    • 계정 비활성화가 어느 접속 경로에 적용되는지도 구분해야 한다.
  • 로컬 계정 파일만 보지 않고 getent로 시스템의 계정 조회 결과를 확인하면 외부 계정 구성을 놓칠 가능성이 줄어든다.
  • 파일을 다른 시스템으로 옮겼을 때 숫자 UID·GID와 이름 매핑이 달라지면 소유자가 예상과 다르게 보일 수 있다.
  • 사용자를 삭제하고 같은 이름으로 다시 만들어도 UID가 달라질 수 있으며, 남은 숫자 소유권이 새 계정과 뜻밖에 연결될 수도 있다.
    • 따라서 계정 수명 관리에는 홈 디렉터리, 예약 작업, 서비스 설정, 파일 소유권을 함께 기록한다.
  • 기록은 누가 어떤 권한으로 실행했는지 추적하되 실제 작업 성공 여부는 별도 로그로 확인한다.
구성·관찰 대상확인하는 정보구분할 문제
계정 조회 결과이름에 대응하는 UID·GID로컬·외부 저장소의 차이
현재 세션가 가진 그룹멤버십 갱신 전 세션
서비스 설정실행 사용자와 추가 그룹터미널과 서비스의 권한 차이
숫자 소유권파일의 UID·GID계정 재생성·시스템 간 이동
학습 확인

이해했는지 확인하기

  • UID·GID와 계정 이름을 구분한다.
  • 서비스에 대화형 로그인과 관리 권한이 필요한지 판단한다.
  • 그룹 변경이 현재 세션에 반영됐는지 확인한다.

함께 확인할 공식 자료