리눅스 서버에서 적절한 사용자와 권한 관리는 보안의 기본입니다. 최소 권한 원칙(Principle of Least Privilege)에 따라 각 서비스와 사용자에게 필요한 최소한의 권한만 부여해야 합니다.

사용자 관리

# 사용자 생성 (홈 디렉터리 자동 생성)
sudo useradd -m -s /bin/bash username

# 비밀번호 설정
sudo passwd username

# 사용자 정보 수정
sudo usermod -c "Full Name" username       # 코멘트(이름) 변경
sudo usermod -s /bin/zsh username          # 기본 셸 변경
sudo usermod -d /new/home username         # 홈 디렉터리 변경

# 사용자 삭제 (홈 디렉터리 및 메일함 포함)
sudo userdel -r username

# 현재 로그인한 사용자
whoami
who
w

그룹 관리

# 그룹 생성
sudo groupadd developers

# 사용자를 그룹에 추가
sudo usermod -aG developers username   # -a: 기존 그룹 유지

# 사용자가 속한 그룹 확인
groups username
id username

# 그룹에서 사용자 제거
sudo gpasswd -d username developers

# 그룹 삭제
sudo groupdel developers

sudo 권한 설정

# sudo 그룹에 추가 (Ubuntu: sudo, CentOS: wheel)
sudo usermod -aG sudo username

# sudoers 파일 직접 편집 (항상 visudo 사용)
sudo visudo
# /etc/sudoers 설정 예시

# 특정 명령어만 허용 (비밀번호 필요)
username ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl

# 비밀번호 없이 특정 명령 실행
username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# 개발팀 그룹 sudo 허용
%developers ALL=(ALL:ALL) ALL

파일 권한 이해

-rwxr-xr--  1  owner  group  size  date  filename
 ^^^
 |||
 ||└─ other (기타 사용자): r-- = 4 (읽기만)
 |└── group (그룹):        r-x = 5 (읽기+실행)
 └─── owner (소유자):      rwx = 7 (읽기+쓰기+실행)

권한 값:

  • r (읽기) = 4
  • w (쓰기) = 2
  • x (실행) = 1

chmod로 권한 변경

# 숫자 방식
chmod 755 file.sh    # rwxr-xr-x (소유자: 7, 그룹: 5, 기타: 5)
chmod 644 file.txt   # rw-r--r-- (소유자: 6, 그룹: 4, 기타: 4)
chmod 600 key.pem    # rw------- (소유자만 읽기/쓰기)
chmod 700 ~/.ssh     # rwx------ (소유자만 모든 권한)

# 기호 방식
chmod u+x file.sh    # 소유자에 실행 권한 추가
chmod g-w file.txt   # 그룹에서 쓰기 권한 제거
chmod o-rwx file     # 기타 사용자 모든 권한 제거
chmod a+r file       # 모든 사용자에 읽기 권한 추가

# 재귀 적용
chmod -R 755 /var/www/html

chown으로 소유자 변경

# 소유자 변경
sudo chown username file.txt

# 소유자와 그룹 함께 변경
sudo chown username:groupname file.txt

# 그룹만 변경
sudo chown :groupname file.txt
# 또는
sudo chgrp groupname file.txt

# 재귀 적용
sudo chown -R www-data:www-data /var/www/html

특수 권한

SUID (Set User ID)

# 실행 시 소유자의 권한으로 실행 (예: passwd 명령)
chmod u+s /usr/bin/myprog
# 또는: chmod 4755 /usr/bin/myprog

# SUID 파일 찾기 (보안 점검)
find / -perm -4000 -type f 2>/dev/null

SGID (Set Group ID)

# 디렉터리에 적용 시: 해당 디렉터리에서 생성되는 파일이 디렉터리의 그룹 상속
chmod g+s /shared/project
# 또는: chmod 2755 /shared/project

Sticky Bit

# 디렉터리에서 본인 파일만 삭제 가능 (예: /tmp)
chmod +t /tmp
# 또는: chmod 1777 /tmp

웹 서버 디렉터리 권한 설정

# 웹 루트 디렉터리 권한 (Nginx/Apache: www-data 사용자)
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;

# 업로드 디렉터리는 쓰기 허용
sudo chmod 775 /var/www/html/uploads
sudo chown -R www-data:www-data /var/www/html/uploads

파일 권한 점검

# 기타 사용자가 쓰기 가능한 파일 찾기 (보안 위험)
find /var/www -perm -o+w -type f

# 소유자 없는 파일 찾기
find / -nouser -nogroup 2>/dev/null

# 권한이 없는 파일로 인한 Nginx 403 오류 진단
sudo -u www-data ls /var/www/html/

적절한 권한 관리는 서버 보안의 기반입니다. 특히 웹 서버 디렉터리와 민감한 설정 파일의 권한 설정에 주의를 기울이세요.