Доўгі час працы даказвае толькі тое, што запуск прайшоў з тымі прывілеямі, якія дэман меў у той момант. Збоі, якія тут важныя, прыходзяць пазней: падключаецца новы кліент, замяняецца спіс адкліканняў, дапаможнаму скрыпту трэба запісаць файл. Кожнае з гэтага — новае адкрыццё, выкананае непрывілеяваным уліковым запісам, з уласным пытаннем правоў і ўласным паведамленнем пра памылку. Тры рашэнні аддзяляюць наладку, якая працягвае працаваць, ад той, што зрываецца на наступнай падзеі.

Аддзяліце тое, што загружана рана, ад таго, што адкрываецца пазней

Дэскрыптар — гэта ручка на адкрытым апісанні файла, і рэжым доступу быў зафіксаваны пры стварэнні гэтага апісання. Змена карыстальніка працэсу пазней не зачыняе ручку, таму ключавы файл, прачытаны як root, працягвае працаваць пасля зніжэння. Рэжым таксама не мяняецца: ручка, адкрытая для чытання, не становіцца запісной, а запісная ручка не адклікаецца толькі таму, што ўліковы запіс страціў правы на шлях. Гэтыя два факты тлумачаць большасць дзіўных паводзін у такіх справаздачах.

Другая палова — памяць. Дэман можа разабраць сертыфікат, захаваць разабраны матэрыял і закрыць файл; у выкарыстанні застаюцца даныя, а не адкрыты файл. Таму пастаянны трафік не даказвае ні што дэскрыптар адкрыты, ні што шлях дасягальны. Ён даказвае толькі тое, што матэрыял для бягучай сесіі быў атрыманы раней.

Пазнейшае адкрыццё — іншая аперацыя. Яно ідзе пад бягучымі ўліковымі данымі, бягучым кантэкстам бяспекі і бягучым прадстаўленнем мантыравання, таму шлях, чытэльны пры запуску, можа быць адхілены пры наступным злучэнні. Ратацыя дадае пастку: запіс новага файла па тым жа шляху пакідае існуючы дэскрыптар прывязаным да старога абекта, таму перазагрузка можа выглядаць паспяховай, пакуль дэман усё яшчэ выкарыстоўвае папярэдні змест. Параўнайце inode, які трымае працэс, з 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, даных адклікання, дапаможных выканальных файлаў або поўнага перазапуску працэсу. Яны ўсё яшчэ ідуць сваімі шляхамі адкрыцця, пад тым уліковым запісам, які працуе ў той момант.

Пацвердзіце ўліковы запіс і тое прадстаўленне, якое ён мае

Спытайце ў працуючага дэмана, які ўліковы запіс ён выкарыстоўвае, замест таго каб давяраць файлу юніта, затым параўнайце адказ з тым, што задае юніт. Разыходжанне — першае, што трэба вырашыць, бо кожная наступная праверка правоў ідзе як той, кім працэс зяўляецца насамрэч. Затым прайдзіце шлях па адным кампаненце; перасячэнне ацэньваецца на кожным узроўні, таму чытэльны файл у нечытэльным каталогу ўсё роўна нечытэльны. Канчатковы рэжым файла — апошняе пытанне, а не першае.

Прасторы імёнаў і служебныя пясочніцы дадаюць межы, якіх не апісваюць уласнасць і біты рэжыму. Шлях, бачны ў вашай абалонцы, можа быць адсутным або толькі для чытання ўнутры chroot, прасторы мантыравання або юніта, які хавае хатнія каталогі. Модулі бяспекі дадаюць яшчэ адзін слой, таму файл, які выглядае чытэльным, усё роўна можа быць адхілены пры адкрыцці.

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 прыбірае перачытванне замест пашырэння каталога.

Вырашайце па падзеі, якую можаце ўзнавіць

Жывы тунель даказвае адзін шлях у кодзе. Падзея, якой патрэбны файл, — адзіны тэст, які пакрывае патрэбнае вам адкрыццё: новае злучэнне кліента, заменены файл адклікання, дазволены мяккі скід або запланаваны перазапуск. Выберыце падзею, выканайце яе і захавайце першую памылку, а не апошнюю.

Для мяккага скіду адзін сігнал і журнал юніта пакажуць, ці ключ быў прачытаны зноў. Пашліце сігнал, затым прачытайце апошнія радкі, якія запісаў юніт:

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

Не рабіце высновы, што скампраметаваны дэман больш не можа змяняць файлы толькі таму, што прывілеі зніжаны. Што ён яшчэ можа, залежыць ад пакінутых уліковых даных, ягоных магчымасцей, каталогаў, у якія ён можа пісаць, і любой запісной ручкі, якую ён яшчэ трымае. Зніжэнне прывілеяў звужае паўнамоцтвы, а пералік адкрыццяў часу выканання паказвае, наколькі. Запішыце гэтую мяжу побач з наладай, каб наступнаму чалавеку не давялося адкрываць яе зноў.

Падобныя артыкулы