๐Ÿ‘‹์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ„ฐ๋”” PKOS 7์ฃผ์ฐจ ๋ณด์•ˆ

Burstยท2023๋…„ 2์›” 27์ผ
0

๐Ÿ˜ŽPKOS์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
7/7

๐Ÿ›ด๋ชฉํ‘œ

๋ณด์•ˆ์€ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์—์„œ ์šด์˜๊นŒ์ง€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐ๋˜๋Š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋„ ๋ณด์•ˆ์€ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์šด์˜ํ•  ์ง€, ์ทจ์•ฝ์  ์ ๊ฒ€์€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉฐ, ์–ด๋– ํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ด๋ฒˆ 7์ฃผ์ฐจ ๋งˆ์ง€๋ง‰ ์Šคํ„ฐ๋””์—์„œ ํ•™์Šต ํ•  ์˜ˆ์ •์ด๋‹ค.

EC2 IAM Role & ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

KOPS๋Š” AWS EC2 Instance(Node)๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค. ํ•ด๋‹น Instance์— ๋ฐฐํฌ๋œ Pod๋Š” Instance์— ๋ถ€์—ฌ๋œ IAM Role๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ํ•ด์ปค์— ์˜ํ•ด Podํ•˜๋‚˜๊ฐ€ ๊ณต๊ฒฉ์„ ๋ฐ›์•„ ํƒˆ์ทจ๋ฅผ ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด Instance์˜ IAM Role๋ฅผ ๊ทธ๋Œ€๋กœ ํƒˆ์ทจํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณด์•ˆ์ ์œผ๋กœ ๋งค์šฐ ์ทจ์•ฝํ•œ ๋ชจ์Šต์ด๋‹ค.
์œ„ ๊ทธ๋ฆผ์˜ ๋นจ๊ฐ„ ๋ฐ•์Šค๊ฐ€ Instance์˜ IAM Role๋ฅผ ๋ฐฐํฌ๋œ Pod๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ถ€์—ฌ๋ฐ›์€ ์ทจ์•ฝํ•œ ๋ชจ์Šต์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

IRSA(IAM Roles for Service Accounts)
์ด๋Ÿฌํ•œ ์ทจ์•ฝ์  ๋•Œ๋ฌธ์— Pod๋ณ„ IAM Role๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ํ•ด๋‹น Pod๊ฐ€ ํƒˆ์ทจ๋ฅผ ๋‹นํ•ด๋„ ๋‹ค๋ฅธ Pod ๋ฐ Instance์— ๊ถŒํ•œ์ด ์—†๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜„์žฌ๋Š” EKS, KOPS ์ตœ์‹  ๋ฒ„์ „์€ ์•ˆ์ „ํ•˜๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.
์œ„ ๊ทธ๋ฆผ์˜ ํŒŒ๋ž€์ƒ‰ ๋ฐ•์Šค๊ฐ€ Pod๋ณ„ IAM Role๋ฅผ ์ ์šฉํ•œ ๋ชจ์Šต์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณด์•ˆ์ œ๊ฑฐ ์‹ค์Šต

#ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ ์ธ์Šคํ„ด์Šค ๋ฐ ์ธ์Šคํ„ด์Šค๊ทธ๋ฃน ์ •๋ณด

#ap-northeast-2a, ap-northeast-2c์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์„ค์ • ์ •๋ณด

#์ด ์ค‘ ap-northeast-2a์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์„ค์ • ์ •๋ณด ์ œ๊ฑฐ

#Pod ๋‘ ๊ฐœ๊ฐ€ Node ๋ณ„๋กœ ํ•œ๊ฐœ ์”ฉ ๋ฐฐํฌ(netshoot-pod)

#์ด ์ค‘ Pod1๋ฒˆ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์„ค์ •์ด ์ œ๊ฑฐ๋˜์–ด ์žˆ๋Š” Instance์— ๋ฐฐํฌ๋˜์–ด ์žˆ์Œ

#ํŒŒ๋“œ1์—์„œ EC2 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด ํ™•์ธ(Token ์ •๋ณด ํ™•์ธ!)

#Pod2์—์„œ๋Š” EC2 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ํ™•์ธ ํ•  ์ˆ˜ ์—†์Œ / ์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ์„ค์ •์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—!!

  1. SDK ์‚ฌ์šฉ์„ ์œ„ํ•œ python pod ๋ฐฐํฌ(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
  1. boto3 Pod ํ™•์ธ(PODNAME1์ด ap-northeast-2a์˜ instance์— ๋ฐฐํฌ)
  2. pod1์— ์ ‘์† ํ›„ ์ธ์Šคํ„ด์Šค ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” python ์ฝ”๋“œ ์ž‘์„ฑ ํ›„ ์‹คํ–‰(Instance์˜ ์ •๋ณด ์ถœ๋ ฅ)
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

  1. Pod2์—์„œ๋Š” boto3 ์‹คํ–‰์ด ์•ˆ๋จ

[์‹ค์Šต๋‚ด์šฉ ์ •๋ฆฌ]
boto3๋Š” Python์šฉ AWS SDK๋ฅผ ๋งํ•œ๋‹ค. ์ด boto3๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” AWS ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค.
์œ„ ์‹ค์Šต์—์„œ boto3๋Š” AWS์˜ ์ž๊ฒฉ์ฆ๋ช…์„, ์ฆ‰ IAM ์—ญํ• ์ด ๊ตฌ์„ฑ๋œ EC2 Instance์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ boto3๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ํƒˆ์ทจํ•˜๋ฉด ํ•ด๋‹น ์ •๋ณด๋ฅผ ํ†ตํ•ด sdk๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” AWS ์ฝ˜์†”์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ–‰์œ„๋ฅผ sdk๋ฅผ ํ†ตํ•ด ์ œ์–ด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.... ๋ฌด์„œ์›€..!!!!๐Ÿฅถ๐Ÿฅถ
(์ถœ์ฒ˜: https://tech.cloud.nongshim.co.kr/2021/03/12/boto3%EA%B0%80-aws%EC%9D%98-%EC%9E%90%EA%B2%A9%EC%A6%9D%EB%AA%85credentials%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EC%88%9C%EC%84%9C-from-python/)

์ทจ์•ฝ์  ์ ๊ฒ€(kubescape / polaris)

kubescape

๋ฏธ๊ตญ NSA(National Security Agency) / CISA(Cybersecurity and Infrastructure Security Agency)์—์„œ ๋ฐœํ–‰ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ณด์•ˆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ˜„์žฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ทจ์•ฝ์ ์„ ์ ๊ฒ€ํ•˜๊ณ , ์ด๋ฅผ ๋Œ€์‹œ๋ณด๋“œ ํ˜•ํƒœ๋กœ ๋ฆฌํฌํŒ…์„ ํ•˜๋Š” ์ทจ์•ฝ์  ์ ๊ฒ€ ํˆด์ด๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ,CI/CD pipelines๋“ฑ์˜ ์ทจ์•ฝ์  ์ ๊ฒ€๋„ ๊ฐ€๋Šฅ
(์ถœ์ฒ˜: https://github.com/kubescape/kubescape)

# ์„ค์น˜
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"

# ์ œ๊ณตํ•˜๋Š” ํ†ต์ œ ์ •์ฑ… ํ™•์ธ
kubescape list controls

# ํด๋Ÿฌ์Šคํ„ฐ ์Šค์บ”
kubescape scan --enable-host-scan --verbose
  • ๊ฐ ๋…ธ๋“œ์— kubescape pod๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ•ด๋‹น Pod๊ฐ€ ๋…ธ๋“œ์˜ ์ทจ์•ฝ์  ์ ๊ฒ€์„ ์ง„ํ–‰ / ์ง„ํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ Pod๊ฐ€ ์‚ญ์ œ
  • ์„ค์น˜ ํ›„ ํด๋Ÿฌ์Šคํ„ฐ ์Šค์บ” ํ™”๋ฉด

polaris

์˜คํ”ˆ์†Œ์Šค ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ์ฝ”๋“œ ์ทจ์•ฝ์  ์ ๊ฒ€ ํˆด / ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ ์‹œ ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๋ฉด ๋ฐฐํฌ๋ฅผ ๋ชปํ•˜๊ฒŒ ์ œ์–ด(Admission Request -> Validating Webhook)
(์ถœ์ฒ˜: https://github.com/FairwindsOps/polaris)

# ์„ค์น˜
kubectl create ns polaris

#
cat <<EOT > polaris-values.yaml
dashboard:
  replicas: 1
  service:
    type: LoadBalancer
EOT

# ๋ฐฐํฌ
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install polaris fairwinds-stable/polaris --namespace polaris --version 5.7.2 -f polaris-values.yaml

# CLB์— ExternanDNS ๋กœ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ
kubectl annotate service polaris-dashboard "external-dns.alpha.kubernetes.io/hostname=polaris.$KOPS_CLUSTER_NAME" -n polaris

# ์›น ์ ‘์† ์ฃผ์†Œ ํ™•์ธ ๋ฐ ์ ‘์†
echo -e "Polaris Web URL = http://polaris.$KOPS_CLUSTER_NAME"
  • ์›น ํ™”๋ฉด

    Namespace: default / Deployment: netshoot-pod
  • Dangerous checks

์ทจ์•ฝ์  ์กฐ์ทจ

  • imageํƒœ๊ทธ ๋ช…์‹œ
  • Liveness probe ๋ช…์‹œ
#netshoot-pod ์— ๋ณด์•ˆ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ ์šฉ

cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-pod
spec:
  replicas: 2    // pod ์ˆ˜
  selector:
    matchLabels:
      app: netshoot-pod
  template:
    metadata:
      labels:
        app: netshoot-pod
    spec:
      containers:
      - name: netshoot-pod
        image: nicolaka/netshoot:v0.9  // ์ด๋ฏธ์ง€ ํƒœ๊ทธ
        command: ["tail"]
        args: ["-f", "/dev/null"]
        imagePullPolicy: Always       // ์ด๋ฏธ์ง€ ํ•ญ์ƒ pull
        resources:                    // ๋ฆฌ์†Œ์Šค ๊ด€๋ จ ์ œํ•œ
          limits:
            cpu: 150m
            memory: 512Mi
          requests:
            cpu: 100m
            memory: 128Mi
        securityContext:            //securityContext
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          privileged: false
          readOnlyRootFilesystem: true
          #runAsNonRoot: true
      terminationGracePeriodSeconds: 0
EOF

webhook ์‹ค์Šต

  1. webhook ์„ค์ •( --set webhook.enable=true)
# webhook ํ™œ์„ฑํ™” ์ ์šฉ

helm upgrade polaris fairwinds-stable/polaris --namespace polaris --version 5.7.2 --reuse-values --set webhook.enable=true 

kubectl get pod,svc -n polaris

  1. ์ทจ์•ฝ์  ์žˆ๋Š” Pod ๋ฐฐํฌ
cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-pod
spec:
  replicas: 1               //replicas๊ฐ€1์ด๋ฉด ์ทจ์•ฝ์ ์œผ๋กœ ํŒ๋‹จ
  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
  1. ํ™•์ธ

    ์ทจ์•ฝ์ ์˜ ์ด์œ ๋กœ Pod ๋ฐฐํฌ ์‹คํŒจ!!!!!!!

K8S ์ธ์ฆ/์ธ๊ฐ€ & RBAC

์ธ์ฆ(authentication): ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํ™•์ธ์œผ๋กœ ์ •์ƒ์ ์ธ ์‚ฌ์šฉ์ž ์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ œ์–ด ํ•˜๋Š” ๊ฒƒ(์ถœ์ฒ˜: https://kubetm.github.io/k8s/07-intermediate-basic-resource/authentication/)

์ธ๊ฐ€(authorization): ์ธ์ฆ์„ ๊ฑฐ์นœ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ๊ฐ€๋œ ํ–‰์œ„๋ฅผ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ œ์–ด ํ•˜๋Š” ๊ฒƒ(์ถœ์ฒ˜: https://kubetm.github.io/k8s/07-intermediate-basic-resource/authentication/)

์ฒ˜์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ ‘ํ–ˆ์„ ๋•Œ, ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ kubeadm์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.
๊ตฌ์„ฑ์„ ํ•˜๊ณ  ๋‚˜๋ฉด, kubectl ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฆ‰ API๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
์•„๋ฌด์ƒ๊ฐ์—†์ด ์‚ฌ์šฉ์„ ํ–ˆ์ง€๋งŒ, ์ด๋Š” ์‚ฌ์‹ค ๋ฆฌ๋ˆ…์Šค์˜ Root ๊ณ„์ •๊ณผ ๋™์ผํ•˜๊ฒŒ admin ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ , API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

#.kube/config ํŒŒ์ผ ํ™•์ธ

  • context ์ •๋ณด ๋ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ์„œ ์ •๋ณด
  • kubectl config view ์ •๋ณด

์‚ฌ์šฉ์ž๋Š” burst89.com / context๋Š” bursti89.com์œผ๋กœ ๊ด€๋ จ๋œ ์ธ์ฆ์„œ๊ฐ€ configํŒŒ์ผ์— ์ €์žฅ๋˜์–ด ํด๋Ÿฌ์Šคํ„ฐ api๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด๋Ÿฌํ•œ ์ธ์ฆ(์ธ์ฆ์„œ / kubectl / SubAccount) ๋ฐ์ธ๊ฐ€(RBAC(Role Based Aceess Control))์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋ฆฌ๋ˆ…์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ๋ณ„๋กœ ํŠน์ • ๊ถŒํ•œ์„ ์ œํ•œํ•˜๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณ„์ •์— ๋”ฐ๋ผ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋งŒ ์‹คํ–‰์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์‹คํ–‰ ๊ธฐ๋Šฅ๋งŒ ๋™์ž‘ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง€์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ†ตํ•ด ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด์„œ๋งŒ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์‚ดํŽด๋ณด์ž!!

  1. dev / infra ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ
  2. dev / infra SubAccount ์ƒ์„ฑ ๋ฐ ํ™•์ธ
  1. ๋„ค์ž„์ŠคํŽ˜์ด๋ณ„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ kubectl Pod ๋ฐฐํฌ
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: dev-kubectl
  namespace: dev-team
spec:
  serviceAccountName: dev-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.24.10
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: infra-kubectl
  namespace: infra-team
spec:
  serviceAccountName: infra-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.24.10
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF
  1. Pod ํ™•์ธ
  2. ์ธ์ฆ์„œ/ํ† ํฐ/๋„ค์ž„์ŠคํŽ˜์ดํŠธ ์ •๋ณด ํ™•์ธ
  3. ์‚ฌ์šฉ ํŽธ์˜๋ฅผ ์œ„ํ•ด Alias ์ง€์ •
alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'
  1. ๊ถŒํ•œ ํ™•์ธ(ํ˜„์žฌ Role์ด ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ์ง€ ์•Š์•„, ์–ด๋– ํ•œ ๋ช…๋ น์–ด๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š”, ๊ถŒํ•œ์ด ์—†๋Š” ์ƒํ™ฉ)

  2. Role ์ƒ์„ฑ ๋ฐ ๋กค ๋ฐ”์ธ๋”ฉ

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-dev-team
  namespace: dev-team
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
EOF

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-infra-team
  namespace: infra-team
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
EOF

# ๋กค๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ : '์„œ๋น„์Šค์–ด์นด์šดํŠธ <-> ๋กค' ๊ฐ„ ์„œ๋กœ ์—ฐ๋™
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-dev-team
  namespace: dev-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-dev-team
subjects:
- kind: ServiceAccount
  name: dev-k8s
  namespace: dev-team
EOF

cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-infra-team
  namespace: infra-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-infra-team
subjects:
- kind: ServiceAccount
  name: infra-k8s
  namespace: infra-team
EOF
  1. ๋กค ๋ฐ”์ธ๋”ฉ ํ™•์ธ

  2. ํ™•์ธ(๊ฐ get pods ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ๋ฐฐํฌ๋œ Pod์˜ ์ •๋ณด ์ถœ๋ ฅ)


[๊ณผ์ œ1] ํŒŒ๋“œ์—์„œ EC2 ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ IAM Role ํ† ํฐ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ(boto3), ์Šคํ„ฐ๋””์—์„œ ์†Œ๊ฐœํ•œ ๊ฒƒ ์ด์™ธ์˜ ๋‹ค๋ฅธ AWS ์„œ๋น„์Šค(ํ˜น์€ Action)๋ฅผ ์‚ฌ์šฉ ํ›„ ์ฝ”๋“œ๋‚˜ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”
1. AdminAccessRole ์ถ”๊ฐ€

  1. ์‹ค์Šต๋•Œ ์‚ฌ์šฉํ•œ Polaris LB๋ฅผ boto3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œ!
import boto3

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

response = client.delete_load_balancer(
    LoadBalancerName='a541ce16a8d874a53830b763c89ce9e0'
)
print(response)
  1. ์‹คํ–‰ํ™”๋ฉด

  2. service ํ™•์ธ ๋ฐ aws console LB ํ™•์ธ

    LB๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‚ญ์ œ๋Š” ๋˜์—ˆ์ง€๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด์—๋Š” ๊ฐ•์ œ ์‚ญ์ œํ•œ ๋‚ด์šฉ์ด ์ ์šฉ๋˜์ง€๋Š” ์•Š์•„ ๊ณ„์†ํ•ด์„œ ๋กœ๋“œ๋ฒจ๋Ÿฐ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฑฐ ์ฒ˜๋Ÿผ ์ •๋ณด ํ‘œ์‹œ!!

[๊ณผ์ œ2] ์ฑ… 398~400ํŽ˜์ด์ง€ - kubescape armo ์›น ์‚ฌ์šฉ ํ›„ ๊ด€๋ จ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”
1. cloud.armosec.io ํšŒ์› ๊ฐ€์ž… Dashboard ์„ค์ •

  • ์„ค์น˜

  • ๋Œ€์‰ฌ๋ณด๋“œ ํ™•์ธ

[๊ณผ์ œ3] polaris ๊ด€๋ จ ์‹ค์Šต(์•„๋ฌด๊ฑฐ๋‚˜) ํ›„ ๊ด€๋ จ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”
1. ๊ธฐ์กด ์‹ค์Šต์— ์‚ฌ์šฉํ–ˆ๋˜ ๋งˆ๋ฆฌ์˜ค Deployment ์ƒ์„ฑ ํ›„ polaris ํ™•์ธ
2. ์ทจ์•ฝ์  ์กฐ์ทจ ํ›„ ํ™•์ธ
3. ๋ณ€๊ฒฝ๋œ yamlํŒŒ์ผ

[๊ณผ์ œ4] ์‹ ๊ทœ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ(SA) ์ƒ์„ฑ ํ›„ 'ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€(๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํฌํ•จ)์—์„œ ์ฝ๊ธฐ ์ „์šฉ'์˜ ๊ถŒํ•œ์„ ์ฃผ๊ณ  ํ…Œ์ŠคํŠธ ํ›„ ์ฝ”๋“œ๋‚˜ ์Šค์ƒท์„ ์˜ฌ๋ ค์ฃผ์„ธ์š”

  1. secure-team ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ ๋ฐ secure-k8s SA ์ƒ์„ฑ
  2. secure-team ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— kubectl Pod ๋ฐฐํฌ
  3. ํด๋Ÿฌ์Šคํ„ฐ ๋กค ์ƒ์„ฑ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋กค ๋ฐ”์ธ๋”ฉ(์ฝ๊ธฐ ๊ถŒํ•œ)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secure
rules:
- apiGroups: [""]
  resources: [""]
  verbs: ["get", "watch", "list"]
#kubectl ๋ช…๋ น์–ด๋กœ clusterrole ์ƒ์„ฑ!
k create clusterrole secure --verb=list --verb=get --verb=watch --resource=*

  apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  creationTimestamp: null
  name: crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: secure
subjects:
- kind: ServiceAccount
  name: secure-k8s
  namespace: secure-team
#kubectl ๋ช…๋ น์–ด๋กœ clusterrolebinding ์ƒ์„ฑ!
k create clusterrolebinding crb --clusterrole=secure --serviceaccount=secure-team:secure-k8s


5. Aliase ์„ค์ •

alias k3='kubectl exec -it secure-kubectl -n secure-team -- kubectl'
  1. ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ pod ์ •๋ณด ์ถœ๋ ฅ ๊ฐ€๋Šฅ ํ™•์ธ
  2. Pod์˜ ์ƒ์„ฑ์€ ๋ถˆ๊ฐ€๋Šฅ(get, list, watch๋งŒ ๊ฐ€๋Šฅ)
    #secre-team ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋„, default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ๋„ pod ์ƒ์„ฑ ๋ถˆ๊ฐ€๋Šฅ!!

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ 7์ฃผ์ฐจ ๋งˆ์ง€๋ง‰ ์Šคํ„ฐ๋””์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ณด์•ˆ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜์˜€๋‹ค. ๋ณด์•ˆ์€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฉด์„œ๋„ ์–ด๋ ค์›Œ์„œ ๋ณดํ†ต ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ ์ค‘์—์„œ ๋งˆ์ง€๋ง‰์— ์†Œ๊ฐœ๋ฅผ ํ•œ๋‹ค. ์šฐ๋ฆฌ ์Šคํ„ฐ๋””๋„ ๋งˆ์ง€๋ง‰ ์Šคํ„ฐ๋””์— ๋ณด์•ˆ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์šฐ๊ฒŒ ๋˜์—ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ทจ์•ฝ์  ์ ๊ฒ€, ์ธ์Šคํ„ด์Šค์™€ Pod๋ณ„ ๊ถŒํ•œ ๋ถ„๋ฆฌ(IRSA)์˜ ์ค‘์š”์„ฑ์„ ์ง์ ‘ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ๊ณ„์ •(SubAccount/namespace)๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ™˜๊ฒฝ๋„ ์‹ค์Šตํ•ด ๋ณด์•˜๋‹ค. ์‹ค์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์šด์˜ ์‹œ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์€ ๊ธฐ๋ณธ์ค‘์—์„œ๋„ ๊ธฐ๋ณธ์ด ๋ ๊ฑฐ ๊ฐ™์•„์„œ ๋งˆ์ง€๋ง‰ ํ•™์Šต๋„ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ ๋‹ค.

์•„์ง ์‹ค๋ฌด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„, ์ž˜์€ ๋ชจ๋ฅด์ง€๋งŒ ์Šคํ„ฐ๋””์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ๊ณผ ์ •ํ›ˆ๋‹˜์˜ ์ฑ…์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์ด ์‹ค๋ฌด์—์„œ ๋งŽ์€ ๋„์›€์ด ๋ ๊ฑฐ ๊ฐ™๋‹ค!!!

์งง๋‹ค๋ฉด ์งง์€ ๊ธฐ๊ฐ„์ด์˜€์ง€๋งŒ 4์ฃผ๋™์•ˆ ์Šคํ„ฐ๋””๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š”๊ฒŒ ์‰ฝ์ง€๋Š” ์•Š์•˜๋‹ค. ๊ธฐ์ดˆ์ง€์‹์ด ๋ถ€์กฑํ•˜๊ณ , AWS ์ง€์‹๋„ ๋ถ€์กฑํ•˜์—ฌ ์Šคํ„ฐ๋””๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š”๋ฐ ๋งŽ์ด ํž˜๋“  ๋ถ€๋ถ„๋„ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ด๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰ ์ˆ˜์—…๊นŒ์ง€ ๋“ฃ๊ณ  ๊ณผ์ œ๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์–ด์„œ ์˜๊ด‘์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค.

๊ฐ€์‹œ๋‹ค๋‹˜, 24๋‹จ๊ณ„ ์‹ค์Šต์œผ๋กœ ์ •๋ณตํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ €์ž ์ด์ •ํ›ˆ ๋‹˜๊ป˜ ๋‹ค์‹œํ•œ๋ฒˆ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•ฉ๋‹ˆ๋‹ค!!!!!

๐Ÿฑโ€๐Ÿ‘“

profile
Cloud Developer

0๊ฐœ์˜ ๋Œ“๊ธ€