Kubernetes 이야기

Falco로 Kubernetes 위협 탐지 모니터링 본문

Kubernetes/보안

Falco로 Kubernetes 위협 탐지 모니터링

kmaster 2022. 4. 28. 20:05
반응형

Container 가 개발/운영에 많이 적용되면서 Container 보안 관련된 사항이 많이 발생한다. 특히 예상치 못한 애플리케이션 동작을 감지하고 이에 대한 경고를 발생할 수 있는 방법이 필요하다. Falco는 이러한 요구사항에 적합한 도구라고 할 수 있다.

 Falco는 구성 변경, 침입 또는 데이터 도난과 같은 예기치 않은 동작을 실시간으로 관찰하고 경고하기 위해 각 노드(마스터 및 작업자)에 배포된 에이전트로 볼 수 있다.

 

주요 규칙은 아래와 같다.

 

  • 특권을 가진(Privileged)컨테이너를 이용한 권한 에스컬레이션(Privilege escalation)
  • 컨테이너에 패키지 설치
  • 쉘, bash, zsh 등과 같은 컨테이너에서 특정 명령 실행
  • 잘 알려진 디렉토리( /etc , /usr/bin , /usr/sbin 등)에 읽기/쓰기
  • 심볼릭링크를 생성
  • 소유권(Ownership)과 권한(Mode)을 변경
  • 예상치 못한 네트워크 연결 또는 소켓 변형
  • 파일 시스템의 모든 파일 조작
  • SSH 바이너리( ssh , scp , sftp 등) 실행
  • 리눅스 coreutils 실행 파일 변형
  • 로그인 바이너리 변형
  • shadowutil 또는 passwd 실행 파일 변형

자세한 규칙은 https://github.com/falcosecurity/falco/blob/master/rules/falco_rules.yaml 를 참고한다.

 

Falco 규칙은 클러스터에 있는 구성 요소의 비정상적인 동작을 식별하는 응용 프로그램의 중심 구성 요소이다. 해당 정의는 기본 폴더 또는 시작 시 Falco가 자동으로 해석할 특정 디렉토리에 배포된 YAML 파일에 정의된 매크로, 목록 및 조건으로 구성된다.

 

- macro: container
  condition: container.id != host

- macro: spawned_process
  condition: evt.type = execve and evt.dir=<

- rule: run_shell_in_container
  desc: a shell was spawned by a non-shell program in a container. Container entrypoints are excluded.
  condition: container and proc.name = bash and spawned_process and proc.pname exists and not proc.pname in (bash, docker)
  output: "Shell spawned in a container other than entrypoint (user=%user.name container_id=%container.id container_name=%container.name shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)"
  priority: WARNING

 

설치

 

Falco의 설치에는 여러가지 방식이 있으면 Helm Chart를 이용하여 배포해 보자.

# helm repo add falcosecurity https://falcosecurity.github.io/charts
# helm repo update
# helm install falco --namespace falco --create-namespace falcosecurity/falco

 

설치된 내역은 아래와 같다.

# kubectl get all -n falco
NAME              READY   STATUS    RESTARTS   AGE
pod/falco-csq7z   1/1     Running   0          5m53s
pod/falco-mjgqj   1/1     Running   1          5m53s
pod/falco-shlt8   1/1     Running   0          5m53s

NAME                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/falco   3         3         3       3            3           <none>          5m53s

 

모니터링

 

Falco에서는 감지된 이상에 대해 일반적으로 'stdout'으로 전송한다. 이러한 로그를 수집 및 처리할 수 있는 로그 시스템 ( 예: ElasticSearch )에 기록을 유지하고 경고를 생성하는 것이 좋다.

 

https://falco.org/blog/extend-falco-outputs-with-falcosidekick/

 

이러한 이상현상에 대한 이벤트를 실시간으로 시각화하고, 경고를 보낼 수 있는 도구가 있다. 이것이 Falcosidekick이다.Falcosidekick 외에도 Prometheus Exporter가 있어 Prometheus-Grafana 로 시각화 해서 볼 수동 있다.

 

Falcosidekick은 Falco의 이벤트를 가져와서 팬아웃 방식으로 다른 출력으로 전달해준다. Falcosidekick은 다양한 오픈소스를 목적에 맞게 사용할 수 있도록한다.

 

Chat
  - Slack
  - Rocketchat
  - Mattermost
  - Teams
  - Discord
  - Google Chat
Metrics / Observability
  - Datadog
  - Influxdb
  - StatsD (for monitoring of falcosidekick)
  - DogStatsD (for monitoring of falcosidekick)
  - Prometheus (for both events and monitoring of falcosidekick)
  - Wavefront
Alerting
  - AlertManager
  - Opsgenie
  - PagerDuty
Logs
  - Elasticsearch
  - Loki
  - AWS CloudWatchLogs
  - Grafana (annotations)
  - Syslog
Object Storage
  - AWS S3
  - GCP Storage
  - Yandex S3 Storage
FaaS / Serverless
  - AWS Lambda
  - Kubeless
  - OpenFaaS
Message queue / Streaming
  - NATS
  - Apache Kafka
  - Kafka Rest Proxy
  - RabbitMQ

 

 

이번에는 Falcosidekick 을 설치해서 모니터링해보자.

 

Falcosidekick 설치

 

# helm upgrade falco --namespace falco falcosecurity/falco --set falcosidekick.enabled=true --set falcosidekick.webui.enabled=true

 

UI를 호출해 보자 ( http://falco-falcosidekick-ui:nodeport/ui )

 

 

Falco는 규칙에 우선순위를 부여하여 규칙 위반이 얼마나 심각한지를 나타낸다. 우선순위는 메시지/JSON 출력 등에 포함된다. 사용 가능한 우선순위는 다음과 같다.


1. EMERGENCY
2. ALERT
3. CRITICAL
4. ERROR
5. WARNING
6. NOTICE
7. INFORMATIONAL
8. DEBUG


규칙에 우선순위를 할당하는데 사용되는 일반적인 지침은 아래과 같다.

  • 규칙이 쓰기 상태(예를 들어, 파일 시스템 등)와 관련된 경우의 우선순위는 ERROR 이다.
  • 규칙이 허가되지 않은 읽기 상태(예를 들어, 민감한 파일 읽기 등)와 관련된 경우 우선순위는 WARNING 이다.
  • 규칙이 예기치 않은 동작(컨테이너에서 예기치 않은 셸 생성, 예기치 않은 네트워크 연결 열기 등)과 관련된 경우 우선순위는 NOTICE 이다.
  • 규칙이 모범 사례(예기치 않은 권한 있는 컨테이너, 민감한 마운트 요소가 있는 컨테이너, 루트로 대화형 명령을 실행하는 경우)에 대한 동작과 관련된 경우 우선순위는 INFO 이다.

감시테스트

 

이제 container 안에 들어가서 apt-get update 명령을 수행해 보자.

 

# kubectl exec -it sampleapp-67447b449f-rt4mk -- bash
root@sampleapp-67447b449f-rt4mk:/# apt-get update
Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [126 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2596 B]
Fetched 8510 kB in 3s (2850 kB/s)
Reading package lists... Done

 

이렇게 수행하고 Falco ui 를 보면

 

위와 같이 terminal 접근 ( Notice )와 apt-get update ( Error ) 감사 로그가 남는 것을 확인할 수 있다.

 

Falco 설치 시 아래와 같이 slack 설정을 하면 경고에 대한 내용을 slack으로 받을 수 있다.

 

# helm upgrade falco --namespace falco falcosecurity/falco ... --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/services/XXXX"
반응형

'Kubernetes > 보안' 카테고리의 다른 글

Network Policy  (0) 2022.05.08
Kubescape  (0) 2022.05.01
Kubernetes 에서 Vault 활용  (0) 2022.03.14
Kubernetes에서 Secret 암호화  (0) 2022.03.13
trivy를 활용한 Container Image 취약성 검사  (3) 2022.03.06
Comments