← Notes

Linux Ubuntu 디렉토리 권한 설정

백엔드 서버 배포 환경 구성· 6 / 6
  1. 1 — AWS EC2 인스턴스 생성과 설정
  2. 2 — AWS EC2 탄력적 IP 주소 할당
  3. 3 — AWS RDS 인스턴스 생성과 파라미터 그룹 설정
  4. 4 — Nginx 웹서버 설치와 리버스 프록시
  5. 5 — Nginx HTTPS - Let's Encrypt SSL/TLS 설정
  6. 6 — Linux Ubuntu 디렉토리 권한 설정

백엔드 서버 개발 중, 회원의 프로필이나 게시물 이미지 파일을 서버에 저장해야하는 기능을 작업중이다.

이미지 파일 저장을 위해 S3와 같은 클라우드 스토리지를 사용할 수 있지만 서버 내부에 직접 저장하는 방식을 먼저 진행해보고자 했다.

기능 구현 후, 로컬 개발환경에서는 잘 작동하던 것이 원격 클라우드 환경에 배포한 후에는 권한 이슈가 발생해 기능을 작동하지 않았다.

Issue: 디렉토리 사용 권한 오류

이미지 파일 저장 기능에서 발생한 디렉토리 권한 오류 상황과 원인이 되는 로직을 살펴본다.

해당 문서의 모든 프로그래밍 작업은 Linux Ubuntu(22.04) 원격 서버에서 진행한다.

기능 로직 확인

이미지 파일을 저장하고자 했던 백엔드 기능 로직은 아래와 같다.

  • 요청된 이미지 파일과 정보를 multer 모듈에 넘김.
  • 이미지 파일 정보의 특징(콘텐츠 유형/회원 등)에 따라 저장 디렉토리 위치(Path)를 지정함.
    ⇒ ex) ${ 루트 디렉토리 } / ${ 콘텐츠 디렉토리 } / ${ 회원 정보(id) }
  • 위치(Path)로 지정된 디렉토리를 모두 생성함.
  • 해당 위치에 이미지 파일 저장함.

위 로직에서 디렉토리 사용 권한이 걸리는 경우는 디렉토리 생성과 이미지 파일을 저장하는 두 곳이다.

지정한 ${ 루트 디렉토리 }root/var/www/html/images 경로의 권한을 수정해야하는 필요성이 생겼다.

Linux 파일 및 디렉토리 권한

권한 오류를 해결하기 위해 먼저 리눅스의 파일 및 디렉토리 권한 체계를 정리한다.

권한(Permission)이란?
리눅스는 여러 사용자가 들어와 사용하는 멀티유저 시스템이다.
여러 사용자가 들어와 사용하기에, 서버에 올려진 비밀자료 열람과 그것을 변조, 수정, 삭제의 우려가 높다.
이를 위해 권한(Permission)이라는 기능이 있는데, 다른 OS와는 달리 Linux는 대부분의 디렉토리에 이 기능이 활성화되어 있다.

권한 확인

먼저 root 위치에 있는 디렉토리들의 권한을 확인해본다.

ls -l

root 디렉토리 하위 폴더 권한 목록

권한 구성

위 이미지의 var 디렉토리를 예시로 구성을 살펴보자.

drwxr-xr-x 14 root root 4096 Nov 20 15:30 var

d: 파일 종류
rwxr-xr-x: 권한
14: 하드 링크 수
root root: 소유자(사용자/그룹)
4096: 파일 사이즈
Nov 20 15:30: 수정시간
var: 파일명
  • 파일 종류

<표1>

  • 권한

    자릿수(rwxrwxrwx)에 따라 사용자(rwx) / 그룹(rwx) / 다른 사용자(rwx) 로 구분된다. 또한 권한별 문자값은 각각의 위치가 정해져 있다.

    • 첫번째: r
    • 두번째: w
    • 세번째: x

문자값별 권한 내용은 아래와 같다.

<표2>

이러한 권한 내용을 이용해 8진수로 권한을 설정할 수 있다.
8진수값은 권한 설정 시 명령어에 사용된다.

<표3>

‘사용자 → 읽기 / 그룹 → 읽기와 쓰기 / 다른 사용자 → 권한 없음’ 을 설정할 경우
⇒ 460(r—rw----)

권한 설정

권한 내용을 바탕으로 Linux 내 디렉토리나 파일의 권한을 부여할 수 있다.

  • 권한 부여
    • 방식-1 - 8진수로 권한 부여

      chmod 777 file.txt
    • 방식-2 - 문자로 권한 부여

      chmod u=rw file.txt
      • 허가권 → 사용자(u) | 그룹(g) | 다른 사용자(o) | 모두(a)
      • 설정 → 추가(+) | 삭제(-) | 지정(=)
      • 권한 → 읽기(r) | 쓰기(w) | 실행(x)
    • 명령어 옵션

      chmod -R 777 file.txt
      • -R or --recursive
        ⇒ 특정 디렉토리 내의 파일(디렉토리)에 대해 재귀적으로 적용
      • -C or --changes
        ⇒ 변경된 파일(디렉토리)에 대한 자세한 정보를 출력

디렉토리의 허가권이 파일보다 우선시 된다. 즉, 어떤 계정이 파일에 허가권이 있지만 그 파일을 담고 있는 디렉토리에 허가권이 없다면 사용이 불가하다.

  • 소유자 변경 소유자 변경은 루트(root) 사용자만 가능하다.
chown user:group file.txt

디렉토리의 경우, 내부 모든 파일과 디렉토리에 적용하기 위해 옵션을 추가해야 한다.

chown -R user:group file.txt

Solution: 디렉토리 사용 권한 수정

위에서 정리한 권한 체계를 바탕으로 실제 문제를 해결한 과정을 정리한다.

수정 내용

위 디렉토리 생성과 이미지 파일 저장 권한 이슈의 경우, 디렉토리의 소유자를 변경하면 해결되는 문제였다. 다른 사용자로 분류되어 있는 백엔드 프로젝트 사용자의 권한을 위해 모든 사용자에게 권한을 풀어줄 순 없기 때문이다.

그렇게 디렉토리 소유자를 백엔드 프로젝트 사용자에게 부여함으로써 임시적(?)으로나마 문제를 해결했다.

디렉토리 소유자 변경 후 권한 목록

Node 백엔드 프로젝트가 ubuntu 디렉토리 내에서 ubuntu 사용자로 실행된다고 하더라도 Nginx를 사용 중이라면, 디렉토리 소유자를 ubuntu가 아닌 www-data로 설정해야 한다.

참고 자료

  • [1] 🐧 리눅스 파일 & 디렉토리 권한 (소유권 / 허가권 / 특수권한)
  • [2] 리눅스 권한이란 무엇인가? (리눅스 소유권, 리눅스 허가권, 리눅스 권한)
목차