IMG-LOGO
공지사항 :

리눅스 전통적 권한 제어

lmkfox - 2026-06-16 06:56:24 6 Views 0 Comment

지난 회차에서 우리는 방대한 텍스트 파일과 로그 더미 속에서 원하는 단서만을 정확하게 골라내는 grep 명령어와 정규 표현식 기술에 대해 알아보았습니다. 이제 터미널 내에서 파일을 자유롭게 탐색하고, 관리하고, 검색하는 기본기를 갖추었으니, 시스템 엔지니어링과 서버 보안의 가장 중요한 기둥 중 하나인 '권한 제어'를 마스터할 차례입니다.

리눅스는 태생부터 수많은 사용자가 동시에 접속하여 자원을 공유하는 다중 사용자(Multi-User) 환경을 전제로 설계되었습니다. 따라서 "어떤 사용자가 이 중요 설정 파일을 읽을 수 있는가?", "어떤 프로세스가 이 디렉토리에 로그를 쌓을 수 있는가?"를 철저하게 통제하지 않으면 시스템은 순식간에 악성코드에 오염되거나 권한 탈취 공격에 무너질 수 있습니다.

이번 5회차에서는 리눅스 보안의 기초 체력이 되는 전통적 임의 접근 제어(DAC) 구조를 살펴보고, chmodchown 명령어를 활용하여 실무에서 파일과 디렉토리의 방어벽을 어떻게 강화하는지 상세한 예제와 함께 알아보겠습니다.

1. 리눅스 권한 구조의 도해와 메커니즘

리눅스 터미널에서 ls -l 명령어를 실행했을 때 가장 왼쪽에 나타나는 -rwxr-xr-xdrwxrwxrwx 같은 10자리의 문자열이 바로 전통적인 권한 표시 구조입니다. 리눅스 커널은 이 문자열을 세 단계의 대상 그룹과 세 가지 종류의 행위 권한으로 쪼개어 해석합니다.

10자리 문자열의 분해 규칙

  • 1번째 자리 (파일 유형): 파일의 종류를 나타냅니다. -는 일반 텍스트나 바이너리 파일, d는 디렉토리, l은 심볼릭 링크를 의미합니다.

  • 2~4번째 자리 (소유자 권한, User/Owner): 이 파일을 생성했거나 소유권을 가진 개별 사용자 본인에게 적용되는 권한입니다.

  • 5~7번째 자리 (그룹 권한, Group): 파일에 지정된 소유 그룹에 속한 구성원 모두에게 공통으로 적용되는 권한입니다.

  • 8~10번째 자리 (나머지 사용자 권한, Others): 소유자도 아니고 해당 그룹에도 속하지 않은, 시스템에 존재하는 다른 모든 일반 계정에게 적용되는 권한입니다.

세 가지 핵심 권한: r, w, x

각 대상 그룹이 가질 수 있는 권한은 r(읽기), w(쓰기), x(실행)로 나뉩니다. 권한이 없을 때는 마침표나 하이픈(-)으로 표시됩니다. 파일과 디렉토리에서 이 권한들이 작동하는 물리적 의미는 완전히 다르므로 실무 적용 시 반드시 구분해야 합니다.

권한 유형 파일(File)에서의 의미 디렉토리(Directory)에서의 의미
r (Read) 파일의 내부 내용을 읽을 수 있음 (cat, vi) 디렉토리 내부의 파일 목록을 볼 수 있음 (ls)
w (Write) 파일의 본문 내용을 수정할 수 있음 디렉토리 내부에 파일 생성, 삭제, 이름 변경 가능
x (Execute) 바이너리나 스크립트를 실행할 수 있음 디렉토리 내부로 진입할 수 있음 (cd)

실무 핵심 포인트: 특정 파일에 대한 쓰기(w) 권한이 있더라도, 그 파일이 들어있는 상위 디렉토리에 쓰기 권한이 없다면 사용자는 그 파일을 삭제하거나 이름을 바꿀 수 없습니다. 파일의 생성과 삭제는 파일 자체가 아닌 디렉토리 권한의 지배를 받기 때문입니다.

2. chmod: 8진수와 심볼릭을 이용한 권한 변경 기술

chmod(Change Mode) 명령어는 파일이나 디렉토리의 읽기, 쓰기, 실행 권한을 수정할 때 사용합니다. 권한을 수정하는 방법은 크게 두 가지로 나뉩니다. 숫자를 이용한 8진수 표기법과 문자를 이용한 심볼릭 표기법입니다.

1) 8진수 표기법 (Numeric Method)

각 권한에 고유한 점수를 부여하고, 이 점수들을 더한 세 자리 숫자로 권한을 한 번에 강제 지정하는 방식입니다. 빠르고 직관적이어서 실무에서 가장 선호됩니다.

  • r (읽기) = 4 점

  • w (쓰기) = 2 점

  • x (실행) = 1 점

  • 권한 없음 = 0 점

이 점수들을 소유자, 그룹, 나머지 사용자 순서대로 합산합니다. 예를 들어 소유자에게 읽기/쓰기($4+2=6$), 그룹에게 읽기($4$), 나머지에게 권한 없음($0$)을 준다면 숫자는 640이 됩니다.

실무 예제: 자동화 백업 스크립트 권한 최적화

서버 내부의 비밀번호가 기재된 백업 스크립트 파일(backup.sh)이 있습니다. 관리자(root)만 이 파일을 읽고 쓸 수 있어야 하며, 동시에 실행도 가능해야 합니다. 반면 다른 일반 사용자들은 이 파일의 내부 내용을 절대 들여다보거나 실행할 수 없도록 격리해야 합니다.

Bash

# 1. 현재 권한 상태 확인
ls -l backup.sh
# 출력 예시: -rw-r--r-- 1 root root 1250 Jun 16 09:00 backup.sh (모두가 읽을 수 있는 상태)

# 2. 소유자에게 모든 권한(4+2+1=7), 그룹과 나머지에게는 무권한(0, 0) 부여
chmod 700 backup.sh

# 3. 결과 확인
ls -l backup.sh
# 변경 결과: -rwx------ 1 root root 1250 Jun 16 09:00 backup.sh

2) 심볼릭 표기법 (Symbolic Method)

기존에 설정된 권한 값을 그대로 유지한 채, 특정 대상의 특정 권한만 콕 집어서 추가하거나 제거하고 싶을 때 사용합니다.

  • 대상 기호: u(user), g(group), o(others), a(all, 모두)

  • 연산자: +(권한 추가), -(권한 제거), =(권한 강제 지정)

실무 예제: 기존 권한을 보존하며 그룹 쓰기 권한만 추가하기

공동 웹 프로젝트 디렉토리 안의 특정 소스코드 파일(index.php)에 대해, 기존에 설정되어 있던 소유자 권한이나 외부인 권한은 건드리지 않고, 동일 그룹에 속한 개발 팀원들에게만 수정(w) 권한을 추가해야 하는 상황입니다.

Bash

# 그룹(g)에게 쓰기(w) 권한을 추가(+)함
chmod g+w index.php

# 결과 확인 시 기존 권한 구조에서 그룹 자리에 'w'가 추가된 것을 볼 수 있습니다.

3. chown: 소유권 관리를 통한 프로세스 권한 격리

보안 관리의 핵심은 권한의 강도를 조절하는 것뿐만 아니라, 해당 파일의 주인이 누구인지를 명확히 규정하는 것입니다. chown(Change Owner) 명령어는 파일과 디렉토리의 소유자와 소유 그룹을 변경합니다.

특히 Nginx, Apache, Tomcat 같은 웹 서버 데몬이나 데이터베이스 프로세스가 특정 디렉토리에 로그를 남기거나 업로드된 파일을 저장해야 할 때, 해당 디렉토리의 소유권을 프로세스 실행 계정으로 넘겨주기 위해 실무에서 필수적으로 사용됩니다.

기본 문법

Bash

chown [옵션] 소유자:소유그룹 파일명(또는 디렉토리명)

실무 예제: 웹 서비스 업로드 디렉토리 소유권 이관 및 하위 순회

시스템 관리자 계정(root)으로 소스코드를 서버에 배포한 후, 사용자들이 웹사이트를 통해 프로필 이미지를 업로드할 수 있도록 uploads 디렉토리의 소유권을 웹 서버 계정인 www-data로 변경해야 하는 상황입니다. 이때 디렉토리 내부의 모든 하위 파일과 폴더까지 한 번에 변경하려면 하위 순회 옵션인 -R(Recursive)을 반드시 붙여야 합니다.

Bash

# uploads 디렉토리와 그 내부 전체 구성물의 소유자를 www-data로, 소유 그룹도 www-data로 변경
chown -R www-data:www-data /var/www/html/uploads

# 변경 결과 확인 (-d 옵션은 디렉토리 자체의 속성을 보기 위함)
ls -ld /var/www/html/uploads
# 출력 결과: drwxr-xr-x 2 www-data www-data 4096 Jun 16 09:10 /var/www/html/uploads

4. 시스템 강화를 위한 실무 보안 권한 하드닝 전략

리눅스 서버 인프라를 안정적으로 운영하기 위해 권한 관리 시 반드시 지켜야 할 엔지니어링 원칙과 체크리스트입니다.

1) 최소 권한의 원칙 (Principle of Least Privilege)

모든 프로세스와 사용자는 업무를 수행하는 데 필요한 최소한의 권한만 가져야 합니다. 실행 파일이 아닌 단순 설정 파일이나 데이터 파일은 절대로 x(실행) 권한을 주지 마십시오. 데이터베이스 백업 파일이나 환경 설정 파일 등 기밀성이 요구되는 파일은 소유자 외에는 아무도 볼 수 없도록 600(-rw-------) 혹은 최소한 640(-rw-r-----) 수준으로 철저히 격리해야 합니다.

2) 777 권한 남용 금지 (가장 치명적인 보안 불감증)

웹 프로그램 실행 중 'Permission Denied'(권한 거부) 오류가 발생했을 때, 정확한 원인을 분석하기 귀찮거나 바쁘다는 이유로 해당 디렉토리에 chmod -R 777을 지르는 행동은 서버의 대문을 활짝 열어두는 것과 같습니다.

777 권한이 부여된 디렉토리는 시스템 내부의 권한이 낮은 다른 일반 계정이나, 웹 취약점을 통해 침투한 해커가 임의로 악성 웹셸 스크립트를 생성하고 실행할 수 있는 완벽한 놀이터가 됩니다. 권한 오류가 나면 무작정 숫자를 높이지 말고, chown을 통해 해당 프로세스가 소유권을 가지게 하거나 소유 그룹을 맞춘 뒤 755(drwxr-xr-x)나 770(drwxrwx---) 수준에서 정교하게 해결하는 습관을 들여야 합니다.

5. 요약

리눅스의 전통적인 권한 제어 구조는 매우 단순하고 명확하지만, 서버 전체의 보안 성패를 가르는 기초 중의 기초입니다.

  • ls -l이 보여주는 10자리 문자열과 r, w, x의 물리적 의미를 완벽히 이해하고,

  • 8진수 표기법(chmod 755)과 심볼릭 표기법(chmod g+w)을 상황에 맞게 구사하며,

  • chown -R을 통해 하위 디렉토리 전체의 프로세스 소유권을 안전하게 제어해야 합니다.

이 전통적 접근 제어 메커니즘을 완벽히 이해했을 때, 비로소 인프라 내 자산을 안전하게 보호할 수 있습니다. 하지만 이 전통적인 방식으로는 "기획자 김 대리에게만 이 디렉토리의 읽기 권한을 추가로 주고 싶다"와 같은 복잡한 현대 협업 환경의 요구사항을 해결하는 데 한계가 있습니다. 다음 6회차에서는 전통적 구조의 한계를 뛰어넘어 제3의 특정 사용자에게 독립적인 권한을 마법처럼 부여하는 '정교한 다중 협업을 위한 방패, ACL(접근 제어 목록)' 기술에 대해 자세히 알아보겠습니다.


댓글