기본 문법
setfacl [옵션] {-m|-M|-x|-X|--set} 규칙 파일...
setfacl은 파일이나 디렉터리에 ACL(Access Control List)을 설정하는 명령어입니다. 기존 유닉스 권한은 소유자·그룹·기타 세 주체에만 권한을 줄 수 있어, 특정 사용자 한 명이나 추가 그룹에게만 다른 권한을 주기 어렵습니다. ACL을 사용하면 파일 소유권과 모드를 그대로 둔 채 개별 사용자나 그룹 단위로 읽기·쓰기·실행 권한을 덧붙일 수 있습니다.
실무에서는 배포 계정에만 설정 파일 쓰기 권한을 주거나, 감사 담당 그룹에 로그 읽기 권한만 허용하는 식으로 사용합니다. 디렉터리에는 기본(default) ACL을 설정해 그 안에 새로 만들어지는 파일이 권한을 상속받게 할 수 있어 협업 디렉터리 구성에 쓰입니다.
리눅스 자격증 시험(리눅스마스터, RHCSA, LPIC 등)에서는 getfacl과 함께 다뤄지는 경우가 많습니다. -m으로 항목을 추가하고, -d로 기본 ACL을 지정하며, -x와 -b로 제거하는 흐름을 이해해 두면 좋습니다. ACL이 설정된 파일은 ls -l의 권한 문자열 끝에 + 기호가 표시됩니다. Rocky Linux 8의 기본 파일시스템인 XFS와 ext4는 ACL을 기본 지원합니다.
자주 쓰는 옵션
| 옵션 | 의미 | 예 |
|---|---|---|
-m | ACL 항목을 추가하거나 수정 | setfacl -m u:deploy:rw /srv/releases/app.env |
-x | 지정한 ACL 항목 삭제(주체만 기재하며, 권한 문자는 무시됨) | setfacl -x u:deploy /srv/releases/app.env |
-b | 기본 ACL을 포함한 모든 확장 ACL 항목 제거(소유자·그룹·기타 기본 항목은 유지) | setfacl -b /srv/project-docs |
-d | 디렉터리에 기본(default) ACL 설정, 이후 새로 생성되는 항목이 상속 | setfacl -d -m u:analyst:rwx /srv/project-docs |
-R | 디렉터리 하위 전체에 재귀 적용 | setfacl -R -m g:auditors:rX /srv/project-docs |
-k | 기본 ACL만 제거(접근 ACL은 유지) | setfacl -k /srv/project-docs |
-M | 파일에 적힌 규칙 목록을 읽어 한 번에 적용(- 를 주면 표준 입력에서 읽음) | setfacl -M rules.txt /srv/data |
--set | 기존 ACL을 모두 버리고 지정한 내용으로 교체(u::, g::, o:: 항목을 반드시 포함해야 함) | setfacl --set u::rw,g::r,o::-,u:deploy:rw /tmp/demo/app.env |
-n | mask 항목을 자동으로 재계산하지 않음 | setfacl -n -m u:deploy:rw /tmp/demo/app.env |
--test | 실제로 적용하지 않고 적용될 결과만 출력 | setfacl --test -m u:deploy:rw /tmp/demo/app.env |
실무 예시
특정 사용자에게 읽기·쓰기 ACL 부여
준비: mkdir -p /tmp/demo; echo 'KEY=value' > /tmp/demo/app.env; chmod 640 /tmp/demo/app.env; id demo_deploy >/dev/null 2>&1 || useradd demo_deploy
$ setfacl -m u:demo_deploy:rw /tmp/demo/app.env && getfacl /tmp/demo/app.env
getfacl: Removing leading '/' from absolute path names
# file: tmp/demo/app.env
# owner: root
# group: root
user::rw-
user:demo_deploy:rw-
group::r--
mask::rw-
other::---
소유자와 모드를 바꾸지 않고 demo_deploy 사용자에게 rw- 권한을 추가합니다. 확장 ACL이 생기면 mask:: 항목이 함께 만들어집니다. getfacl은 절대 경로를 받으면 맨 앞의 '/'를 떼어냈다는 안내를 표준 오류로 출력합니다.
ACL 설정 여부를 ls로 확인
준비: mkdir -p /tmp/demo; echo data > /tmp/demo/plain.txt; echo data > /tmp/demo/acl.txt; id demo_deploy >/dev/null 2>&1 || useradd demo_deploy
$ setfacl -m u:demo_deploy:r /tmp/demo/acl.txt; ls -l /tmp/demo/plain.txt /tmp/demo/acl.txt
-rw-r--r--+ 1 root root 5 Sep 16 11:40 /tmp/demo/acl.txt
-rw-r--r--. 1 root root 5 Sep 16 11:40 /tmp/demo/plain.txt
ACL이 설정된 파일은 권한 문자열 끝에 + 기호가 붙습니다. SELinux가 활성화된 Rocky 8에서는 ACL이 없는 파일에 보안 컨텍스트를 뜻하는 . 기호가 표시됩니다.
여러 파일에 그룹 읽기 ACL 부여
준비: mkdir -p /tmp/demo/logs; touch /tmp/demo/logs/file1.log /tmp/demo/logs/file2.log; getent group auditors >/dev/null || groupadd auditors
$ setfacl -m g:auditors:r /tmp/demo/logs/file1.log /tmp/demo/logs/file2.log && getfacl /tmp/demo/logs/file2.log | grep auditors
group:auditors:r--
getfacl: Removing leading '/' from absolute path names
파일 여러 개를 인수로 주어 같은 그룹 ACL을 한 번에 지정합니다. auditors 그룹에는 읽기 권한만 부여됩니다.
디렉터리에 기본 ACL로 상속 설정
준비: mkdir -p /tmp/demo/project-docs; id demo_analyst >/dev/null 2>&1 || useradd demo_analyst
$ setfacl -m u:demo_analyst:rwx /tmp/demo/project-docs && setfacl -d -m u:demo_analyst:rwx /tmp/demo/project-docs && touch /tmp/demo/project-docs/new.txt && getfacl /tmp/demo/project-docs/new.txt | grep demo_analyst
getfacl: Removing leading '/' from absolute path names
user:demo_analyst:rwx #effective:rw-
기본 ACL을 설정하면 이후 그 디렉터리에 만들어지는 파일이 해당 항목을 물려받습니다. 다만 일반 파일은 생성 모드에 실행 비트가 없어 mask가 rw-로 계산되고, 유효 권한이 #effective:rw-로 표시됩니다.
ACL 항목 삭제와 전체 초기화
준비: mkdir -p /tmp/demo; echo x > /tmp/demo/clean.txt; id demo_deploy >/dev/null 2>&1 || useradd demo_deploy; getent group auditors >/dev/null || groupadd auditors; setfacl -m u:demo_deploy:rw,g:auditors:r /tmp/demo/clean.txt
$ setfacl -x u:demo_deploy /tmp/demo/clean.txt && getfacl /tmp/demo/clean.txt; setfacl -b /tmp/demo/clean.txt && ls -l /tmp/demo/clean.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/demo/clean.txt
# owner: root
# group: root
user::rw-
group::r--
group:auditors:r--
mask::r--
other::r--
-rw-r--r--. 1 root root 2 Sep 16 11:40 /tmp/demo/clean.txt
-x는 지정한 항목 하나만 지우므로 group:auditors 항목과 mask는 남습니다. 이어서 -b를 실행하면 확장 ACL이 모두 제거되어 ls -l의 + 기호가 사라집니다.
기본 ACL만 제거하기
준비: mkdir -p /tmp/demo/shared; id demo_analyst >/dev/null 2>&1 || useradd demo_analyst; setfacl -m u:demo_analyst:rwx /tmp/demo/shared; setfacl -d -m u:demo_analyst:rwx /tmp/demo/shared
$ setfacl -k /tmp/demo/shared && getfacl /tmp/demo/shared
getfacl: Removing leading '/' from absolute path names
# file: tmp/demo/shared
# owner: root
# group: root
user::rwx
user:demo_analyst:rwx
group::r-x
mask::rwx
other::r-x
-k는 default: 로 시작하는 기본 ACL 항목만 지우고 접근 ACL은 그대로 남깁니다. 출력에 default 항목이 보이지 않고 user:demo_analyst:rwx만 남습니다.
주의할 점
- -x로 항목을 지울 때는 u:deploy처럼 주체만 적는 것이 안전합니다. 권한 문자를 함께 적으면 무시되거나 버전에 따라 오류가 날 수 있습니다.
- mask 값이 낮으면 ACL 권한이 #effective로 제한됩니다. getfacl로 실제 유효 권한을 확인하세요.
- chmod로 그룹 권한을 바꾸면 ACL이 설정된 파일에서는 mask가 변경되어 ACL 유효 권한이 함께 달라집니다.
- 기본 ACL(-d)은 디렉터리에만 설정되며, 설정 이전에 이미 존재하던 파일에는 적용되지 않습니다.
- -R로 재귀 적용하면 일반 파일에도 x가 붙을 수 있습니다. 대문자 X(예: rX)를 쓰면 디렉터리와 이미 실행 권한이 있는 파일에만 실행 권한이 부여됩니다.
- 예제의 useradd·groupadd는 실습용 계정과 그룹을 만드는 작업입니다. 운영 서버가 아닌 테스트 환경에서 실행하고, /etc 아래 시스템 파일이나 광범위한 경로에 -R로 ACL을 적용하기 전에는 대상 경로를 반드시 확인하세요.
이 명령어로 풀 수 있는 실습 문제
브라우저 웹 터미널에서 바로 풀고 요구사항별로 자동 채점됩니다. 로그인 없이 5분 체험도 가능합니다.
관련 명령어
마지막 검수 2026-09-16 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.
