Ar trebui să renunți la chroot sau să copiezi iproute2 în închisoare?
O închisoare incompletă eșuează după pornire, nu la boot. Alege între relaxarea întăririi și copierea binarilor împreună cu bibliotecile în noua rădăcină.
Serviciul pornește, un client se asociază și nu apare niciodată o rută pe partea serverului. Sau daemonul refuză să pornească și numește o comandă pe care nu a putut-o executa. Ambele rezultate urmează aceleași trei linii, care se copiază de obicei împreună dintr-un ghid de întărire: trecerea la un cont fără privilegii, eliminarea grupului și schimbarea rădăcinii sistemului de fișiere. Doar una dintre cele trei ascunde fișiere, și doar una dintre ele elimină privilegiul de a modifica tabela de rutare. Separarea lor este modul în care afli ce linie vrei de fapt.
Ce elimină închisoarea de care daemonul încă are nevoie
Schimbarea rădăcinii are loc după pornire, așa că daemonul păstrează tot ce a deschis deja și pierde tot ce ar deschide mai târziu. Orice ajutor pe care conexiunea îl rulează după acel punct trebuie să existe în noua rădăcină, împreună cu bibliotecile partajate pe care le încarcă. O închisoare construită dintr-un fișier de configurare și un certificat nu are niciuna dintre cele două.
Trecerea la un cont fără privilegii este o restricție separată. Un proces care a renunțat la root poate să nu poată modifica rute sau ridica o interfață chiar când binarul este chiar acolo, așa că cele două defecțiuni trebuie diagnosticate separat.
Trei condiții decid de ce remediere ai nevoie
Prima condiție este modul în care buildul tău instalează rutele. Versiunile recente de OpenVPN configurează interfața și tabela de rutare în proces, în timp ce pachetele mai vechi și configurațiile proprii se bazează pe instrumente externe sau pe scripturi up și down. Dacă jurnalul numește o comandă, este implicat un instrument extern și închisoarea îl ascunde. Dacă jurnalul arată în schimb o eroare de permisiuni, problema este contul.
A doua este întreținerea. O închisoare cu binare copiate trebuie reîmprospătată de fiecare dată când pachetul care le furnizează este actualizat, altfel prima actualizare lasă în urmă un tunel rupt. A treia este dacă un anumit control necesită cu adevărat un chroot; dacă cerința este de fapt despre separarea privilegiilor, schimbarea contului poate fi suficientă singură.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
Ce trebuie să conțină o închisoare funcțională
O închisoare care rulează comenzi are nevoie de binar, de fiecare bibliotecă față de care se leagă și de orice nod de dispozitiv pe care daemonul îl deschide târziu. Copiază piesele și testează-le fără VPN în imagine:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
Prima comandă listează dependențele, și este cea pe care oamenii o sar. Un binar copiat care nu găsește o bibliotecă eșuează cu un mesaj diferit de un binar lipsă, și ambele par o defecțiune OpenVPN când sunt citite din partea clientului. Rularea comenzii de mână în închisoare reproduce defecțiunea fără a reporni serviciul.
Copiază și configurația, certificatele și orice CRL în închisoare, pentru că un fișier pe care daemonul se așteaptă să îl recitească după pornire nu va fi găsit odată ce rădăcina s-a schimbat. Notează ce ai copiat, deoarece următoarea actualizare a pachetului de rețea înlocuiește originalele și lasă închisoarea pe copia veche.
Micșorează întărirea în schimb
Dacă închisoarea există doar pentru că așa spunea un ghid, eliminarea acelei singure linii păstrând restricțiile de cont este un rezultat defensabil. Daemonul își păstrează viziunea asupra sistemului de fișiere și scapă de problemă, iar coborârea privilegiilor scoate în continuare root din procesul de lungă durată.
Notează ce rămâne, și de ce. O configurație care a pierdut în tăcere un control fără o notă este felul în care derivează întărirea, iar următorul audit va întreba de ce a dispărut linia.
Împarte cele trei linii înainte de a alege
Copiază configurația, dezactivează toate cele trei directive și confirmă că un client se conectează și că apar rutele așteptate. Reactivează apoi doar liniile de cont, iar apoi chroot singur. Pasul în care tunelul se rupe indică granița, și eviți să reconstruiești o închisoare care nu a fost niciodată cauza.
Când rutează din nou, rulează o sesiune de client cu verbositate mai mare și citește linia care numește comanda sau permisiunea care a eșuat. Acea linie valorează mai mult decât timeout-ul pe care clientul îl raportează în final.