사용자·그룹과 최소 권한
사용자 이름은 식별자를 읽기 쉽게 표현한 것입니다. 서비스 계정과 관리 계정을 분리하고 필요한 권한만 부여합니다.
개념부터 찾아보기
정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.
이 노트에서 설명할 수 있게 되는 것
- 계정 저장 정보와 실행 중 프로세스의 자격 정보를 구분한다.
- 기본 그룹·보조 그룹·서비스 계정이 파일 접근에 미치는 영향을 설명한다.
- 그룹 변경이 기존 세션에 곧바로 반영되지 않는 이유를 추적한다.
01passwd·shadow·group이 담는 필드를 분해하기
- 의 일곱 필드/etc/의 한 줄은 이름:암호표시:UID:GID:설명:홈:로그인셸의 일곱 필드다.
- 암호표시 x암호표시 x는 보통 암호 검증 자료가 에 따로 있다는 뜻이다.
- /etc//etc/는 와 암호 변경·만료 정보를 관리하므로 공개 본문이나 로그에 내용 자체를 옮기지 않는다.
- /etc/·그룹/etc/은 그룹 이름과 GID, 보조 구성원을 담는다.
- GID사용자의 기본 GID는 에 있으므로 의 구성원 문자열에 없어도 해당 그룹을 기본 그룹으로 사용할 수 있다.
- getent는 설정에 따라 로컬 파일뿐 아니라 SSSD· 등 외부 계정 공급자를 포함하여 조회한다.
- 로컬 파일과 계정 조회그래서 /etc/에 없다는 이유만으로 존재하지 않는 계정이라고 단정할 수 없다.
- UID·GID커널은 파일 소유권에 문자열 이름이 아니라 숫자 UID/GID를 저장하며, ls가 그 숫자를 이름으로 바꾸어 표시한다.
- 계정계정 이름을 바꾸는 작업과 저장된 숫자 식별자를 바꾸는 작업은 결과가 다르다.
getent passwd learner
getent group team
id learner
# 설명용 passwd 한 줄
# learner:x:1500:1500:Lab user:/home/learner:/bin/bash교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.
02계정을 만들 때 홈·셸·기본 그룹을 함께 정하는 이유
- 로그인 셸·UIDuseradd -m은 홈을 만들고, -d는 홈 경로, -s는 로그인 셸, -u는 UID, -g는 기본 그룹, -G는 보조 그룹을 지정한다.
- 배포판의 기본값과 /etc/skel 내용에 따라 생성 결과가 달라지므로 옵션 의미와 정책 파일을 분리해서 이해한다.
- 계정 learner는 대화형으로 인증 암호를 설정하는 단계이며 계정 생성 자체가 항상 사용 가능한 암호를 만들어 주는 것은 아니다.
- 서비스 계정·로그인서비스 계정은 사람의 대화형 로그인과 프로그램의 파일 접근을 분리한다.
- UID서비스 프로그램이 UID를 가질 필요는 있지만 일반 로그인 셸은 필요하지 않은 경우 nologin을 지정한다.
- nologinnologin은 정상적인 프로그램 경로이며 단순히 존재하지 않는 셸 경로를 적는 방식이 아니다.
- UID·서비스 계정의 User=는 서비스가 어떤 UID로 실행되는지를 정하므로 서비스 계정의 로그인 허용 여부와 별개로 의미가 있다.
# 별도 실습 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 정책 등에 의해 결정된다.
- 기본 그룹·계정기본 그룹은 계정의 기본값이고 보조 그룹은 추가 접근 범위다.
- usermodusermod -aG team learner는 기존 보조 그룹에 team을 추가하지만 -G team만 쓰면 목록을 지정한 집합으로 바꾼다.
- -g는 기본 그룹을 바꾸므로 -G와 교환해서 쓸 수 없다.
- 그룹그룹 데이터베이스를 수정해도 이미 로그인한 셸의 커널 자격 정보가 모두 즉시 바뀌지는 않는다.
- 로그인새 로그인에서 다시 계산하거나 newgrp가 만드는 새 셸을 사용하면 변화가 나타난다.
- id·계정id learner는 계정 데이터베이스의 상태를, 인자 없는 id는 현재 의 상태를 비교하는 데 도움이 된다.
- 기본 그룹·usermod기본 그룹을 바꿀 때 usermod가 홈 아래 일부 소유 그룹을 바꾸는 동작이 있을 수 있지만 시스템 전체 파일과 실행 중 까지 모두 변환하는 작업은 아니다.
id learner
id
sudo usermod -aG team learner
# 새 로그인 뒤 id로 실제 보조 그룹을 비교한다.교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.
passwd 필드와 id 출력으로 로그인 자격 정보 추적하기
계정 레코드, 보조 그룹 소속, 실제 의 자격 정보를 서로 다른 증거로 읽는다.
실습 구성과 전제
- 세 화면은 서로 다른 계정·시스템의 조회 사례다. 한 계정에 그룹을 추가한 연속 전후 사진이 아니다.
- 계정 데이터는 읽기 전용으로 조회한다. 아래 labuser·labteam은 실제 계정명을 대신한 예시다.
계정 레코드의 필드를 나눈다
- 형식은 이름:암호표시:UID:GID:설명:홈:셸이다. x는 보통 가 별도 데이터에 있다는 표시이며, 사용자 암호 자체가 아니다.
- 서비스 계정의 nologin과 일반 계정의 bash를 비교하면 대화형 로그인 용도를 구분할 수 있다. 셸 설정만으로 모든 인증 방식이나 서비스 실행을 금지했다고 단정하지 않는다.
bashgetent passwd labuser getent group labteam계정·그룹 레코드를 조회한다. 해시를 출력할 필요는 없다.
원본 크기로 보기 ↗- 화면의 레코드들은 콜론으로 구분되며 UID·GID·홈 경로·셸이 연속해 나온다.
- 서비스 계정에는 nologin, 일반 계정에는 /bin/bash가 나타나므로 계정 목적에 따른 차이를 읽을 수 있다.
확인 기준getent는 시스템의 이름 조회 설정을 따른다. /etc/에 없더라도 외부 계정 저장소에서 조회되는 계정이 있을 수 있다.
기본 그룹과 보조 그룹 목록을 대조한다
- 첫 화면의 user2는 groups에 자신의 그룹 하나가 보인다. 두 번째 user1은 자신의 그룹과 tester가 함께 보인다. 이 둘은 서로 다른 계정의 구성 비교다.
- 의 GID 한 필드만 읽어서는 보조 그룹까지 알 수 없다. id 대상계정 출력으로 전체 그룹 목록을 보완한다.
원본 크기로 보기 ↗- uid=1001, gid=1001이 표시된다.
- groups에는 1001 그룹 하나만 나열되어 있다.
원본 크기로 보기 ↗- 다른 계정의 기본 GID는 1002다.
- groups에는 1002 외에 1003(tester)가 함께 나열된다.
확인 기준동명이인 그룹을 피하려면 이름뿐 아니라 숫자 GID도 대조한다. 현재 셸의 그룹 상태와 조회 대상 계정의 목록도 구별한다.
새 로그인 전후를 프로세스 관점에서 확인한다
- 보조 그룹을 바꾼 뒤 기존 셸이 자동으로 새 자격 정보를 얻는 것은 아니다. 새 세션은 계정 조회 결과를 바탕으로 새 의 그룹 목록을 설정한다.
- id labuser와 인자 없는 id를 나란히 기록한다. 전자는 지정 계정의 소속 조회이고 후자는 명령을 실행한 현재 의 자격 정보이므로 결과가 다를 이유가 있다.
bashid labuser id printf "effective UID: "; id -u printf "group IDs: "; id -G현재 세션과 지정 계정의 자격 정보 비교 예시다.
확인 기준새로 로그인한 대상 계정에서 id를 다시 확인해 그룹이 반영되었는지 판단한다. 로 실행한 결과를 일반 로그인 상태와 섞지 않는다.
실습에서 확인한 동작 원리
- 계정 레코드는 로그인에 사용할 신원 정보이고, 접근 판정에는 실행 중 의 자격 정보가 쓰인다.
- 기본 GID 한 개와 보조 그룹 집합은 역할이 다르며, 그룹 변경의 적용 시점은 새 세션 생성과 연결된다.
설정·출력 추가로 확인하기 12장
아래 화면을 펼쳐 위 실습의 설정값, 명령과 확인 기준을 비교해 보세요. 각 묶음은 별도 실습 기록입니다.
실습 화면 묶음 01 1장
원본 크기로 보기 ↗- 학습 원본 · Linux 계정 전환과 비밀번호 설정의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 02 1장
원본 크기로 보기 ↗- 학습 원본 · Linux 계정 전환과 비밀번호 설정의 해당 절에 수록된 화면·도식이다.
실습 화면 묶음 03 10장
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「REAL UID, Effective UID」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「SetGID」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「SetUID」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「Sticky bit」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·UID·SetUID·SetGID·Sticky bit 동작. 원문에서 「그룹 생성 및 관리」에 배치된 그림 또는 화면이다.
원본 크기로 보기 ↗- 수업 원본 자료 · 사용자·그룹·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 learner | 1200,1300 | 조회 저장소의 현재 정보 |
| 기존 셸의 id | 1200 | 이미 생성된 실행 자격 |
| 새 로그인 셸의 id | 1200,1300 | 갱신 정보를 반영한 자격 |
06인증 실패를 계정·자격·위임 단계로 구별하기
- 계정 조회 실패getent에 계정이 없다면 이름· 공급자·외부 조회 상태의 문제를 먼저 다룬다. 암호가 틀렸다는 결론은 계정 조회 결과만으로 나오지 않는다.
- 암호와 다른 인증저장된 암호 잠금 상태는 암호 인증의 근거다. 공개키와 이미 발급된 세션 등 다른 경로가 같은 조건으로 막히는지는 서비스· 정책에 달렸다.
- 로그인 뒤 접근 거부인증이 성공해도 파일의 UID/GID· 또는 명령 위임이 맞지 않으면 작업은 거부된다. 로그인 로그의 success를 후속 작업의 성공으로 합치지 않는다.
- 의 두 권한 인증 요구를 만족하는 것과 가 해당 대상 사용자·명령·인자를 허용하는 것은 별개다. 는 두 번째 권한을 자동으로 넓히지 않는다.
- 계정 제거 뒤 자료이름을 삭제한 뒤에도 숫자 UID가 붙은 파일과 실행 는 남을 수 있다. 소유권 인계와 UID 재사용을 함께 관리해야 다른 계정으로 자료가 연결되는 일을 피할 수 있다.
07암호 잠금·암호 만료·계정 만료는 다른 상태다
- -l -l은 일반적으로 저장된 암호 표현을 잠가 암호 인증을 막는 작업이다.
- 세션이미 연결된 세션을 끊거나 모든 SSH 공개키·토큰을 자동 폐기하는 기능과 같지 않다.
- chage -Mchage -M은 암호 최대 사용 기간, -m은 최소 변경 간격, -W는 만료 전 경고 일수를 다룬다.
- 계정 만료·암호 만료계정 만료일은 암호 만료와 별도이며 과 서비스가 이 상태를 어떻게 검사하는지도 인증 경로에 영향을 준다.
- 계정계정을 퇴역시키는 과정은 먼저 새 인증을 막고, 키·토큰과 위임 권한을 회수하며, 남은 세션·예약 작업·소유 파일의 를 처리한 뒤 계정을 제거하는 순서로 생각한다. 계정 레코드를 지워도 다른 디렉터리에 남은 UID 소유 파일이 모두 사라지는 것은 아니다.
- UID·계정UID를 재사용하면 새 계정이 그 파일의 소유자로 해석될 수 있으므로 숫자 식별자의 수명까지 고려한다.
passwd -S learner
chage -l learner
# 공개 예시에서는 shadow 해시를 출력하지 않는다.교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.
08sudoers의 대상과 실행 인자를 정확히 읽기
- 는 누가, 어느 호스트에서, 누구로, 어떤 명령을 실행할 수 있는지 표현한다.
- 명령·인자 위임learner ALL=(root) /usr/bin/systemctl restart demo.service는 learner가 root로 해당 경로와 지정 인자에 맞는 명령을 실행하도록 위임하는 예다.
- 그룹%team은 사용자 한 명 대신 그룹을 뜻한다.
- 실제 실행 파일 경로와 서비스 이름은 배포 환경에 맞아야 한다.
- 정책 검사·visudo는 구문 검사를 포함한 편집 도구이며 -l은 현재 위임 내용을 보여 준다. 는 자체의 추가 암호 요구를 생략하는 태그이지 명령의 위험을 줄이는 설정이 아니다.
- 위임 명령의 확장 권한셸·편집기·패키지 관리자처럼 다른 명령을 실행할 수 있는 도구나 사용자가 수정 가능한 스크립트를 root로 허용하면 좁은 위임처럼 보여도 권한 확대가 가능하다.
- 명령·인자·기능 범위단순한 명령 이름뿐 아니라 인자와 그 명령이 읽는 파일의 쓰기 권한까지 권한 모델에 포함한다.
# /etc/sudoers.d/demo의 교육용 한 줄
learner ALL=(root) /usr/bin/systemctl restart demo.service
# 구문 검사
sudo visudo -c교육용 예시. 표시된 결과는 설명을 위한 예시이며 실제 실행 기록이 아니다.
09로그인 사용자와 실행 주체 대조하기
- 로그인·조회 시에는 현재 로그인 사용자와 실제 의 실행 사용자를 구분한다.
- 계정관리 작업은 수행 주체와 결과를 기록하고, 공동으로 사용하는 하나의 관리자 계정보다 책임을 식별할 수 있는 계정을 사용한다.
id
groups
getent passwd "$USER"현재 계정의 식별자·그룹·계정 정보를 조회한다.
10계정 조회에서 프로세스 자격 정보까지
- 계정·보조 그룹계정 이름 operator와 보조 그룹 reports를 사용하는 예를 생각한다.
- 계정계정 조회 계층은 로컬 파일이나 설정된 외부 디렉터리에서 이름에 대응하는 UID와 그룹 정보를 구한다.
- 로그인로그인 프로그램 등은 인증을 수행한 뒤 세션과 를 적절한 UID·GID·보조 그룹으로 시작한다.
- 계정·이후 파일 접근은 사용자가 입력한 계정 이름 문자열 자체보다 가 가진 자격 정보와 대상 소유권을 대조하는 방식으로 이루어진다.
- 계정·그룹관리자가 계정 저장소에 reports 그룹 멤버십을 추가해도 실행 중인 모든 의 보조 그룹 목록이 자동으로 교체되지는 않는다.
- 로그인·세션기존 셸과 그 자식은 이전 자격 정보를 계속 사용할 수 있고, 새 은 갱신된 그룹 정보를 받아 시작할 수 있다.
- 서비스에도 같은 구분이 필요하다.
- 그룹·저장소의 멤버십, 현재 터미널의 그룹, 서비스 의 그룹을 세 가지 관찰 대상으로 나누면 변경 직후의 혼란을 줄일 수 있다.
- 변경 전저장소와 기존 세션 모두 reports 그룹이 없다.
- 저장소 변경계정 멤버십은 갱신됐지만 기존 는 그대로다.
- 새 세션 생성로그인 과정에서 갱신된 그룹 정보를 반영한다.
- 접근 결과 비교다른 조건이 같으면 새 세션은 그룹 권한으로 읽고 기존 세션은 거부될 수 있다.
설명과 함께 보는 보조 도식
그룹 변경 전후의 두 세션
reports 그룹을 추가한 뒤 기존 세션과 새 세션을 비교한다.
변경 전
저장소와 기존 세션 모두 reports 그룹이 없다.
- 기존 그룹
- reports 없음
전체 단계를 한 번에 읽기
- 01
변경 전
저장소와 기존 세션 모두 reports 그룹이 없다.
- 기존 그룹
- reports 없음
- 02
저장소 변경
계정 멤버십은 갱신됐지만 기존 프로세스는 그대로다.
- 저장소
- reports 포함
- 기존 세션
- 이전 목록 유지
- 03
새 세션 생성
로그인 과정에서 갱신된 그룹 정보를 반영한다.
- 새 그룹
- reports 포함
- 04
접근 결과 비교
다른 조건이 같으면 새 세션은 그룹 권한으로 읽고 기존 세션은 거부될 수 있다.
- 차이의 원인
- 프로세스 자격 정보
11같은 이름으로 접속했는데 결과가 다른 경우
- 보조 그룹터미널에서는 파일을 읽는데 서비스에서는 거부된다면 서비스의 User· 설정과 보조 그룹을 먼저 확인한다.
- 로그인 셸로그인 셸 제한은 대화형 로그인을 막는 한 방법이지만 Samba 같은 별도 서비스의 인증 정책을 모두 대신하지 않는다.
- 계정 비활성화가 어느 접속 경로에 적용되는지도 구분해야 한다.
- 계정로컬 계정 파일만 보지 않고 getent로 시스템의 계정 조회 결과를 확인하면 외부 계정 구성을 놓칠 가능성이 줄어든다.
- UID·GID파일을 다른 시스템으로 옮겼을 때 숫자 UID·GID와 이름 매핑이 달라지면 소유자가 예상과 다르게 보일 수 있다.
- UID사용자를 삭제하고 같은 이름으로 다시 만들어도 UID가 달라질 수 있으며, 남은 숫자 소유권이 새 계정과 뜻밖에 연결될 수도 있다.
- 따라서 계정 수명 관리에는 홈 디렉터리, 예약 작업, 서비스 설정, 파일 소유권을 함께 기록한다.
- 권한 위임과 작업 결과 기록은 누가 어떤 권한으로 실행했는지 추적하되 실제 작업 성공 여부는 별도 로그로 확인한다.
| 구성·관찰 대상 | 확인하는 정보 | 구분할 문제 |
|---|---|---|
| 계정 조회 결과 | 이름에 대응하는 UID·GID | 로컬·외부 저장소의 차이 |
| 현재 세션 | 가 가진 그룹 | 멤버십 갱신 전 세션 |
| 서비스 설정 | 실행 사용자와 추가 그룹 | 터미널과 서비스의 권한 차이 |
| 숫자 소유권 | 파일의 UID·GID | 계정 재생성·시스템 간 이동 |
이해했는지 확인하기
- UID·GID와 계정 이름을 구분한다.
- 서비스에 대화형 로그인과 관리 권한이 필요한지 판단한다.
- 그룹 변경이 현재 세션에 반영됐는지 확인한다.