본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Linux

[Ubuntu 보안] AppArmor 기본 개념과 설정

by bluefriday 2022. 10. 7.
반응형

Application Armor (AppArmor)

리소스에 대한 접근 제어 방식에는 DAC방식과 MAC 방식이 있다. Discretionary(임의의, 자유재량에 의한) Access Control 의 약어인, DAC 방식은 '리소스의 접근'에 대하여 누가(주체) 리소스(객체)에 접근하려는지로 구분하게 되는데, 이 때 해당 리소스의 소유자는 리소스에 접근하려는 사용자나 사용자그룹 단위로 제한을 할 수 있다. 자원의 소유자가 임의로 권한을 줄 수 있는 방식이다.

DAC 방식과 비교되는 MAC 방식도 있다. Mandatory(강제) Access Control 의 약어로, 미리 정의된 정책에 따라 사용자의 접근을 제어한다. 자원에 접근하려는 사용자(주체) 별로 보안 등급이 존재하고, 리소스에도 보안 레벨이 존재하게 되는데, 이 사용자의 보안 등급과 리소스의 보안 레벨에 기반하여 접근이 제어된다. 리소스의 소유자라고 해도 정책에 맞지 않으면 해당 리소스에 접근할 수 없으며, 보안 등급과 보안 레벨은 관리자만이 수정할 수 있다.

리눅스 계열 OS는 전통적으로 DAC 방식을 사용하여 리소스에 대한 접근 제어를 관리하는데, 더욱 세밀한 접근 제어를 위해 각각의 OS에서는 MAC 방식의 접근 제어도 지원한다.

  • Debian / Ubuntu / SUSE Linux : AppArmor
  • Redhat 계열 : SELinux (Security Enhanced Linux)

AppArmor 는 Debian / Ubuntu 계열에서 사용되는 MAC 방식의 보안 모듈이다. Application Armor 의 약어로, 프로그램이 실행되기 전에 호출되는 명령들을 검사하고 실행여부등을 정할 수 있다.

 

상태 확인하기

대부분의 해당 계열 배포판에서 기본적으로 설치되어 있다. 먼저 다음의 명령어로 OS가 apparmor를 지원하는지 확인할 수 있다 (출력으로 Y 확인).

root@localhost~#]cat /sys/module/apparmor/parameters/enabled
Y

 

다음의 명령어로 모듈 구동 여부를 확인할 수 있다.

systemctl status apparmor

(option) 만약 설치되어 있지 않을 경우 하단의 apt 명령어를 사용하여 설치 한다.

apt-get install apparmor-utils

AppArmor 의 설정과 관련된 파일들은 '/sys/kernel/security/apparmor' 이 디렉토리 하위에 있다. 하단의 명령어를 사용하면, 이 디렉토리 안에 있는 주요 정보들을 정리하여 화면에 보여준다.

### appramor 상태 조회
apparmor_status


### 사용 예
root@instance-1:/$ apparmor_status 
apparmor module is loaded.
25 profiles are loaded.
19 profiles are in enforce mode.
   /sbin/dhclient
   /snap/snapd/17029/usr/lib/snapd/snap-confine
   ...
   /usr/sbin/tcpdump
   snap-update-ns.google-cloud-cli
6 profiles are in complain mode.
   snap.google-cloud-cli.anthoscli
   ...
   snap.google-cloud-cli.kubectl
1 processes have profiles defined.
1 processes are in enforce mode.
   /usr/sbin/chronyd (2467) 
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
root@instance-1:/# 
root@instance-1:/#

apparmor_status 명령어 외에 'aa-status' 명령을 사용하여도 동일한 결과를 출력한다.

 

AppArmor profile

위 'apparmor_status' 명령어 사용 결과를 보면, 첫 번째 라인에 '25 profiles are loaded' 라고 표시되어 있다. 25개의 프로파일이 apparmor 모듈에 등록(loaded)되었다는 걸 알 수 있다.

프로파일은 apparmor 가 사용하는 정책으로, 명령어의 검사와 실행 여부를 결정하는 파일이기도 하다. 이 정책 파일을 통해 프로그램의 실행 여부를 결정하고 접근 제어를 수행한다. 프로파일은 자체 제작할 수도 있으며, 패키지를 설치할 때 해당 패키지에 해당하는 프로파일이 자동으로 등록되기도 한다. 

프로파일은 다음의 3가지 모드로 등록될 수 있다.

  • Enforce mode - apparmor 가 이 프로파일에 따라 리소스 접근을 제한하고 log 를 기록
  • Complain mode - apparmor 가 이 프로파일에 따라 접근을 제한하지는 않지만, log 는 기록
  • Unconfined - 별도의 접근 제어가 없으며, log 또한 남기지 않음

Apparmor 가 사용하는 프로파일들은  '/etc/apparmor.d' 디렉토리에서 확인할 수 있다.

해당 디렉토리 하위에 있는 파일중 예로 '/etc/apparmor.d/usr.sbin.tcpdump' 파일을 확인해보자.

# vim:syntax=apparmor
#include <tunables/global>

/usr/bin/man {
  #include <abstractions/base>

  ...
  /usr/bin/troff rmCx -> &man_groff,
  /usr/bin/vgrind rmCx -> &man_groff,
  ...
}

profile man_groff {
  ...
  /usr/bin/preconv rm,
  signal peer=/usr/bin/man,
}

...

위와 같이 프로파일은 정책 이름으로 시작하여 중괄호 안에 세부 정책들이 정의된다. 내용을 보기 전에 먼저 정책 이름을 보면, 앞에 slash(/) 로 시작하는 정책명과 slash(/) 없이 시작되는 정책명으로 구분할 수 있다.

1) slash 로 시작하는 정책은, 해당 정책의 이름이 그 정책이 적용될 프로그램을 의미한다. 위 예에서 '/usr/bin/man' 정책은 사용자가 터미널에서 man(/usr/bin/man) 명령을 실행할 때 적용된다.

2) slash 로 시작하지 않는 이름은, 별도의 명령으로 특정 정책을 특정 프로그램에 수동으로 매핑할 수 있다. 물론 1)에 해당하는 정책들도 수동으로 매핑 가능하다.

 

AppArmor profile 등록

AppArmor 프로파일을 쉽게 등록하기 위해, Apparmor 유틸리티를 추가로 설치한다 (위에서 설치하였을 경우 생략).

apt-get install apparmor-utils

유틸리티를 설치 후, apparmor 로 명령어를 제한하기 전에 date 명령을 미리 사용하여 기능이 정상적으로 동작함을 확인한다.

root@instance-2:/# date
Thu Oct 20 04:16:17 UTC 2022

root@instance-2:/# date -s 11:22:33
Thu Oct 20 11:22:33 UTC 2022

위와 같이 date 명령어로 현재 시간을 수정할 수 있다. 이제 aa-genprof 명령을 사용하여 특정 명령을 제한하는 프로파일을 생성해본다.

aa-genprof <명령어>

여기서는 date 명령을 대상으로 수행한다.

root@instance-2:/# aa-genprof date
Writing updated profile for /usr/bin/date.
Setting /usr/bin/date to complain mode.

Before you begin, you may wish to check if a
profile already exists for the application you
wish to confine. See the following wiki page for
more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Profiling: /usr/bin/date

Please start the application to be profiled in
another window and exercise its functionality now.

Once completed, select the "Scan" option below in 
order to scan the system logs for AppArmor events. 

For each AppArmor event, you will be given the 
opportunity to choose whether the access should be 
allowed or denied.

[(S)can system log for AppArmor events] / (F)inish

위와 같이 /usr/bin/date 와 같은 프로파일을 생성한다고 알려주며 대화형으로 Apparmor 로그를 스캔할지 종료할지를 물어본다. F를 눌러 종료한다.

Setting /usr/bin/date to enforce mode.

Reloaded AppArmor profiles in enforce mode.

Please consider contributing your new profile!
See the following wiki page for more information:
https://gitlab.com/apparmor/apparmor/wikis/Profiles

Finished generating profile for /usr/bin/date.
root@instance-2:/#

이제 /usr/bin/date 명령이 enforce 모드로 등록되었다. 다시 date 명령을 수행해본다.

root@instance-2:/# date -s 11:11:11
date: cannot set date: Operation not permitted

이전과는 달리 date 명령으로 날짜를 조정할 수 없는 것을 확인 가능하다.

root@instance-2:/# aa-status
apparmor module is loaded.
37 profiles are loaded.
31 profiles are in enforce mode.
   /snap/snapd/17029/usr/lib/snapd/snap-confine
   ...
   /usr/bin/date
   ...
   snap.lxd.lxc
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
root@instance-2:/#

aa-status 명령으로 apparmor 의 상태를 조회해보면 /usr/bin/date 가 enforce 모드로 추가되어 있는 걸 볼 수 있다.

apprarmor 프로파일은 아래와 같은 방법으로 삭제한다.

sudo ln -s /etc/apparmor.d/<대상 프로파일> /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/disable/<대상 프로파일>

이제 다시 date 명령의 제한을 풀기 위해 apparmor 프로파일을 삭제한다.

root@instance-2:/# cd /etc/apparmor.d
root@instance-2:/etc/apparmor.d# ls
abstractions  force-complain  lsb_release      sbin.dhclient  usr.bin.date  usr.lib.snapd.snap-confine.real  usr.sbin.rsyslogd
disable       local           nvidia_modprobe  tunables       usr.bin.man   usr.sbin.chronyd                 usr.sbin.tcpdump
root@instance-2:/etc/apparmor.d# ln -s /etc/apparmor.d/usr.bin.date /etc/apparmor.d/disable/
root@instance-2:/etc/apparmor.d# apparmor_parser -R /etc/apparmor.d/disable/usr.bin.date 
root@instance-2:/etc/apparmor.d#

위와 같이 삭제 후에 aa-status 로 다시 apparmor 상태를 조회해보면 아래와 같다.

root@instance-2:/etc/apparmor.d# aa-status
apparmor module is loaded.
36 profiles are loaded.
30 profiles are in enforce mode.
   /snap/snapd/17029/usr/lib/snapd/snap-confine
   ...
   snap.lxd.lxc
   snap.lxd.lxc-to-lxd
   snap.lxd.lxd
   snap.lxd.migrate
   ...
   /usr/sbin/chronyd (1361) 
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
root@instance-2:/etc/apparmor.d#

/usr/bin/date 와 관련된 프로파일이 삭제 되었다. 이제 다시 date 명령을 수행해본다.

oot@instance-2:/etc/apparmor.d# date -s 10:10:10
Thu Oct 20 10:10:10 UTC 2022
root@instance-2:/etc/apparmor.d

처음과 같이 정상적으로 date 명령이 수행 가능하다.

댓글