მუშაობის ხანგრძლივი დრო მხოლოდ იმას ადასტურებს, რომ გაშვება წარმატებით დასრულდა იმ უფლებებით, რაც დემონს იმ მომენტში ჰქონდა. აქ მნიშვნელოვანი ჩავარდნები უფრო გვიან მოდის: ახალი კლიენტი უერთდება, გაუქმების სია იცვლება, დამხმარე სკრიპტმა ფაილი უნდა ჩაწეროს. თითოეული მათგანი ახალი გახსნაა, რომელსაც უფლებების გარეშე ანგარიში ასრულებს, საკუთარი ნებართვის კითხვითა და საკუთარი შეცდომის შეტყობინებით. სამი გადაწყვეტილება ჰყოფს მუშაობის გამგრძელებელ კონფიგურაციას შემდეგ მოვლენაზე წარუმატებელისაგან.

გამოყავით ადრე ჩატვირთული გვიან გახსნილისაგან

დესკრიპტორი ღია ფაილის აღწერის სახელურია და წვდომის რეჟიმი მაშინ დაფიქსირდა, როცა ეს აღწერა შეიქმნა. პროცესის მომხმარებლის მოგვიანებით შეცვლა სახელურს არ ხურავს, ამიტომ root-ით წაკითხული გასაღების ფაილი დაქვეითების შემდეგაც მუშაობს. რეჟიმიც არ იცვლება: წაკითხვისთვის გახსნილი სახელური ჩასაწერი არ ხდება, ხოლო ჩასაწერი სახელური არ უქმდება მხოლოდ იმიტომ, რომ ანგარიშმა ბილიკზე უფლებები დაკარგა. ეს ორი ფაქტი ხსნის ამ მოხსენებებში არსებული გასაკვირი ქცევის უმეტეს ნაწილს.

მეორე ნახევარი მეხსიერებაა. დემონს შეუძლია სერტიფიკატის გაანალიზება, გაანალიზებული მასალის შენახვა და ფაილის დახურვა; გამოყენებაში რჩება მონაცემები და არა ღია ფაილი. ამიტომ გაგრძელებული ტრაფიკი არ ამტკიცებს არც იმას, რომ დესკრიპტორი ღიაა და არც იმას, რომ ბილიკის სახელი მისაწვდომია. ის მხოლოდ იმას ამტკიცებს, რომ მიმდინარე სესიისთვის საჭირო მასალა ადრე იქნა მოპოვებული.

გვიანდელი გახსნა სხვა ტრანზაქციაა. ის მიმდინარეობს მიმდინარე სერტიფიკატებით, მიმდინარე უსაფრთხოების კონტექსტითა და მიმდინარე მონტაჟის ხედით, ამიტომ გაშვებისას წაკითხვადი ბილიკი შემდეგ კავშირზე შეიძლება უარყოფილ იქნას. როტაცია ხაფანგს ამატებს: იმავე ბილიკის სახელზე ახალი ფაილის ჩაწერა არსებულ დესკრიპტორს ძველ ობიექტზე მიბმულს ტოვებს, ამიტომ გადატვირთვა შეიძლება წარმატებულად გამოიყურებოდეს, სანამ დემონი ჯერ კიდევ წინა შიგთავსს იყენებს. შეადარეთ პროცესის მიერ დაჭერილი inode დისკზე არსებულს, სანამ როტაციის ამოქმედებას დაიჯერებთ.

დაასახელეთ სამი გაშვების წაკითხვა და როდის ხდება თითოეული

სამი რესურსი ჩვეულებრივ ინიციალიზაციიდან ბევრად გვიან იხსნება და სხვადასხვა მომენტში ფარდება. კონკრეტული კლიენტის კონფიგურაციის ფაილი იკითხება მაშინ, როცა ის კლიენტი უერთდება, ამიტომ ის შეიძლება ერთი მომხმარებლისთვის გატყდეს, სანამ დანარჩენები აგრძელებენ. გაუქმების მონაცემები მოწმდება თანამოძმის ავთენტიფიკაციისას და ისევ ფაილის შეცვლისას. დროებით დირექტორიას მხოლოდ მაშინ ეხებიან, როცა სკრიპტი ან დანამატი რამეს წერს.

არცერთი სამიდან არ ეკუთვნის გაშვების ბილიკს, ამიტომ კვირების განმავლობაში ჯანსაღი სერვერი შემდეგ კავშირზე შეიძლება ჩავარდეს. კატეგორია ასევე ასახელებს შესწორების მფლობელს: პირველი ორი დემონის ანგარიშის ქვეშ კონფიგურაციაზე წაკითხვის უფლებაა, ხოლო მესამე ვიწრო დანიშნულების ჩასაწერი ადგილია.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key უპასუხებს უფრო ვიწრო კითხვას, ვიდრე უმეტესობა ფიქრობს. ის გასაღების ფაილს ღიად ინახავს დოკუმენტირებული SIGUSR1 და ping-restart გადატვირთვების განმავლობაში, და არაფერს აკეთებს CCD ფაილებისთვის, გაუქმების მონაცემებისთვის, დამხმარე გაშვებადი ფაილებისთვის ან პროცესის სრული გადატვირთვისთვის. ისინი კვლავ საკუთარ გახსნის ბილიკებს მიჰყვებიან, იმ მომენტში მოქმედი ნებისმიერი ანგარიშის ქვეშ.

დაადასტურეთ ანგარიში და ხედი, რომელიც მას რეალურად აქვს

ჰკითხეთ გაშვებულ დემონს, რომელ ანგარიშს იყენებს, იმის ნაცვლად რომ unit ფაილს ენდოთ, შემდეგ შეადარეთ პასუხი იმას, რასაც unit ადგენს. შეუთანხმებლობა პირველი მოსაგვარებელია, რადგან ყოველი შემდგომი ნებართვის შემოწმება იმის სახით მიდის, ვინც პროცესი რეალურად არის. შემდეგ გაიარეთ ბილიკი კომპონენტობრივად; გავლა ყოველ დონეზე ფასდება, ამიტომ გაუვალ დირექტორიაში მყოფი წაკითხვადი ფაილი მაინც წაუკითხავი რჩება. ფაილის საბოლოო რეჟიმი ბოლო კითხვაა და არა პირველი.

სახელთა სივრცეები და სერვისის ქვიშის ყუთები ამატებენ საზღვრებს, რომლებსაც მფლობელობა და რეჟიმის ბიტები არ აღწერენ. თქვენს გარსში ხილული ბილიკი შეიძლება არ არსებობდეს ან მხოლოდ წაკითხვადი იყოს chroot-ში, მონტაჟის სახელთა სივრცეში ან unit-ში, რომელიც სახლის დირექტორიებს მალავს. უსაფრთხოების მოდულები კიდევ ერთ ფენას ამატებენ, ამიტომ წაკითხვადი შთაბეჭდილების მქონე ფაილი გახსნისას მაინც შეიძლება უარყოფილ იქნას.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

ადმინისტრატორის გარსში წარმატებული წაკითხვა ამ კომბინირებულ პირობათაგან არცერთს არ ამოწმებს. გაუშვით შემოწმება დემონის ანგარიშით, იმავე სახელთა სივრცითა და ქვიშის ყუთით, ან დაეთანხმეთ, რომ შედეგი თქვენს გარსს აღწერს და არა სერვერს. მესამე ბრძანება ამ ტესტის იაფი ვერსიაა: ის ბეჭდავს ყოველი კომპონენტის რეჟიმს და ფარდება პირველზე, რომელსაც დემონის ანგარიში ვერ გადის.

მიეცით გაშვების დაწერას საკუთარი დირექტორია

წაკითხვა ნუსხის მხოლოდ ნახევარია. დამხმარე სკრიპტს შეიძლება სჭირდებოდეს მდგომარეობის ფაილის შექმნა, დანამატს შეიძლება სჭირდებოდეს მდგომარეობის ჩაწერა კონფიგურაციის გვერდით, და ეს ჩანაწერები არ იფარება კონფიგურაციის ხის ჩასაწერად ქცევით. მიეცით კონკრეტულ დირექტორიას ის ჩაწერის ნებართვა, რაც მის ფუნქციას სჭირდება, იმ მფლობელითა და რეჟიმით, რომელსაც ახსნით. უპირატესობა მიანიჭეთ მხოლოდ წაკითხვის წვდომას ყველაფრისთვის, რაც მხოლოდ იკითხება.

შეინახეთ პირადი გასაღების ნებართვები ცალკე პოლიტიკის ფაილებისგან. გასაღები, რომელიც გადატვირთვის შემდეგ ხელახლა უნდა წაიკითხოს, სხვა მოთხოვნა აქვს, ვიდრე ყოველ კავშირზე წაკითხვად კლიენტის ფაილს, და ერთი დამთმობი რეჟიმი ორივესთვის იძლევა მეტ წვდომას, ვიდრე პრობლემა ითხოვს. ვიწრო მფლობელობის მქონე გამოყოფილი დემონის ანგარიში უფრო ადვილი შესამოწმებელია, ვიდრე ფართო ჯგუფი. როცა გასაღებმა გადატვირთვები უნდა გადაიტანოს, persist-key აუქმებს ხელახლა წაკითხვას დირექტორიის გაფართოების ნაცვლად.

გადაწყვიტეთ იმ მოვლენის მიხედვით, რომლის გამეორებაც შეგიძლიათ

ცოცხალი გვირაბი კოდში მხოლოდ ერთ ბილიკს ამტკიცებს. მოვლენა, რომელსაც ფაილი სჭირდება, ერთადერთი ტესტია, რომელიც ფარავს თქვენთვის საინტერესო გახსნას, იქნება ეს ახალი კლიენტის კავშირი, შეცვლილი გაუქმების ფაილი, დაშვებული რბილი გადატვირთვა თუ დაგეგმილი გადატვირთვა. აირჩიეთ მოვლენა, გაუშვით და შეინახეთ პირველი შეცდომა და არა უკანასკნელი.

რბილი გადატვირთვისთვის ერთი სიგნალი და unit-ის ჟურნალი გვიჩვენებს, ხელახლა წაიკითხეს თუ არა გასაღები. გაგზავნეთ სიგნალი, შემდეგ წაიკითხეთ ბოლო სტრიქონები, რომლებიც unit-მა დაწერა:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

ნუ დაასკვნით, რომ კომპრომეტირებული დემონი ვეღარ შეცვლის ფაილებს მხოლოდ იმიტომ, რომ უფლებები დაქვეითდა. თუ კიდევ რა შეუძლია, დამოკიდებულია დარჩენილ სერტიფიკატებზე, მის შესაძლებლობებზე, იმ დირექტორიებზე, სადაც წერა შეუძლია, და ნებისმიერ ჩასაწერ დესკრიპტორზე, რომელსაც ჯერ კიდევ ფლობს. უფლებების შემცირება ავიწროებს ხელისუფლებას და გაშვების გახსნების ნუსხა გვიჩვენებს, რამდენად. დაწერეთ ეს ზღვარი კონფიგურაციის გვერდით, რომ შემდეგ ადამიანს ხელახლა აღმოჩენა არ დასჭირდეს.

დაკავშირებული სტატიები