[리눅스] 서버 보안 ACL 개념 및 설정하기 (feat. getfacl, setfacl)

반응형

 

 

ACL이란 ?

LINUX/UNIX 운영체제는 파일이나 디렉토리 권한 관리를 위해 chmod 명령어를 사용했습니다. 소유자/그룹/다른사용자 이 3가지 역할에 따라 접근 권한을 다르게 부여했습니다. = POSIX 권한 (참고 : ACL/POSIX 권한의 관계, 우선순위)

 

그런데 이 방법에는 한계가 있었습니다. 예를들어, 어떤 파일에 대해 철수에게는 읽기/쓰기를, 은미에게는 읽기 권한만 주는 등의 세밀한 권한 관리는 불가능했습니다.

 

이런 문제를 해결하기 위해 리눅스는 커널과 파일시스템에 대한 접근 제어 목록(ACL, Access Control List) 기능을 구현했습니다. 특정 파일이나 디렉토리에 대해 사용자 개별로 권한을 제어할 수 있습니다. 접근 권한의 경우 파일시스템 속성으로 부여됨에 따라 예전의 ext1, ext2에서는 사용할 수 없습니다.

 

 - Access Control List 의 약자

 - 접근 제어 목록 설정

 - chmod 보다 더 세밀한 권한 관리 가능

 

 

ACL 추가/변경/삭제

setfacl [옵션] [권한] [파일/디렉토리] 형식

옵션 설명
-m ACL 설정(수정)
-x ACL 삭제
-R 디렉토리인 경우 하위 디렉토리까지 권한 변경
-b 모든 ACL 삭제 (mask 포함)

 

 

권한 작성법 <파일 / 디렉토리>

u:uid:perms 파일 또는 디렉토리 경로
  u = 사용자를 뜻함
  uid = 사용자명 또는 uid 입력
  perms = rw 또는 6와 같이 부여할 권한 입력

[servera]# setfacl -m u:1001:rw /etc/passwd  // passwd 파일에 대한 읽기/쓰기 권한을 uid 1001을 가진 사용자에게 부여
[servera]# setfacl -x u:1001 /etc/passwd  // passwd 파일에 대해 uid 1001이 가진 모든 권한을 제거
[servera]# setfacl -b /etc/passwd  // passwd 파일에 적용된 모든 ACL 제거

[servera]# setfacl -m u:castle:rwx /data01  // data01 디렉토리에 대한 읽기/쓰기/실행 권한을 castle 사용자에게 부여
[servera]# setfacl -x u:castle:rwx /data01  // data01 디렉토리에 대한 읽기/쓰기/실행 권한을 castle 사용자에게서 제거
[servera]# setfacl -b /data01  // data01 디렉토리에 적용된 모든 ACL 제거

 

g:gid:perms 파일 또는 디렉토리 경로
  g = 그룹을 뜻함
  gid = 그룹명 또는 gid 입력
  perms = rx 또는 5와 같이 부여할 권한 입력

[servera]# setfacl -m g:manage:5 /data01/dataremove.sh  // dataremove.sh 파일에 대한 읽기/실행 권한을 manage 그룹에 부여
[servera]# setfacl -x g:manage /data01/dataremove.sh  // dataremove.sh 파일에 대해 manage 그룹이 가진 모든 권한을 제거
[servera]# setfacl -b /data01/dataremove.sh  // dataremove.sh 파일에 적용된 모든 ACL 제거

[servera]# setfacl -m g:manage:7 /data01  // data01 디렉토리에 대한 읽기/실행 권한을 manage 그룹에 부여
[servera]# setfacl -x g:manage /data01  // data01 디렉토리에 대해 manage 그룹이 가진 모든 권한을 제거
[servera]# setfacl -b /data01  // data01 디렉토리에 적용된 모든 ACL 제거

 

o:perms 파일 또는 디렉토리 경로
  o = 다른사용자를 뜻함
  perms = rwx 또는 7과 같이 부여할 권한 입력

[servera]# setfacl -m o:5 /tmp/test.txt  // test.txt 파일에 대한 읽기/실행 권한을 다른 사용자들에게 부여
[servera]# setfacl -m o:0 /tmp/test.txt  // test.txt 파일에 대해 다른 사용자가 가진 모든 권한을 제거
[servera]# setfacl -b /tmp/test.txt  // test.txt 파일에 적용된 모든 ACL 제거

* other 권한 제거의 경우 -x 옵션이 아니라 -m 옵션을 사용해 덮어 씌우는 방식으로 제거해야함

[servera]# setfacl -m o:5 /data01  // data01 디렉토리에 대한 읽기/실행 권한을 다른 사용자들에게 부여
[servera]# setfacl -m o:0 /data01  // data01 디렉토리에 대해 다른 사용자가 가진 모든 권한을 제거
[servera]# setfacl -b /data01  // data01 디렉토리에 적용된 모든 ACL 제거

 

m::perms 파일 또는 디렉토리 경로

  m = mask를 뜻함

  perms = r 또는 4와 같이 부여할 권한 입력

[servera]# setfacl -m m::rx test.sh  // test.sh 파일에 대해 읽기/실행 권한으로 최종 제어한다.
[servera]# setfacl -m m::0 test.sh  // test.sh 파일에 대한 마스크 권한을 모두 제거한다.
또는
[servera]# setfacl -m m::--- test.sh  // test.sh 파일에 대한 마스크 권한을 모두 제거한다.

 

 

ACL 조회

getfacl [파일/디렉토리] 형식

[servera]# getfacl home
# file: home
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

[servera]# getfacl tmp
# file: tmp
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

[servera]# getfacl home/test.sh
# file: home/test.sh
# owner: root
# group: root
user::rw-
group::r--
other::r--

 

 

ACL 예제

1. 회사 및 부서 디렉토리 생성
최상위 디렉토리에 회사 디렉토리 'amazon'을 생성합니다.
'amazon' 하위에 각 부서 디렉토리를 생성합니다.
 인프라팀 디렉토리 'infra'
 영업팀 디렉토리 'sales'
 IT부서 디렉토리 'dt'
 관리팀 디렉토리 'admin'

2. 직원 계정 생성 및 패스워드 설정
회사의 직원 계정을 생성합니다. (별도 그룹 지정 없음) 패스워드는 'abc123!@#'으로 통일합니다.
 인프라팀 a(팀장), b(팀원)
 영업팀 c(팀장), d(팀원)

3. ACL 설정(1)
a 팀장은 본인 부서 디렉토리에 읽기/쓰기/실행 모두 가능하며, sales 부서 디렉토리는 읽기/실행만 가능
b 팀장은 본인 부서 디렉토리에 읽기/쓰기/실행 모두 가능하며, infra 부서 디렉토리는 읽기/실행만 가능
팀원들은 본인 부서 디렉토리만 접근 가능하며, 읽기/실행만 가능

4. ACL 설정(2)
dt 부서는 user:rwx, group:rx, other:x 권한을 상속
admin 부서는 어떤 경우에도 사용자는 읽기만 가능

 

1. 회사 및 부서 디렉토리 생성
[servera]# mkdir /amazon
[servera]# cd /amazon
[servera]# mkdir infra sales dt admin
[servera]# chmod 750 ./ *  // other 권한 테스트를 위해 모든 디렉토리의 other 권한 제거

------------------------------------------------------------------

2. 직원 계정 생성 및 패스워드 설정
[servera]# useradd a  // infra 팀장
[servera]# useradd b  // infra 팀원
[servera]# useradd c  // sales 팀장
[servera]# useradd d  // sales 팀원
[servera]# echo 'abc123!@#' | passwd --stdin a
[servera]# echo 'abc123!@#' | passwd --stdin b
[servera]# echo 'abc123!@#' | passwd --stdin c
[servera]# echo 'abc123!@#' | passwd --stdin d

------------------------------------------------------------------

3. ACL 설정(1)
[servera]# getfacl infra
# file: infra
# owner: root
# group: root
user::rwx
group::r-x
other::---

[servera]# getfacl sales
# file: sales
# owner: root
# group: root
user::rwx
group::r-x
other::---

3-1) a 팀장은 본인 부서 디렉토리에 읽기/쓰기/실행 모두 가능, sales 부서 디렉토리는 읽기/실행만 가능
[servera]# setfacl -m u:a:rwx infra
[servera]# setfacl -m u:a:rx sales
3-2) c 팀장은 본인 부서 디렉토리에 읽기/쓰기/실행 모두 가능, infra 부서 디렉토리는 읽기/실행만 가능
[servera]# setfacl -m u:c:rwx sales
[servera]# setfacl -m u:c:rx sales
3-3) b 팀원은 본인 부서 디렉토리만 접근 가능, 읽기/실행만 가능
[servera]# setfacl -m u:b:rx infra
3-4) d 팀원은 본인 부서 디렉토리만 접근 가능, 읽기/실행만 가능
[servera]# setfacl -m u:d:rx sales
[servera]# getfacl infra
# file: infra
# owner: root
# group: root
user::rwx
user:a:rwx  // infra 팀장 a는 rwx
user:b:r-x  // infra 팀원 b는 rx
user:c:r-x  // sales 팀장 c는 rx
group::r-x
mask::rwx
other::---

[servera]# getfacl sales
# file: sales
# owner: root
# group: root
user::rwx
user:a:r-x  // infra 팀장 a는 rx
user:c:rwx  // sales 팀장 c는 rwx
user:d:r-x  // sales 팀원 d는 rx
group::r-x
mask::r-x
other::---

------------------------------------------------------------------

4. ACL 설정(2)
4-1) dt 부서는 user:rwx, group:rx, other:x 권한 상속
[servera]# getfacl dt
# getfacl dt
# file: dt
# owner: root
# group: root
user::rwx
group::r-x
other::---

[servera]# setfacl -m d:u::rwx,d:g::rx,d:o::x dt
[servera]# getfacl dt
# file: dt
# owner: root
# group: root
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::--x


4-2) admin 부서는 어떠한 경우에도 사용자는 읽기만 가능
[servera]# getfacl admin
# file: admin
# owner: root
# group: root
user::rwx
group::r-x
other::---

[servera]# setfacl -m u:a:rwx admin
[servera]# setfacl -m m::r admin
[servera]# getfacl admin
# file: admin
# owner: root
# group: root
user::rwx
user:a:rwx						#effective:r--
group::r-x                      #effective:r--
mask::r--
other::---

 

 

ACL 예제 권한 테스트

1. infra 팀장 a와 sales 팀장 c의 권한 테스트
1-1) a는 본인 소속 infra 디렉토리에서는 rwx, sales 디렉토리에서는 rx
[servera]# su - a
[servera]$ cd /amazon/infra  // 실행 가능
[servera]$ ls  // 읽기 가능
[servera]$ echo -e 'echo aaa' > a.sh  // 쓰기,수정 가능
[servera]$ cat a.sh
echo aaa
[servera]$ sh a.sh
aaa
[servera]$ cd /amazon/sales  // 실행 가능
[servera]$ ls  // 읽기 가능
[servera]$ echo -e 'aaa' > aa.sh  // 쓰기,수정 불가능
-bash: aa.sh: Permission denied

1-2) c는 본인 소속 sales 디렉토리에서는 rwx, infra 디렉토리에서는 rx
[servera]# su - c
[servera]$ cd /amazon/sales  // 실행 가능
[servera]$ ls  // 읽기 가능
[servera]$ echo -e 'echo ccc' > c.sh  // 쓰기,수정 가능
[servera]$ cat c.sh
echo ccc
[servera]$ sh c.sh
ccc
[servera]$ cd /amazon/infra  // 실행 가능
[servera]$ ls  // 읽기 가능
a.sh
[servera]$ echo -e 'echo ccc' > cc.sh  // 쓰기,수정 불가능
-bash: cc.sh: Permission denied

------------------------------------------------------------------

2. infra 팀원 b와 sales 팀원 d의 권한 테스트
2-1) b는 본인 소속 infra 디렉토리만 rx
[servera]# su - b
[servera]$ cd /amazon/infra  // 실행 가능
[servera]$ ls  // 읽기 가능
a.sh
[servera]$ echo -e 'echo bbb' > b.sh  // 쓰기,수정 불가능
-bash: b.sh: Permission denied
[servera]$ cd /amazon/sales  // 실행 불가능 (접근조차 안되니 당연히 읽기, 수정도 불가능)
-bash: cd: /amazon/sales/: Permission denied

2-2) d는 본인 소속 sales 디렉토리만 rx
[servera]# su - d
[servera]$ cd /amazon/sales  // 실행 가능
[servera]$ ls  // 읽기 가능
c.sh
[servera]$ echo -e 'echo ddd' > d.sh  // 쓰기,수정 불가능
-bash: d.sh: Permission denied
[servera]$ cd /amazon/infra  // 실행 불가능 (접근조차 안되니 당연히 읽기, 수정도 불가능)
-bash: cd: /amazon/infra/: Permission denied

------------------------------------------------------------------

3. dt 디렉토리 권한 상속 테스트
[servera]# cd /amazon/dt
[servera]# mkdir dt_team1 dt_team2  // dt 디렉토리 하위에 새로운 디렉토리 2개 생성
[servera]# getfacl dt_team1
# file: dt_team1
# owner: root
# group: root
user::rwx
group::rw-
other::r--
default:user::rwx  // dt 권한을 그대로 상속받았다.
default:group::r-x  // dt 권한을 그대로 상속받았다.
default:other::--x  // dt 권한을 그대로 상속받았다.

[servera]# getfacl dt_team2
# file: dt_team2
# owner: root
# group: root
user::rwx
group::rw-
other::r--
default:user::rwx  // dt 권한을 그대로 상속받았다.
default:group::r-x  // dt 권한을 그대로 상속받았다.
default:other::--x  // dt 권한을 그대로 상속받았다.

------------------------------------------------------------------

4. admin 마스크 권한 테스트
[servera]# su - a
[servera]$ cd /amazon
[servera]$ cd admin
-bash: cd: admin: Permission denied
// admin 디렉토리에 a 계정의 ACL인 rwx 권한이 적용되어 있지만, admin 디렉토리에 대한 마스크 권한인 r--가 우선 적용됨
반응형

댓글

Designed by JB FACTORY