전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]

티스토리 뷰

File이나 Directory의 권한은 ugo시스템에 의해 제어됩니다.

아래 예제에서 /var/www/html디렉토리는 owner user인 root는 rwx, owner group인 root는 rx, 그리고 그 외에는 rx권한이 있습니다.

[root@bastion ~]# mkdir -p /var/www/html
[root@bastion ~]# cd /var/www
[root@bastion www]# ls -al
total 12
drwxr-xr-x   3 root root 4096 Jul 22 21:15 .
drwxr-xr-x. 21 root root 4096 Jul 22 21:15 ..
drwxr-xr-x   2 root root 4096 Jul 22 21:15 html

만약 admins라는 그룹에 속한 사용자에게는 rwx, editors라는 그룹 사용자는 rw, readers라는 그룹 사용자에게는 r권한만 주고 싶다면 어떻게 해야할까요?

ugo system으로는 해결할수가 없습니다.

이를 지원하기 위해 ACL(Access Control List)이라는 기능을 제공합니다.

파일이나 디렉토리의 ACL정보를 읽는 명령은 getfacl이고, 변경하는 명령은 setfacl입니다.

- getfacl <file / directory>

- setfacl

구분 Syntax 예제
owner user setfacl -m u::<permission> <file OR directory> - setfacl -m u::rwx ./html
- setfacl -m u::7 ./html
named user setfacl -m u:<username OR UID>:<permission> <file OR directory> - setfacl -m u:user1:rw ./html
- setfacl -m u:1001:6 ./html
ower group setfacl -m g::<permission> <file OR directory> - setfacl -m g::rwx ./html
- setfacl -m g::7 ./html
named group setfacl -m g:<groupname OR GID>:<permission> <file OR directory> - setfacl -m g:group1:rw ./html
- setfacl -m g:2001:6 ./html
others setfacl -m o::<permission> <file OR directory> - setfacl -m o::--- ./html
- setfacl -m 0::0 ./html
mask setfacl -m m::<permission> <file OR directory> - setfacl -m m::rw ./html
- setfacl -m m::6 ./html
default default ACL이 지정되면 그 디렉토리 내에 파일/디렉토리가 생성될 때 지정된 기본값이 적용됩니다.


setfacl -m d:u::<permission> <directory>

setfacl -m d:g::<permission> <directory>

setfacl -m d:o::<permission> <directory>

setfacl -m d:m::<permission> <directory>

- setfacl -m d:u::rwx,d:g::rw,d:o::0,m:rw html

TIP: 대문자 'X'로 permission을 지정하면 디렉토리에만 실행권한이 부여되고 파일에는 부여되지 않습니다.

[root@bastion www]# setfacl -R -m u:root:rwX ./html
[root@bastion www]# getfacl ./html
# file: html
# owner: admin
# group: admins
user::rwx
user:root:rwx
user:ocean:rwx
group::rw-
group:operators:rwx
mask::rwx
other::---

[root@bastion www]# getfacl ./html/file1.html
# file: html/file1.html
# owner: root
# group: root
user::rw-
user:root:rw-
group::r--
mask::rw-
other::r--

 

ACL 삭제: -x는 특정 ACL만 삭제이고, -b는 전체 ACL을 삭제함

- setfacl -x [ u | g | o | m ]:name <file OR directory>

- setfacl -x d: [ u | g | o | m ]:name <directory> : default ACL 설정을 삭제

- setfacl -k <directory> : 디렉토리의 모든 ACL 설정을 삭제

- setfacl -b <file or directory> : 전체 ACL 삭제

 

mask 기능

mask는 권한의 한계를 의미합니다. mask가 지정되면 ACL로 권한을 더 많이 부여해도 mask에 지정된 권한까지만 동작합니다.  

named user, owner group, named group에 적용됩니다. 다시 말해 mask에 지정한 권한 한계는 owner user와 others에는 적용되지 않습니다.

예제로 이해하기

예제를 통해 이해해 보도록 하겠습니다.

아래와 같이 user와 group을 만듭니다.  user의 암호는 모두 'passw0rd'로 합니다.

Group users
admins admin
editors editor1, editors2
readers user1, user2
[root@bastion www]# groupadd admins
[root@bastion www]# groupadd editors
[root@bastion www]# groupadd readers
[root@bastion www]# useradd admin -g admins -p passw0rd
[root@bastion www]# useradd editor1 -g editors -p passw0rd
[root@bastion www]# useradd editor2 -g editors -p passw0rd
[root@bastion www]# useradd user1 -g readers -p passw0rd
[root@bastion www]# useradd user2 -g readers -p passw0rd

/var/www/html디렉토리를 만들고, owner는 admin:admins로 부여합니다. 

[root@bastion var]# mkdir -p /var/www/html
[root@bastion var]# chown -R admin:admins /var/www

/var/www디렉토리와 모든 하위 디렉토리에 아래와 같이 ACL을 적용합니다.

대상 ACL
admin rwx
editor1, editor2 rw
user1, user2 r
admins rwx
editors rw
readers r
others user/groups 권한없음
default user: rwx
group: rw
others: 권한없음
mask rw
[root@bastion var]# setfacl -Rm u::rwx,u:editor1:rw,u:editor2:rw,g::rw,g:editors:rw,g:readers:r,o::0 /var/www
[root@bastion var]# setfacl -Rm d:u::rwx,d:g::rw,d:o::0 /var/www
[root@bastion var]# setfacl -Rm m::rw /var/www
[root@bastion var]# getfacl /var/www
getfacl: Removing leading '/' from absolute path names
# file: var/www
# owner: admin
# group: admins
user::rwx
user:editor1:rw-
user:editor2:rw-
group::rw-
group:editors:rw-
group:readers:r--
mask::rw-
other::---
default:user::rwx
default:group::rw-
default:other::---

 

ACL이 적용된 file/directory는 ugo 시스템 정보의 마지막이 '+'로 변경됩니다.

[root@bastion var]# ls -al /var/www/
total 16
drwxrw----+  3 admin admins 4096 Jul 22 22:04 .
drwxr-xr-x. 21 root  root   4096 Jul 22 21:15 ..
drwxrw----+  2 admin admins 4096 Jul 22 21:15 html

 

mask를 r로 줄여봅시다. 즉, owner user인 admin을 제외하고는 최대 권한을 읽기까지만 허용하는것입니다.

아래와 같이 #effective라는 key로 실제 적용되는 권한을 표시합니다.

즉, 사용자인 editor1, editor2, 그룹 admins, editors는 읽기와 쓰기 권한이 있지만, mask로 허용된 읽기권한밖에 갖지 못합니다.

[root@bastion var]# setfacl -Rm m::r /var/www
[root@bastion var]# getfacl /var/www
getfacl: Removing leading '/' from absolute path names
# file: var/www
# owner: admin
# group: admins
user::rwx
user:editor1:rw-		#effective:r--
user:editor2:rw-		#effective:r--
group::rw-			#effective:r--
group:editors:rw-		#effective:r--
group:readers:r--
mask::r--
other::---
default:user::rwx
default:group::rw-
default:other::---

 

editor1, editor2의 ACL을 제거해 보겠습니다.

[root@bastion var]# setfacl -x u:editor1 /var/www/html
[root@bastion var]# setfacl -x u:editor2 /var/www/html
[root@bastion var]# getfacl /var/www/html
getfacl: Removing leading '/' from absolute path names
# file: var/www/html
# owner: admin
# group: admins
user::rwx
group::rw-
group:editors:rw-
group:readers:r--
mask::rw-
other::---
default:user::rwx
default:group::rw-
default:other::---

 

마지막으로 전체 ACL을 삭제합니다.

html디렉토리의 ugo 정보의 마지막에 '+'가 없어진것을 확인할 수 있습니다.

[root@bastion var]# setfacl -R -b /var/www
[root@bastion var]# ls -al /var/www
total 12
drwxrw----   3 admin admins 4096 Jul 22 22:04 .
drwxr-xr-x. 21 root  root   4096 Jul 22 21:15 ..
drwxrw----   2 admin admins 4096 Jul 22 21:15 html

 

유용한 사용 예시

파일 이용한 ACL 적용하기

getfacl <source> > <acl filename>

setfacl --set-file=<acl filename> <target>

[root@bastion www]# setfacl -m u:ocean:7 ./html
[root@bastion www]# getfacl ./html
# file: html
# owner: admin
# group: admins
user::rwx
user:ocean:rwx
group::rw-
mask::rwx
other::---

[root@bastion www]# mkdir docs
[root@bastion www]# getfacl ./html > acl
[root@bastion www]# setfacl --set-file=./acl docs
[root@bastion www]# getfacl docs
# file: docs
# owner: root
# group: root
user::rwx
user:ocean:rwx
group::rw-
mask::rwx
other::---

이를 조금 응용하면 아래와 같이 source 파일 또는 디렉토리에 적용된 ACL을 target 파일 또는 디렉토리에 적용할수 있습니다.

getfacl <source> | setfacl --set-file=- <target>

예) getfacl ./html | setfacl --set-file=- ./docs

[root@bastion www]# setfacl -m g:operators:rwx ./html
[root@bastion www]# getfacl ./html | setfacl --set-file=- ./docs
[root@bastion www]# getfacl ./docs
# file: docs
# owner: root
# group: root
user::rwx
user:ocean:rwx
group::rw-
group:operators:rwx
mask::rwx
other::---

 

댓글

전자책 출간 알림 [마이크로서비스패턴 쉽게 개발하기]