리눅스에서는 다른 유닉스 계열 운영체제처럼 파일이나 디렉터리의 권한을 관리할 때 소유자,그룹,다른 사용자라는 세 가지 역할에 따라 접근 권하을 부여할 수 있고, 이 작업은 chmod를 통해 수행합니다.
이러한 세 가지 역할에 따라 접근 권한을 관리하는 데는 갖가지 제한이 있었습니다.
파일에 대해 alice, bob이라는 사용자에게 읽기 권한만 주고 Eve와 Frank에게는 읽기/쓰기 권한을 주는 등의 세밀한 권한 조정을 불가능했습니다.
이 같은 문제를 해결하기 위해 리눅스 커널과 파일 시스템에 접근 제어목록(ACL:Access Control List)을 구현했고 cp,mv 같은 파일 관련 유틸리티도 ACL에 맞게 수정되었습니다.
접근 권한은 파일시스템의 속성으로 부여되므로 ext1,ext2
같은 이전의 파일 시스템에서는 사용할 수 없습니다.
ACL은 access ACL과 기본 ACL이라는 두 가지 형식이 있습니다.
디렉터리에 들어있는 파일에 access ACL이 설정돼 있지 않으면 디렉터리에 지정된 기본 ACL이 적용됩니다. ACL은 사용자별, 그룹별, 유효 접근 권리 마스크(effective rights mask)별, 그리고 다른 사용자에 대해 설정할 수 있습니다.
ACL을 설정하는 명령어는 setfacl입니다.
-m
옵션을 지정하면 파일이나 디렉터리의 ACL을 추가 또는 변경할 수 있으며, setfacl -m rules files
형식으로 사용하면 됩니다.
rule
은 필수항목입니다.
-x
,--remove
옵션을 이용하면 ACL을 삭제할 수 있습니다. -m 과 마찬가지로 rules과 파일명을 지정하게 돼 있으나 권한 항목은 지정할 수 없으며 지정된 사용자와 그룹의 모든 권한을 삭제합니다.
예시
일반 사용자는 /etc/sysconfig/iptables
파일의 내용을 볼 수 없습니다. 따라서 lesstif라는 사용자에게 root만 볼 수 있는 /etc/sysconfig/iptables
파일을 볼 수 있는 권한을 부여 해볼려고합니다.
위와 같은 방법으로 그룹와 Other에게도 권한을 줄 수 있습니다.
기본 ACL 설정은 rules 항목 앞에 d 문자를 붙이면 됩니다. 디렉토리에만 지정할 수 있으므로 파일에 지정할 경우 에러가 발생합니다.
파일이나 디렉토리에 설정된 ACL을 확인할 때는 getfacl 명령어를 사용합니다. 일례로 시스템 로그가 쌓이는 /var/log
의 ACL을 확인해보십시다.
/var/log
의 소유자는 root
이고 그룹도 root
입니다. 소유자는 r,w,x 권하을 가지고 있고 그룹과 다른 사용자에게는 r,x 권한이 부여돼 있음을 확인할 수 있습니다.
리눅스나 유닉스를 관리할 때 좋은 습관 중 하나는 루트로 작업하는 것을 최소화 하는것입니다. 불편하더라도 일반 사용자로 로그인해서 작업하고 꼭 루트 권한이 필요한 경우에만 루트 권한을 획득해서 작업하거나 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 처럼 모두에게 쓰기 권한을 주지 않고 특정 계정에게만 권한을 부여해 이 같은 문제를 해결할 수 있습니다.
멋져요 .. ♡