setfacl 명령어 사용법

파일과 디렉터리에 ACL(접근 제어 목록) 항목을 설정·삭제하는 명령어입니다.

권한·보안 관리연결 실습 문제 3개Rocky Linux 8 기준 · 실행 결과는 실습 컨테이너에서 확인

기본 문법

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을 기본 지원합니다.

자주 쓰는 옵션

옵션의미
-mACL 항목을 추가하거나 수정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
-nmask 항목을 자동으로 재계산하지 않음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 · 내용에 오류가 있으면 문제 페이지의 질문 기능으로 알려 주세요.