Demon chroot uğursuzluğunu jurnala yazır, profil isə artıq geniş görünür, ona görə cəlbedici həll yol qaydasını genişləndirib yenidən başlatmaqdır. Bu adətən heç nəyi dəyişmir, çünki chroot profilin heç vaxt verə bilmədiyi bir imtiyazla qorunur. Hansı qata toxunmaq lazım olduğunu müəyyən etmək üç ucuz yoxlama tələb edir: prosesin nəyi saxlamağa icazəsi olduğunu, siyasətin nəyə icazə verdiyini və başladıcının bunlardan heç biri əhəmiyyət kəsb etməmişdən əvvəl nəyi çıxardığını.

İki ayrı qapı, və yalnız biri AppArmor-a aiddir

chroot prosesin işlədiyi istifadəçi adlar məkanında CAP_SYS_CHROOT tələb edir. Bu adi Linux imtiyazıdır və nüvə onu çağırış yollarla hər hansı iş görməmişdən əvvəl yoxlayır. Ayrıca, icra rejimində olan AppArmor profili proses bu qabiliyyəti saxladığı halda belə onu rədd edə bilər, çünki məcburi siyasət etimadnamələrin yerinə deyil, onlara əlavə olaraq nəzərə alınır. Bu fərq praktikada vacibdir: iki qat müxtəlif fayllarda yaşayır və adətən müxtəlif insanlar tərəfindən saxlanılır.

Bu iki qapı eyni errno ilə uğursuz olur. Hər ikisi EPERM yaradır və hər ikisi demon jurnalında ümumi icazə şikayəti kimi görünür; buna görə profil məzmunu barədə təxmin yürütmək bu qədər vaxt itirir. Əlavə etmək istədiyiniz yol qaydası chroot uğurla başa çatdıqdan sonra fayl girişini idarə edir; əməliyyatın ümumiyyətlə icazəli olub-olmadığına heç bir aidiyyəti yoxdur.

Üçüncü qapı hər ikisindən yuxarıda yerləşir. Əgər xidmət meneceri və ya bir sarğı prosesi qabiliyyət onun sərhəd dəstində olmadan başlatmışsa, heç bir AppArmor dəyişikliyi onu geri qaytara bilməz və profilə qabiliyyət əlavə etmək sadəcə nüvənin yerinə yetirməyəcəyi bir niyyəti sənədləşdirir.

Siyasəti redaktə etməzdən əvvəl imtiyaz vəziyyətini oxuyun

Aktiv olduğunu düşündüyünüz konfiqurasiyadan deyil, işləyən prosesdən başlayın. Vəziyyət faylı beş qabiliyyət maskasını və no-new-privileges bayrağını göstərir və onlar müxtəlif suallara cavab verir:

grep -E '^(CapInh|CapPrm|CapEff|CapBnd|CapAmb|NoNewPrivs):' /proc/$(pidof openvpn)/status
sudo aa-status | grep -i openvpn

Çağırış üçün vacib olan dəst CapEff-dir: CapBnd-də olub CapEff-də olmayan qabiliyyət tavanla icazə verilir, amma hazırda saxlanmır. CapAmb o zaman vacibdir ki, binar adi setuid mənasında imtiyazlı deyil, çünki ətraf qabiliyyətlər xidmətin fayl qabiliyyətləri olmadan exec boyunca imtiyazı saxlamasının yoludur. CapInh exec boyunca miras alına bilən bitləri saxlayır, lakin yalnız icra olunan faylın miras dəsti buna icazə verdikdə, yəni oradakı bir bit tək başına heç nə vermir.

Sonra hansı profilin həqiqətən ilişdirildiyini təsdiqləyin. Proses gözləmədiyiniz bir profil adı ilə məhdudlaşdırıla bilər, xüsusən distributiv öz unit faylını və profilini birlikdə göndərdikdə, və /proc/PID/attr/current faylını oxumaq bunu bir sətirdə həll edir. Redaktə etdiyiniz faylı nüvənin bildirdiyi profil ilə müqayisə etmək səbəbi düzəltməklə heç kimin yükləmədiyi faylı redaktə etmək arasındakı fərqdir.

Qabiliyyət qaydasını yalnız audit izi bunu dedikdə əlavə edin

Nüvə və audit qeydləri rədd edən qatı adlandırır. Əməliyyatı capable və adı sys_chroot olan, onu yaradan profil ilə birlikdə bir rədd axtarın. Əgər belə qeyd varsa, proses qabiliyyəti artıq saxlayırdı və AppArmor onu rədd etdi, hədəflənmiş dəyişiklik isə həqiqi profilin içində bir qabiliyyət qaydasıdır:

capability sys_chroot,

Onu həqiqətən ilişdirilmiş profildə fraqment kimi saxlayın və açar sözü əlaqəsiz bir dərslikdən qayda kopyalamaq əvəzinə apparmor.d profil arayışı ilə yoxlayın. Onu ortaq daxiletmə faylına atmaq həmin faylı çəkən hər məhdud proqrama verir, profilləri şikayət rejiminə keçirmək isə bu rəddi həll etmək əvəzinə növbəti rəddi gizlədir. Profil qaydası siyasət rəddini aradan qaldırır; imtiyaz yaratmır, yəni effektiv dəstində heç vaxt CAP_SYS_CHROOT olmayan proses qayda yerində olsa da yenə uğursuz olacaq.

Əgər audit qeydi ümumiyyətlə heç bir AppArmor rəddi göstərmirsə, profili redaktə etməyi dayandırın. Qarşınızda etimadnamə problemi var və qalan iş siyasət dilində deyil, unit faylında və ya valideyn prosesdədir.

Xidmət meneceri öz tavanını saxlayır

systemd hər xidmət üçün qabiliyyət sərhəd dəsti təyin edir və bu dəst standart olaraq dardır. Orada xaric edilən hər şey profilin nə dediyindən asılı olmayaraq proses üçün əlçatmazdır; buna görə sərtləşdirilmiş unit-lər demon əl ilə başladılanda işləyən əməliyyatda uğursuz ola bilər. Müvafiq direktivlər unit daxilində oxumaq asandır və tətbiq xətanı bildirdikdə gözdən qaçırmaq asandır. Distributiv paketinin göndərdiyi drop-in faylları heç kimin konfiqurasiya etdiyini xatırlamadığı tavanın adi mənbəyidir.

Tavanı qaldırmaq və qabiliyyəti vermək bir deyil, iki dəyişiklikdir. Sərhəd dəstindəki giriş prosesin qabiliyyəti saxlaya biləcəyini deyir; bu, onu effektiv dəstə əlavə etmir və NoNewPrivs hər şey uyğun gəlsə də sonrakı yüksəlişin uğur qazanmasının qarşısını ala bilər. Yalnız əməliyyatın ehtiyac duyduğunu əlavə edin, sərtləşdirmənin qalanını toxunulmaz saxlayın və bir çağırışın keçməsi üçün bütün qabiliyyətləri vermək qısayoluna müqavimət göstərin.

Sıra burada da vacibdir. Əvvəlcə unit tavanını dəyişin, CapEff-in artıq biti saxladığını yoxlayın və yalnız bundan sonra AppArmor-un hələ də rədd edib-etmədiyinə qərar verin. Hər iki dəyişikliyi eyni vaxtda etmək, uğursuzluq davam edərsə sizi yenidən təxminə qoyur.

Rədd aradan qalxdıqdan sonra həbsxananın özünü yoxlayın

Uğurlu chroot kökü yerindən oynadır, buna görə demonun sonra toxunduğu hər yol yeni ağacın içində həll olunur. Çatışmayan konfiqurasiya, olmayan cihaz qovşağı və ya kopyalanmamış sertifikat qovluğu artıq fayl xətası kimi görünəcək və bu xəta qabiliyyət deyil, düzülüş problemidir. Daha bir geniş icazə əlavə etmək əvəzinə növbəti hadisəni oxuyun. Bu köçürmə nisbi yolun nə demək olduğunu da dəyişir; buna görə sərtləşdirmə bələdçiləri demon konfiqurasiyasında mütləq yollar tələb edir.

chroot-un nə etmədiyini xatırlamaq da faydalıdır. O, yol sərhədidir, qum qutusu deyil: imtiyazı saxlayan proses ondan qaça bilər, buna görə qabiliyyət adətən çağırışdan sonra atılır və məhdudlaşdırma demonun ətrafında qalmalıdır. AppArmor profilini, qabiliyyət sərhəd dəstini və fayl sistemi məhdudiyyətlərini birlikdə saxlamaq məşqin məqsədidir, xidmət başlayan kimi silinəcək bir artıq deyil.

Qərar qaydası qısadır. Audit qeydi AppArmor adlandırırsa, ilişdirilmiş profilə bir qabiliyyət qaydası əlavə edin. Effektiv dəst boşdursa, unit tavanını və imtiyazın atılma sırasını düzəldin. Profil redaktə etdiyiniz profil deyilsə, redaktəni dayandırın və həqiqisini tapın.

Əlaqəli məqalələr