OpenVPN push-peer-info: пазначаць кліентаў без давання доступу
Поле UV_ перадаецца праз аўтэнтыфікаваны тунэль, але значэнне ўсё яшчэ з’яўляецца заявай кліента. Наладзьце яго, праверце, што прыйшло, і пакіньце аўтарызацыю на серверы.
Тэгі разгортвання — звычайная прычына, па якой людзі бяруцца за гэтую функцыю: кожнае злучэнне павінна несці нешта накшталт пляцоўкі ці ролі, а сервер павінен чытаць гэта, не выдумляючы другі фармат уліковых даных. У супольным OpenVPN механізм ужо ёсць, і ён невялікі. Балючы бок — гэта чаканні. Усталяванне звычайнай зменнай у профілі кліента нічога не робіць на серверы, а значэнне, якое ўсё ж прыходзіць, сведчыць толькі пра тое, што кліент яго даслаў.
Гэта кіраўніцтва для працоўнага шляху, кроку праверкі, які паказвае, што прыйшло насамрэч, і адкату, які не пакідае паўналаджанага кручка. Нішто тут не патрабуе новага сертыфіката, новага плагіна ці пашырэння пратакола.
Задайце зменную і ўключыце шлях
Дзве радкі робяць працу ў профілі кліента, і абедзве абавязковыя. Без першай няма чаго дасылаць; без другой кліент увогуле не прапануе інфармацыю пра аднарангавы вузел. Парадак не мае значэння, і гэта варта ведаць, бо дзве радкі часта трапляюць у розныя часткі згенераванага профілю. Важна тое, што абедзве перажываюць любое перапісванне профілю перад чытаннем кліентам.
setenv UV_DEPLOY field-support
push-peer-info
Прэфікс UV_ — не ўпрыгожванне. Звычайная зменная DEPLOY застаецца лакальнай для працэсу кліента і ніколі не перадаецца, а форма з прэфіксам — гэта прастора імёнаў, якую пратакол пакідае для палёў, вызначаных карыстальнікам. Пакіньце астатнюю частку ўхваленага профілю нязменнай і перад разгортваннем пераканайцеся, што зборка кліента, якую вы разгортваеце, падтрымлівае абедзве дырэктывы.
Адна практычная праверка месца тут, а не ў канцы: пераканайцеся, што дырэктыва даходзіць да бінарніка кліента і не праглынаецца абгорткай. Графічны кліент, які сам будуе камандны радок, або інтэрфейс кіравання, які перазагружае захаваны профіль, могуць адкінуць радкі, якіх не пазнаюць. Калі сервер нічога не бачыць, гэта першае месца, дзе варта глядзець.
Чытайце поле з кручка на серверы
На баку сервера атрыманая інфармацыя пра аднарангавы вузел правяраецца і ўстаўляецца ў асяроддзе працоўнага працэсу злучэння, і менавіта гэта робіць яе чытэльнай з кручка без вашай працы з пратаколам. Серверу не трэба разбіраць кантрольны канал ці нешта захоўваць для вас; значэнне проста прысутнічае, пакуль усталёўваецца злучэнне. Мінімальны скрыпт client-connect, які запісвае тэг побач з аўтэнтыфікаваным імем, выглядае так.
#!/bin/sh
# /etc/openvpn/server/hooks/label.sh
printf '%s %s\n' "$common_name" "${UV_DEPLOY:-unset}" \
>> /var/log/openvpn/deploy-labels.log
Чытайце зменную праз асяроддзе, а не праз разбор лога, і заўсёды давайце ёй значэнне па змаўчанні. ${UV_DEPLOY:-unset} захоўвае працаздольнасць скрыпта для кліентаў, якія ніколі не дасылаюць поле, што з’яўляецца нармальным станам падчас паэтапнага разгортвання. Не вылівайце ўсё асяроддзе ў лог, каб знайсці імя; там нашмат больш за тэг, уключаючы значэнні, якія вы не збіраліся захоўваць.
Запусціце скрыпт уручную, і ён паведаміць unset для ўсяго, бо ручная абалонка не нясе асяроддзе злучэння. Гэта не памылка ў скрыпце і не доказ таго, што поле адсутнічае. Праверце яго праз рэальнае злучэнне, бо гэта адзіны кантэкст, у якім зменная існуе.
Праверце, што насамрэч прыйшло
Падключыце адзін кліент з тэгам і адзін без яго, затым прачытайце файл. Пара — гэта і ёсць тэст: адзін радок павінен несці значэнне, а другі — значэнне па змаўчанні, і абодва павінны называць тую ж аўтэнтыфікаваную асобу, якую вы чакаеце.
tail -n 5 /var/log/openvpn/deploy-labels.log
# field-support deployed-client-07
# unset legacy-laptop-02
Гэтыя радкі-каментарыі — форма вываду, а не транскрыпт з вашага сервера; чытайце свой файл. Калі другі кліент таксама паказвае значэнне, зменная ўсталявана дзесьці яшчэ ў асяроддзі, і вы чытаеце састарэлы параметр, а не поле аднарангавага вузла.
Праверце таксама лог сервера для гэтага злучэння. Інфармацыя пра аднарангавы вузел можа з’явіцца там, што зручна для адладкі і з’яўляецца прычынай трымаць значэнні сумнымі: ніякіх імёнаў людзей, ніякіх нумароў заявак, нічога, што вам было б непрыемна паказаць чытачу лога.
Стаўцеся да тэга як да заявы, а не як да асобы
Кожны, хто можа рэдагаваць профіль кліента, можа змяніць тэг, і тое, што тунэль аўтэнтыфікаваны, не робіць тэг паўнамоцным. Транспарт абараняе значэнне ў дарозе; ён не сведчыць пра заяву. Аўтарызацыя па-ранейшаму належыць аўтэнтыфікаванай асобе і запісу рэгістрацыі, якім валодае сервер, а тэг параўноўваецца з гэтым запісам, калі гэта мае значэнне.
Гэта розніца вызначае, дзе тэг можна выкарыстоўваць. Добрыя ўжыванні — накіраванне сеансу ў патрэбны файл лога, выбар групы адлюстравання на панэлі кіравання або пазначэнне сеансу падтрымкі, каб чалавек мог знайсці яго пазней. Дрэнныя ўжыванні — дапушчэнне прылады ў падсетку, выбар палітыкі міжсеткавага экрана або рашэнне, чые даныя кліента сеанс можа чытаць.
Праверце значэнне, перш чым яно дасягне шляху, запыту або каманды абалонкі. Спіс дазволеных радкоў дастатковы для тэга разгортвання, і гэта нічога не каштуе. Ніколі не ўстаўляйце радок, прапанаваны аднарангавым вузлом, у камандны радок абалонкі, і абмяжоўвайце любое захаванае назіранне сеансам, а не адрасам тунэлю, які выкарыстае наступны кліент.
case "${UV_DEPLOY:-}" in
field-support|field-qa|lab) : ;;
*) UV_DEPLOY=unknown ;;
esac
Адкаціце чыста
Выдаленне функцыі — гэта два выдаленні і адна праверка. Выдаліце радкі setenv і push-peer-info з профілю кліента, затым выдаліце або адключыце кручок і яго мэту лога на серверы.
grep -rn 'UV_DEPLOY\|push-peer-info' /etc/openvpn/
tail -n 3 /var/log/openvpn/deploy-labels.log
Пасля гэтага падключыце адзін кліент і пераканайцеся, што радок лога больш не з’яўляецца. Кручок, які працягвае працаваць пасля змены профілю, звычайна аказваецца другім профілем, які ўсё яшчэ разгорнуты на тэставай прыладзе, і знайсці яго цяпер танней, чым падчас аўдыту.
У канцы застаецца невялікі абмежаваны кавалак метаданых сеансу з дакументаваным паходжаннем: кліент заяўляе яго, сервер запісвае, і нішто ў доступе ад яго не залежыць. Гэта карысная версія функцыі, і для яе не патрэбны новыя ўліковыя даныя.