파일 접근 제어와 UNIX/Linux 권한 관리
파일 접근 제어의 목적과 UNIX/Linux 권한 표기, ACL, DAC·MAC·RBAC, SELinux·AppArmor 적용 방식을 정리한다.
2026-08-14 · 최초 발행 2026-01-12
파일을 읽고, 바꾸고, 실행할 수 있는 대상을 정한다
파일 접근 제어는 파일과 디렉토리에 대한 권한을 관리해 무단 접근을 막고 데이터 보안을 유지하는 운영체제 보안 메커니즘이다. 사용자별로 접근을 허용하거나 제한하며, 중요 파일의 보호와 데이터 기밀성·무결성 유지에 직접 연결된다.
개인 파일을 다른 사용자로부터 격리하고, 시스템 파일의 변경이나 삭제를 막는 일도 같은 권한 체계 위에서 이뤄진다. 권한 설계에서는 필요한 범위만 부여하는 최소 권한 원칙, 중요한 작업을 나눠 맡기는 직무 분리, 여러 보안 계층을 함께 두는 방어 심층화가 기준이 된다.
UNIX/Linux 권한은 대상과 동작을 함께 표현한다
UNIX/Linux는 권한 대상을 소유자(Owner), 그룹(Group), 기타(Others)로 구분한다. 소유자는 파일을 생성한 사용자이고, 그룹은 파일 그룹에 속한 사용자들, 기타는 그 어느 쪽에도 속하지 않는 모든 사용자다.
각 대상에는 읽기(Read), 쓰기(Write), 실행(Execute) 권한을 다르게 줄 수 있다.
- 파일의 읽기 권한은 내용 조회를 뜻하고, 디렉토리에서는 내용 목록을 보는
ls권한이 된다. - 파일의 쓰기 권한은 내용 수정과 삭제를 뜻하며, 디렉토리에서는 파일 생성과 삭제에 관여한다.
- 파일의 실행 권한은 프로그램 실행이고, 디렉토리에서는
cd로 진입할 수 있는 권한이다.
권한은 심볼릭 표기와 8진수 표기로 확인하고 설정한다.
-rwxr-xr-x
# - : 파일 유형 (- 일반 파일, d 디렉토리, l 심볼릭 링크)
# rwx : Owner 권한 (읽기, 쓰기, 실행)
# r-x : Group 권한 (읽기, 실행)
# r-x : Others 권한 (읽기, 실행)
읽기 r은 4, 쓰기 w는 2, 실행 x는 1로 계산한다.
chmod 755 file.txt
# 7 (rwx) : Owner = 4+2+1
# 5 (r-x) : Group = 4+0+1
# 5 (r-x) : Others = 4+0+1
자주 보게 되는 조합은 다음과 같다.
| 8진수 | 심볼릭 | 설명 |
|---|---|---|
| 644 | rw-r--r-- | 파일: 소유자 읽기/쓰기, 타인 읽기만 |
| 755 | rwxr-xr-x | 실행 파일: 소유자 전체, 타인 읽기/실행 |
| 700 | rwx------ | 소유자만 전체 권한 |
| 777 | rwxrwxrwx | 모든 사용자 전체 권한 (위험) |
| 600 | rw------- | 소유자만 읽기/쓰기 |
chmod는 심볼릭 방식과 8진수 방식 모두를 지원한다.
# 심볼릭 방식
chmod u+x file.txt # 소유자에게 실행 권한 추가
chmod g-w file.txt # 그룹에서 쓰기 권한 제거
chmod o=r file.txt # 기타에게 읽기만 부여
chmod a+r file.txt # 모두에게 읽기 추가 (a=all)
# 8진수 방식
chmod 644 file.txt # rw-r--r--
chmod 755 script.sh # rwxr-xr-x
chmod 700 private.txt # rwx------
실행 권한에는 특별한 예외가 있다
SetUID는 실행 파일을 소유자 권한으로 실행하게 한다. rwsr-xr-x (4755)처럼 표시되며, /usr/bin/passwd는 일반 사용자가 비밀번호를 변경할 수 있도록 SetUID를 사용한다.
chmod u+s file
chmod 4755 file
SetGID는 파일 실행 시 그룹 권한으로 실행되게 하며, 디렉토리에서는 새로 만들어지는 파일이 디렉토리 그룹을 상속하게 한다. 표기는 rwxr-sr-x (2755)다.
chmod g+s directory
chmod 2755 directory
Sticky Bit는 디렉토리 안에서 소유자만 자신의 파일을 삭제할 수 있도록 제한한다. rwxr-xr-t (1755)로 표시되며, /tmp가 대표적인 예다.
chmod +t directory
chmod 1755 directory
특수 권한은 ls 출력의 s와 t로도 확인할 수 있다.
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root 68208 Jan 01 12:00 /usr/bin/passwd
# s: SetUID
ls -ld /tmp
# drwxrwxrwt 20 root root 4096 Jan 01 12:00 /tmp
# t: Sticky Bit
소유자와 그룹을 바꾸는 명령
사용자는 UID(User ID)로 식별된다. root의 UID는 0이고, Linux에서 일반 사용자의 UID는 1000 이상이다.
ls -l file.txt
# -rw-r--r-- 1 user group 1024 Jan 01 12:00 file.txt
# user: 소유자
그룹은 GID(Group ID)로 식별한다. 그룹 목록은 /etc/group에서, 사용자 정보는 /etc/passwd에서 확인할 수 있다.
groups user
# user : user developers sudo
소유자 변경에는 chown, 그룹 변경에는 chgrp를 사용한다.
chown newuser file.txt # 소유자 변경
chown newuser:newgroup file.txt # 소유자 및 그룹 변경
chown -R newuser directory # 디렉토리 재귀적 변경
chgrp newgroup file.txt # 그룹 변경
chgrp -R newgroup directory # 디렉토리 재귀적 변경
권한을 정하는 주체에 따라 달라지는 접근 제어
DAC(Discretionary Access Control)는 파일 소유자가 권한을 결정하는 방식이다. UNIX/Linux의 기본 모델이며 chmod, chown으로 관리한다. 유연하고 관리하기 쉽지만, 소유자의 실수와 중앙 통제의 어려움이 보안상 약점이 될 수 있다.
MAC(Mandatory Access Control)은 시스템 정책이 권한을 결정한다. 소유자도 이를 바꿀 수 없으며 SELinux와 AppArmor가 여기에 해당한다. 중앙 통제와 높은 보안 수준을 제공하는 대신 구성은 복잡하고 유연성은 낮다.
RBAC(Role-Based Access Control)는 사용자에게 직접 권한을 붙이기보다 관리자, 개발자, 사용자 같은 역할에 따라 권한을 부여한다. 역할을 기준으로 관리할 수 있어 직무 분리와 관리 효율에 적합하다.
전통적인 권한만으로 부족할 때 ACL을 쓴다
ACL(Access Control List)은 특정 사용자나 그룹에 세밀한 권한을 부여하는 방식이다. Owner, Group, Others만으로는 서로 다른 사용자와 그룹에 개별 권한을 설정하기 어려운 경우를 보완한다. 예를 들어 user1에는 읽기/쓰기를, user2에는 읽기만 줄 수 있다.
Linux에서 ACL을 사용하려면 파일 시스템 마운트 옵션에 acl을 추가한다.
# 파일 시스템 마운트 옵션에 acl 추가
mount -o remount,acl /
setfacl은 ACL을 설정하거나 제거한다.
# 사용자에게 권한 부여
setfacl -m u:user1:rw file.txt # user1에게 읽기/쓰기
setfacl -m u:user2:r file.txt # user2에게 읽기만
# 그룹에게 권한 부여
setfacl -m g:developers:rwx directory # developers 그룹에게 전체 권한
# 기본 ACL 설정 (디렉토리)
setfacl -d -m u:user1:rw directory # 생성되는 파일에 자동 적용
# ACL 제거
setfacl -x u:user1 file.txt # user1 ACL 제거
setfacl -b file.txt # 모든 ACL 제거
설정된 ACL은 getfacl로 확인한다.
getfacl file.txt
# # file: file.txt
# # owner: owner
# # group: group
# user::rw-
# user:user1:rw-
# user:user2:r--
# group::r--
# mask::rw-
# other::r--
ls -l 출력의 +는 ACL이 설정된 파일임을 나타낸다.
ls -l file.txt
# -rw-r--r--+ 1 owner group 1024 Jan 01 12:00 file.txt
# +: ACL이 설정됨
사용자에게 적용되는 권한은 하나만 선택된다
파일 권한을 확인할 때 운영체제는 먼저 사용자가 소유자인지 확인한다. 해당하면 Owner 권한을 적용한다. 소유자가 아니라면 파일 그룹에 속하는지 확인하고, 속하면 Group 권한을 적용한다. 두 조건 모두 맞지 않을 때 Others 권한을 적용한다.
이 과정은 OR 조건이 아니다. 먼저 일치하는 카테고리 하나만 적용된다.
-rwxr----- 1 alice developers 1024 Jan 01 12:00 script.sh
developers 그룹에 속한 bob은 alice가 아니므로 소유자 권한을 받지 않는다. 그룹에는 속하므로 Group 권한이 적용되며, 권한은 r--, 즉 읽기만 가능하다.
developers 그룹에 속하지 않는 charlie는 소유자도 그룹 구성원도 아니므로 --- 권한을 받고 접근할 수 없다.
Windows에서는 NTFS 권한과 상속을 사용한다
Windows의 NTFS는 Full Control, Modify, Read & Execute, Read, Write 같은 기본 권한을 제공한다. 고급 권한에는 Traverse Folder / Execute File, List Folder / Read Data, Read Attributes, Read Extended Attributes, Create Files / Write Data, Create Folders / Append Data, Write Attributes, Write Extended Attributes, Delete Subfolders and Files, Delete, Read Permissions, Change Permissions, Take Ownership가 있다.
부모 디렉토리의 권한은 자식 파일과 디렉토리에 자동으로 상속될 수 있다. 상속을 차단하고 명시적 권한을 설정하는 방식도 사용할 수 있다.
SELinux와 AppArmor로 정책을 더한다
SELinux는 MAC을 구현하며 NSA가 개발했고 Red Hat, Fedora, CentOS 기본으로 제공된다. 정책 모드는 Enforcing, Permissive, Disabled로 나뉜다. Enforcing은 정책을 적용하고 위반을 차단하며, Permissive는 위반을 기록만 하고 차단하지 않는다.
SELinux는 user:role:type:level 형식의 컨텍스트를 사용한다.
ls -Z file.txt
# -rw-r--r--. user user unconfined_u:object_r:user_home_t:s0 file.txt
# SELinux 컨텍스트: user:role:type:level
모드와 컨텍스트는 다음 명령으로 확인하거나 변경할 수 있다.
# 모드 확인
getenforce
# 모드 변경
setenforce 0 # Permissive
setenforce 1 # Enforcing
# 컨텍스트 변경
chcon -t httpd_sys_content_t /var/www/html/index.html
AppArmor도 MAC을 구현하지만 프로파일을 기반으로 프로그램별 권한을 제한한다. Ubuntu와 SUSE 기본으로 제공되며, Enforce는 정책을 적용하고 Complain은 위반을 기록만 한다.
# 상태 확인
aa-status
# 프로파일 활성화
aa-enforce /etc/apparmor.d/usr.bin.program
# 프로파일 비활성화
aa-disable /etc/apparmor.d/usr.bin.program