사용자 관리
Linux 시스템 사용자와 그룹의 생성, 수정, 삭제 및 관리 완벽 가이드
Linux 시스템 사용자와 그룹의 생성, 수정, 삭제 및 관리 완벽 가이드
목표: 사용자 계정 체계를 설계하고 관리할 수 있는 수준
👤 사용자 계정 기초
사용자 ID (UID) 체계
| UID 범위 | 사용자 유형 | 예시 |
|---|---|---|
| 0 | root (슈퍼유저) | root |
| 1-999 | 시스템 계정 | daemon, bin, www-data |
| 1000+ | 일반 사용자 | user, john, alice |
| 65534 | nobody (권한 없음) | nobody |
주요 설정 파일
/etc/passwd — 사용자 기본 정보
username:password:UID:GID:GECOS:home_directory:shell
예시:
john:x:1000:1000:John Doe:/home/john:/bin/bash
필드 설명:
| 필드 | 의미 | 예시 |
|---|---|---|
| 1 | 사용자명 | john |
| 2 | 비밀번호 (x = /etc/shadow 사용) | x |
| 3 | UID | 1000 |
| 4 | GID (기본 그룹) | 1000 |
| 5 | GECOS (전체 이름/설명) | John Doe |
| 6 | 홈 디렉토리 | /home/john |
| 7 | 기본 셸 | /bin/bash |
/etc/shadow — 비밀번호 및 계정 정책
username:password_hash:last_change:min:max:warn:inactive:expire:reserved
예시:
john:$6$rounds=5000$salt$hash...:19000:0:99999:7:::
필드 설명:
| 필드 | 의미 | 예시 |
|---|---|---|
| 1 | 사용자명 | john |
| 2 | 비밀번호 해시 | $6$… (SHA-512) |
| 3 | 마지막 변경일 (1970.1.1 기준) | 19000 |
| 4 | 최소 사용일 (변경 후) | 0 |
| 5 | 최대 사용일 (변경 필요) | 99999 |
| 6 | 경고 기간 (만료 전) | 7 |
| 7 | 비활성 기간 | (비어있음) |
| 8 | 계정 만료일 | (비어있음) |
| 9 | 예약 | (비어있음) |
/etc/group — 그룹 정보
groupname:password:GID:member_list
예시:
devteam:x:1001:john,alice,bob
🛠️ 사용자 관리 명령어
useradd — 사용자 생성
# 기본 생성
useradd username
# 홈 디렉토리 생성
useradd -m username
# 특정 셸 지정
useradd -m -s /bin/bash username
# 특정 UID 지정
useradd -u 1500 username
# 특정 그룹 지정
useradd -g devteam username
# 보조 그룹 추가
useradd -G sudo,docker username
# 설명 추가
useradd -c "John Doe" username
# 계정 만료일 설정
useradd -e 2026-12-31 username
# 완전한 예시
useradd -m -s /bin/bash -u 1500 -g devteam -G sudo,docker -c "John Doe" john
주요 옵션:
| 옵션 | 의미 |
|---|---|
-m | 홈 디렉토리 생성 |
-s | 기본 셸 지정 |
-u | UID 지정 |
-g | 기본 그룹 지정 (GID 또는 그룹명) |
-G | 보조 그룹 지정 (쉼표 구분) |
-c | 설명 (GECOS 필드) |
-e | 계정 만료일 (YYYY-MM-DD) |
-f | 비활성 기간 (일) |
-d | 홈 디렉토리 경로 지정 |
-M | 홈 디렉토리 생성 안함 |
-N | 기본 그룹 자동 생성 안함 |
-r | 시스템 계정 생성 (UID 1-999) |
usermod — 사용자 수정
# 사용자명 변경
usermod -l newname oldname
# 홈 디렉토리 변경
usermod -d /new/home -m username
# 셸 변경
usermod -s /bin/zsh username
# 그룹 변경
usermod -g newgroup username
# 보조 그룹 추가 (기존 그룹 유지)
usermod -aG docker username
# 보조 그룹 교체 (주의!)
usermod -G sudo,docker username
# 설명 변경
usermod -c "New Description" username
# UID 변경 (파일 소유권도 함께 변경)
usermod -u 2000 username
find / -user 1000 -exec chown 2000 {} \;
# 계정 잠금
usermod -L username
# 계정 잠금 해제
usermod -U username
# 계정 만료일 설정
usermod -e 2026-12-31 username
주의사항:
-G옵션은 보조 그룹을 교체함 (기존 그룹 제거)- 기존 그룹에 추가하려면 반드시
-aG사용 - UID 변경 시 파일 소유권도 함께 변경해야 함
userdel — 사용자 삭제
# 기본 삭제 (홈 디렉토리 유지)
userdel username
# 홈 디렉토리와 메일 스풀 함께 삭제
userdel -r username
# 강제 삭제 (로그인 중인 사용자도)
userdel -f username
passwd — 비밀번호 관리
# 자신의 비밀번호 변경
passwd
# root가 다른 사용자 비밀번호 변경
passwd username
# 비밀번호 잠금
passwd -l username
# 비밀번호 잠금 해제
passwd -u username
# 비밀번호 상태 확인
passwd -S username
# 비밀번호 즉시 만료 (다음 로그인 시 변경 강제)
passwd -e username
# 최소 사용일 설정
passwd -n 7 username
# 최대 사용일 설정
passwd -x 90 username
# 경고 기간 설정
passwd -w 7 username
👥 그룹 관리
groupadd — 그룹 생성
# 기본 생성
groupadd groupname
# 특정 GID 지정
groupadd -g 1500 groupname
# 시스템 그룹 생성
groupadd -r groupname
groupmod — 그룹 수정
# 그룹명 변경
groupmod -n newname oldname
# GID 변경
groupmod -g 2000 groupname
groupdel — 그룹 삭제
groupdel groupname
주의: 기본 그룹으로 사용 중이면 삭제 불가
gpasswd — 그룹 비밀번호 및 관리
# 그룹 관리자 설정
gpasswd -A username groupname
# 그룹 멤버 추가
gpasswd -a username groupname
# 그룹 멤버 제거
gpasswd -d username groupname
# 그룹 비밀번호 설정
gpasswd groupname
🔍 사용자 정보 확인
id — 사용자 ID 정보
id # 현재 사용자
id username # 특정 사용자
id -u # UID만
id -g # GID만
id -G # 모든 그룹 ID
id -un # 사용자명만
id -gn # 기본 그룹명만
whoami / who / w — 로그인 정보
whoami # 현재 사용자명
who # 로그인한 사용자 목록
who -a # 상세 정보
w # 로그인 사용자 + 현재 작업
last # 최근 로그인 기록
last username # 특정 사용자 로그인 기록
lastb # 실패한 로그인 시도
finger — 사용자 정보 (설치 필요)
apt-get install finger # Debian/Ubuntu
yum install finger # RHEL/CentOS
finger username # 사용자 상세 정보
🔄 사용자 환경 설정
홈 디렉토리 구조
/home/username/
├── .bashrc # Bash 설정 (대화형 셸)
├── .bash_profile # Bash 설정 (로그인 셸)
├── .bash_logout # 로그아웃 시 실행
├── .profile # 범용 셸 설정
├── .zshrc # Zsh 설정
├── .vimrc # Vim 설정
├── .ssh/ # SSH 키 및 설정
│ ├── authorized_keys
│ ├── id_rsa
│ └── known_hosts
├── .config/ # XDG 설정 디렉토리
└── .local/ # 사용자 로컬 데이터
스켈레톤 파일 (/etc/skel)
새 사용자 생성 시 복사되는 기본 파일들
# skel 디렉토리 확인
ls -la /etc/skel/
# skel 파일 수정 (새 사용자에게 적용)
cp custom-config /etc/skel/.config/
로그인 셸 vs 비로그인 셸
로그인 셸:
- SSH 접속, 콘솔 로그인
- 실행 순서:
/etc/profile→~/.bash_profile→~/.bashrc
비로그인 셸 (대화형):
- 터미널 에뮬레이터
- 실행:
~/.bashrc
비대화형:
- 스크립트 실행
- 환경변수 상속만
🛡️ 계정 보안
계정 잠금 정책
# 실패한 로그인 횟수 제한 (PAM 설정)
# /etc/pam.d/common-auth (Debian/Ubuntu)
# /etc/pam.d/system-auth (RHEL/CentOS)
auth required pam_tally2.so deny=5 unlock_time=900
# 계정 잠금 상태 확인
pam_tally2 --user=username
# 계정 잠금 해제
pam_tally2 --user=username --reset
세션 타임아웃 설정
# /etc/profile 또는 ~/.bashrc
export TMOUT=600 # 10분 비활성 시 자동 로그아웃
# SSH 세션 타임아웃
# /etc/ssh/sshd_config
ClientAliveInterval 300
ClientAliveCountMax 2
비밀번호 정책
# /etc/login.defs 수정
PASS_MAX_DAYS 90 # 최대 사용일
PASS_MIN_DAYS 7 # 최소 사용일
PASS_MIN_LEN 12 # 최소 길이
PASS_WARN_AGE 7 # 만료 경고일
# PAM 비밀번호 복잡성 (libpam-pwquality)
# /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
📝 실전 예시
웹 개발팀 계정 설정
#!/bin/bash
# create_dev_user.sh
USERNAME=$1
FULLNAME=$2
# 그룹 생성 (없으면)
getent group devteam >/dev/null || groupadd devteam
getent group docker >/dev/null || groupadd docker
# 사용자 생성
useradd -m -s /bin/bash -g devteam -G docker,sudo -c "$FULLNAME" $USERNAME
# 비밀번호 설정 (임시 비밀번호)
passwd $USERNAME
# 홈 디렉토리 권한 설정
chmod 700 /home/$USERNAME
# 개발 도구 설정 복사
cp -r /etc/skel/dev-configs/* /home/$USERNAME/
chown -R $USERNAME:devteam /home/$USERNAME/
echo "User $USERNAME created successfully!"
echo "Groups: devteam, docker, sudo"
사용자 일괄 생성
#!/bin/bash
# bulk_create_users.sh
while IFS=',' read -r username fullname; do
useradd -m -s /bin/bash -c "$fullname" "$username"
echo "$username:TempPass123!" | chpasswd
chage -d 0 "$username" # 다음 로그인 시 비밀번호 변경 강제
done < users.csv
퇴사자 계정 처리
#!/bin/bash
# disable_user.sh
USERNAME=$1
# 1. 계정 잠금
usermod -L $USERNAME
# 2. SSH 접근 차단
echo "DenyUsers $USERNAME" >> /etc/ssh/sshd_config
systemctl reload sshd
# 3. 홈 디렉토리 백업
tar czf /backup/users/${USERNAME}_$(date +%Y%m%d).tar.gz /home/$USERNAME/
# 4. 프로세스 종료
pkill -u $USERNAME
# 5. (30일 후) 계정 삭제
# userdel -r $USERNAME
echo "User $USERNAME has been disabled"
🔗 관련 노트
- 01-02-파일-권한-관리 — 권한 상세 가이드
- 01-03-사용자-관리 — 권한 위임
- 01-03-사용자-관리 — Pluggable Authentication Modules
- 02-04-네트워크-설정 — SSH 키 관리
- 03-03-보안-하드닝 — 보안 강화
마지막 업데이트: 2026-06-01