← 전체 글로 돌아가기

서버 운영

Ubuntu 배포 서버에서 파일 권한을 숫자보다 소유자로 점검한 설정 노트

배포 뒤 업로드 파일만 읽히지 않던 문제를 권한 숫자 암기 대신 사용자와 그룹 기준으로 확인한 방법

업로드 디렉터리만 실패했다

새 서버에서 애플리케이션은 정상 기동했지만 이미지 업로드 직후 500이 발생했다. 로그에는 permission denied가 있었고 정적 파일은 잘 읽혔다. 권한을 무작정 넓히기보다 프로세스의 계정부터 확인했다.

프로세스가 누구인지부터 확인

셸 계정은 ubuntu였지만 systemd 유닛은 www-data로 실행되고 업로드 디렉터리는 root:root였다.

systemctl show myapp --property=User,Group
ps -o user,group,cmd -C node
namei -l /srv/myapp/uploads
stat -c '%A %U:%G %n' /srv/myapp/uploads

기준은 애플리케이션 계정이 필요한 디렉터리만 쓸 수 있고 상위 경로는 통과할 수 있게 하는 것이었다.

install -d -o www-data -g www-data -m 0750 /srv/myapp/uploads
chown -R www-data:www-data /srv/myapp/uploads
find /srv/myapp/uploads -type d -exec chmod 0750 {} +
find /srv/myapp/uploads -type f -exec chmod 0640 {} +
su -s /bin/sh www-data -c 'test -w /srv/myapp/uploads'

다음 배포까지 생각하기

수동 수정만 하면 배포 때 root가 만든 파일로 다시 깨질 수 있다. 배포 스크립트에 소유권과 파일 모드 설정을 넣어 반복 가능한 상태로 만들었다.

배포 전 점검표

  • systemd의 User/Group과 디렉터리 소유자가 맞는가
  • namei -l로 상위 경로를 확인했는가
  • 업로드 파일과 실행 파일의 모드를 구분했는가
  • 서비스 계정으로 쓰기 테스트를 했는가

권한 문제를 숫자 하나로 덮지 않고 프로세스의 신원과 파일 생성 주체를 먼저 적으니 재발 원인까지 보였다.