Linux 서버 관리 완전 정복 2편: 사용자와 권한 관리
Linux Server Administration Complete Guide Part 2
Linux 서버 관리 완전 정복 시리즈
1편: 기초와 파일 시스템 | 2편: 사용자와 권한 관리 (현재) | 3편: 패키지 관리와 서비스
들어가며: 왜 사용자 관리가 중요한가?
Linux는 다중 사용자 운영체제입니다. 여러 사용자가 동시에 시스템에 접근할 수 있으며, 각 사용자는 고유한 권한과 작업 공간을 가집니다. 서버 보안의 첫 번째 방어선은 바로 적절한 사용자 관리와 권한 설정입니다.
이번 편에서는 사용자 계정 생성부터 그룹 관리, 파일 권한 설정, 특수 권한, sudo 설정까지 실무에서 반드시 알아야 할 내용을 다룹니다.
1. 사용자 계정 이해하기
1.1 사용자 유형
- root 사용자: UID 0, 시스템의 모든 권한을 가진 슈퍼유저
- 시스템 사용자: UID 1-999, 서비스 실행용 계정 (nginx, mysql 등)
- 일반 사용자: UID 1000 이상, 실제 사람이 사용하는 계정
1.2 사용자 정보 파일
# /etc/passwd - 사용자 기본 정보
username:x:1000:1000:Full Name:/home/username:/bin/bash
# 필드: 사용자명:암호위치:UID:GID:설명:홈디렉토리:기본쉘
# /etc/shadow - 암호화된 비밀번호 (root만 접근 가능)
username:$6$salt$encrypted:19000:0:99999:7:::
# 필드: 사용자명:암호화된비밀번호:마지막변경일:최소사용일:최대사용일:경고기간:...
1.3 사용자 정보 확인
# 현재 사용자 확인
whoami
id
# 특정 사용자 정보
id username
getent passwd username
# 로그인 중인 사용자
who
w
2. 사용자 계정 관리
2.1 사용자 생성
# 기본 사용자 생성
sudo useradd username
# 옵션을 지정하여 생성
sudo useradd -m -d /home/devuser -s /bin/bash -c "Developer Account" devuser
# -m: 홈 디렉토리 생성
# -d: 홈 디렉토리 경로 지정
# -s: 기본 쉘 지정
# -c: 설명(코멘트)
# 비밀번호 설정
sudo passwd devuser
2.2 사용자 수정
# 사용자 정보 수정
sudo usermod -c "Updated Comment" username
sudo usermod -s /bin/zsh username # 쉘 변경
sudo usermod -d /new/home username # 홈 디렉토리 변경
sudo usermod -l newname oldname # 사용자명 변경
sudo usermod -aG groupname username # 그룹에 추가 (-a 필수!)
# 계정 잠금/해제
sudo usermod -L username # 잠금
sudo usermod -U username # 해제
2.3 사용자 삭제
# 사용자만 삭제 (홈 디렉토리 유지)
sudo userdel username
# 사용자와 홈 디렉토리 함께 삭제
sudo userdel -r username
3. 그룹 관리
3.1 그룹 이해하기
그룹은 여러 사용자를 묶어 권한을 일괄 관리하는 단위입니다. 각 사용자는 하나의 기본 그룹(primary group)과 여러 보조 그룹(secondary groups)에 속할 수 있습니다.
# /etc/group - 그룹 정보
groupname:x:1000:user1,user2,user3
# 필드: 그룹명:비밀번호:GID:멤버목록
3.2 그룹 관리 명령어
# 그룹 생성
sudo groupadd developers
sudo groupadd -g 2000 devops # GID 지정
# 그룹 수정
sudo groupmod -n newname oldname # 이름 변경
sudo groupmod -g 2001 groupname # GID 변경
# 그룹 삭제
sudo groupdel groupname
# 그룹 멤버 확인
getent group developers
groups username
3.3 그룹 활용 예시
# 개발팀 그룹 생성 및 사용자 추가
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
# 공유 디렉토리 설정
sudo mkdir /srv/project
sudo chgrp developers /srv/project
sudo chmod 2775 /srv/project
4. 파일 권한 심화
4.1 권한 구조 복습
-rwxr-xr-- 1 owner group 1024 Jan 21 10:00 file.txt
│└─┬┘└─┬┘└─┬┘
│ │ │ └── 기타(Others): r-- (읽기만)
│ │ └────── 그룹(Group): r-x (읽기, 실행)
│ └────────── 소유자(Owner): rwx (읽기, 쓰기, 실행)
└───────────── 파일 타입: - (일반 파일)
4.2 chmod - 권한 변경
# 숫자 방식 (Octal)
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 700 private/ # rwx------
chmod 777 public/ # rwxrwxrwx (보안상 권장하지 않음)
# 기호 방식 (Symbolic)
chmod u+x script.sh # 소유자에게 실행 권한 추가
chmod g-w file.txt # 그룹에서 쓰기 권한 제거
chmod o=r file.txt # 기타 사용자 권한을 읽기만으로 설정
chmod a+r file.txt # 모든 사용자에게 읽기 권한 추가
chmod u=rwx,g=rx,o=r file # 복합 설정
# 재귀적 적용
chmod -R 755 directory/
4.3 chown - 소유권 변경
# 소유자 변경
sudo chown newowner file.txt
# 소유자와 그룹 동시 변경
sudo chown newowner:newgroup file.txt
# 그룹만 변경
sudo chown :newgroup file.txt
sudo chgrp newgroup file.txt
# 재귀적 적용
sudo chown -R webuser:www-data /var/www/
5. 특수 권한
5.1 SUID (Set User ID)
실행 파일에 설정하면, 실행 시 파일 소유자의 권한으로 실행됩니다.
# SUID 설정
chmod u+s program
chmod 4755 program
# 예시: passwd 명령어
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# 일반 사용자도 자신의 비밀번호를 변경할 수 있음
5.2 SGID (Set Group ID)
파일에 설정하면 그룹 권한으로 실행, 디렉토리에 설정하면 새 파일이 디렉토리의 그룹을 상속합니다.
# SGID 설정
chmod g+s directory/
chmod 2775 directory/
# 팀 공유 폴더에 유용
sudo mkdir /srv/shared
sudo chgrp developers /srv/shared
sudo chmod 2775 /srv/shared
# 이 안에 생성되는 모든 파일은 developers 그룹에 속함
5.3 Sticky Bit
디렉토리에 설정하면, 파일 소유자만 해당 파일을 삭제할 수 있습니다.
# Sticky Bit 설정
chmod +t directory/
chmod 1777 directory/
# 예시: /tmp 디렉토리
ls -ld /tmp
# drwxrwxrwt 12 root root ... /tmp
# 모든 사용자가 파일 생성 가능하지만, 자신의 파일만 삭제 가능
5.4 특수 권한 숫자 표기
| 권한 | 숫자 | 표시 | 적용 대상 |
|---|---|---|---|
| SUID | 4 | s (소유자 실행 위치) | 실행 파일 |
| SGID | 2 | s (그룹 실행 위치) | 파일/디렉토리 |
| Sticky | 1 | t (기타 실행 위치) | 디렉토리 |
6. sudo 설정과 관리
6.1 sudo란?
sudo(Superuser Do)는 일반 사용자가 관리자 권한으로 명령을 실행할 수 있게 해주는 도구입니다. root로 직접 로그인하는 것보다 안전하며, 모든 작업이 로그에 기록됩니다.
6.2 sudoers 파일 편집
# 반드시 visudo 사용 (문법 검사 수행)
sudo visudo
# /etc/sudoers 기본 구조
# 사용자명 호스트=(실행사용자) 명령어
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) ALL
# 예시: devuser에게 sudo 권한 부여
devuser ALL=(ALL:ALL) ALL
# 특정 명령만 허용
webadmin ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
# 비밀번호 없이 실행 허용
deploy ALL=(ALL) NOPASSWD: /usr/bin/git pull
6.3 sudo 그룹 활용
# Ubuntu/Debian: sudo 그룹
sudo usermod -aG sudo username
# RHEL/CentOS: wheel 그룹
sudo usermod -aG wheel username
# 그룹 설정 확인
getent group sudo
getent group wheel
6.4 sudo 로그 확인
# sudo 사용 로그
sudo cat /var/log/auth.log | grep sudo # Debian/Ubuntu
sudo cat /var/log/secure | grep sudo # RHEL/CentOS
7. 실전 시나리오
7.1 웹 개발팀 환경 구성
# 1. 그룹 생성
sudo groupadd webdev
# 2. 사용자 생성 및 그룹 추가
sudo useradd -m -s /bin/bash -G webdev alice
sudo useradd -m -s /bin/bash -G webdev bob
sudo passwd alice
sudo passwd bob
# 3. 프로젝트 디렉토리 설정
sudo mkdir -p /var/www/project
sudo chown root:webdev /var/www/project
sudo chmod 2775 /var/www/project
# 4. 특정 sudo 권한 부여
sudo visudo
# 추가: %webdev ALL=(ALL) /usr/bin/systemctl restart nginx
7.2 보안 점검 체크리스트
# SUID 파일 검색 (보안 점검)
sudo find / -perm -4000 -type f 2>/dev/null
# 소유자 없는 파일 검색
sudo find / -nouser -o -nogroup 2>/dev/null
# world-writable 파일 검색
sudo find / -perm -0002 -type f 2>/dev/null
# 빈 비밀번호 계정 검색
sudo awk -F: '($2 == "") {print $1}' /etc/shadow
8. 자주 하는 실수와 해결
- usermod -G vs usermod -aG:
-aG는 기존 그룹 유지하며 추가,-G만 쓰면 기존 그룹이 모두 제거됨 - chmod 777: 절대 사용 금지. 보안 취약점의 원인
- /etc/sudoers 직접 편집: 반드시
visudo사용. 문법 오류 시 시스템 접근 불가 - root 계정 직접 사용: sudo를 통한 권한 상승 권장. 감사 로그 기록을 위해
마무리
사용자와 권한 관리는 Linux 서버 보안의 기초입니다. 적절한 사용자 분리, 최소 권한 원칙 적용, sudo를 통한 권한 관리는 안전한 서버 운영의 필수 요소입니다.
다음 3편에서는 패키지 관리와 서비스 운영에 대해 다룹니다.
시리즈 네비게이션
← 1편: 기초와 파일 시스템 | 2편 (현재) | 3편: 패키지 관리와 서비스 →