Kubernetes์˜ Seccomp: ์ฒ˜์Œ๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•  7๊ฐ€์ง€

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์˜๊ตญ ํšŒ์‚ฌ ASOS.com์˜ ์ˆ˜์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ฒˆ์—ญํ•œ ๊ธฐ์‚ฌ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ทธ๋Š” seccomp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes์˜ ๋ณด์•ˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์ „๋…ํ•˜๋Š” ์ผ๋ จ์˜ ๊ฐ„ํ–‰๋ฌผ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋…์ž๋“ค์ด ์†Œ๊ฐœ๋ฅผ ์ข‹์•„ํ•œ๋‹ค๋ฉด ์ €์ž๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ํ–ฅํ›„ ์ž๋ฃŒ๋ฅผ ๊ณ„์†ํ•ด์„œ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Kubernetes์˜ Seccomp: ์ฒ˜์Œ๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•  7๊ฐ€์ง€

์ด ๊ธฐ์‚ฌ๋Š” ๋งˆ์ˆ ์ด๋‚˜ ์š”์ˆ ์— ์˜์ง€ํ•˜์ง€ ์•Š๊ณ  SecDevOps ์ •์‹ ์œผ๋กœ seccomp ํ”„๋กœํ•„์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๊ฒŒ์‹œ๋ฌผ ์ค‘ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค. XNUMX๋ถ€์—์„œ๋Š” Kubernetes์—์„œ seccomp ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์‚ฌํ•ญ๊ณผ ๋‚ด๋ถ€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

Kubernetes ์ƒํƒœ๊ณ„๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ๊ฒฉ๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๋ณด์•ˆ ์ปดํ“จํŒ… ๋ชจ๋“œ(Secure Computing Mode)์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ดˆ์ปด. ๊ทธ ํ•ต์‹ฌ์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๊ธฐ๋ณธ ์‚ฌํ•ญ ์•Œ์•„๋ณด๊ธฐ

๊ธฐ๋ณธ seccomp ํ”„๋กœํ•„์—๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. defaultAction, architectures (๋˜๋Š” archMap) ๊ทธ๋ฆฌ๊ณ  syscalls:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "sched_yield",
                "futex",
                "write",
                "mmap",
                "exit_group",
                "madvise",
                "rt_sigprocmask",
                "getpid",
                "gettid",
                "tgkill",
                "rt_sigaction",
                "read",
                "getpgrp"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(์ค‘๊ฐ„-๊ธฐ๋ณธ-seccomp.json)

defaultAction ์„น์…˜์— ์ง€์ •๋˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ๊ธฐ๋ณธ ์šด๋ช…์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. syscalls. ์ž‘์—…์„ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ฐ’์— ์ค‘์ ์„ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

  • SCMP_ACT_ERRNO โ€” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹คํ–‰์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • SCMP_ACT_ALLOW - ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„น์…˜์—์„œ architectures ๋Œ€์ƒ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ์ปค๋„ ์ˆ˜์ค€์—์„œ ์ ์šฉ๋˜๋Š” ํ•„ํ„ฐ ์ž์ฒด๋Š” ํ”„๋กœํ•„์— ์ง€์ •๋œ ์ด๋ฆ„์ด ์•„๋‹ˆ๋ผ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์‹๋ณ„์ž์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Š” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์€ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ด๋ฅผ ์‹๋ณ„์ž์™€ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ์™„์ „ํžˆ ๋‹ค๋ฅธ ID๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ recvfrom (์†Œ์ผ“์—์„œ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ)์€ x64 ์‹œ์Šคํ…œ์—์„œ ID = 64์ด๊ณ  x517์—์„œ ID = 86์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— x86-x64 ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ชฉ๋ก์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„น์…˜์—์„œ syscalls ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋‚˜์—ดํ•˜๊ณ  ์ด์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์„ ์„ค์ •ํ•˜์—ฌ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. defaultAction ์— SCMP_ACT_ERRNO, ์„น์…˜์—์„œ ์ „ํ™” syscalls ํ• ๋‹น SCMP_ACT_ALLOW. ๋”ฐ๋ผ์„œ ์„น์…˜์— ์ง€์ •๋œ ํ†ตํ™”๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. syscalls, ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. defaultAction ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ˜๋Œ€์˜ ํ–‰๋™.

์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ทธ๋‹ค์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๋‰˜์•™์Šค์— ๋Œ€ํ•ด ๋ช‡ ๋งˆ๋”” ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ Kubernetes์— LOB(๊ธฐ๊ฐ„ ์—…๋ฌด) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ์ตœ์†Œํ•œ์˜ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

1. AllowPrivilegeEscalation=false

ะ’ securityContext ์ปจํ…Œ์ด๋„ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค AllowPrivilegeEscalation. ์— ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ false, ์ปจํ…Œ์ด๋„ˆ๋Š” (on) ์กฐ๊ธˆ no_new_priv. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋Š” ์ด๋ฆ„์—์„œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž์ฒด ๋ณด์œ  ๊ถŒํ•œ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ถŒํ•œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ต์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. true (๊ธฐ๋ณธ๊ฐ’)์€ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์ด ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค์˜ ๋งจ ์ฒ˜์Œ์— seccomp ํ”„๋กœํ•„์„ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ถ€ ๋Ÿฐํƒ€์ž„ ํ”„๋กœ์„ธ์Šค(์˜ˆ: ์‚ฌ์šฉ์ž/๊ทธ๋ฃน ID ์„ค์ •, ํŠน์ • ๊ธฐ๋Šฅ ์‚ญ์ œ)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ”„๋กœํ•„์—์„œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์†Œํ•œ ์ผ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์— echo hi, ๋‹ค์Œ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "brk",
                "capget",
                "capset",
                "chdir",
                "close",
                "execve",
                "exit_group",
                "fstat",
                "fstatfs",
                "futex",
                "getdents64",
                "getppid",
                "lstat",
                "mprotect",
                "nanosleep",
                "newfstatat",
                "openat",
                "prctl",
                "read",
                "rt_sigaction",
                "statfs",
                "setgid",
                "setgroups",
                "setuid",
                "stat",
                "uname",
                "write"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(hi-pod-seccomp.json)

...์ด๊ฒƒ ๋Œ€์‹ ์—:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "brk",
                "close",
                "execve",
                "exit_group",
                "futex",
                "mprotect",
                "nanosleep",
                "stat",
                "write"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(hi-์ปจํ…Œ์ด๋„ˆ-seccomp.json)

๊ทธ๋Ÿฐ๋ฐ ๋˜ ์ด๊ฒŒ ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฑธ๊นŒ์š”? ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋‹ค์Œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ ์ด์ƒ). capset, set_tid_address, setgid, setgroups ะธ setuid. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ๊ณผ์ œ๋Š” ์ „ํ˜€ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ํ”„๋กœํ•„์„ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๊ตฌํ˜„์— ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋Š ๋‚  ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์—…๋ฐ์ดํŠธํ•œ ํ›„(๊ท€ํ•˜ ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์— ์˜ํ•ด) ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์ด ๊ฐ‘์ž๊ธฐ ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ # 1: ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. AllowPrivilegeEscaltion=false. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด seccomp ํ”„๋กœํ•„์˜ ํฌ๊ธฐ๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์˜ ๋ณ€๊ฒฝ์— ๋œ ๋ฏผ๊ฐํ•ด์ง‘๋‹ˆ๋‹ค.

2. ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ seccomp ํ”„๋กœํ•„ ์„ค์ •

seccomp ํ”„๋กœํ•„์€ ํฌ๋“œ ์ˆ˜์ค€์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

annotations:
  seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"

...๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ:

annotations:
  container.security.alpha.kubernetes.io/<container-name>: "localhost/profile.json"

Kubernetes seccomp๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์œ„ ๊ตฌ๋ฌธ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. GA๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค (์ด ์ด๋ฒคํŠธ๋Š” Kubernetes์˜ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค - 1.18 - ๋Œ€๋žต์ ์ธ ๋ฒˆ์—ญ์—์„œ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.)

Kubernetes๊ฐ€ ํ•ญ์ƒ ๊ทธ๋žฌ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•„๋Š” ์‚ฌ๋žŒ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ์ด๋กœ ์ธํ•ด seccomp ํ”„๋กœํ•„์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€ ์ปจํ…Œ์ด๋„ˆ. ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์€ ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณด์™„ํ•˜์ง€๋งŒ ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ์ธํ”„๋ผ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ Pod์—์„œ ์‚ฌ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ญ์ƒ ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. AllowPrivilegeEscalation=true, ์ด๋Š” ๋‹จ๋ฝ 1์—์„œ ์–ธ๊ธ‰๋œ ๋ฌธ์ œ๋กœ ์ด์–ด์ง€๋ฉฐ ์ด๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ seccomp ํ”„๋กœํ•„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ•จ์ •์„ ํ”ผํ•˜๊ณ  ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์— ๋งž๋Š” ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ƒˆ ๋ฒ„์ „(1.18?)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๋•Œ๊นŒ์ง€ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒ # 2: ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ seccomp ํ”„๋กœํ•„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ์ ์ธ ์˜๋ฏธ์—์„œ ์ด ๊ทœ์น™์€ ์ผ๋ฐ˜์ ์œผ๋กœ "๋‚ด seccomp ํ”„๋กœํ•„์ด ์™œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ณดํŽธ์ ์ธ ๋Œ€๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. docker runํ•˜์ง€๋งŒ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•œ ํ›„์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋‚˜์š”?

3. ๋Ÿฐํƒ€์ž„/๊ธฐ๋ณธ๊ฐ’์€ ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Kubernetes์—๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ํ”„๋กœํ•„์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. runtime/default ะธ docker/default. ๋‘˜ ๋‹ค Kubernetes๊ฐ€ ์•„๋‹Œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ ๋ฐ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ”„๋กœํ•„ docker/default Kubernetes 1.11๋ถ€ํ„ฐ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.

๋‚ด ์ƒ๊ฐ์—” ํ”„๋กœํ•„์ด runtime/default ์ž‘์„ฑ๋œ ๋ชฉ์ ์— ์™„๋ฒฝํ•˜๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ์œ„ํ—˜์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž๋ฅผ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. docker run ๊ทธ๋“ค์˜ ์ฐจ์—. ๊ทธ๋Ÿฌ๋‚˜ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•œ ํ”„๋กœํ•„์€ ๋„ˆ๋ฌด ๊ฐœ๋ฐฉ์ ์ด๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ˜•)์— ๋Œ€ํ•œ ํ”„๋กœํ•„์„ ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐํžˆ ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŒ # 3: ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ seccomp ํ”„๋กœํ•„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ˜•์— ๋Œ€ํ•œ ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด Golang ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ์›น API๋ฅผ ํฌํ•จํ•˜๋Š” ๊ณ ๊ธ‰ ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. ์ตœํ›„์˜ ์ˆ˜๋‹จ์œผ๋กœ๋งŒ ๋Ÿฐํƒ€์ž„/๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

ํ–ฅํ›„ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” SecDevOps์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ seccomp ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜๊ณ  ์ž๋™ํ™”ํ•˜๊ณ  ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ ํ”„๋กœํ•„๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

4. ๋ฌด์ œํ•œ์€ ์˜ต์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

์œผ๋กœ ์ฒซ ๋ฒˆ์งธ Kubernetes ๋ณด์•ˆ ๊ฐ์‚ฌ ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค seccomp ๋น„ํ™œ์„ฑํ™”๋จ. ์ฆ‰, ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด PodSecurityPolicyํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํ™œ์„ฑํ™”ํ•˜๋ฉด seccomp ํ”„๋กœํ•„์ด ์ •์˜๋˜์ง€ ์•Š์€ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. seccomp=unconfined.

์ด ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ์ „์ฒด ์ ˆ์—ฐ ์ธต์ด ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒ # 4: ํด๋Ÿฌ์Šคํ„ฐ์˜ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๋„ ์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. seccomp=unconfined, ํŠนํžˆ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ.

5. "๊ฐ์‚ฌ ๋ชจ๋“œ"

์ด ์ ์€ Kubernetes์—๋งŒ ๊ตญํ•œ๋œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ "์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ" ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค.

๊ณต๊ต๋กญ๊ฒŒ๋„ seccomp ํ”„๋กœํ•„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์–ด๋ ค์šด ์ผ์ด๋ฉฐ ์‹œํ–‰์ฐฉ์˜ค์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์‚ฌ์šฉ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ "์‚ญ์ œ"ํ•  ์œ„ํ—˜ ์—†์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ด๋ฅผ ํ…Œ์ŠคํŠธํ•  ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Linux ์ปค๋„ 4.14 ๋ฆด๋ฆฌ์Šค ์ดํ›„ ๊ฐ์‚ฌ ๋ชจ๋“œ์—์„œ ํ”„๋กœํ•„์˜ ์ผ๋ถ€๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ syslog์— ๊ธฐ๋กํ•˜์ง€๋งŒ ์ด๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp๋Š” ํ•„ํ„ฐ์˜ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋งŒ๋“œ๋Š” ์Šค๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ฐ˜์ ์ธ ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ•„์š”ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์œ ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์‹œ์Šคํ…œ์˜ ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•˜์„ธ์š”.
  3. ๋‹ค๋ฅธ ๋ชจ๋“  ํ†ตํ™”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋กœ๊ทธ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํ™”๋œ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
    "defaultAction": "SCMP_ACT_LOG",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "sched_yield",
                "futex",
                "write",
                "mmap",
                "exit_group",
                "madvise",
                "rt_sigprocmask",
                "getpid",
                "gettid",
                "tgkill",
                "rt_sigaction",
                "read",
                "getpgrp"
            ],
            "action": "SCMP_ACT_ALLOW"
        },
        {
            "names": [
                "add_key",
                "keyctl",
                "ptrace"
            ],
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}

(์ค‘๊ฐ„ ํ˜ผํ•ฉ-seccomp.json)

๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ์ž ์žฌ์ ์œผ๋กœ ํ•ด๋ฅผ ๋ผ์น  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ˜ธ์ถœ์„ ์ฐจ๋‹จํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ๊ธฐ์ดˆ๋Š” ๊ณต์‹ ๋„์ปค ๋ฌธ์„œ. ๊ธฐ๋ณธ ํ”„๋กœํ•„์—์„œ ์ฐจ๋‹จ๋˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ SCMT_ACT_LOG 2017๋…„ ๋ง๋ถ€ํ„ฐ Linux ์ปค๋„์˜ ์ง€์›์„ ๋ฐ›์•„ Kubernetes ์ƒํƒœ๊ณ„์— ๋“ค์–ด์˜จ ๊ฒƒ์€ ๋น„๊ต์  ์ตœ๊ทผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Linux ์ปค๋„ 4.14 ๋ฐ runC ๋ฒ„์ „ ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. v1.0.0-rc9.

ํŒ # 5: ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์™€ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ฐ์‚ฌ ๋ชจ๋“œ ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ

ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ˜ธ์ถœ์„ ์‹๋ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณด์•ˆ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋” ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ •์ ์ด๋ฏ€๋กœ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ(๋˜๋Š” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๊ฒฝ์šฐ ์œ„ํ—˜ํ•œ ํ”Œ๋ž˜๊ทธ/์˜ต์…˜)์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ณธ์งˆ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ‘œํ˜„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์˜ ์ œํ•œ์„ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

Go ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ํ˜ธ์ถœ์„ ์ˆ˜์ง‘ํ•˜๋Š” ํŠน์ˆ˜ ๋„๊ตฌ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ:

package main

import "fmt"

func main() {
	fmt.Println("test")
}

... ๋ฐœ์‚ฌํ•˜์ž gosystract ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค :

go install https://github.com/pjbgf/gosystract
gosystract --template='{{- range . }}{{printf ""%s",n" .Name}}{{- end}}' application-path

...๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค:

"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp",
"arch_prctl",

์ง€๊ธˆ์€ ์ด๋Š” ๋‹จ์ง€ ์˜ˆ์‹œ์ผ ๋ฟ์ด๋ฉฐ ๋„๊ตฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์— ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒ # 6: ๊ผญ ํ•„์š”ํ•œ ํ†ตํ™”๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ํ†ตํ™”๋Š” ๋ชจ๋‘ ์ฐจ๋‹จํ•˜์„ธ์š”.

7. ์˜ฌ๋ฐ”๋ฅธ ๊ธฐ๋ฐ˜ ๋งˆ๋ จ(๋˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์— ๋Œ€๋น„)

์ปค๋„์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์— ๊ด€๊ณ„์—†์ด ํ”„๋กœํ•„์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ผญ ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ง์ด์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ exit ๋˜๋Š” exit_group, ์ปจํ…Œ์ด๋„ˆ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋ช…๋ น๋„ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. echo hi ๊ทธ๋ฅผ ๋Š๋‹คo ๋ฌด๊ธฐํ•œ. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

Kubernetes์˜ Seccomp: ์ฒ˜์Œ๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•  7๊ฐ€์ง€

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ๊ตฌ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. strace - ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Kubernetes์˜ Seccomp: ์ฒ˜์Œ๋ถ€ํ„ฐ ์•Œ์•„์•ผ ํ•  7๊ฐ€์ง€
sudo strace -c -p 9331

ํ”„๋กœํ•„์— ๋Ÿฐํƒ€์ž„ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

ํŒ # 7: ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ํ—ˆ์šฉ ๋ชฉ๋ก์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

์ด๊ฒƒ์œผ๋กœ SecDevOps์˜ ์ •์‹ ์— ๋”ฐ๋ผ Kubernetes์—์„œ seccomp๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ ์ค‘ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ๋งˆ์นฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ถ€๋ถ„์—์„œ๋Š” ์ด๊ฒƒ์ด ์ค‘์š”ํ•œ ์ด์œ ์™€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”์‹ 

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€