OpenVPN තුළ chroot අසාර්ථක වේ: AppArmor රීතියක් ද, නැතහොත් හැකියාවක් ද?
AppArmor පැතිකඩකට මාර්ගයක් එකතු කිරීම කිසිදා CAP_SYS_CHROOT ලබා නොදේ, තවද ප්රතික්ෂේප වූ chroot එකක් වෙනස් ස්තර තුනකින් පැමිණිය හැක. කුමක් වෙනස් කළ යුතුද යන්න තීරණය කරන්න.
ඩේමන් chroot අසාර්ථකත්වයක් වාර්තා කරන අතර පැතිකඩ දැනටමත් පුළුල් බව පෙනේ, එබැවින් පෙළඹෙන නිවැරදි කිරීම වන්නේ මාර්ග රීතියක් පුළුල් කර නැවත ආරම්භ කිරීමයි. එය සාමාන්යයෙන් කිසිවක් වෙනස් නොකරයි, මන්ද chroot පැතිකඩට කිසිදා ලබා දීමට නොහැකි වූ වරප්රසාදයකින් ආරක්ෂා වී ඇත. කුමන ස්තරය ස්පර්ශ කළ යුතුද යන්න තීරණය කිරීමට පරීක්ෂණ තුනක් අවශ්ය වන අතර ඒවා ලාභදායකය: ක්රියාවලියට රඳවා ගැනීමට අවසර ඇත්තේ කුමක්ද, ප්රතිපත්තිය අවසර දෙන්නේ කුමක්ද, සහ ඒ දෙකෙන් එකක්වත් වැදගත් වීමට පෙර දියත් කරන්නා ඉවත් කළේ කුමක්ද.
වෙන් වූ දොරටු දෙකක්, ඉන් එකක් පමණක් AppArmor ට අයත් වේ
chroot සඳහා ක්රියාවලිය ක්රියාත්මක වන පරිශීලක නාම අවකාශය තුළ CAP_SYS_CHROOT අවශ්ය වේ. එය සාම්ප්රදායික Linux වරප්රසාදයක් වන අතර, ක්රියාවලිය මාර්ග සමඟ කිසිවක් නොකිරීමට පෙර කර්නලය එය පරීක්ෂා කරයි. වෙනම, ක්රියාත්මක වන AppArmor පැතිකඩක් ක්රියාවලියට එය තිබියදීත් එම හැකියාව ප්රතික්ෂේප කළ හැක, මන්ද අනිවාර්ය ප්රතිපත්තිය අක්තපත්ර සමඟ මිස ඒවා වෙනුවට නොව, ඒවාට අමතරව සලකා බලන බැවිනි. මෙම වෙනස ප්රායෝගිකව වැදගත් වේ: ස්තර දෙක වෙනස් ගොනු තුළ පවතින අතර සාමාන්යයෙන් වෙනස් පුද්ගලයින් විසින් නඩත්තු කරනු ලැබේ.
එම දොරටු දෙකම එකම errno සමඟ අසාර්ථක වේ. දෙකම EPERM නිපදවන අතර, දෙකම ඩේමන් ලොගයේ සාමාන්ය අවසර පැමිණිල්ලක් ලෙස දිස්වේ; එහෙයින් පැතිකඩ අන්තර්ගතය ගැන අනුමාන කිරීම බොහෝ කාලය නාස්ති කරයි. ඔබ එකතු කිරීමට යන මාර්ග රීතිය chroot සාර්ථක වීමෙන් පසු ගොනු ප්රවේශය පාලනය කරයි; මෙහෙයුමට අවසර තිබේද යන්නට එයට කිසිදු සම්බන්ධයක් නැත.
තෙවන දොරටුව දෙකටම ඉහළින් පිහිටා ඇත. සේවා කළමනාකරු හෝ ආවරණයක් ක්රියාවලිය එහි සීමා කුලකයේ එම හැකියාව නොමැතිව ආරම්භ කළේ නම්, කිසිදු AppArmor වෙනසකට එය නැවත ගෙන ඒමට නොහැක; පැතිකඩට හැකියාවන් එකතු කිරීම කර්නලය ඉටු නොකරන අභිප්රායක් පමණක් වාර්තා කරයි.
ප්රතිපත්තිය සංස්කරණය කිරීමට පෙර වරප්රසාද තත්ත්වය කියවන්න
ඔබ සක්රීය යැයි සිතන වින්යාසයෙන් නොව, ධාවනය වන ක්රියාවලියෙන් ආරම්භ කරන්න. තත්ත්ව ගොනුව හැකියාවේ ආවරණ පහක් සහ no-new-privileges ධජය පෙන්වන අතර, ඒවා වෙනස් ප්රශ්නවලට පිළිතුරු දෙයි:
grep -E '^(CapInh|CapPrm|CapEff|CapBnd|CapAmb|NoNewPrivs):' /proc/$(pidof openvpn)/status
sudo aa-status | grep -i openvpn
CapEff යනු ඇමතුමට වැදගත් වන කුලකයයි: CapBnd තුළ ඇති නමුත් CapEff තුළ නොමැති හැකියාවක් සීමාව මගින් අවසර ලබා දී ඇති අතර එය දැනට රඳවා නොගනී. CapAmb වැදගත් වන්නේ ද්විමය ගොනුව සාමාන්ය setuid අර්ථයෙන් වරප්රසාද නොලද විටය, මන්ද පරිසර හැකියාවන් යනු සේවාවක් ගොනු හැකියාවන් නොමැතිව exec හරහා වරප්රසාදයක් රඳවා ගන්නා ක්රමයයි. CapInh තුළ exec හරහා උරුම විය හැකි බිටු ඇත, නමුත් එය ධාවනය වන ගොනුවේ උරුම කුලකය අවසර දෙන විට පමණි; එබැවින් එහි ඇති බිටුවක් තනිව කිසිවක් ලබා නොදේ.
පසුව සැබවින්ම සම්බන්ධ වී ඇත්තේ කුමන පැතිකඩද යන්න තහවුරු කරන්න. ක්රියාවලියක් ඔබ බලාපොරොත්තු නොවූ පැතිකඩ නාමයකින් සීමා කර තිබිය හැක, විශේෂයෙන් බෙදාහැරීමක් එහිම unit ගොනුව සහ පැතිකඩ එකට ලබා දෙන විට; /proc/PID/attr/current කියවීම එය එක් පේළියකින් තීරණය කරයි. කර්නලය වාර්තා කරන පැතිකඩ සමඟ ඔබ සංස්කරණය කළ ගොනුව සංසන්දනය කිරීම හේතුව නිවැරදි කිරීමට සහ කිසිවෙකු පූරණය නොකරන ගොනුවක් සංස්කරණය කිරීමට අතර ඇති වෙනසයි.
විගණන සටහන එසේ පවසන විට පමණක් හැකියා රීතිය එකතු කරන්න
කර්නල සහ විගණන වාර්තා ප්රතික්ෂේප කළ ස්තරය නම් කරයි. capable මෙහෙයුම සහ sys_chroot නාමය සහිත ප්රතික්ෂේපයක් ද, එය නිපදවූ පැතිකඩ ද සොයන්න. එවැනි වාර්තාවක් තිබේ නම්, ක්රියාවලියට දැනටමත් එම හැකියාව තිබී ඇති අතර AppArmor එය ප්රතික්ෂේප කර ඇත; එබැවින් ඉලක්කගත වෙනස වන්නේ සැබෑ පැතිකඩ තුළ ඇති හැකියා රීතියකි:
capability sys_chroot,
එය සැබවින්ම සම්බන්ධ වූ පැතිකඩ තුළ කොටසක් ලෙස තබා ගන්න, සහ අදාළ නැති නිබන්ධනයකින් රීතියක් පිටපත් කිරීම වෙනුවට යතුරු පදය apparmor.d පැතිකඩ යොමුව සමඟ සසඳන්න. එය හවුල් include එකකට දැමීමෙන් එම ගොනුව ඇතුළත් කරන සීමා කළ සෑම වැඩසටහනකටම එය ලබා දේ; පැතිකඩ complain මාදිලියට මාරු කිරීම මෙය විසඳීම වෙනුවට ඊළඟ ප්රතික්ෂේපය සඟවයි. පැතිකඩ රීතිය ප්රතිපත්ති ප්රතික්ෂේපයක් ඉවත් කරයි; එය වරප්රසාදයක් නිපදවන්නේ නැත, එබැවින් CAP_SYS_CHROOT කිසිදා තම ඵලදායී කුලකයේ නොතිබූ ක්රියාවලියක් රීතිය තිබියදීත් අසාර්ථක වේ.
විගණන වාර්තාව කිසිදු AppArmor ප්රතික්ෂේපයක් නොපෙන්වන්නේ නම්, පැතිකඩ සංස්කරණය කිරීම නවත්වන්න. ඔබ අක්තපත්ර ගැටලුවකට මුහුණ දෙමින් සිටී; ඉතිරි කටයුතු unit ගොනුවේ හෝ මව් ක්රියාවලියේ මිස ප්රතිපත්ති භාෂාවේ නොවේ.
සේවා කළමනාකරු තමන්ගේම සීමාවක් රඳවා ගනී
systemd සෑම සේවාවකටම හැකියා සීමා කුලකයක් නියම කරන අතර පෙරනිමියෙන් එම කුලකය පටුය. එහි බැහැර කර ඇති කිසිවක් පැතිකඩ කුමක් කීවත් ක්රියාවලියට ලබා ගත නොහැක; එහෙයින් දෘඩ කළ unit, ඩේමන් අතින් ආරම්භ කළ විට ක්රියා කළ මෙහෙයුමක අසාර්ථක විය හැක. අදාළ නියෝග unit තුළ පහසුවෙන් කියවිය හැකි අතර, යෙදුම විසින්ම අසාර්ථකත්වය වාර්තා කරන විට පහසුවෙන් අතපසු වේ. බෙදාහැරීමේ පැකේජයක් ලබා දෙන drop-in යනු කිසිවෙකු වින්යාස කළ බව මතක නැති සීමාවක සුපුරුදු මූලාශ්රයයි.
සීමාව ඉහළ නැංවීම සහ හැකියාව ලබා දීම වෙනස් වෙනස්කම් දෙකකි, එකක් නොවේ. සීමා කුලකයේ ඇති සටහනක් පවසන්නේ ක්රියාවලියට එම හැකියාව රඳවා ගත හැකි බවයි; එය ඵලදායී කුලකයට එය එකතු නොකරයි, තවද අනෙක් සියල්ල ගැළපුනත් NoNewPrivs පසුව සිදුවන උසස් කිරීමක් සාර්ථක වීම වළක්වා ගත හැක. මෙහෙයුමට අවශ්ය දේ පමණක් එකතු කරන්න, ඉතිරි දෘඩකිරීම නොවෙනස්ව තබන්න, සහ එක් ඇමතුමක් සමත් කිරීමට සියලු හැකියාවන් ලබා දෙන කෙටි මාර්ගයට එරෙහි වන්න.
මෙහි අනුපිළිවෙල ද වැදගත් වේ. පළමුව unit සීමාව වෙනස් කරන්න, CapEff තුළ දැන් එම බිටුව ඇති බව තහවුරු කරන්න, ඉන්පසු පමණක් AppArmor තවමත් ප්රතික්ෂේප කරන්නේද යන්න තීරණය කරන්න. වෙනස්කම් දෙකම එකවර කිරීමෙන් අසාර්ථකත්වය දිගටම පැවතුනහොත් ඔබ නැවතත් අනුමාන කිරීමට පත් වේ.
ප්රතික්ෂේපය ඉවත් වූ පසු, හිර ගෙයම පරීක්ෂා කරන්න
සාර්ථක chroot එකක් මූලය ගෙන යයි, එබැවින් ඉන්පසු ඩේමන් ස්පර්ශ කරන සෑම මාර්ගයක්ම නව ගස තුළ විසඳනු ලැබේ. නැති වූ වින්යාසය, නොපවතින උපාංග නෝඩයක් හෝ පිටපත් නොකළ සහතික නාමාවලියක් දැන් ගොනු දෝෂයක් ලෙස දිස්වන අතර එම දෝෂය හැකියා ගැටලුවක් නොව පිරිසැලසුම් ගැටලුවකි. තවත් පුළුල් අවසරයක් එකතු කිරීම වෙනුවට ඊළඟ සිදුවීම කියවන්න. මෙම මාරුව සාපේක්ෂ මාර්ගයක අර්ථය ද වෙනස් කරයි; එහෙයින් දෘඩකිරීම් මාර්ගෝපදේශ ඩේමන් වින්යාසයේ නිරපේක්ෂ මාර්ග අවධාරණය කරයි.
chroot නොකරන දේ මතක තබා ගැනීම ද උපකාරී වේ. එය මාර්ග මායිමක් මිස වැලි පෙට්ටියක් නොවේ: වරප්රසාදය රඳවා ගන්නා ක්රියාවලියකට එයින් ගැලවිය හැක; එහෙයින් හැකියාව සාමාන්යයෙන් ඇමතුමෙන් පසු ඉවත් කරනු ලබන අතර සීමා කිරීම ඩේමන් වටා රැඳී තිබිය යුතුය. AppArmor පැතිකඩ, හැකියා සීමා කුලකය සහ ගොනු පද්ධති සීමා සමඟ රඳවා ගැනීම මෙම ව්යායාමයේ අරමුණයි, සේවාව ආරම්භ වූ පසු ඉවත් කළ යුතු ඉතිරියක් නොවේ.
තීරණ රීතිය කෙටිය. විගණන වාර්තාව AppArmor නම් කරන්නේ නම්, සම්බන්ධ පැතිකඩට එක් හැකියා රීතියක් එකතු කරන්න. ඵලදායී කුලකය හිස් නම්, unit සීමාව සහ වරප්රසාද ඉවත් කිරීමේ අනුපිළිවෙල නිවැරදි කරන්න. පැතිකඩ ඔබ සංස්කරණය කළ එක නොවේ නම්, සංස්කරණය නවත්වා සැබෑ එක සොයා ගන්න.