Демон 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 арқылы мұрагерлікке берілуі мүмкін биттерді ұстайды, бірақ орындалатын файлдың мұрагерлік жиыны рұқсат еткенде ғана, сондықтан ондағы бір бит өздігінен ештеңе бермейді.

Содан кейін қай профиль шын мәнінде тіркелгенін растаңыз. Процесс күтпеген профиль атымен шектелуі мүмкін, әсіресе дистрибутив өз бірлік файлы мен профилін бірге жеткізсе, және /proc/PID/attr/current оқу мұны бір жолда шешеді. Өңделген файлыңызды ядро хабарлаған профильмен салыстыру — себепті түзету мен ешкім жүктемейтін файлды өңдеу арасындағы айырма.

Мүмкіндік ережесін тек аудит ізі солай десе ғана қосыңыз

Ядро және аудит жазбалары бас тартқан қабатты атайды. Операциясы capable және аты sys_chroot болатын, оны тудырған профильмен бірге келетін бас тартуды іздеңіз. Егер сол жазба болса, процесс мүмкіндікті бұрыннан ұстаған және AppArmor бас тартқан, ал мақсатты өзгеріс нақты профиль ішіндегі мүмкіндік ережесі:

capability sys_chroot,

Оны шын мәнінде тіркелген профильде фрагмент ретінде ұстаңыз және кілт сөзді бөгде оқулықтан ереже көшіруден гөрі apparmor.d профильдерінің анықтамасымен салыстырыңыз. Оны ортақ include ішіне салу ол файлды тартатын барлық шектелген бағдарламаға береді, ал профильді complain режиміне ауыстыру осы мәселені шешудің орнына келесі бас тартуды жасырады. Профиль ережесі саяси бас тартуды алып тастайды; ол артықшылық жасамайды, сондықтан тиімді жиынында CAP_SYS_CHROOT ешқашан болмаған процесс ереже болса да сәтсіз аяқталады.

Егер аудит жазбасы AppArmor бас тартуын мүлдем көрсетпесе, профильді өңдеуді тоқтатыңыз. Сіз тіркелгі деректерінің мәселесін көріп отырсыз, ал қалған жұмыс бірлік файлында немесе ата-ана процесінде, саясат тілінде емес.

Қызмет менеджері өз төбесін ұстайды

systemd әр қызметке мүмкіндіктердің шектеуші жиынын орнатады, және әдепкіде ол жиын тар. Онда алып тасталғанның бәрі профиль не десе де процесс үшін қолжетімсіз, сондықтан қатайтылған бірліктер демонды қолмен іске қосқанда жұмыс істеген операцияда сәтсіз аяқталуы мүмкін. Тиісті директиваларды бірліктен оқу оңай және қолданба сәтсіздікті хабарлағанда оларды байқамау да оңай. Тарату бумасы жеткізетін drop-in файлдары — ешкім реттегенін есіне алмайтын төбенің әдеттегі көзі.

Төбені көтеру және мүмкіндік беру — екі өзгеріс, біреу емес. Шектеуші жиындағы жазба процесс мүмкіндікті ұстай алатынын айтады; ол оны тиімді жиынға қоспайды, ал NoNewPrivs кейінгі көтерудің табысты болуына кедергі келтіруі мүмкін, тіпті қалғанының бәрі сай келсе де. Тек операцияға қажеттіні қосыңыз, қалған қатайтуды сақтаңыз және бір шақыруды өткізу үшін барлық мүмкіндіктерді беру қысқа жолына бас имеңіз.

Мұнда реттілік те маңызды. Алдымен бірліктің төбесін өзгертіңіз, CapEff енді битті қамтитынын растаңыз, содан кейін ғана AppArmor әлі бас тарта ма деп шешіңіз. Екі өзгерісті бірге жасау, сәтсіздік жалғасса, сізді қайтадан болжауға қалдырады.

Бас тарту жойылғаннан кейін түрменің өзін тексеріңіз

Сәтті chroot түбірді жылжытады, сондықтан демон кейін тиетін әрбір жол жаңа ағаштың ішінде шешіледі. Жетіспейтін конфигурация, жоқ құрылғы торабы немесе көшірілмеген сертификат қалтасы енді файл қатесі ретінде көрінеді, және бұл қате мүмкіндіктің емес, орналасудың мәселесі. Тағы бір кең рұқсат қосудың орнына келесі оқиғаны оқыңыз. Жылжу салыстырмалы жолдың мағынасын да өзгертеді, сондықтан қатайту нұсқаулықтары демон конфигурациясында абсолютті жолдарды талап етеді.

chroot нені жасамайтынын есте ұстаған да пайдалы. Бұл жол шекарасы, sandbox емес: артықшылықты сақтаған процесс одан қашып кете алады, сондықтан мүмкіндік әдетте шақырудан кейін тасталады және сондықтан шектеу демонның айналасында қалуы керек. AppArmor профилін, мүмкіндіктердің шектеуші жиынын және файлдық жүйе шектеулерін бірге ұстау — бұл жаттығудың мақсаты, қызмет көтерілгенде алып тастайтын қалдық емес.

Шешім ережесі қысқа. Егер аудит жазбасы AppArmorды атаса, тіркелген профильге бір мүмкіндік ережесін қосыңыз. Егер тиімді жиын бос болса, бірлік төбесін және артықшылықтан бас тарту ретін реттеңіз. Егер профиль сіз өңдеген профиль болмаса, өңдеуді тоқтатып, шынайысын табыңыз.

Қатысты мақалалар