نوټ. ژباړه: موږ ستاسو پام ته د برتانوي شرکت ASOS.com کې د یو لوړ پوړي امنیتي انجینر لخوا د یوې مقالې ژباړه وړاندې کوو. د دې سره، هغه د سیکومپ کارولو له لارې په کبرنیټس کې د امنیت ښه کولو لپاره وقف شوي خپرونو لړۍ پیل کوي. که لوستونکي پیژندنه خوښ کړي، موږ به لیکوال تعقیب کړو او په دې موضوع به د هغه راتلونکي موادو ته دوام ورکړو.
دا مقاله د پوسټونو په لړۍ کې لومړۍ ده چې څنګه د 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"
}
]
}
defaultAction
د هر سیسټم کال ډیفالټ برخلیک ټاکي چې په برخه کې ندي مشخص شوي syscalls
. د شیانو د اسانه کولو لپاره، راځئ چې په دوو اصلي ارزښتونو تمرکز وکړو چې کارول کیږي:
-
SCMP_ACT_ERRNO
- د سیسټم کال اجرا کول بندوي ، -
SCMP_ACT_ALLOW
- اجازه ورکوي.
کړی architectures
د هدف جوړښتونه لیست شوي دي. دا مهمه ده ځکه چې فلټر پخپله، د کرنل په کچه پلي کیږي، د سیسټم کال پیژندونکو پورې اړه لري، نه په پروفایل کې مشخص شوي نومونو پورې اړه لري. د کانټینر چلولو وخت به دوی د کارولو دمخه د پیژندونکو سره میچ کړي. نظر دا دی چې د سیسټم زنګونه کولی شي په بشپړ ډول مختلف IDs ولري د سیسټم جوړښت پورې اړه لري. د مثال په توګه، د سیسټم زنګ recvfrom
(د ساکټ څخه د معلوماتو ترلاسه کولو لپاره کارول کیږي) په x64 سیسټمونو کې ID = 64 او په x517 کې ID = 86 لري.
په برخه کې 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"
}
]
}
د دې پر ځای:
{
"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"
}
]
}
مګر بیا، ولې دا ستونزه ده؟ په شخصي توګه، زه به د لاندې سیسټم تلیفونونو د سپینې لیست کولو څخه مخنیوی وکړم (مګر که چیرې د دوی لپاره ریښتینې اړتیا وي): 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
لږ خلک پوهیږي چې کوبرنیټس تل لري
ستونزه دا ده چې دا کانټینر تل د سره پیل کیږي 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. غیر محدودیت یو اختیار ندی.
له PodSecurityPolicy
، کوم چې به دا په کلستر کې فعال کړي، ټول پوډونه چې د seccomp پروفایل نه دی تعریف شوی به په کې کار وکړي seccomp=unconfined
.
پدې حالت کې کار کول پدې معنی دي چې د موصلیت ټوله پرت له لاسه ورکوي چې کلستر ساتي. دا طریقه د امنیتي متخصصینو لخوا نه وړاندیز کیږي.
د شورا شمیره 4: په کلستر کې هیڅ کانټینر باید دننه نه وي seccomp=unconfined
په ځانګړې توګه د تولید چاپیریال کې.
5. "د پلټنې حالت"
دا ټکی د Kubernetes لپاره ځانګړی ندی، مګر بیا هم د "شیانو څخه مخکې له دې چې تاسو پیل کړئ" کټګورۍ کې راځي.
لکه څنګه چې پیښیږي، د seccomp پروفایلونو رامینځته کول تل ننګونې وې او په پراخه کچه په محاکمه او خطا تکیه کوي. حقیقت دا دی چې کاروونکي په ساده ډول د دې فرصت نلري چې دوی د تولید چاپیریال کې ازمويي پرته لدې چې د غوښتنلیک "غورځولو" خطر سره مخ کړي.
د لینکس کرنل 4.14 خوشې کیدو وروسته ، دا ممکنه شوه چې د پروفایل برخې د پلټنې حالت کې پرمخ بوځي ، په سیسلوګ کې د ټولو سیسټم تلیفونونو په اړه معلومات ثبت کړي ، مګر پرته له دې چې دوی بلاک کړي. تاسو کولی شئ دا حالت د پیرامیټر په کارولو سره فعال کړئ SCMT_ACT_LOG
:
SCMP_ACT_LOG: seccomp به د سیسټم کال کولو تار اغیزه ونکړي که چیرې دا په فلټر کې د کوم قانون سره سمون ونلري، مګر د سیسټم کال په اړه معلومات به لاګ شي.
دلته د دې خصوصیت کارولو لپاره یوه ځانګړې تګلاره ده:
- د سیسټم تلیفونونو ته اجازه ورکړئ چې اړتیا وي.
- د سیسټم څخه تلیفونونه بند کړئ چې تاسو پوهیږئ به ګټور نه وي.
- په لاګ کې د نورو ټولو تلیفونونو په اړه معلومات ثبت کړئ.
یو ساده مثال داسې ښکاري:
{
"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"
}
]
}
مګر په یاد ولرئ چې تاسو اړتیا لرئ ټول هغه زنګونه بند کړئ چې تاسو پوهیږئ به نه کارول کیږي او دا ممکن کلستر ته زیان ورسوي. د لیست ترتیب کولو لپاره یو ښه اساس رسمي دی
په هرصورت، یو کیچ شتون لري. که څه هم SCMT_ACT_LOG
د 2017 له پای راهیسې د لینکس کرنل لخوا ملاتړ شوی، دا یوازې په دې وروستیو کې د کوبرنیټس ایکوسیستم ته ننوتلی. له همدې امله ، د دې میتود کارولو لپاره تاسو به د لینکس کرنل 4.14 او رن سی نسخه ته اړتیا ولرئ ټیټ نه وي
د شورا شمیره 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
په داسې حاالتو کې، یو وسیله کولی شي د ژغورنې لپاره راشي strace
- دا به وښیې چې ستونزه څه کیدی شي:
sudo strace -c -p 9331
ډاډ ترلاسه کړئ چې پروفایلونه ټول سیسټم زنګونه لري چې غوښتنلیک د چلولو وخت ته اړتیا لري.
د شورا شمیره 7: تفصیل ته پام وکړئ او ډاډ ترلاسه کړئ چې د سیسټم ټول اړین تلیفونونه سپین لیست شوي دي.
دا د SecDevOps په روح کې په Kubernetes کې د seccomp کارولو په اړه د مقالو لړۍ لومړۍ برخه پای ته رسوي. په لاندې برخو کې به موږ د دې په اړه وغږیږو چې ولې دا مهم دی او څنګه د پروسې اتومات کول.
PS د ژباړونکي څخه
زموږ په بلاګ کې هم ولولئ:
- «
د ډاکر کانټینرونو لپاره امنیت » - «
33+ د Kubernetes امنیتي وسیلې » - «
د امنیت غوښتنې چاپیریال کې ډاکر او کبرنیټس » - «
د Kubernetes امنیت لپاره 9 غوره کړنې ".
سرچینه: www.habr.com