본문 바로가기
Kubernetes

Kubernetes에서 App Armor를 활용하여 Container 내부 디렉토리 Write 제한하기

by beann 2024. 3. 23.
반응형

App Armor는 무엇이고, 왜 쓰는걸까

App Armor(Application Armor)는 특정 어플리케이션의 동작 또는 특정 File, Directory에 대한 Read, Write, 을 제한하여  사용자의 무분별한 어플리케이션, 파일 및 디렉토리에 대한 접근을 통제할 수 있다.

예를들면, / 이하 디렉토리는 쓰기가 불가능하도록 설정 한다던가, curl을 사용하지 못하도록 한다던가, a.txt파일에 대해 cat명령어를 쓰지 못하도록 한다던가 이러한 것들이 가능하다.

 

요약.

- AppArmor는 리눅스 커널 보안모듈로서 MAC(Mandatory Access Control)기반 Security Mondule이다.

- Node에서도 사용가능하고, Container에서도 사용 가능하다.

- 커널단의 Systemcall 제한을 통해 특정 어플리케이션 동작을 통제한다.

- Kubernetes를 통해 적용하려면 모든  Node에 AppArmor를 적용해야하는데, Daemonset형상으로도 제공되니 링크 참고.

https://github.com/GoogleCloudPlatform/gke-security-scenarios-demo/blob/master/terraform/modules/instance/manifests/apparmor-loader.yaml

 

 

 

App Armor 활용 방법


# Ubuntu에는 기본적으로 Apparmor가 설치 되어있다.

 

[Node]

root@k8s-w:# vi k8s-example
profile k8s-example flags=(attach_disconnected) {
  file,
  # Deny all file writes.
  deny /** w,
}
~
  • 위와 같은 파일은 AppArmor에서는 Profile이라고 칭한다.
  • Profile에 쓰일 정책은 Rule이라고 한다.
  • k8s-example은 AppArmor의 일름을 정의한다.
  • flags=(attach+disconnected) 해당 플래그는 AppArmor를 Container에 적용하기 위해 설정한다.
  • file: 프로필이 파일과 관련된 정책을 정의한다.
  • deny /** w: /(루트 디렉토리)이하 모든 파일에 대한 쓰기 작업을 거부한다.

 

root@k8s-w:# apparmor_parser k8s-example

root@k8s-w:# aa-status | grep k8s-example
   k8s-example

apparmor_parser 커맨드를 통해 Profile을 적용한다.

aa-status를 통해 AppArmor Profile목록을 확인할 수 있다.

[주요커맨드]

-a, --add                  Profile을 적용하기 위해선 -a옵션을 써야하나 Default이기 때문에 안써도됨
-r, --replace             말그대로 AppArmor Profile을 Replace하기 위해 사용
-R, --remove           현재 적용된 AppArmor Profile을 Remove할때 사용 

 

 

[ControlPlane]

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor
  annotations:
    # Tell Kubernetes to apply the AppArmor profile "k8s-apparmor-example-deny-write".
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-example
spec:
  containers:
  - name: hello
    image: busybox:1.28
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]


k apply -f hello-apparmor.yaml

 

container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-example  #끝에 hello는 Container Name이어야한다. 

localhost/k8s-example은 AppArmor Name이어야한다.

 

 

root@k8s-m:# k exec -it hello-apparmor -- sh
/ #
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # touch test
touch: test: Permission denied

위와같이 AppArmor k8s-example이 적용되어 Write작업이 안되는 것이 확인된다.

 

 

반응형