리눅스(Linux)에는 파일과 디렉터리에 대한 접근을 세밀하게 통제할 수 있는 강력한 기능이 있습니다. 바로 '액세스 제어 목록(Access Control Lists, ACL)'입니다. 이 글에서는 리눅스에서 ACL이 어떻게 동작하는지, 그리고 이를 활용해 파일 권한을 어떻게 제어하는지 단계별로 살펴보겠습니다.
참고: ACL의 작동 원리를 확실히 이해하기 위해 먼저 실습용 리눅스 시스템에 사용자와 그룹을 설정하겠습니다. 아래 실습은 Kali 운영체제가 설치된 가상 머신에서 진행되며, root 사용자는 새로운 사용자를 시스템에 추가하고 그룹에 배정할 수 있는 권한을 가집니다.
사용자와 그룹 생성하기
먼저 root 계정으로 로그인한 뒤, 아래 표와 같이 사용자를 생성하고 각각의 그룹에 배정합니다. 개념을 쉽게 이해할 수 있도록 사용자에게는 간단한 이름을 부여했습니다.
| 사용자 | 그룹 |
|---|---|
| john1 john2 john3 |
johns |
| jane1 jane2 |
janes |
시스템에 새로운 사용자를 추가할 때는 adduser 명령어를 사용합니다.

id 명령어를 실행하면 새로 생성된 사용자의 상세 정보를 확인할 수 있습니다. 출력 결과에는 사용자 ID(uid), 그룹 ID(gid), 그룹 이름(groups)이 표시됩니다. 사용자가 생성되면 자동으로 사용자 이름과 동일한 이름의 그룹에 등록되며, 해당 사용자가 그 그룹의 유일한 멤버가 됩니다.

같은 방식으로 "john2"와 "john3" 사용자도 생성합니다.
adduser john2 adduser john3
세 명의 사용자가 모두 생성되면 id 명령어로 각 사용자와 그룹의 ID를 확인할 수 있습니다.

출력 결과를 보면 세 사용자가 각각 1000, 1001, 1002라는 서로 다른 그룹에 속해 있는 것을 알 수 있습니다. 앞서 제시한 표에서 계획했듯이, 우리는 세 사용자를 하나의 그룹인 johns에 묶어야 합니다. 현재 시스템에 이 그룹이 존재하지 않으므로 groupadd 명령어로 새로 만들겠습니다.
groupadd -g <새_그룹_ID> <그룹_이름>

여기서는 새 그룹 ID를 5000으로 지정했습니다. 만약 -g 옵션을 생략하면 시스템이 자동으로 그룹 ID를 할당합니다. 새 그룹의 이름은 "johns"입니다. 이제 "john1", "john2", "john3" 세 사용자를 이 그룹의 멤버로 추가해야 하는데, 이 작업에는 usermod 명령어를 사용합니다.
usermod -g <그룹_이름> <사용자_이름>
usermod는 "사용자_이름"을 "그룹_이름" 그룹에 추가하는 명령어입니다. 아래 화면은 그룹 변경 전 "john1"의 uid와 gid를 먼저 보여주고, usermod 명령이 성공적으로 실행된 후 "john1"이 gid 5000번의 "johns" 그룹에 추가된 모습입니다.

동일한 과정을 "john2"와 "john3"에도 적용합니다.
usermod -g johns john2 usermod -g johns john3
마지막으로 id 명령어를 사용하면 "johns" 그룹에 속한 세 사용자의 정보를 한눈에 확인할 수 있습니다.

이렇게 해서 세 명의 사용자를 성공적으로 생성하고 같은 그룹에 배정했습니다.
같은 방식으로 "jane1"과 "jane2" 사용자를 생성하고 gid 6000번의 "janes" 그룹에 추가했습니다. 아래와 같이 id 명령어로 두 사용자의 정보를 확인할 수 있습니다.

액세스 제어 목록(ACL)이 필요한 이유
이제 사용자 "john1"이 로그인하여,

홈 디렉터리에 새 파일을 만들고,

파일에 내용을 추가했다고 가정해 보겠습니다.

ls 명령어로 파일의 메타데이터를 확인해 보겠습니다.

출력 결과 맨 앞의 문자들인 - rw- r-- r--가 권한 문자열(permission string)에 해당합니다. 이것을 하나씩 분해해 보겠습니다.
| - | rw- | r-- | r-- |
|---|---|---|---|
| 파일 유형 | 파일 소유자 john1이 가진 권한 | johns 그룹 멤버들이 가진 권한 | johns 그룹에 속하지 않은 기타 사용자에게 주어진 권한 |
파일 권한에 대한 기본 개념이 부족하다면 관련 입문 문서를 먼저 참고하는 것도 좋습니다.
그런데 만약 파일 소유자인 "john1"이 추가로 "john2"와 "jane1"에게만 쓰기(write) 권한을 부여하고, "john3"과 "jane2"에게는 읽기(read) 권한만 유지하고 싶다면 어떻게 해야 할까요?
| rw- | r-- |
|---|---|
| john1 john2 jane1 |
john3 jane2 |
한 가지 방법은 "john1", "john2", "jane1"에게 읽기·쓰기 권한을 준 새 그룹을 만들고, 또 다른 그룹에는 "john3"과 "jane2"에게 읽기 권한만 부여하는 것입니다. 하지만 john1이 특정 그룹 멤버의 권한을 더 수정하고 싶어질 때마다 새로운 그룹을 계속 만들어야 합니다. 여러 개의 그룹을 생성하고 관리하는 일은 시스템 관리자에게 큰 부담이 됩니다.
대신 파일에 '액세스 제어 목록(ACL)'을 설정하면, 어떤 사용자가 해당 파일에 대해 어떤 작업을 수행할 수 있는지 명확하게 지정할 수 있습니다.
파일에 액세스 제어 목록(ACL)을 생성하는 방법
모든 파일은 생성될 때 기본적인 ACL이 함께 할당됩니다. 따라서 ACL을 효율적으로 활용하는 것은 결국 이를 적절히 수정하는 문제입니다. 파일의 ACL은 오직 파일 소유자와 root 사용자만 수정할 수 있습니다.
기존 ACL을 확인하려면 getfacl 명령어를 사용합니다.
getfacl <파일_이름>

#로 시작하는 줄은 주석(comment) 줄입니다. 실제 정보는 출력 마지막 세 줄에 담겨 있으며, 앞서 확인한 권한 문자열과 유사한 구조입니다. "user" 줄은 파일 소유자 "john1"에게 할당된 권한을, "group" 줄은 "johns" 그룹의 다른 멤버들에게 할당된 권한을 의미합니다. 그리고 예상하셨듯이 "other" 줄은 그룹 외부의 모든 사용자를 가리킵니다.
이제 setfacl 명령어로 파일의 기존 ACL을 수정해 보겠습니다.
setfacl -m entity:name:permissions <파일_이름>
| entity | name | permissions |
|---|---|---|
| ACL 항목의 대상을 나타냅니다. user(u), group(g), others(o) |
ACL 항목이 적용될 사용자 또는 그룹의 이름 | 읽기(r), 쓰기(w), 실행(x) 권한을 각각의 문자로 표기합니다. |
먼저 "john2"에게 파일에 대한 읽기·쓰기 권한을 부여하고,

이어서 "jane1"에게도 동일한 권한을 부여합니다.

업데이트된 "secretfile"의 ACL을 다시 확인해 보겠습니다.

출력 결과에서 "john2"와 "jane1"에게 읽기·쓰기 권한이 각각 할당된 것을 확인할 수 있습니다.
ACL 적용 결과 검증하기
실제로 "john2"가 파일을 읽고 쓸 수 있는지 확인해 보겠습니다.

"john2"가 입력한 새로운 내용이 파일에 정상적으로 추가되었습니다.

마찬가지로 "jane1"도 읽기·쓰기 권한을 모두 행사할 수 있습니다.

반면 같은 그룹에 속한 "john3"는 파일에 쓰기를 시도하면 실패합니다.

기타(other) 범주에 해당하는 "jane2" 역시 파일에 쓸 수 없습니다.

마무리
지금까지 살펴본 과정은 디렉터리에도 동일하게 적용할 수 있습니다. 액세스 제어 목록(ACL)을 활용하면 시스템 관리자가 복잡한 그룹 구조를 만들지 않고도 파일과 디렉터리 접근 권한을 능숙하고 유연하게 관리할 수 있습니다.