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형상으로도 제공되니 링크 참고.
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작업이 안되는 것이 확인된다.
'Kubernetes' 카테고리의 다른 글
Kubernetes ServiceAccount 관리 (0) | 2024.03.30 |
---|---|
trivy를 활용한 Container Image 취약점 스캔하기 (0) | 2024.03.27 |
gVisor 및 runsc를 활용한 Host와의 컨테이너 커널 격리 (0) | 2024.03.21 |
kube-bench 사용법 및 Install (0) | 2024.03.20 |
kubesec install 및 사용법 (1) | 2024.03.19 |