리눅스 파일 권한(chmod, chown) 쉽게 이해하기

리눅스 파일 권한(chmod, chown) 쉽게 이해하기

리눅스 서버를 운영하다 보면 “Permission denied”라는 에러를 한 번쯤은 만나게 됩니다. 분명 파일이 거기 있는데 열 수 없다거나, 스크립트를 실행하려는데 권한이 없다고 나오는 경우입니다. 이런 문제가 생기면 보통 chmod나 chown 명령어를 써서 해결하라는 답변이 나옵니다. 그런데 명령어만 따라 치면 당장은 해결되지만 왜 그렇게 하는 건지 이해하지 못하면 나중에 또 같은 문제를 겪게 됩니다. 이번 글에서는 리눅스 파일 권한이 어떤 구조로 되어 있는지, chmod와 chown이 각각 무엇을 바꾸는 건지를 기초부터 정리해보겠습니다.

리눅스는 왜 파일마다 권한을 나누는가

리눅스는 태생부터 여러 사용자가 동시에 사용하는 운영체제입니다. 서버 한 대에 여러 명이 접속해서 작업하는 환경을 전제로 설계되었기 때문에, 내 파일을 다른 사용자가 함부로 읽거나 수정하거나 삭제하지 못하도록 파일 하나하나에 권한이 붙어 있습니다.

서버 환경에서도 마찬가지입니다. 웹 서버 프로세스는 www-data라는 사용자 권한으로 실행되고, 배포 작업은 deploy 같은 사용자로 하고, 시스템 관리는 root로 합니다. 이들이 접근할 수 있는 파일 범위가 다르기 때문에 권한 설정이 중요합니다. 권한을 잘못 설정하면 웹 서버가 파일을 못 읽어서 사이트가 안 뜨거나, 반대로 너무 열어두면 보안에 구멍이 생깁니다.

파일 권한 확인하는 방법

터미널에서 ls -l 명령어를 치면 파일 목록과 함께 권한 정보가 나옵니다.

ls -l
-rw-r--r-- 1 ubuntu ubuntu  1024 Jun 15 10:30 index.html
drwxr-xr-x 2 ubuntu ubuntu  4096 Jun 15 10:30 images
-rwxr-xr-- 1 root   root     512 Jun 15 10:30 deploy.sh

왼쪽에 나오는 -rw-r–r– 같은 문자열이 권한 표시입니다. 처음에는 이게 무슨 암호처럼 보이지만 규칙을 알면 간단합니다.

맨 앞 한 글자는 파일 종류입니다. -는 일반 파일이고 d는 디렉토리입니다. 그 뒤로 9글자가 권한인데, 3글자씩 끊어서 읽으면 됩니다.

첫 번째 세 글자는 소유자(owner)의 권한입니다. 두 번째 세 글자는 그룹(group)의 권한입니다. 세 번째 세 글자는 기타 사용자(others)의 권한입니다.

각 자리에는 r, w, x 또는 -가 들어갑니다. r은 읽기(read), w는 쓰기(write), x는 실행(execute)입니다. -는 해당 권한이 없다는 뜻입니다.

그래서 -rw-r–r–을 해석하면 이렇습니다. 소유자는 읽기와 쓰기가 가능하고, 그룹은 읽기만 가능하고, 기타 사용자도 읽기만 가능합니다. 아무도 실행 권한은 없습니다.

소유자와 그룹이란

ls -l 결과에서 ubuntu ubuntu라고 나오는 부분이 소유자와 그룹입니다. 앞의 ubuntu가 파일 소유자이고, 뒤의 ubuntu가 파일이 속한 그룹입니다.

리눅스에서 모든 파일은 반드시 하나의 소유자와 하나의 그룹에 속합니다. 소유자는 보통 파일을 만든 사용자이고, 그룹은 그 사용자가 속한 기본 그룹이 됩니다.

왜 그룹이라는 개념이 필요한지 의문이 들 수 있습니다. 예를 들어 개발팀 서버에서 세 명의 개발자가 같은 프로젝트 파일을 수정해야 한다고 합시다. 파일 소유자는 한 명만 될 수 있으니까, 나머지 두 명은 기타 사용자(others) 권한으로 접근해야 합니다. 그런데 others 권한을 열어두면 서버에 접속 가능한 모든 사용자에게 열리는 겁니다. 이때 세 명을 같은 그룹에 넣고 그룹 권한을 설정하면 해당 그룹에 속한 사람만 접근할 수 있습니다.

chmod — 권한 변경하기

chmod는 파일의 권한을 변경하는 명령어입니다. change mode의 줄임말입니다. 사용법은 크게 두 가지가 있습니다.

첫 번째는 숫자로 설정하는 방법입니다. 이게 더 자주 쓰입니다.

chmod 755 deploy.sh

여기서 755는 세 자리 숫자인데, 각 자리가 소유자, 그룹, 기타 사용자의 권한을 나타냅니다. 각 숫자는 r, w, x 권한의 합산입니다. r은 4, w는 2, x는 1입니다.

7은 4+2+1이니까 읽기, 쓰기, 실행 전부 가능합니다. 5는 4+0+1이니까 읽기와 실행만 가능합니다. 0이면 아무 권한이 없습니다.

그래서 chmod 755 deploy.sh는 소유자에게 모든 권한을 주고, 그룹과 기타 사용자에게는 읽기와 실행 권한만 주겠다는 뜻입니다.

자주 사용하는 숫자 조합을 정리하면 이렇습니다. 644는 소유자가 읽기 쓰기, 나머지는 읽기만 가능한 설정이고 일반 파일에 많이 씁니다. 755는 소유자가 전부 가능하고 나머지는 읽기 실행만 가능한 설정이고 스크립트나 디렉토리에 많이 씁니다. 600은 소유자만 읽기 쓰기 가능하고 나머지는 접근 불가인 설정이고 SSH 키 같은 민감한 파일에 씁니다. 700은 소유자만 전부 가능하고 나머지는 접근 불가인 설정이고 개인 디렉토리에 씁니다.

두 번째는 문자로 설정하는 방법입니다.

chmod u+x deploy.sh

u는 소유자(user), g는 그룹(group), o는 기타(others), a는 전체(all)입니다. +는 권한 추가, -는 권한 제거입니다. 위 명령어는 소유자에게 실행 권한을 추가하라는 뜻입니다.

특정 권한 하나만 바꾸고 싶을 때는 문자 방식이 편합니다. 전체 권한을 한 번에 설정할 때는 숫자 방식이 깔끔합니다.

chown — 소유자 변경하기

chown은 파일의 소유자와 그룹을 변경하는 명령어입니다. change owner의 줄임말입니다.

sudo chown www-data:www-data /var/www/today-play/index.html

콜론 앞이 소유자, 뒤가 그룹입니다. 이 명령어는 index.html 파일의 소유자와 그룹을 둘 다 www-data로 바꿉니다. 웹 서버가 이 파일을 읽어야 하는데 소유자가 다른 사용자로 되어 있으면 권한 문제가 생기기 때문에, 웹 서버 사용자로 소유권을 넘기는 겁니다.

소유자만 바꾸고 싶으면 콜론과 그룹을 생략합니다.

sudo chown www-data /var/www/today-play/index.html

그룹만 바꾸고 싶으면 콜론 앞을 비우면 됩니다.

sudo chown :developers /var/www/today-play/index.html

디렉토리와 그 안의 모든 파일의 소유자를 한 번에 바꾸려면 -R 옵션을 사용합니다.

sudo chown -R www-data:www-data /var/www/today-play/

-R은 재귀적(recursive)으로 하위 파일과 폴더를 전부 포함한다는 뜻입니다. 웹 사이트 디렉토리 전체의 소유자를 바꿀 때 자주 씁니다. chmod에도 -R 옵션이 있고 같은 방식으로 동작합니다.

chown은 보통 sudo를 붙여야 합니다. 파일 소유권을 바꾸는 건 시스템 관리자 권한이 필요한 작업이기 때문입니다.

디렉토리 권한은 파일과 다르다

디렉토리에서 r, w, x 권한의 의미는 파일과 조금 다릅니다.

디렉토리에서 r은 디렉토리 안의 파일 목록을 볼 수 있는 권한입니다. ls 명령어로 내용을 확인할 수 있느냐의 문제입니다.

w는 디렉토리 안에서 파일을 생성하거나 삭제할 수 있는 권한입니다. 파일 내용을 수정하는 것과는 별개입니다. 디렉토리에 w 권한이 있으면 그 안에 파일을 만들거나 지울 수 있습니다.

x는 디렉토리에 접근할 수 있는 권한입니다. cd 명령어로 디렉토리 안에 들어가려면 x 권한이 필요합니다. 디렉토리에 r은 있는데 x가 없으면 파일 목록은 볼 수 있지만 그 파일에 실제로 접근하지는 못하는 어중간한 상태가 됩니다.

그래서 디렉토리 권한은 보통 755로 설정합니다. 소유자는 전부 가능하고 다른 사용자는 목록 확인과 접근만 가능한 상태입니다.

실무에서 자주 만나는 상황들

웹 서버가 파일을 못 읽는 경우가 가장 흔합니다. Nginx가 www-data 사용자로 실행되는데, 웹 사이트 파일의 소유자가 ubuntu이고 권한이 700이면 www-data는 해당 파일에 접근할 수 없습니다. 이럴 때 파일의 소유자를 www-data로 바꾸거나, 기타 사용자에게 읽기 권한을 주면 해결됩니다.

SSH 키 파일의 권한이 너무 열려 있는 경우도 많이 겪습니다. SSH 접속에 사용하는 개인 키 파일(.pem이나 id_rsa)은 소유자만 읽을 수 있어야 합니다. 권한이 644 이상으로 열려 있으면 SSH가 아예 접속을 거부합니다. “WARNING: UNPROTECTED PRIVATE KEY FILE!”이라는 경고가 나오면서 연결이 안 됩니다. 이때 chmod 600으로 설정하면 됩니다.

chmod 600 ~/.ssh/id_rsa

배포 후에 업로드된 파일이 안 보이는 경우도 있습니다. 사용자가 웹 사이트를 통해 이미지를 업로드했는데, 해당 디렉토리의 권한이 쓰기를 허용하지 않으면 파일 저장이 실패합니다. 업로드 디렉토리에는 웹 서버 사용자가 쓰기 가능하도록 설정해야 합니다.

chmod 777은 왜 쓰면 안 되는가

권한 문제가 생기면 인터넷에서 “chmod 777 해라”라는 답변을 쉽게 찾을 수 있습니다. 777은 모든 사용자에게 모든 권한을 주는 설정입니다. 당장은 문제가 해결되지만 보안 관점에서 매우 위험합니다.

서버에 접속할 수 있는 누구라도 해당 파일을 읽고, 수정하고, 실행할 수 있게 됩니다. 만약 웹 서버에 취약점이 있어서 공격자가 시스템에 접근했을 때, 777로 설정된 파일은 마음대로 조작할 수 있습니다.

권한 문제가 생기면 무조건 777로 열지 말고, 어떤 사용자가 어떤 권한이 필요한지를 먼저 파악해야 합니다. 대부분의 경우 소유자를 올바르게 설정하거나 그룹 권한을 조정하는 것만으로 해결됩니다.

umask — 기본 권한을 결정하는 값

파일을 새로 만들면 기본 권한이 자동으로 설정됩니다. 이 기본 권한을 결정하는 게 umask 값입니다.

터미널에서 umask를 입력하면 현재 값을 확인할 수 있습니다.

umask
0022

umask는 “이 권한은 빼겠다”라는 의미입니다. 파일의 최대 기본 권한은 666이고 디렉토리는 777입니다. 여기서 umask 값을 빼면 실제 기본 권한이 됩니다.

umask가 0022이면 파일은 666에서 022를 뺀 644가 기본 권한이 됩니다. 디렉토리는 777에서 022를 뺀 755가 됩니다. 파일을 만들 때마다 매번 chmod를 하지 않아도 되는 이유가 이것입니다.

보안을 강화하고 싶으면 umask를 0077로 설정하면 됩니다. 그러면 새로 만든 파일은 600, 디렉토리는 700이 되어서 소유자만 접근할 수 있습니다.

마무리

리눅스 파일 권한은 소유자, 그룹, 기타 사용자 세 범위에 대해 읽기, 쓰기, 실행 권한을 각각 설정하는 구조입니다. chmod로 권한을 바꾸고 chown으로 소유자를 바꿉니다. 처음에는 숫자 조합이 헷갈리지만 644, 755, 600 이 세 가지만 기억해도 대부분의 상황에 대응할 수 있습니다. 핵심은 필요한 만큼만 권한을 열고 나머지는 닫아두는 것입니다. 다음 글에서는 서버에서 반복 작업을 자동으로 실행해주는 크론탭(Crontab) 사용법을 다뤄보겠습니다.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *