[Linux] ACL 권한

박원균·2021년 11월 6일
0

Linux

목록 보기
3/5
post-thumbnail

setfacl과 getfacl

리눅스에서는 다른 유닉스 계열 운영체제처럼 파일이나 디렉터리의 권한을 관리할 때 소유자,그룹,다른 사용자라는 세 가지 역할에 따라 접근 권하을 부여할 수 있고, 이 작업은 chmod를 통해 수행합니다.

이러한 세 가지 역할에 따라 접근 권한을 관리하는 데는 갖가지 제한이 있었습니다.
파일에 대해 alice, bob이라는 사용자에게 읽기 권한만 주고 Eve와 Frank에게는 읽기/쓰기 권한을 주는 등의 세밀한 권한 조정을 불가능했습니다.

이 같은 문제를 해결하기 위해 리눅스 커널과 파일 시스템에 접근 제어목록(ACL:Access Control List)을 구현했고 cp,mv 같은 파일 관련 유틸리티도 ACL에 맞게 수정되었습니다.

접근 권한은 파일시스템의 속성으로 부여되므로 ext1,ext2 같은 이전의 파일 시스템에서는 사용할 수 없습니다.

ACL 설정

ACL은 access ACL과 기본 ACL이라는 두 가지 형식이 있습니다.

  • access ACL은 지정한 파일이나 디렉터리에 대해 설정한 접근 제어 목록입니다.
  • 기본 ACL은 디렉터리에만 지정할 수 있고 필수 사하은 아닙니다.

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

ACL을 설정하는 명령어는 setfacl입니다.

ACL 추가/변경

-m 옵션을 지정하면 파일이나 디렉터리의 ACL을 추가 또는 변경할 수 있으며, setfacl -m rules files 형식으로 사용하면 됩니다.

rule은 필수항목입니다.

  • u:uid:perms
    특정 사용자를 대상으로 ACL을 설정해야합니다. 대상 사용자는 사용자 ID나 UID(숫자)로 지정하면됩니다.
    시스템이 등록한 유요한 사용자여만 합니다.
  • g:gid:perms
    그룹을 대상으로 권한을 지정하며, 대상 그룹은 그룹명이나 GID(숫자)로 지정합니다.
    시스템이 등록한 유효한 그룹이어야합니다.
  • o:perms
    다른 사용자에 대해 ACL을 지정합니다. perms에 지정한 권한은 r,w,x라는 세가지로 나뉘며 여러 권하을 지정할 경우 권한 문자를 이어서 지정하면됩니다.

ACL 삭제

-x,--remove 옵션을 이용하면 ACL을 삭제할 수 있습니다. -m 과 마찬가지로 rules과 파일명을 지정하게 돼 있으나 권한 항목은 지정할 수 없으며 지정된 사용자와 그룹의 모든 권한을 삭제합니다.

예시
일반 사용자는 /etc/sysconfig/iptables 파일의 내용을 볼 수 없습니다. 따라서 lesstif라는 사용자에게 root만 볼 수 있는 /etc/sysconfig/iptables 파일을 볼 수 있는 권한을 부여 해볼려고합니다.

위와 같은 방법으로 그룹와 Other에게도 권한을 줄 수 있습니다.

기본 ACL 설정

기본 ACL 설정은 rules 항목 앞에 d 문자를 붙이면 됩니다. 디렉토리에만 지정할 수 있으므로 파일에 지정할 경우 에러가 발생합니다.

ACL 확인

파일이나 디렉토리에 설정된 ACL을 확인할 때는 getfacl 명령어를 사용합니다. 일례로 시스템 로그가 쌓이는 /var/log의 ACL을 확인해보십시다.

/var/log의 소유자는 root이고 그룹도 root입니다. 소유자는 r,w,x 권하을 가지고 있고 그룹과 다른 사용자에게는 r,x 권한이 부여돼 있음을 확인할 수 있습니다.

ACL의 활용

리눅스나 유닉스를 관리할 때 좋은 습관 중 하나는 루트로 작업하는 것을 최소화 하는것입니다. 불편하더라도 일반 사용자로 로그인해서 작업하고 꼭 루트 권한이 필요한 경우에만 루트 권한을 획득해서 작업하거나 sudo 명령어로 루트 권한이 필요한 명령어만 별도로 실행하는 것이 큰 사고나 실수를 방지하는 좋은 작업 습관입니다.

CentOs에 설치되는 아파트 웹 서버의 경우 일반 사용자는 로그 파일을 볼 수 없게 돼 있습니다.단순히 웹 서버 로그를 보기위해 매번 root로 로그인 하는 것은 바람직하지 않지만 모든 사용자가 로그 파일을 볼 수 있는것도 바람직한 상황은 아닙니다.

wgpark 권한으로 httpd 로그를 볼수있게 설정해볼 겁니다.

우선, getfacl로 파일의 권한을 확인합니다.

[root@localhost wgpark]# getfacl /var/log/httpd

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

소유자인 root를 제외한 일반 사용자는 아무 권한이 없으므로 디렉터리에서 ls로 파일 목록을 조회조차할 수 없습니다. 이제 wgpark 사용자에게 읽기 권한을 부여 해볼것입니다. 대상이 디렉토리이기 때문에 r,x 속성을 함께 줘야 해당 디렉토리 내용을 볼 수 있습니다.

[root@localhost wgpark]# setfacl -m u:wgpark:rx /var/log/httpd/
[root@localhost wgpark]# getfacl /var/log/httpd/
getfacl: Removing leading '/' from absolute path names
# file: var/log/httpd/
# owner: root
# group: root
user::rwx
user:wgpark:r-x
group::---
mask::r-x
other::---

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

웹 서버나 기타 애플리케이션 서버를 설정할 때 서버를 구동한 계정과 콘텐츠를 제공하는 계정이 다른 경우가 있을 수 있습니다. 그런데 시스템에 wordpress 라는 계정을 만들고 /var/www/wordpress 디렉토리의 소유자를 wordpress로 변경할 경우 권한 문제로 인해 워드프레스에서 글을 작성할 때 첨부 파일 업로드가 실패하는 문제가 발생할 수 있습니다. 이것은 소유자는 wordpress인데 웹 서버를 구동한 계정은 apache 계정이므로 워드프레스의 uploads 폴더에 파일을 쓰지 못해서 발생하는 문제입니다.

이 경우 uploads 폴더를 만들고 아파치 웹 서버가 폴더에 쓸 수 있게 권한을 부여하면 /tmp 처럼 모두에게 쓰기 권한을 주지 않고 특정 계정에게만 권한을 부여해 이 같은 문제를 해결할 수 있습니다.

profile
함바라기

2개의 댓글

comment-user-thumbnail
2021년 11월 6일

멋져요 .. ♡

1개의 답글

관련 채용 정보