Kubernetes 클러스터의 보안을 유지하는 것은 매우 중요한 과제입니다. Falco는 이런 보안을 강화하는 도구로, 클러스터 내에서 발생하는 의심스러운 활동을 실시간으로 감지하고 경고를 생성해줍니다. 이번 글에서는 Falco가 정상적으로 실행 중인지 확인하고, 실제로 의심스러운 활동을 감지하고 경고를 보내는 과정을 살펴보겠습니다.
먼저, 클러스터의 노드에서 Falco가 정상적으로 실행 중인지 확인해야 합니다. 노드에 SSH로 접속한 후 다음 명령어를 실행하여 Falco 서비스 상태를 확인합니다.
systemctl status falco
정상적으로 실행 중이라면, 다음 단계로 넘어갈 수 있습니다.
다른 터미널에서 이전 단계에서 접속한 노드에 SSH 접속한 후 다음 명령어를 실행합니다. 이 명령어는 Falco 서비스에서 생성된 이벤트를 실시간으로 확인할 수 있게 해줍니다.
journalctl -fu falco
이 명령어를 실행하면 Falco가 생성한 많은 기존 로그가 출력될 수 있습니다. 여기서는 새로운 이벤트 로그만을 확인하므로, 기존 로그는 무시하고 다음 단계로 넘어갑니다.
첫 번째로 터미널로 돌아가서 kubectl exec
명령을 사용하여 Nginx 컨테이너에서 셸을 엽니다. 예를 들어, 다음과 같은 명령어를 실행할 수 있습니다.
kubectl exec -it <nginx-pod-name> -- /bin/bash
이 명령어를 실행하면 Falco의 이벤트 로그에 Nginx 컨테이너 내부에서 셸이 열렸음을 알리는 경고가 표시됩니다. 경고 메시지에는 컨테이너 ID, 사용된 이미지, 네임스페이스 등 다양한 정보가 포함됩니다.
첫 번째 터미널에서 Nginx 컨테이너 내부의 /etc/shadow
파일 내용을 읽어봅시다.
cat /etc/shadow
이 명령어를 실행하면 Falco가 즉시 경고를 표시하여 컨테이너 내부에서 민감한 파일이 열렸음을 알립니다. 이렇게 Falco는 누군가 Nginx 컨테이너 내부에서 셸을 열고 민감한 파일을 읽는 것을 인식합니다. 그렇다면 Falco는 어떻게 이러한 활동을 감지할 수 있을까요?
Falco는 이벤트를 이상으로 간주하고 경고를 보내기 위해 규칙을 사용합니다. 기본적으로 여러 규칙이 정의되어 있으며, 그 중 하나가 컨테이너 내부에서 셸이 열렸음을 경고하고, 다른 하나가 민감한 파일이 읽혔음을 경고합니다. 이러한 규칙은 YAML 파일에 정의되어 있습니다.
규칙 파일은 세 가지 주요 요소로 구성됩니다: 규칙, 목록, 매크로.
규칙은 경고가 트리거되어야 하는 조건을 정의하며, 다섯 가지 필수 키로 구성됩니다.
이제 컨테이너에서 셸이 열릴 때 경고를 보내는 사용자 정의 규칙을 만들어 봅시다. 이 규칙의 이름을 "detect shell inside a container"로 하고, 조건에는 Bash 프로세스가 실행되었지만, 컨테이너 내에서만 실행되는 경우를 지정합니다. 출력 메시지는 "Bash shell opened"와 함께 셸을 연 사용자 및 컨테이너 ID를 포함하도록 정의합니다. 마지막으로 이 이벤트의 우선순위를 경고로 설정합니다.
- rule: detect shell inside a container
desc: Detect when a shell is spawned inside a container
condition: container.id != host and proc.name = bash
output: Bash Opened (user=%user.name container=%container.id)
priority: WARNING
다양한 셸(Bourne 셸, Zsh, Kom 셸 등)을 모두 감지하려면 목록을 사용할 수 있습니다. 다음과 같이 "Linux shells"라는 이름의 목록을 만들고 조건에 적용합니다.
- rule: detect shell inside a container
desc: Detect when a shell is spawned inside a container
condition: container.id != host and proc.name in (linux_shells)
output: Bash Opened (user=%user.name container=%container.id)
priority: WARNING
- list: linux_shells
items: [bash, zsh, sh, csh, ksh, tcsh, dash]
표현식을 더 간단하게 만들기 위해 매크로를 사용할 수 있습니다. 예를 들어, 기본 매크로인 "container"를 사용하여 조건을 단순화할 수 있습니다.
- rule: detect shell inside a container
desc: Detect when a shell is spawned inside a container
condition: container and proc.name in ( container linux_shells)
output: Bash Opened (user=%user.name container=%container.id)
priority: WARNING
- list: linux_shells
items: [bash, zsh, sh, csh, ksh, tcsh, dash]
- macro: container
condition: container.id != host
이렇게 하면 규칙을 더 쉽게 작성하고 이해할 수 있습니다. 사용자 정의 규칙을 작성할 때 사용할 수 있는 여러 매크로가 있으며, 전체 목록은 Falco 문서에서 확인할 수 있습니다.
Falco를 사용하여 Kubernetes 클러스터에서 의심스러운 활동을 감지하고 경고를 보내는 방법을 살펴보았습니다. Falco는 강력한 보안 도구로, 다양한 규칙과 필터를 사용하여 클러스터의 보안을 강화할 수 있습니다. 사용자 정의 규칙을 통해 클러스터 환경에 맞게 Falco를 최적화할 수 있습니다. Falco를 활용하여 클러스터의 보안을 한층 강화해 보세요!