11 ways not to get hacked

https://kubernetes.io/blog/2018/07/18/11-ways-not-to-get-hacked/ μš”μ•½

pspκ΄€λ ¨ λ‚΄μš©μ€ μ‚­μ œ

Kubernetes λ³΄μ•ˆμ€ ν”„λ‘œμ νŠΈκ°€ μ‹œμž‘λœ μ΄ν›„λ‘œ λ¨Ό 길을 κ±Έμ–΄μ™”μ§€λ§Œ μ—¬μ „νžˆ λͺ‡ κ°€μ§€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 컨트둀 ν”Œλ ˆμΈμ—μ„œ μ‹œμž‘ν•˜μ—¬ μ›Œν¬λ‘œλ“œ 및 λ„€νŠΈμ›Œν¬ λ³΄μ•ˆμ„ 톡해 κ΅¬μΆ•ν•˜κ³  λ³΄μ•ˆμ˜ λ―Έλž˜μ— λŒ€ν•œ 예츑으둜 λ§ˆλ¬΄λ¦¬ν•˜λŠ” λ‹€μŒμ€ ν΄λŸ¬μŠ€ν„°λ₯Ό κ°•ν™”ν•˜κ³  μ†μƒλœ 경우 볡원λ ₯을 λ†’μ΄λŠ” 데 도움이 λ˜λŠ” μœ μš©ν•œ 팁 λͺ©λ‘μž…λ‹ˆλ‹€.

Part One: The Control Plane

control plane은 Kubernetes의 λ‘λ‡Œμž…λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„°μ—μ„œ μ‹€ν–‰ 쀑인 λͺ¨λ“  μ»¨ν…Œμ΄λ„ˆμ™€ ν¬λ“œμ— λŒ€ν•œ 전체 보기가 있고 μƒˆ ν¬λ“œ(λΆ€λͺ¨ λ…Έλ“œμ— λŒ€ν•œ 루트 μ•‘μ„ΈμŠ€ κΆŒν•œμ΄ μžˆλŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό 포함할 수 있음)λ₯Ό μ˜ˆμ•½ν•  수 있으며 ν΄λŸ¬μŠ€ν„°μ— μ €μž₯된 λͺ¨λ“  비밀을 읽을 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κ·€μ€‘ν•œ 것은 μ ‘κ·Όν•  λ•Œλ‚˜, μ €μž₯λ˜μ–΄ μžˆμ„ λ•Œλ‚˜, λ„€νŠΈμ›Œν¬λ₯Ό 톡해 μš΄μ†‘λ  λ•Œλ„ 우발적인 λˆ„μΆœ 및 μ•…μ˜μ μΈ μ˜λ„λ‘œλΆ€ν„° λ³΄ν˜Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

1. TLS Everywhere

νŠΈλž˜ν”½ μŠ€λ‹ˆν•‘μ„ λ°©μ§€ν•˜κ³ , μ„œλ²„μ˜ IDλ₯Ό ν™•μΈν•˜κ³ , (μƒν˜Έ TLS의 경우) ν΄λΌμ΄μ–ΈνŠΈμ˜ IDλ₯Ό ν™•μΈν•˜λ €λ©΄ TLSλ₯Ό μ§€μ›ν•˜λŠ” λͺ¨λ“  ꡬ성 μš”μ†Œμ— λŒ€ν•΄ TLSλ₯Ό ν™œμ„±ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Source

Lucas KΓ€ldstrΓΆm이 μž‘μ„±ν•œ 이 λ„€νŠΈμ›Œν¬ λ‹€μ΄μ–΄κ·Έλž¨μ€ TLSκ°€ μ΄μƒμ μœΌλ‘œ μ μš©λ˜μ–΄μ•Ό ν•˜λŠ” 일뢀 μœ„μΉ˜, 즉 λ§ˆμŠ€ν„°μ˜ λͺ¨λ“  κ΅¬μ„±μš”μ†Œ 사이, Kubeletκ³Ό API μ„œλ²„ 사이λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

2. RBACν™œμ„±ν™”(Least Privilege μ΅œμ†Œ κΆŒν•œ λ²•μΉ™μœΌλ‘œ) , ABACλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠκΈ° , 그리고 둜그 λͺ¨λ‹ˆν„°λ§ ν•˜κΈ°

Role-based access control은 λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ•‘μ„ΈμŠ€μ™€ 같은 λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ‚¬μš©μž μ•‘μ„ΈμŠ€μ— λŒ€ν•œ μ„ΈλΆ„ν™”λœ μ •μ±… 관리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Kubernetes의 ABAC(속성 기반 μ•‘μ„ΈμŠ€ μ œμ–΄)λŠ” 릴리슀 1.6λΆ€ν„° RBAC둜 λŒ€μ²΄λ˜μ—ˆμœΌλ©° API μ„œλ²„μ—μ„œ ν™œμ„±ν™”ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. λŒ€μ‹  RBACλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

μžŠμ§€ λ§ˆμ„Έμš”: μ΄λŸ¬ν•œ 둜그λ₯Ό ν΄λŸ¬μŠ€ν„° 내뢀에 λ³΄κ΄€ν•˜λŠ” 것은 μΉ¨ν•΄ μ‹œ λ³΄μ•ˆ μœ„ν˜‘μ΄ λ©λ‹ˆλ‹€. μ΄λŠ” λ‹€λ₯Έ λͺ¨λ“  λ³΄μ•ˆμ— λ―Όκ°ν•œ λ‘œκ·Έμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μœ„λ°˜ μ‹œ λ³€μ‘°λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν΄λŸ¬μŠ€ν„° μ™ΈλΆ€λ‘œ μ „μ†‘λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

3. API μ„œλ²„μ— 타사 인증 μ‚¬μš©

쑰직 μ „μ²΄μ—μ„œ 인증 및 κΆŒν•œ λΆ€μ—¬(Single Sign On이라고도 함)λ₯Ό 쀑앙 μ§‘μ€‘ν™”ν•˜λ©΄ μ‚¬μš©μžμ— λŒ€ν•œ μ˜¨λ³΄λ”©, μ˜€ν”„λ³΄λ”© 및 μΌκ΄€λœ κΆŒν•œμ΄ 도움이 λ©λ‹ˆλ‹€.

Kubernetesλ₯Ό 타사 인증 제곡자(예: Google λ˜λŠ” GitHub)와 ν†΅ν•©ν•˜λ©΄ 원격 ν”Œλž«νΌμ˜ ID 보증(2FA와 같은 κ²ƒμœΌλ‘œ 백업됨)을 μ‚¬μš©ν•˜κ³  κ΄€λ¦¬μžκ°€ μ‚¬μš©μžλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜κΈ° μœ„ν•΄ Kubernetes API μ„œλ²„λ₯Ό μž¬κ΅¬μ„±ν•΄μ•Ό ν•˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.

4. etcd ν΄λŸ¬μŠ€ν„° 뢄리 및 λ°©ν™”λ²½

etcdλŠ” μƒνƒœ 및 비밀에 λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•˜λ©° μ€‘μš”ν•œ Kubernetes ꡬ성 μš”μ†Œμž…λ‹ˆλ‹€. ν΄λŸ¬μŠ€ν„°μ˜ λ‚˜λ¨Έμ§€ λΆ€λΆ„κ³Ό λ‹€λ₯΄κ²Œ λ³΄ν˜Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

API μ„œλ²„μ˜ etcd에 λŒ€ν•œ μ“°κΈ° μ•‘μ„ΈμŠ€λŠ” 전체 ν΄λŸ¬μŠ€ν„°μ—μ„œ 루트λ₯Ό μ–»λŠ” 것과 λ™μΌν•˜λ©° 읽기 μ•‘μ„ΈμŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ κΆŒν•œμ„ μƒλ‹Ήνžˆ μ‰½κ²Œ μ—μŠ€μ»¬λ ˆμ΄μ…˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Kubernetes μŠ€μΌ€μ€„λŸ¬λŠ” λ…Έλ“œκ°€ μ—†λŠ” ν¬λ“œ μ •μ˜μ— λŒ€ν•΄ etcdλ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ 찾은 ν¬λ“œλ₯Ό μ˜ˆμ•½μ„ μœ„ν•΄ μ‚¬μš© κ°€λŠ₯ν•œ kubelet으둜 λ³΄λƒ…λ‹ˆλ‹€. 제좜된 ν¬λ“œμ— λŒ€ν•œ μœ νš¨μ„± κ²€μ‚¬λŠ” API μ„œλ²„κ°€ etcd에 μ“°κΈ° 전에 μˆ˜ν–‰ν•˜λ―€λ‘œ etcd에 직접 μ“°λŠ” μ•…μ˜μ μΈ μ‚¬μš©μžλŠ” λ§Žμ€ λ³΄μ•ˆ λ©”μ»€λ‹ˆμ¦˜μ„ μš°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예)PodSecurityμ •μ±….

etcdλŠ” ν”Όμ–΄ 및 ν΄λΌμ΄μ–ΈνŠΈ TLS μΈμ¦μ„œλ‘œ κ΅¬μ„±ν•˜κ³  μ „μš© λ…Έλ“œμ— 배포해야 ν•©λ‹ˆλ‹€. 개인 ν‚€κ°€ λ„λ‚œλ‹Ήν•˜κ³  μž‘μ—…μž λ…Έλ“œμ—μ„œ μ‚¬μš©λ˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ ν΄λŸ¬μŠ€ν„°λ₯Ό API μ„œλ²„λ‘œ λ°©ν™”λ²½μœΌλ‘œ μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

5. μ•”ν˜Έν™” ν‚€ ꡐ체

λ³΄μ•ˆ λͺ¨λ²” μ‚¬λ‘€λŠ” ν‚€ μ†μƒμ˜ "폭발 반경"을 μ œν•œν•˜κΈ° μœ„ν•΄ μ•”ν˜Έν™” 킀와 μΈμ¦μ„œλ₯Ό μ •κΈ°μ μœΌλ‘œ κ΅μ²΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

KubernetesλŠ” κΈ°μ‘΄ 자격 증λͺ…이 만료되면 μƒˆ CSR을 μƒμ„±ν•˜μ—¬ 일뢀 μΈμ¦μ„œ(특히 kubelet ν΄λΌμ΄μ–ΈνŠΈ 및 μ„œλ²„ μΈμ¦μ„œ)λ₯Ό μžλ™μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ API μ„œλ²„κ°€ etcd 값을 μ•”ν˜Έν™”ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” λŒ€μΉ­ μ•”ν˜Έν™” ν‚€λŠ” μžλ™μœΌλ‘œ μˆœν™˜λ˜μ§€ μ•ŠμœΌλ©° μˆ˜λ™μœΌλ‘œ μˆœν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” λ§ˆμŠ€ν„° μ•‘μ„ΈμŠ€κ°€ ν•„μš”ν•˜λ―€λ‘œ 관리 μ„œλΉ„μŠ€(예: GKE λ˜λŠ” AKS)λŠ” μš΄μ˜μžλ‘œλΆ€ν„° 이 문제λ₯Ό μΆ”μƒν™”ν•©λ‹ˆλ‹€.

Part Two: Workloads

컨트둀 ν”Œλ ˆμΈμ—μ„œ μ΅œμ†Œν•œμ˜ μ‹€ν–‰ κ°€λŠ₯ν•œ λ³΄μ•ˆμœΌλ‘œ ν΄λŸ¬μŠ€ν„°λŠ” μ•ˆμ „ν•˜κ²Œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 배포 μ‹œ μ‹ λ’°ν•  수 μžˆμ§€λ§Œ 인터넷에 μ—°κ²°λ˜μ–΄ 있으면 λ‚˜μ€‘μ— μ•…μš©λ  μœ„ν—˜μ΄ 항상 μžˆμŠ΅λ‹ˆλ‹€. μ΅œμ†Œν•œμ˜ κΆŒν•œμœΌλ‘œ μ›Œν¬λ‘œλ“œλ₯Ό μ‹€ν–‰ν•˜κ³  λŸ°νƒ€μž„ ꡬ성을 κ°•ν™”ν•˜λ©΄ μ΄λŸ¬ν•œ μœ„ν—˜μ„ μ™„ν™”ν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

6. Use Linux Security Features and PodSecurityPolicies

Linux μ»€λ„μ—λŠ” μ‘μš© ν”„λ‘œκ·Έλž¨μ— μ΅œμ†Œ κΆŒν•œμ„ μ œκ³΅ν•˜λ„λ‘ ꡬ성할 수 μžˆλŠ” μ—¬λŸ¬ 쀑첩 λ³΄μ•ˆ ν™•μž₯(κΈ°λŠ₯, SELinux, AppArmor, seccomp-bpf)이 μžˆμŠ΅λ‹ˆλ‹€.

baneκ³Ό 같은 λ„κ΅¬λŠ” AppArmor ν”„λ‘œν•„μ„ μƒμ„±ν•˜κ³  seccomp ν”„λ‘œν•„μ„ μœ„ν•œ docker-slim을 μƒμ„±ν•˜λŠ” 데 도움이 될 수 μžˆμ§€λ§Œ μ΄λŸ¬ν•œ μ •μ±… 적용의 λΆ€μž‘μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 포괄적인 ν…ŒμŠ€νŠΈλ₯Ό μ£Όμ˜ν•˜μ—¬ ν•˜μ‹­μ‹œμ˜€.

7. Statically Analyse YAML

Sensitive information should not be stored in pod-type YAML resource (deployments, pods, sets, etc.), and sensitive configmaps and secrets should be encrypted with tools such as vault (with CoreOS's operator), git-crypt, sealed secrets, or cloud provider KMS.

Static analysis of YAML configuration can be used to establish a baseline for runtime security. kubesec generates risk scores for resources:

{
  "score": -30,
  "scoring": {
    "critical": [
      {
        "selector": "containers[] .securityContext .privileged == true",
        "reason": "Privileged containers can allow almost completely unrestricted host access"
      }
    ],
    "advise": [
      {
        "selector": "containers[] .securityContext .runAsNonRoot == true",
        "reason": "Force the running image to run as a non-root user to ensure least privilege"
      },
      {
        "selector": "containers[] .securityContext .capabilities .drop",
        "reason": "Reducing kernel capabilities available to a container limits its attack surface",
        "href": "/docs/tasks/configure-pod-container/security-context/"
      }
    ]
  }
}

And kubetest is a unit test framework for Kubernetes configurations:

#// vim: set ft=python:
def test_for_team_label():
    if spec["kind"] == "Deployment":
        labels = spec["spec"]["template"]["metadata"]["labels"]
        assert_contains(labels, "team", "should indicate which team owns the deployment")

test_for_team_label()

8. λ£¨νŠΈκ°€ μ•„λ‹Œ μ‚¬μš©μžλ‘œ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰

루트둜 μ‹€ν–‰λ˜λŠ” μ»¨ν…Œμ΄λ„ˆλŠ” μž‘μ—… λΆ€ν•˜κ°€ μš”κ΅¬ν•˜λŠ” 것보닀 훨씬 더 λ§Žμ€ κΆŒν•œμ„ κ°–κ³  있으며, μ΄λŠ” 손상될 경우 κ³΅κ²©μžκ°€ 곡격을 κ³„μ†ν•˜λŠ” 데 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

Kubernetesμ—μ„œ μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ ν™œμ„±ν™”λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, μ»¨ν…Œμ΄λ„ˆμ˜ μ‚¬μš©μž ID ν…Œμ΄λΈ”μ΄ 호슀트의 μ‚¬μš©μž ν…Œμ΄λΈ”μ— λ§€ν•‘λ˜κ³  μ»¨ν…Œμ΄λ„ˆ λ‚΄μ—μ„œ 루트 μ‚¬μš©μžλ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰ν•˜λ©΄ ν˜ΈμŠ€νŠΈμ—μ„œ 루트둜 μ‹€ν–‰λ©λ‹ˆλ‹€. μ»¨ν…Œμ΄λ„ˆ λΈŒλ ˆμ΄ν¬μ•„μ›ƒμ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ³„μΈ΅ν™”λœ λ³΄μ•ˆ λ©”μ»€λ‹ˆμ¦˜μ΄ μžˆμ§€λ§Œ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ 루트둜 μ‹€ν–‰ν•˜λŠ” 것은 μ—¬μ „νžˆ ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ§Žμ€ μ»¨ν…Œμ΄λ„ˆ μ΄λ―Έμ§€λŠ” 루트 μ‚¬μš©μžλ₯Ό μ‚¬μš©ν•˜μ—¬ PID 1을 μ‹€ν–‰ν•©λ‹ˆλ‹€. ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€κ°€ μ†μƒλ˜λ©΄ κ³΅κ²©μžκ°€ μ»¨ν…Œμ΄λ„ˆμ— 루트λ₯Ό κ°–κ²Œ 되며 잘λͺ»λœ ꡬ성을 μ•…μš©ν•˜κΈ°κ°€ 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€.

# Required to prevent escalations to root.
allowPrivilegeEscalation: false
runAsUser:
  # Require the container to run without root privileges.
  rule: 'MustRunAsNonRoot'

λ£¨νŠΈκ°€ μ•„λ‹Œ μ»¨ν…Œμ΄λ„ˆλŠ” 1024 미만의 κΆŒν•œ μžˆλŠ” ν¬νŠΈμ— 바인딩할 수 μ—†μ§€λ§Œ(이것은 CAP_NET_BIND_SERVICE 컀널 κΈ°λŠ₯에 μ˜ν•΄ μ œμ–΄λ¨) μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 이 사싀을 μœ„μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ—μ„œ κ°€μƒμ˜ MyApp μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ»¨ν…Œμ΄λ„ˆμ˜ 포트 8443에 λ°”μΈλ”©λ˜μ§€λ§Œ μ„œλΉ„μŠ€λŠ” targetPort에 λŒ€ν•œ μš”μ²­μ„ ν”„λ‘μ‹œν•˜μ—¬ 443μ—μ„œ 이λ₯Ό λ…ΈμΆœν•©λ‹ˆλ‹€.

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 443
      targetPort: 8443

λ£¨νŠΈκ°€ μ•„λ‹Œ μ‚¬μš©μžλ‘œ μ›Œν¬λ‘œλ“œλ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” 것은 μ‚¬μš©μž λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆκ±°λ‚˜ λ£¨νŠΈκ°€ μ—†λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 지속적인 μž‘μ—…μ΄ μ»¨ν…Œμ΄λ„ˆ λŸ°νƒ€μž„μ— μžˆμ„ λ•ŒκΉŒμ§€ λ³€κ²½λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

9. Use Network Policies

기본적으둜 Kubernetes λ„€νŠΈμ›Œν‚Ήμ€ λͺ¨λ“  ν¬λ“œ κ°„ νŠΈλž˜ν”½μ„ ν—ˆμš©ν•©λ‹ˆλ‹€. 이것은 `Network Policy`을 μ‚¬μš©ν•˜μ—¬ μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

KubernetesλŠ” λͺ¨λ“  μ‹œμŠ€ν…œ μƒνƒœλ₯Ό etcd에 μ €μž₯ν•˜λ―€λ‘œ CNI λ„€νŠΈμ›Œν‚Ή ν”ŒλŸ¬κ·ΈμΈμ—μ„œ μ§€μ›ν•˜λŠ” 경우 동적 방화벽을 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

Calico, Cilium, kube-router, Romana 및 Weave Net은 λͺ¨λ‘ Network Policy을 μ§€μ›ν•©λ‹ˆλ‹€.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector:
Here's an example NetworkPolicy that denies all egress except UDP 53 (DNS), which also prevents inbound connections to your application. NetworkPolicies are stateful, so the replies to outbound requests still reach the application.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: myapp-deny-external-egress
spec:
  podSelector:
    matchLabels:
      app: myapp
  policyTypes:
  - Egress
  egress:
  - ports:
    - port: 53
      protocol: UDP
  - to:
    - namespaceSelector: {}

Kubernetes λ„€νŠΈμ›Œν¬ 정책은 DNS 이름에 μ μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ³ μ • IP λ˜λŠ” podSelector(동적 Kubernetes IP의 경우)μ—λ§Œ λ„€νŠΈμ›Œν¬ 정책을 μ μš©ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

λͺ¨λ²” μ‚¬λ‘€λŠ” λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λŒ€ν•œ λͺ¨λ“  νŠΈλž˜ν”½μ„ κ±°λΆ€ν•˜λŠ” κ²ƒμœΌλ‘œ μ‹œμž‘ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 수락 ν…ŒμŠ€νŠΈ μ œν’ˆκ΅°μ„ 톡과할 수 μžˆλ„λ‘ 경둜λ₯Ό μ μ§„μ μœΌλ‘œ μΆ”κ°€ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

k8s: # used for Kubernetes pods
  deployment: # only deployments currently supported
    test-frontend: # pod name, defaults to `default` namespace
      test-microservice: 80 # `test-microservice` is the DNS name of the target service
      test-database: -80 # `test-frontend` should not be able to access test-database’s port 80
      169.254.169.254: -80, -443 # AWS metadata API
      metadata.google.internal: -80, -443 # GCP metadata API

    new-namespace:test-microservice: # `new-namespace` is the namespace name
      test-database.new-namespace: 80 # longer DNS names can be used for other namespaces
      test-frontend.default: 80
      169.254.169.254: -80, -443 # AWS metadata API
      metadata.google.internal: -80, -443 # GCP metadata API

10. Scan Images and Run IDS(μΉ¨μž… 탐지 μ‹œμŠ€ν…œ)

μ›Ή μ„œλ²„λŠ” μ™ΈλΆ€μ—μ„œ http/httpsλ₯Ό ν†΅ν•΄μ„œ podλ‚΄λΆ€μ½”λ“œλ₯Ό μ‹€ν–‰ν• μˆ˜ 있음

이미지 μŠ€μΊ”ν•˜λ©΄ κ³΅κ²©μžκ°€ μ»¨ν…Œμ΄λ„ˆμ— 원격 μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•΄ μ•…μš©ν•  수 μžˆλŠ” μ•Œλ €μ§„ 취약점이 μ—†λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

IDS(μΉ¨μž… 탐지 μ‹œμŠ€ν…œ)을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 웹훅은 μ»¨ν…Œμ΄λ„ˆ 이미지 μŠ€μΊ” λ„κ΅¬μ—μ„œ 이미지λ₯Ό ν΄λŸ¬μŠ€ν„°μ— λ°°ν¬ν•˜κΈ° 전에 μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 검사에 μ‹€νŒ¨ν•œ μ΄λ―Έμ§€λŠ” μž…μž₯이 거뢀될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œλ €μ§„ 취약점에 λŒ€ν•΄ μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό μŠ€μΊ”ν•˜λ©΄ κ³΅κ²©μžκ°€ 곡개된 CVEλ₯Ό μ•…μš©ν•  수 μžˆλŠ” μ‹œκ°„μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€. CoreOS의 Clair 및 Aqua의 Micro Scanner와 같은 무료 λ„κ΅¬λŠ” 배포 νŒŒμ΄ν”„λΌμΈμ—μ„œ μ‚¬μš©λ˜μ–΄ μ€‘μš”ν•˜κ³  μ•…μš© κ°€λŠ₯ν•œ 취약점이 μžˆλŠ” μ΄λ―Έμ§€μ˜ 배포λ₯Ό λ°©μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Grafeas와 같은 λ„κ΅¬λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ 고유 μ„œλͺ…(μ½˜ν…μΈ  μ£Όμ†Œ μ§€μ • κ°€λŠ₯ ν•΄μ‹œ)에 λŒ€ν•œ 지속적인 κ·œμ • μ€€μˆ˜ 및 μ·¨μ•½μ„± 검사λ₯Ό μœ„ν•΄ 이미지 메타데이터λ₯Ό μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, ν•΄λ‹Ή ν•΄μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό μŠ€μΊ”ν•˜λŠ” 것은 ν”„λ‘œλ•μ…˜μ— 배포된 이미지λ₯Ό μŠ€μΊ”ν•˜λŠ” 것과 λ™μΌν•˜λ©° ν”„λ‘œλ•μ…˜ ν™˜κ²½μ— μ•‘μ„ΈμŠ€ν•  ν•„μš” 없이 계속 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œλ €μ§€μ§€ μ•Šμ€ Zero Day 취약점은 항상 μ‘΄μž¬ν•˜λ―€λ‘œ Twistlock, Aqua 및 Sysdig Secure와 같은 μΉ¨μž… 탐지 도ꡬλ₯Ό Kubernetes에 배포해야 ν•©λ‹ˆλ‹€.

IDSλŠ” μ»¨ν…Œμ΄λ„ˆμ—μ„œ 비정상적인 λ™μž‘μ„ κ°μ§€ν•˜κ³  이λ₯Ό μΌμ‹œ μ€‘μ§€ν•˜κ±°λ‚˜ μ’…λ£Œν•©λ‹ˆλ‹€. Sysdig의 FalcoλŠ” μ˜€ν”ˆ μ†ŒμŠ€ κ·œμΉ™ 엔진이며 이 μƒνƒœκ³„μ˜ μΆœλ°œμ μž…λ‹ˆλ‹€.

Part Three: The Future

λ³΄μ•ˆμ˜ "ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ μ§„ν™”"의 λ‹€μŒ λ‹¨κ³„λŠ” μ„œλΉ„μŠ€ λ©”μ‹œλ‘œ λ³΄μ΄μ§€λ§Œ μ±„νƒμ—λŠ” μ‹œκ°„μ΄ 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ—λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ©”μ‹œ μΈν”„λΌλ‘œμ˜ λ³΅μž‘μ„± 이동이 ν¬ν•¨λ˜λ©° 쑰직은 λͺ¨λ²” 사둀λ₯Ό μ΄ν•΄ν•˜κΈ°λ₯Ό 열망할 κ²ƒμž…λ‹ˆλ‹€.

11. Run a Service Mesh

μ„œλΉ„μŠ€ λ©”μ‹œλŠ” Envoy 및 Linkerd와 같은 κ³ μ„±λŠ₯ "μ‚¬μ΄λ“œμΉ΄" ν”„λ‘μ‹œ μ„œλ²„ 간에 λ§Œλ“€μ–΄μ§„ μ•”ν˜Έν™”λœ 영ꡬ μ—°κ²°μ˜ μ›Ήμž…λ‹ˆλ‹€. λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ λ³€κ²½ 없이 νŠΈλž˜ν”½ 관리, λͺ¨λ‹ˆν„°λ§ 및 정책을 μΆ”κ°€ν•©λ‹ˆλ‹€.

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ λ³΄μ•ˆ 및 λ„€νŠΈμ›Œν‚Ή μ½”λ“œλ₯Ό κ³΅μœ ν•˜κ³  μ „νˆ¬ ν…ŒμŠ€νŠΈλ₯Ό 거친 라이브러리 μ„ΈνŠΈλ‘œ μ˜€ν”„λ‘œλ“œν•˜λŠ” 것은 Linkerdλ₯Ό 톡해 이미 κ°€λŠ₯ν–ˆμœΌλ©° Google, IBM 및 Lyft의 Istio λ„μž…μœΌλ‘œ 이 뢄야에 λŒ€μ•ˆμ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν¬λ“œλ‹Ή μ•”ν˜Έν™” IDλ₯Ό μœ„ν•œ SPIFFE 및 기타 λ‹€μ–‘ν•œ κΈ°λŠ₯을 μΆ”κ°€ν•¨μœΌλ‘œμ¨ IstioλŠ” μ°¨μ„ΈλŒ€ λ„€νŠΈμ›Œν¬ λ³΄μ•ˆμ˜ 배포λ₯Ό λ‹¨μˆœν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

"제둜 트러슀트" λ„€νŠΈμ›Œν¬μ—μ„œλŠ” λͺ¨λ“  μƒν˜Έ μž‘μš©μ΄ mTLS(μƒν˜Έ TLS)λ₯Ό 톡해 λ°œμƒν•˜λ―€λ‘œ κΈ°μ‘΄ λ°©ν™”λ²½μ΄λ‚˜ Kubernetes λ„€νŠΈμ›Œν¬ 정책이 ν•„μš”ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

전톡적인 λ„€νŠΈμ›Œν‚Ήμ—μ„œ ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ λ³΄μ•ˆ μ›μΉ™μœΌλ‘œμ˜ μ΄λŸ¬ν•œ μ „ν™˜μ€ 전톡적인 λ³΄μ•ˆ 사고방식을 κ°€μ§„ μ‚¬λžŒλ“€μ—κ²Œ 쉽지 μ•Šμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λ©° SPIFFE의 Evan Gilman이 μ“΄ Zero Trust Networking 책은 이 λ©‹μ§„ 신세계λ₯Ό μ†Œκ°œν•˜λŠ” 데 적극 ꢌμž₯λ©λ‹ˆλ‹€.

Istio LTSκ°€ μΆœμ‹œλ˜μ—ˆμœΌλ©° ν”„λ‘œμ νŠΈλŠ” 1.0 λ¦΄λ¦¬μŠ€μ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•ˆμ •μ„± 버전 κ΄€λ¦¬λŠ” Kubernetes λͺ¨λΈκ³Ό λ™μΌν•©λ‹ˆλ‹€. κ°œλ³„ APIκ°€ 자체 μ•ŒνŒŒ/베타 μ•ˆμ •μ„± λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œ μžμ‹ μ„ μ‹λ³„ν•˜λŠ” μ•ˆμ •μ μΈ μ½”μ–΄μž…λ‹ˆλ‹€. μ•žμœΌλ‘œ λͺ‡ 달 λ™μ•ˆ Istio 채택이 증가할 κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€.

Last updated

Was this helpful?