Docker-ის უსაფრთხოება
ისწავლეთ Docker-ის უსაფრთხოების საუკეთესო პრაქტიკების, კონფიგურაციებისა და ინსტრუმენტების შესახებ
Docker-ის უსაფრთხოება
უსაფრთხოება კრიტიკულად მნიშვნელოვანია production-ში კონტეინერების გაშვებისას. კონტეინერების უსაფრთხოება მოითხოვს კომპლექსურ მიდგომას, რომელიც ეხება მოწყვლადობებს ყველა დონეზე - ჰოსტის სისტემიდან და კონტეინერის runtime-იდან აპლიკაციის კოდამდე და ქსელურ კომუნიკაციებამდე. ეს სახელმძღვანელო მოიცავს Docker გარემოსთვის აუცილებელ უსაფრთხოების პრაქტიკებსა და კონფიგურაციებს, რათა დაგეხმაროთ უსაფრთხო კონტეინერიზებული აპლიკაციების შექმნასა და შენარჩუნებაში.
უსაფრთხოების საფუძვლები
იზოლაცია
- პროცესების იზოლაცია: კონტეინერები იზიარებენ ჰოსტის ბირთვს, მაგრამ მუშაობენ იზოლირებულ პროცესების სივრცეებში
- ქსელის namespace-ის გამოყოფა: თითოეულ კონტეინერს აქვს საკუთარი ქსელის სტეკი
- რესურსების შეზღუდვები: CPU-ს, მეხსიერების და სხვა რესურსების შეზღუდვა DoS-ის თავიდან ასაცილებლად
- ფაილური სისტემის იზოლაცია: კონტეინერ-სპეციფიური ფაილური სისტემა ჰოსტზე კონტროლირებადი წვდომით
- მომხმარებლის namespace-ის მიბმა: კონტეინერის მომხმარებლების მიბმა არა-პრივილეგირებულ ჰოსტის მომხმარებლებზე
- Control groups (cgroups): ბირთვის ფუნქცია, რომელიც ზღუდავს და იზოლირებს რესურსების გამოყენებას
- Namespaces: უზრუნველყოფს იზოლირებულ სამუშაო სივრცეს თითოეული კონტეინერისთვის (PID, NET, MNT, UTS, IPC)
წვდომის კონტროლი
- მომხმარებლის უფლებები: მინიმალური პრივილეგიების პრინციპი კონტეინერის პროცესებისთვის
- ჯგუფების მართვა: Linux ჯგუფების სწორი გამოყენება წვდომის კონტროლისთვის
- როლზე დაფუძნებული წვდომის კონტროლი (RBAC): განსაზღვრეთ, ვის შეუძლია Docker რესურსებზე მოქმედებების შესრულება
- API-ზე წვდომის შეზღუდვები: TLS ავთენტიფიკაცია და ავტორიზაცია Docker daemon-ისთვის
- Registry-ის ავთენტიფიკაცია: უსაფრთხო წვდომა image registry-ებზე ავთენტიფიკაციით
- საიდუმლოებების მართვა: რწმუნებათა სიგელებისა და მგრძნობიარე ინფორმაციის უსაფრთხო დამუშავება
- კონტეინერის მომხმარებლის შეზღუდვები: კონტეინერების გაშვება არა-root მომხმარებლებით
რესურსების კონტროლი
- CPU-ს ლიმიტები: კონტეინერების მიერ გადაჭარბებული CPU-ს მოხმარების თავიდან აცილება
- მეხსიერების შეზღუდვები: მეხსიერების გამოყენების შეზღუდვა OOM მდგომარეობების თავიდან ასაცილებლად
- საცავის კვოტები: დისკის გამოყენების კონტროლი ფაილური სისტემის შევსების თავიდან ასაცილებლად
- ქსელის სიჩქარის შეზღუდვა: გამტარუნარიანობის ბოროტად გამოყენების თავიდან ასაცილებლად
- პროცესების შეზღუდვები: პროცესების შექმნისა და შესაძლებლობების შეზღუდვა
- Syscall-ების ფილტრაცია: ხელმისაწვდომი სისტემური გამოძახებების შეზღუდვა seccomp-ით
- შესაძლებლობები: პრივილეგირებული ოპერაციების დეტალური კონტროლი
Docker-ის უსაფრთხოების საუკეთესო პრაქტიკები
Image-ის უსაფრთხოება
Image-ის უსაფრთხოება კონტეინერის უსაფრთხოების საფუძველია - მოწყვლადმა საბაზისო image-მა შეიძლება საფრთხე შეუქმნას თქვენს მთელ აპლიკაციას.
უსაფრთხო image-ების საუკეთესო პრაქტიკები:
- გამოიყენეთ ოფიციალური ან დამოწმებული image-ები, როდესაც შესაძლებელია
- განაახლეთ საბაზისო image-ები უსაფრთხოების პატჩებით
- ააგეთ მინიმალური image-ებიდან, როგორიცაა Alpine ან distroless
- მიაბით კონკრეტული ვერსიები დაიჯესტებით უცვლელობისთვის
- დანერგეთ მოწყვლადობების სკანირება CI/CD მილსადენებში
- წაშალეთ არასაჭირო ინსტრუმენტები production image-ებიდან
- დააყენეთ image-ების ხელმოწერა მიწოდების ჯაჭვის უსაფრთხოებისთვის
- გამოიყენეთ მრავალეტაპიანი build-ები საბოლოო image-ის ზომის შესამცირებლად
კონტეინერის უსაფრთხოება
- არასდროს გაუშვათ კონტეინერები root-ით
- შექმენით გამოყოფილი მომხმარებელი თქვენს Dockerfile-ში:
RUN useradd -r -u 1000 appuser - გადაერთეთ ამ მომხმარებელზე:
USER appuser - გამოიყენეთ
--userდროშა:docker run --user 1000:1000 my-image
- შექმენით გამოყოფილი მომხმარებელი თქვენს Dockerfile-ში:
- გამოიყენეთ მხოლოდ წაკითხვადი root ფაილური სისტემა
- თავიდან აიცილეთ ფაილური სისტემის მოდიფიკაციები:
docker run --read-only my-image - მიამაგრეთ კონკრეტული ჩაწერადი დირექტორიები:
docker run --read-only --tmpfs /tmp my-image - მიუთითეთ ჩაწერადი volume-ები:
docker run --read-only -v data:/data:rw my-image
- თავიდან აიცილეთ ფაილური სისტემის მოდიფიკაციები:
- შეზღუდეთ კონტეინერის შესაძლებლობები
- მოაშორეთ ყველა შესაძლებლობა და დაამატეთ მხოლოდ ის, რაც საჭიროა:
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE my-image- გასათვალისწინებელი გავრცელებული შესაძლებლობები: NET_BIND_SERVICE, CHOWN, DAC_OVERRIDE, SETUID, SETGID
- დააყენეთ რესურსების ლიმიტები
- თავიდან აიცილეთ რესურსების გამოფიტვა:
docker run --memory=512m --cpu-shares=512 my-image - დააყენეთ CPU-ს ლიმიტები:
docker run --cpus=0.5 my-image(გამოიყენეთ ერთი CPU-ს 50%) - დააკონფიგურირეთ ulimit-ები:
docker run --ulimit nofile=1024:1024 my-image
- თავიდან აიცილეთ რესურსების გამოფიტვა:
- გამოიყენეთ უსაფრთხოების ოფციები
- გამოიყენეთ seccomp პროფილები:
docker run --security-opt seccomp=profile.json my-image - ჩართეთ AppArmor:
docker run --security-opt apparmor=docker-default my-image - გამორთეთ პრივილეგიების ესკალაცია:
docker run --security-opt no-new-privileges my-image
- გამოიყენეთ seccomp პროფილები:
- ჩართეთ ლოგირება და მონიტორინგი
- დააკონფიგურირეთ ლოგირება:
docker run --log-driver=journald my-image - დააყენეთ კონტეინერის მონიტორინგი ისეთი ინსტრუმენტებით, როგორიცაა cAdvisor, Prometheus, ან DataDog
- დანერგეთ აუდიტის ლოგირება Docker daemon-ისა და API გამოძახებებისთვის
- გამოიყენეთ რეალურ დროში უსაფრთხოების მონიტორინგის ინსტრუმენტები, როგორიცაა Falco
- დააკონფიგურირეთ ლოგირება:
უსაფრთხოების კონფიგურაციები
უსაფრთხო კონტეინერის Runtime
შემდეგი Docker Compose კონფიგურაცია აჩვენებს უსაფრთხოების ყოვლისმომცველ გამკაცრებას:
თითოეულ ამ უსაფრთხოების კონფიგურაციას კონკრეტული დანიშნულება აქვს:
no-new-privilegesხელს უშლის პრივილეგიების ესკალაციის შეტევებს- Seccomp პროფილები ზღუდავს ხელმისაწვდომ სისტემურ გამოძახებებს
- მხოლოდ წაკითხვადი ფაილური სისტემა ხელს უშლის მავნე მოდიფიკაციებს
- არა-root მომხმარებლად გაშვება ამცირებს შეჭრისგან პოტენციურ ზიანს
- შესაძლებლობების მოშორება ახორციელებს მინიმალური პრივილეგიების პრინციპს
- რესურსების ლიმიტები ხელს უშლის DoS შეტევებს
- Health check-ები საშუალებას იძლევა კომპრომეტირებული კონტეინერების ავტომატურ გამოვლენას
ქსელის უსაფრთხოება
ქსელის იზოლაცია
- გამოიყენეთ მორგებული ქსელები კონტეინერების კომუნიკაციის იზოლირებისთვის
- შეზღუდეთ გარე წვდომა შიდა ქსელებით
- ჩართეთ TLS დაშიფრული კომუნიკაციებისთვის
- დანერგეთ firewall-ები ჰოსტისა და კონტეინერის დონეზე
- დააკვირდეთ ტრაფიკს ქსელის მონიტორინგის ინსტრუმენტებით
წვდომის კონტროლი
- პორტების მიბმის შეზღუდვები - გამოააშკარავეთ მხოლოდ აუცილებელი პორტები
- სერვის-სპეციფიური ქსელები - გამოყავით frontend/backend
- ქსელის სეგმენტაცია მრავალი ქსელით
- ტრაფიკის დაშიფვრა TLS-ით და VPN-ებით
- Load balancer-ის უსაფრთხოება - TLS შეწყვეტა და WAF
Docker Daemon-ის უსაფრთხოება
Docker daemon-ის დაცვა კრიტიკულია, რადგან ის მუშაობს root პრივილეგიებით და მართავს ყველა კონტეინერს.
Docker daemon-ის უსაფრთხოების ძირითადი კონფიგურაციები:
"icc": false- გამორთეთ კონტეინერებს შორის კომუნიკაცია ნაგულისხმევად"no-new-privileges": true- თავიდან აიცილეთ პრივილეგიების ესკალაცია"userland-proxy": false- გამოიყენეთ iptables პირდაპირ userland proxy-ის ნაცვლად"live-restore": true- კონტეინერები აგრძელებენ მუშაობას, თუ daemon-ი მიუწვდომელია"default-ulimits"- დააყენეთ გონივრული ნაგულისხმევი ulimit-ები ყველა კონტეინერისთვის
Content Trust და Image-ების ხელმოწერა
Content trust უზრუნველყოფს:
- Image-ის ავთენტურობის ვერიფიკაციას - ადასტურებს, რომ image-ები სანდო წყაროებიდან მოდის
- მონაცემთა მთლიანობის დაცვას - უზრუნველყოფს, რომ image-ები არ შეცვლილა
- გამომცემლის ვერიფიკაციას - ამოწმებს, ვინ გამოაქვეყნა image-ი
- მიწოდების ჯაჭვის უსაფრთხოებას - იცავს კონტეინერის მთელ სასიცოცხლო ციკლს
- Deployment პოლიტიკის აღსრულებას - მხოლოდ ხელმოწერილი image-ების გაშვების ნებართვა
იმპლემენტაცია იყენებს The Update Framework (TUF) და Notary-ს:
- Root გასაღებები - მთავარი სანდოობის გასაღებები (შეინახეთ ოფლაინ და უსაფრთხოდ)
- Target გასაღებები - გამოიყენება კონკრეტული რეპოზიტორიების ხელმოსაწერად
- Snapshot გასაღებები - იწერს რეპოზიტორიის მიმდინარე მდგომარეობას
- Delegation გასაღებები - იძლევა ხელმოწერის უფლებამოსილების დელეგირების საშუალებას
- Timestamp გასაღებები - ხელს უშლის განმეორებით შეტევებს
მაგალითი სამუშაო პროცესი:
უსაფრთხოების ინსტრუმენტები და სკანირება
გავრცელებული უსაფრთხოების ინსტრუმენტები
უსაფრთხოების ინსტრუმენტები გვეხმარება მოწყვლადობების, არასწორი კონფიგურაციებისა და პოტენციური საფრთხეების იდენტიფიცირებაში თქვენს კონტეინერულ ეკოსისტემაში.
უსაფრთხოების ინსტრუმენტების ინტეგრაცია CI/CD-ში
საიდუმლოებების მართვა
Docker Secrets
- დაშიფრულია მოსვენებულ მდგომარეობაში - საიდუმლოებები ინახება დაშიფრულად Swarm Raft ლოგში
- უსაფრთხო გადაცემა - გადაიცემა TLS-დაშიფრული ქსელებით
- ვერსიების კონტროლი - ცვლილებების თვალყურის დევნა საიდუმლოების ვერსიონირებით
- წვდომის შეზღუდვები - ხელმისაწვდომია მხოლოდ ავტორიზებული სერვისებისთვის
- Runtime ინექცია - ხელმისაწვდომია როგორც ფაილები კონტეინერში runtime-ისას
- ცენტრალიზებული მართვა - თანმიმდევრულია Docker Swarm კლასტერში
- არამუდმივი - არ ინახება კონტეინერის image-ში ან ფაილურ სისტემაში
იმპლემენტაცია
Docker Compose საიდუმლოებებით
გარე საიდუმლოებების მართვა
შესაბამისობა და აუდიტი
შესაბამისობის ძირითადი სფეროები:
- კონტეინერის runtime-ის უსაფრთხოება
- დანერგეთ seccomp და AppArmor პროფილები
- აღასრულეთ არა-root კონტეინერები სათანადო მომხმარებლის namespace-ებით
- გამოიყენეთ მხოლოდ წაკითხვადი ფაილური სისტემები, სადაც შესაძლებელია
- გამოიყენეთ CIS Docker Benchmarks (Center for Internet Security)
- დანერგეთ runtime მონიტორინგი ისეთი ინსტრუმენტებით, როგორიცაა Falco
- Image-ის უსაფრთხოების პოლიტიკები
- დაადგინეთ საბაზისო უსაფრთხოების მოთხოვნები ყველა image-ისთვის
- აღასრულეთ მოწყვლადობის სკანირება deployment-მდე
- მოითხოვეთ ხელმოწერილი image-ები content trust-ით
- შეინარჩუნეთ დამტკიცებული image-ების ინვენტარი
- დაადოკუმენტირეთ საბაზისო image-ების განახლების პროცედურები
- შექმენით და შეინარჩუნეთ SBOM-ები (Software Bill of Materials)
- ქსელის უსაფრთხოების კონტროლი
- დანერგეთ ქსელის სეგმენტაცია სათანადო იზოლაციით
- დაშიფრეთ ყველა მგრძნობიარე ტრაფიკი (TLS/mTLS)
- გამოიყენეთ შიდა ქსელები სერვისებს შორის კომუნიკაციისთვის
- დააყენეთ სათანადო ingress და egress ფილტრაცია
- დანერგეთ ქსელის პოლიტიკები ტრაფიკის ნაკადის შესაზღუდად
- დააკვირდეთ უჩვეულო ქსელურ აქტივობას
- წვდომის კონტროლის პოლიტიკები
- დანერგეთ როლზე დაფუძნებული წვდომის კონტროლი (RBAC)
- გამოიყენეთ მინიმალური პრივილეგიების პრინციპი
- მოითხოვეთ MFA ადმინისტრაციული წვდომისთვის
- რეგულარულად შეცვალეთ რწმუნებათა სიგელები
- ჩაატარეთ წვდომის ლოგების აუდიტი
- დანერგეთ პრივილეგიების მართვა Docker რესურსებისთვის
- აუდიტის ლოგირება
- დააკონფიგურირეთ ყოვლისმომცველი ლოგირება ყველა კომპონენტისთვის:
- მოახდინეთ ლოგების ცენტრალიზაცია ანალიზისთვის:
- დააყენეთ შესაბამისი ლოგების შენახვის პოლიტიკები
- დანერგეთ ლოგების მთლიანობის დაცვა
- შექმენით შეტყობინებები უსაფრთხოებასთან დაკავშირებული მოვლენებისთვის
- დაადგინეთ ლოგების განხილვის პროცედურები
- დააკონფიგურირეთ ყოვლისმომცველი ლოგირება ყველა კომპონენტისთვის:
- მოწყვლადობის მართვა
- image-ებისა და გაშვებული კონტეინერების რეგულარული სკანირება
- ავტომატიზირებული პატჩინგის პროცესები
- მოწყვლადობაზე რეაგირების მკაფიო პროცედურები
- მოწყვლადობის თვალყურის დევნა და გამოსწორების ვადები
- დოკუმენტირებული გამონაკლისების პროცესი
- საფრთხეების დაზვერვის ინტეგრაცია
- მარეგულირებელთან შესაბამისობა
- დაუკავშირეთ კონტეინერის კონტროლი კონკრეტულ მოთხოვნებს (PCI DSS, HIPAA, SOC2 და ა.შ.)
- დაადოკუმენტირეთ კონტეინერის უსაფრთხოების არქიტექტურა
- დანერგეთ მოვალეობების საჭირო გამიჯვნა
- ჩაატარეთ რეგულარული შესაბამისობის შეფასებები
- შეინარჩუნეთ კონტროლის ეფექტურობის მტკიცებულებები
უსაფრთხოების მონიტორინგი
მონიტორინგის ინსტრუმენტები და პრაქტიკები
უსაფრთხოების ყოვლისმომცველი მონიტორინგი საშუალებას იძლევა საეჭვო აქტივობებისა და პოტენციური უსაფრთხოების ინციდენტების გამოვლენას.
Prometheus-ის კონფიგურაციის მაგალითი კონტეინერის მონიტორინგისთვის
Falco-ს წესების მაგალითი უსაფრთხოების მონიტორინგისთვის
ინციდენტზე რეაგირება
გამოვლენა
- ლოგების მონიტორინგი - შეაგროვეთ და გააანალიზეთ ლოგები ყველა კომპონენტიდან
- რესურსების გამოყენების თვალყურის დევნა - გამოავლინეთ არანორმალური რესურსების ნიმუშები
- შეტყობინება ანომალიებზე - დააკონფიგურირეთ შეტყობინებების სისტემები
გაფართოებული უსაფრთხოების თემები
AppArmor პროფილები
SELinux პოლიტიკები
Seccomp პროფილები
უსაფრთხოების ჩამონათვალი
აუცილებელი უსაფრთხოების ზომები:
- რეგულარული უსაფრთხოების განახლებები
- მინიმალური საბაზისო image-ები
- სათანადო წვდომის კონტროლი
- ქსელის სეგმენტაცია
- რესურსების შეზღუდვები
- უსაფრთხოების სკანირება
- აუდიტის ლოგირება
- საიდუმლოებების მართვა
- შესაბამისობის მონიტორინგი
- ინციდენტზე რეაგირების გეგმა