리눅스 보안을 이야기할 때 방화벽, SSH, fail2ban 같은 주제가 먼저 떠오르기 쉽다. 하지만 실제 운영 환경에서 사고를 만드는 가장 흔한 원인 중 하나는 의외로 잘못된 파일 권한 설정이다.

예를 들어 중요한 설정 파일이 모든 사용자에게 읽히거나, 실행되면 안 되는 스크립트가 실행 가능 상태로 배포되거나, 웹 루트 디렉토리 권한이 과하게 열려 있는 경우가 그렇다. 이런 문제는 겉보기에는 사소해 보여도, 정보 노출이나 권한 오남용으로 바로 이어질 수 있다.

이번 글에서는 리눅스 보안 관점에서 퍼미션을 어떻게 이해해야 하는지, 그리고 chmod, chown, umask를 어떤 시각으로 써야 하는지 정리해본다.

1. 리눅스 퍼미션의 기본 구조

리눅스의 파일 권한은 크게 세 묶음으로 나뉜다.

  • 소유자(User)
  • 그룹(Group)
  • 기타 사용자(Other)

그리고 각 대상은 다음 세 가지 권한을 가질 수 있다.

  • r = 읽기(Read)
  • w = 쓰기(Write)
  • x = 실행(Execute)

예를 들어 아래와 같은 출력이 있다고 보자.

-rwxr-x--- 1 alice developers 2048 Mar 11 12:00 deploy.sh

이 의미는 다음과 같다.

  • 소유자 alice는 읽기/쓰기/실행 가능
  • 그룹 developers는 읽기/실행 가능
  • 기타 사용자는 접근 불가

보안 관점에서는 항상 이 질문을 던지는 게 좋다.

> 이 파일을 누가 읽을 수 있어야 하는가? > 이 파일을 누가 수정할 수 있어야 하는가? > 이 파일을 정말 실행 가능해야 하는가?

2. chmod 명령어 : 권한을 바꾸는 가장 기본적인 도구

chmod는 파일이나 디렉토리의 권한을 변경할 때 사용한다.

숫자 방식 이해

가장 많이 쓰는 방식은 숫자 표기다.

  • 4 = 읽기
  • 2 = 쓰기
  • 1 = 실행

즉:

  • 7 = 4+2+1 = rwx
  • 6 = 4+2 = rw-
  • 5 = 4+1 = r-x
  • 4 = r--

예를 들면:

chmod 644 file.txt
chmod 755 script.sh
chmod 600 secrets.env

보안 관점에서 자주 쓰는 권한 예시

644

  • 일반 문서 파일에 자주 사용
  • 소유자만 수정 가능, 나머지는 읽기만 가능

600

  • 비밀 정보 파일에 적합
  • 예: SSH 개인키, 환경변수 파일, 인증 토큰

755

  • 실행 스크립트나 디렉토리에 자주 사용
  • 하지만 모든 파일에 습관적으로 주면 위험할 수 있음

700

  • 개인 스크립트나 민감한 디렉토리에 적합
  • 소유자 외 접근 차단

실무에서 자주 하는 실수

chmod -R 777 /var/www/html

이런 식의 설정은 매우 위험하다. 테스트 중 편하게 하려고 권한을 다 열어버리는 경우가 있는데, 운영 환경에서는 거의 최악의 선택에 가깝다.

777은 누구나 읽고, 쓰고, 실행할 수 있다는 뜻이기 때문에:

  • 웹 서버 파일 변조 위험
  • 악성 파일 업로드 위험
  • 설정 파일 노출 위험

같은 문제가 생길 수 있다.

3. chown 명령어 : 권한보다 먼저 봐야 하는 소유권

퍼미션 문제를 볼 때 많은 사람이 chmod부터 만지지만, 실제로는 chown이 먼저 필요한 경우도 많다.

chown은 파일의 소유자와 그룹을 바꾸는 명령어다.

sudo chown user:user file.txt
sudo chown -R www-data:www-data /var/www/project

왜 소유권이 중요한가?

권한이 아무리 적절해도 소유자가 잘못 잡혀 있으면 운영이 꼬인다.

예를 들어:

  • 웹 서버가 써야 할 디렉토리를 root가 소유 중인 경우
  • 배포 사용자가 수정해야 할 파일을 다른 계정이 소유 중인 경우
  • 협업 디렉토리의 그룹 소유권이 엉뚱하게 설정된 경우

이런 상황에서는 권한보다 소유권 설계가 먼저다.

보안 관점의 원칙

  • 서비스는 필요한 계정으로만 파일을 소유하게 한다.
  • 사람 계정과 서비스 계정의 역할을 섞지 않는다.
  • 루트 소유가 정말 필요한 파일만 루트로 둔다.

예를 들어 웹 서비스라면:

  • 코드 배포는 배포 계정이 담당
  • 실행과 읽기는 웹 서비스 계정이 담당
  • 업로드 디렉토리는 별도로 제한

이런 식으로 역할을 분리하는 게 안전하다.

4. umask : 파일이 처음 만들어질 때의 기본 보안 수준

umask는 새 파일이나 디렉토리가 생성될 때 기본 권한을 어떻게 제한할지 정하는 값이다.

umask
umask 027

기본적으로 새 파일은 보통 666, 새 디렉토리는 777에서 시작하고, 여기에 umask 값이 빠진다.

예를 들어 umask 022라면:

  • 파일: 644
  • 디렉토리: 755

umask 027라면:

  • 파일: 640
  • 디렉토리: 750

왜 중요한가?

운영 환경에서 파일을 만들 때마다 매번 chmod 하는 건 비효율적이다. 처음부터 보수적인 권한으로 생성되게 하는 편이 훨씬 안전하다.

특히 다음 경우에 중요하다.

  • 로그 파일 생성
  • 업로드 파일 저장
  • 배포 스크립트가 만드는 설정 파일
  • 자동화 도구가 생성하는 인증 파일

보안 관점에서는 처음부터 덜 열리게 만들고, 필요한 경우만 열어주는 방식이 좋다.

5. 디렉토리 퍼미션은 파일 퍼미션과 다르게 봐야 한다

리눅스에서 디렉토리 권한은 파일 권한과 의미가 조금 다르다.

디렉토리에서:

  • r : 목록 보기
  • w : 파일 생성/삭제/이름 변경
  • x : 디렉토리 진입

즉 디렉토리에 x 권한이 없으면 그 안으로 들어갈 수 없다.

예를 들어:

chmod 700 /home/user/private
chmod 750 /srv/project

이런 설정은 디렉토리 접근 제어에서 자주 쓰인다.

보안 팁

  • 민감한 디렉토리는 700 또는 750 우선 검토
  • 공유 디렉토리는 그룹 단위 접근으로 설계
  • 업로드 디렉토리는 실행 권한을 불필요하게 주지 않기

특히 웹 업로드 디렉토리에 실행 권한이 남아 있으면 보안상 매우 좋지 않다.

6. 특수 퍼미션: SUID, SGID, Sticky Bit는 신중하게

기본 권한 외에도 특수 권한이 있다.

chmod 4755 somebinary
chmod 2775 sharedir
chmod 1777 /tmp/shared

SUID

실행 시 파일 소유자 권한으로 동작한다. 잘못 사용하면 권한 상승 취약점으로 이어질 수 있다.

SGID

그룹 권한 상속이나 그룹 기반 실행에 사용된다. 공유 디렉토리 운영에 유용하지만, 의도를 모르고 쓰면 권한 구조가 꼬일 수 있다.

Sticky Bit

공유 디렉토리에서 파일 소유자만 삭제 가능하게 한다. 대표적인 예가 /tmp다.

보안 관점 결론

특수 권한은 “편리해서” 쓰는 게 아니라, 필요성과 영향 범위를 이해한 뒤 최소한으로만 써야 한다.

7. 실무에서 특히 조심할 퍼미션 대상

다음 파일과 디렉토리는 특히 보수적으로 관리하는 게 좋다.

SSH 키

chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh

SSH 개인키가 노출되면 바로 인증 문제로 이어질 수 있다.

환경변수 파일

chmod 600 .env

API 키, DB 비밀번호, 토큰이 들어 있는 경우가 많기 때문에 공개되면 안 된다.

웹 루트와 업로드 디렉토리

  • 웹 루트는 불필요한 쓰기 권한 최소화
  • 업로드 디렉토리는 실행 금지 검토
  • 서비스 계정과 배포 계정 역할 분리

로그 파일

로그는 종종 내부 정보와 경로, 에러 메시지를 포함하므로 읽기 권한도 신중히 봐야 한다.

8. 퍼미션 점검할 때 추천하는 흐름

운영 서버에서 퍼미션 문제를 점검할 때는 아래 순서가 좋다.

  1. 소유자와 그룹 먼저 확인
   ls -l
  1. 민감 파일 권한 확인
   stat file.txt
  1. 과하게 열린 파일 찾기
   find /path -type f -perm -o+r
  1. 특수 권한 파일 점검
   find / -perm /4000 -type f 2>/dev/null
  1. 생성 기본값 확인
   umask

중요한 건 단순히 “닫는 것”이 아니라,

  • 누가 써야 하는지
  • 누가 읽어야 하는지
  • 누가 실행할 필요가 없는지

를 역할 기준으로 구분하는 것이다.

마무리

리눅스 보안에서 퍼미션은 기본 중의 기본이지만, 동시에 가장 자주 실수하는 영역이기도 하다. chmod, chown, umask를 단순 명령어로 외우는 수준을 넘어, 최소 권한 원칙소유권 설계 관점에서 이해해야 실제 운영에서 사고를 줄일 수 있다.

좋은 리눅스 보안 설정은 복잡한 기술에서 시작되지 않는다. 의외로 가장 먼저 봐야 할 것은 “이 파일을 누가 읽고, 누가 쓰고, 누가 실행할 수 있느냐” 같은 기본적인 질문이다.