Seccomp in Kubernetes: 7 شیان چې تاسو اړتیا لرئ له پیل څخه پوه شئ

نوټ. ژباړه: موږ ستاسو پام ته د برتانوي شرکت ASOS.com کې د یو لوړ پوړي امنیتي انجینر لخوا د یوې مقالې ژباړه وړاندې کوو. د دې سره، هغه د سیکومپ کارولو له لارې په کبرنیټس کې د امنیت ښه کولو لپاره وقف شوي خپرونو لړۍ پیل کوي. که لوستونکي پیژندنه خوښ کړي، موږ به لیکوال تعقیب کړو او په دې موضوع به د هغه راتلونکي موادو ته دوام ورکړو.

Seccomp in Kubernetes: 7 شیان چې تاسو اړتیا لرئ له پیل څخه پوه شئ

دا مقاله د پوسټونو په لړۍ کې لومړۍ ده چې څنګه د SecDevOps په روح کې د seccomp پروفایلونه رامینځته کړي ، پرته لدې چې جادو او جادو ته لاره هواره کړي. په لومړۍ برخه کې، زه به په Kubernetes کې د seccomp پلي کولو اساسات او داخلي توضیحات پوښم.

د کوبرنیټس ایکوسیستم د کانټینرونو خوندي کولو او جلا کولو لپاره پراخه لارې وړاندې کوي. مقاله د خوندي کمپیوټري حالت په اړه ده چې په نوم هم پیژندل کیږي سیکم کمپیوټر. د دې جوهر د کانټینرونو لخوا د اجرا کولو لپاره موجود سیسټم غوښتنې فلټر کول دي.

ولې دا مهمه ده؟ کانټینر یوازې یوه پروسه ده چې په یو ځانګړي ماشین کې پرمخ ځي. او دا د نورو غوښتنلیکونو په څیر کرنل کاروي. که کانټینرونه کولی شي کوم سیسټم زنګونه ترسره کړي، ډیر ژر به مالویر د دې څخه ګټه پورته کړي ترڅو د کانټینر انزوا مخه ونیسي او نور غوښتنلیکونه اغیزمن کړي: د معلوماتو مداخله، د سیسټم ترتیبات بدلول، او نور.

د 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 د هدف جوړښتونه لیست شوي دي. دا مهمه ده ځکه چې فلټر پخپله، د کرنل په کچه پلي کیږي، د سیسټم کال پیژندونکو پورې اړه لري، نه په پروفایل کې مشخص شوي نومونو پورې اړه لري. د کانټینر چلولو وخت به دوی د کارولو دمخه د پیژندونکو سره میچ کړي. نظر دا دی چې د سیسټم زنګونه کولی شي په بشپړ ډول مختلف IDs ولري د سیسټم جوړښت پورې اړه لري. د مثال په توګه، د سیسټم زنګ recvfrom (د ساکټ څخه د معلوماتو ترلاسه کولو لپاره کارول کیږي) په x64 سیسټمونو کې ID = 64 او په x517 کې ID = 86 لري. دا تاسو کولی شئ د x86-x64 معمارۍ لپاره د ټولو سیسټم زنګونو لیست ومومئ.

په برخه کې syscalls د سیسټم ټول زنګونه لیست کوي او مشخص کوي چې د دوی سره څه وکړي. د مثال په توګه، تاسو کولی شئ د ترتیب کولو له لارې سپین لیست جوړ کړئ defaultAction په SCMP_ACT_ERRNO، او په برخه کې زنګ ووهئ syscalls ګمارل SCMP_ACT_ALLOW. په دې توګه، تاسو یوازې په برخه کې مشخص شوي تلیفونونو ته اجازه ورکوئ syscalls، او نور ټول منع کوي. د تور لیست لپاره تاسو باید ارزښتونه بدل کړئ defaultAction او برعکس عملونه.

اوس موږ باید د nuances په اړه یو څو ټکي ووایو چې دومره څرګند ندي. مهرباني وکړئ په یاد ولرئ چې لاندې سپارښتنې داسې انګیرل کیږي چې تاسو په کوبرنیټس کې د سوداګرۍ غوښتنلیکونو یوه کرښه ځای په ځای کوئ او تاسو غواړئ چې دوی د امکان تر حده لږ امتیازاتو سره پرمخ بوځي.

1. اجازه راکړئ PrivilegeEscalation=false

В securityContext کانټینر یو پیرامیټر لري AllowPrivilegeEscalation. که چیرې دا نصب شي falseکانټینرونه به د (on) بټ no_new_priv. د دې پیرامیټر معنی د نوم څخه څرګند دی: دا کانټینر د خپل ځان په پرتله د ډیرو امتیازاتو سره د نوي پروسو پیل کولو مخه نیسي.

د دې اختیار یو اړخ اغیزه ټاکل کیږي true (ډیفالټ) دا دی چې د کانټینر چلولو وخت د پیل پروسې په پیل کې د seccomp پروفایل پلي کوي. په دې توګه، ټول سیسټم زنګونه چې د داخلي چلولو پروسو چلولو لپاره اړین دي (د مثال په توګه د کاروونکي / ګروپ IDs ترتیب کول، د ځانګړو وړتیاو کمول) باید په پروفایل کې فعال شي.

یو کانټینر ته چې کوچني کارونه کوي 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-container-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 - نږدې ژباړې په راتلونکي خپرونه کې تمه کیږي).

لږ خلک پوهیږي چې کوبرنیټس تل لري بګچې د دې لامل شوی چې د seccomp پروفایلونه پلي شي بند کانتینر. د چلولو چاپیریال تر یوې اندازې پورې د دې نیمګړتیا لپاره تاوان ورکوي، مګر دا کانټینر د پوډونو څخه ورک نه کیږي، ځکه چې دا د دوی زیربنا تنظیمولو لپاره کارول کیږي.

ستونزه دا ده چې دا کانټینر تل د سره پیل کیږي AllowPrivilegeEscalation=true، د ستونزو لامل کیږي چې په 1 پراګراف کې ویل شوي ، او دا نشي بدلیدلی.

د کانټینر په کچه د seccomp پروفایلونو په کارولو سره، تاسو د دې زیان څخه مخنیوی کوئ او کولی شئ یو پروفایل جوړ کړئ چې د یو ځانګړي کانټینر سره مناسب وي. دا باید ترسره شي تر هغه چې پراختیا کونکي بګ حل کړي او نوې نسخه (شاید 1.18؟) د هرچا لپاره شتون ولري.

د شورا شمیره 2: د کانټینر په کچه د seccomp پروفایلونه تنظیم کړئ.

په عملي معنی کې، دا قاعده معمولا د دې پوښتنې لپاره د نړیوال ځواب په توګه کار کوي: "ولې زما د seccomp پروفایل سره کار کوي؟ docker runمګر د Kubernetes کلستر ته د ګمارلو وروسته کار نه کوي؟

3. یوازې د وروستي ځای په توګه د چلولو وخت/ډیفالټ وکاروئ

Kubernetes د جوړ شوي پروفایلونو لپاره دوه اختیارونه لري: runtime/default и docker/default. دواړه د کانټینر چلولو وخت لخوا پلي کیږي، نه د کوبرنیټس. نو ځکه، دوی ممکن د چلولو وخت چاپیریال او د هغې نسخه پورې اړه ولري توپیر ولري.

په بل عبارت، د چلولو وخت بدلولو په پایله کې، کانټینر ممکن د سیسټم تلیفونونو مختلف سیټ ته لاسرسۍ ولري، کوم چې دا ممکن یا ونه کاروي. ډیری وختونه کارول کیږي د ډاکر تطبیق. که تاسو غواړئ دا پروفایل وکاروئ، مهرباني وکړئ ډاډ ترلاسه کړئ چې دا ستاسو لپاره مناسب دی.

عکس وښاياست docker/default د Kubernetes 1.11 راهیسې له مینځه وړل شوی، نو د دې کارولو څخه ډډه وکړئ.

زما په نظر، پروفایل runtime/default د هغه هدف لپاره چې دا رامینځته شوی په بشپړ ډول مناسب دی: د کمانډ پلي کولو پورې اړوند خطرونو څخه د کاروونکو ساتنه docker run په خپلو موټرو. په هرصورت، کله چې د کوبرنیټس کلسترونو کې د سوداګرۍ غوښتنلیکونو خبره راځي، زه به دا استدلال وکړم چې دا ډول پروفایل خورا خلاص دی او پراختیا کونکي باید د دوی غوښتنلیکونو (یا غوښتنلیکونو ډولونو) لپاره پروفایلونو رامینځته کولو تمرکز وکړي.

د شورا شمیره 3: د ځانګړو غوښتنلیکونو لپاره seccomp پروفایلونه جوړ کړئ. که دا ممکنه نه وي، د غوښتنلیک ډولونو لپاره پروفایلونه جوړ کړئ، د بیلګې په توګه، یو پرمختللی پروفایل جوړ کړئ چې د ګولنګ غوښتنلیک ټول ویب APIs پکې شامل وي. یوازې د وروستي ریسارټ په توګه د چلولو وخت/ډیفالټ وکاروئ.

په راتلونکو پوسټونو کې، زه به پوښښ وکړم چې څنګه د SecDevOps الهام شوي seccomp پروفایلونه رامینځته کړم، دوی اتومات کړئ، او په پایپ لاینونو کې یې ازموینه وکړئ. په بل عبارت، تاسو به هیڅ عذر ونه لرئ چې د غوښتنلیک ځانګړي پروفایلونو ته لوړ نه کړئ.

4. غیر محدودیت یو اختیار ندی.

له د Kubernetes لومړۍ امنیتي پلټنه دا په ډیفالټ سره معلومه شوه seccomp غیر فعال شوی. دا پدې مانا ده چې که تاسو ترتیب نه کړئ PodSecurityPolicy، کوم چې به دا په کلستر کې فعال کړي، ټول پوډونه چې د seccomp پروفایل نه دی تعریف شوی به په کې کار وکړي seccomp=unconfined.

پدې حالت کې کار کول پدې معنی دي چې د موصلیت ټوله پرت له لاسه ورکوي چې کلستر ساتي. دا طریقه د امنیتي متخصصینو لخوا نه وړاندیز کیږي.

د شورا شمیره 4: په کلستر کې هیڅ کانټینر باید دننه نه وي seccomp=unconfinedپه ځانګړې توګه د تولید چاپیریال کې.

5. "د پلټنې حالت"

دا ټکی د Kubernetes لپاره ځانګړی ندی، مګر بیا هم د "شیانو څخه مخکې له دې چې تاسو پیل کړئ" کټګورۍ کې راځي.

لکه څنګه چې پیښیږي، د seccomp پروفایلونو رامینځته کول تل ننګونې وې او په پراخه کچه په محاکمه او خطا تکیه کوي. حقیقت دا دی چې کاروونکي په ساده ډول د دې فرصت نلري چې دوی د تولید چاپیریال کې ازمويي پرته لدې چې د غوښتنلیک "غورځولو" خطر سره مخ کړي.

د لینکس کرنل 4.14 خوشې کیدو وروسته ، دا ممکنه شوه چې د پروفایل برخې د پلټنې حالت کې پرمخ بوځي ، په سیسلوګ کې د ټولو سیسټم تلیفونونو په اړه معلومات ثبت کړي ، مګر پرته له دې چې دوی بلاک کړي. تاسو کولی شئ دا حالت د پیرامیټر په کارولو سره فعال کړئ 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 له پای راهیسې د لینکس کرنل لخوا ملاتړ شوی، دا یوازې په دې وروستیو کې د کوبرنیټس ایکوسیستم ته ننوتلی. له همدې امله ، د دې میتود کارولو لپاره تاسو به د لینکس کرنل 4.14 او رن سی نسخه ته اړتیا ولرئ ټیټ نه وي 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 کارول ترلاسه کړئ:

Seccomp in Kubernetes: 7 شیان چې تاسو اړتیا لرئ له پیل څخه پوه شئ

په داسې حاالتو کې، یو وسیله کولی شي د ژغورنې لپاره راشي strace - دا به وښیې چې ستونزه څه کیدی شي:

Seccomp in Kubernetes: 7 شیان چې تاسو اړتیا لرئ له پیل څخه پوه شئ
sudo strace -c -p 9331

ډاډ ترلاسه کړئ چې پروفایلونه ټول سیسټم زنګونه لري چې غوښتنلیک د چلولو وخت ته اړتیا لري.

د شورا شمیره 7: تفصیل ته پام وکړئ او ډاډ ترلاسه کړئ چې د سیسټم ټول اړین تلیفونونه سپین لیست شوي دي.

دا د SecDevOps په روح کې په Kubernetes کې د seccomp کارولو په اړه د مقالو لړۍ لومړۍ برخه پای ته رسوي. په لاندې برخو کې به موږ د دې په اړه وغږیږو چې ولې دا مهم دی او څنګه د پروسې اتومات کول.

PS د ژباړونکي څخه

زموږ په بلاګ کې هم ولولئ:

سرچینه: www.habr.com

Add a comment