세밀한 접근 권한 사용

리눅스도 다른 유닉스 계열 운영체제처럼 파일이나 디렉터리의 권한을 관리할 때 소유자(owner), 그룹(group), 다른 사용자(other) 라는 세 가지 역할에 따라 접근 권한을 부여할 수 있습니다.


이러한 세 가지 역할에 따라 세밀하게 접근 권한을 관리하는 데는 제약 사항이 있었습니다. 일례로 어떤 파일이나 디렉터리에 대해 julia 와 tom 사용자에게 읽기 권한만 주고 bob과 alice는 읽기/쓰기 권한을 줄수는 없었습니다.


이런 문제를 해결하기 위해 리눅스 커널과 파일 시스템은 POSIX(Portable Operating System Interface) 표준 기반의 접근 제어 목록(ACL; Access Control List) 기능이 추가되었고 cp, mv 같이 파일과 디렉터리를 다루는 유틸리티도 ACL 에 맞게 수정되었습니다.

최신 버전의 리눅스 배포판은 접근 제어 목록 기능이 포함되어 있으므로 별다른 설정없이 바로 사용할 수 있습니다.


ACL 설정

ACL 은 access ACL 과 기본 ACL 두 가지 형식이 있으며 access ACL 은 지정한 파일이나 디렉터리에 대해 설정한 접근 제어 목록이며 기본 ACL 은 디렉터리에만 지정할 수 있고 필수 사항은 아닙니다.

디렉토리에 들어있는 파일에 access ACL 이 설정돼 있지 않으면 디렉토리에 지정된 기본 ACL 을 사용하게 되며 사용자별, 그룹별, 유효 접근 권리 마스크(effective rights mask) 별, 그리고 다른 사용자(other)에 대해 설정할 수 있습니다.

ACL 을 설정하는 명령어는 setfacl 이며 기본적인 사용법에 대해서 알아 봅시다.



ACL 추가/변경

-m 옵션을 사용하면 파일이나 디렉터리의 ACL 을 추가 또는 변경할 수 있으며 setfacl -m rules files 와 같은 형식으로 사용하면 됩니다. rule 은 필수 항목이며 다음과 같은 옵션을 주어서 설정할 수 있습니다.

  • u:uid:perms
    특정 사용자를 대상으로 ACL 을 설정하며 사용자 ID나 UID(숫자)로 지정하면 됩니다.
  • g:gid:perms
    그룹을 대상으로 설정하며, 그룹 명이나 GID(숫자) 로 지정하면 됩니다.
  • o:perms
    다른 사용자(other)에 대해 ACL 을 설정합니다.

perms 에 지정하는 권한은 r(읽기), w(쓰기), x(실행) 세 가지로 나눠지며 여러 권한을 지정할 경우 권한 문자를 이어서 써주면 됩니다. 예를 들어 읽기, 쓰기, 실행을 모두 허용할 경우 rwx 를 지정합니다.


만약 root 만 읽을 수 있는 /etc/sudoers 파일을 lesstif 사용자만 읽을 수 있게 한다면 아래와 같이 -m 옵션에 u: 항목에 lesstif 를 기술해 주면 됩니다.

예제일 뿐이고 sudoers 파일은 보안상 중요한 파일이므로 root 만 읽게 하는게 좋습니다.

$ sudo setfacl -m u:lesstif:r /etc/sudoers
/etc/sudoers 파일 접근 허용


이제 lesstif 사용자로 로그인해서 cat /etc/sudoers  를 실행해서  파일 내용이 보이는지 확인해 봅시다.


ACL 삭제

아래 명령은 lesstif 사용자의 /etc/sudoers 에 대한 모든 권한을 삭제합니다.

$ sudo setfacl -x u:lesstif /etc/sudoers
접근 권한 해제


ACL 확인

ACL 을 확인하려면 getfacl 명령어 뒤에 확인하려는 파일이나 디렉터리를 지정해 주면 되며 아래 명령어는 /etc/sudoers 파일의 권한을 확인합니다.

$ getfacl /etc/sudoers


# file: etc/sudoers
# owner: root
# group: root
user::r--
group::r--
mask::r--
other::---


TODO owner, group 진하게

ACL 확인


소유자와 그룹은  읽기(r) 권한만 갖고 있고 나머지는 아무 권한이 없는 것을 확인할 수 있습니다.


사용 예

이제 보안 관점에서 왜 ACL 이 필요한지 설명드리면 전절에서 얘기한 최소 권한 법칙에 ACL 이 필요하기 때문입니다. 예로 웹 서버가 잘 구동되고 있는지 웹 서버 로그를 봐야한다고 가정해 보겠습니다.

(실무에서는 자주 발생합니다.)

웹 서버 로그에 쓰기 위해서는 웹 서버 또는 root 권한이 필요하며 이는 당연하 설정이라고 생각됩니다.


하지만 웹 서버 로그를 보기 위해서도 root 권한이 필요하며 단순히 웹서버 로그를 보기 위해 매번 root 로 로그인하는 것은 바람직하지 않지만 모든 사용자가 로그 파일을 볼 수 있는 것도 바람직한 상황은 아닙니다. 

이럴 경우 ACL 을 활용하여 웹 서버 로그를 봐야 하는 특정 사용자만 읽기 권한을 주면 보안성을 확립하면서 루트 권한없이 서비스 운영에 필요한 웹 서버 로그도 볼수  있습니다.


이제 setfacl 을 이용하여 lesstif 라는 사용자는 아파치 웹서버 로그를 볼 수 있게 설정해 봅시다.


웹서버 로그가 저장되는 /etc/httpd/logs 는 실제로는 /var/log/httpd 에 대한 심볼릭 링크이며 먼저 getfacl 의 접근 권한 설정을 확인해 보겠습니다.

$ sudo getfacl /var/log/httpd/
  
getfacl: Removing leading '/' from absolute path names
# file: var/log/httpd/
# owner: root
# group: root
user::rwx
group::---
mask::---
other::---


TODO owner, group 진하게

웹 서버 로그 권한 확인


/var/log 의 소유자는 root 이고 그룹도 root 이며 소유자는 읽기(r), 쓰기(w), 실행(x) 권한을 갖고 있고 그룹과 다른 사용자에게는 읽기(r), 실행(x) 권한이 부여돼 있음을 확인할 수 있습니다.


소유자인 root 를 제외한 일반 사용자는 아무 권한이 없으므로 /var/log/httpd 디렉토리에 대해 ls 로 파일 목록을 조회조차 할 수 없습니다.

이제 lesstif 사용자에게 읽기 권한을 부여해 봅시다. 대상이 디렉터리이므로 읽기(r), 실행(x) 속성을 같이 줘야 해당 디렉터리의 내용들을 볼 수 있습니다.

$ sudo setfacl -m u:lesstif:rx /var/log/httpd/
웹 서버 로그 접근 허용


이제 lesstif 사용자는 tail -f /var/log/httpd/error_log  명령으로 아파치 웹 서버로의 로그를 읽을 수 있지만 다른 사용자는 기존처럼 읽기가 불가능하므로 웹 서버 로그를 보려고 루트로 로그인 할 필요가 없습니다.


이처럼 ACL 을 이해하고 setfacl 과 getfacl 의 사용법을 알면 파일/디렉터리별 세밀한 접근 제어 설정을 통해 루트로 수행해야 하는 작업을 최소화하고 잘못된 모드 설정으로 인한 보안 취약점을 방지할 수 있습니다.

Ref