Skríptì tí ó bẹ̀rẹ̀ OpenVPN tí kò sì so mọ́ rára kì í sábà jẹ́ ìṣòro nẹ́tíwọ́kì: ẹ̀rọ ìbánisọ̀rọ̀ wà níbi ìbéèrè tí kò ní tẹ́mínàálì láti fi yà. OpenVPN ní ọ̀nà méjì péré tí wọ́n fọwọ́ sí láti dá ìbéèrè yẹn lóhùn láìsí ènìyàn, fáìlì ẹ̀rí ìdánimọ̀ lẹ́yìn auth-user-pass àti sọ́kẹ́tì ìṣàkóso, wọn kò sì lè rọ́pò ara wọn. Fáìlì náà ná ìtọ́sọ́nà kan ó sì dá ìbéèrè kan lóhùn; sọ́kẹ́tì dá gbogbo ìbéèrè lóhùn ó sì fún ohunkóhun tí ó lè ṣí ibùdókọ̀ loopback ní ọ̀nà ìṣàkóso tí kò ní ìjẹ́rìí. Èwo ni ó bá ìgbékalẹ̀ rẹ dà gbáralé ìbéèrè tí ń dí lọ́nà gidi, àti àṣírí tí o lè fi sílẹ̀ ní ìdákẹ́jẹ́.

Dárúkọ ìbéèrè náà kí o tó yan ọ̀nà kan

Ìbéèrè mẹ́rin ń yẹra bakan náà lórí tẹ́mínàálì. Ẹ̀wẹ̀ẹ́ àkọsílẹ̀ náà wá láti ìṣètò PAM tàbí auth-user-pass-verify ti ẹ̀rọ ìpèsè, auth-user-pass sì ń dá a lóhùn. Ọ̀rọ̀ àṣírí kọ́kọ́rọ́ aládàáni jẹ́ ti fáìlì kọ́kọ́rọ́, a sì ń kà á nípasẹ̀ --askpass tàbí a fi ọwọ́ tẹ̀ ẹ́. Àkópọ̀ PKCS#12 béèrè ọ̀rọ̀ àṣírí tirẹ̀. Ìjẹ́rìí aṣojú ń lo fáìlì auth tí --http-proxy ń gbà, kì í ṣe ẹ̀rí ìdánimọ̀ àkọsílẹ̀ náà.

Nígbà tí OpenVPN bá ń ṣiṣẹ́ gẹ́gẹ́ bí ọmọ systemd, PHP tàbí Node kò sí tẹ́mínàálì, nítorí náà ọ̀kọ̀ọ̀kan wọ̀nyí ń dí ní ìdákẹ́jẹ́. Ìlànà náà jókòó níbẹ̀, àkọsílẹ̀ dúró lẹ́yìn ìlà ìpamọ́, ẹ̀yà náà sì kúkú kọjá àkókò; ìdákẹ́jẹ́ yẹn ni ìdí tí àwọn ènìyàn fi ń fi ìyípadà ìgbìyànjú tàbí sleep kún un dípò wíwo ìbéèrè tí ń dúró. Sọ́kẹ́tì ìṣàkóso nìkan ló lè dá gbogbo mẹ́rin lóhùn. Fáìlì ẹ̀rí ìdánimọ̀ dá ti àkọ́kọ́ lóhùn, kò sì dá ohunkóhun mìíràn.

auth-user-pass: fáìlì kan, ìbéèrè kan

Fáìlì náà ní orúkọ olùṣe ní ìlà àkọ́kọ́ àti ọ̀rọ̀ àṣírí ní ìlà èkejì, kò sí ohunkóhun mìíràn: kò sí àmì àyọká, kò sí orúkọ kọ́kọ́rọ́, kò sí àkọsílẹ̀. Ṣètò ipò 600 kí o sì fi àkọsílẹ̀ tí ń ṣiṣẹ́ openvpn ṣe olówó, èyí tí ó sábà jẹ́ olùṣe àkànṣe fún iṣẹ́ kan kì í ṣe ìwọlé rẹ. Fáìlì tí root ní lábẹ́ /root ni ìyàtọ̀ láàrin àṣẹ tí ń ṣiṣẹ́ nínú ṣẹ́ẹ̀lì rẹ àti ẹ̀yà tí ń kùnà nígbà ìbẹ̀rẹ̀.

Àlàyé méjì ń sọ fáìlì tí ó tọ́ di ìbéèrè. Olóòtú tí ń fi CRLF pamọ́ ń fi ìpadà kẹ̀kẹ́-ẹrù tí ó lẹ̀ mọ́ ọ̀rọ̀ àṣírí sílẹ̀, nítorí náà ẹ̀rọ ìpèsè kọ ọ̀rọ̀ àṣírí tí ó dà bí ẹni tí ó tọ́ nínú fáìlì; ṣàyẹ̀wò pẹ̀lú cat -A tàbí od -c kì í ṣe pẹ̀lú ojú. Àti auth-user-pass tí kò ní àríyànjiyàn nínú profáìlì túmọ̀ sí «bèèrè lọ́wọ́ olùṣe» gẹ́gẹ́ bí àpẹẹrẹ, èyí tí ìtọ́sọ́nà kejì lórí ìlà àṣẹ lè má lè borí, nítorí a ń ṣàyẹ̀wò profáìlì níbi tí ó wà.

Ìtò àwọn àṣàyàn ni pákúté kẹta, ó sì sinmi lórí ẹ̀dà. Àwọn ìkọ́ OpenVPN 2.4 kan ń pa --auth-user-pass tì nígbà tí ó bá wà ṣáájú --config, nítorí náà àwọn àṣàyàn méjì kan náà ní ìtò mìíràn ń so mọ́. Fi ìtọ́sọ́nà náà sínú profáìlì, tàbí lẹ́yìn --config lórí ìlà àṣẹ, kí o sì fi grep wá profáìlì fún gbogbo ìṣẹ̀lẹ̀ kí o tó yí ohunkóhun mìíràn padà.

auth-nocache jẹ́ ti ọ̀nà yìí ṣùgbọ́n kò pèsè ohunkóhun. Ó dí ìwọ̀n àkókò tí ẹ̀rọ ìbánisọ̀rọ̀ ń fi ẹ̀rí ìdánimọ̀ pamọ́ nínú ìrántí, èyí tí ó ń ràn lọ́wọ́ lẹ́yìn ìkùnà tí kò sì ràn lọ́wọ́ rárá nígbà tí fáìlì kò sí. Àtúnso mọ́ lẹ́yìn àkókò ìpàdé ní ẹ̀gbẹ́ ẹ̀rọ ìpèsè ń tún fáìlì kà, nítorí náà ẹ̀rí tí ó ṣiṣẹ́ nígbà ìbẹ̀rẹ̀ lè ṣì parí ní àárín ọjọ́.

Sọ́kẹ́tì ìṣàkóso: gbogbo ìbéèrè, ojú púpọ̀

Bẹ̀rẹ̀ ẹ̀rọ ìbánisọ̀rọ̀ pẹ̀lú olùgbọ́ kí o sì sọ ní kedere pé a óò ròyìn àwọn ìbéèrè lórí rẹ̀, ní lílo àwọn ìtọ́sọ́nà tí a kọ sínú ìwé ìtọ́nisọ́nà OpenVPN 2.6:

management 127.0.0.1 3030
management-query-passwords

Láti bash, di ìsopọ̀ mú lórí àpèjúwe fáìlì àfikún kí o sì dá lóhùn pẹ̀lú orúkọ ìbéèrè kì í ṣe ipò, nítorí àtúnso mọ́ lè béèrè ní ìtò mìíràn:

exec 3<>/dev/tcp/127.0.0.1/3030
while read -r -u 3 line; do
  case "$line" in
    *"Need 'Auth' username/password"*)
      echo 'username "Auth" alice' >&3
      echo 'password "Auth" secret' >&3 ;;
    *"Need 'Private Key' password"*)
      echo 'password "Private Key" secret' >&3 ;;
  esac
done

Ààlà ni gbígbé. Ìlànà ìṣàkóso jẹ́ àkọsílẹ̀ tí ó ṣí lórí TCP lórí loopback, nítorí náà kò gbọdọ̀ tẹ olùgbọ́ jáde lórí àdírẹ́sì LAN tàbí ọ̀nà abẹ́lẹ̀ kí olùṣàkóso jíjìnnà lè dé ọ̀dọ̀ rẹ̀; olùṣàkóso jíjìnnà túmọ̀ sí gbígbé SSH, kì í ṣe ìdè tí ó gbòòrò. Ẹ̀mí àpapọ̀ náà ń gba olùṣàkóso kan ṣoṣo lẹ́ẹ̀kan, nítorí náà GUI tàbí olùṣọ́ kò lè pín sọ́kẹ́tì pẹ̀lú skríptì rẹ. Ìsopọ̀ kejì ni a kọ̀, a kò fi sínú ìlà, ìkùnà sì dà bí skríptì tí ó di adití.

Sọ́kẹ́tì yẹn tún jẹ́ ọ̀nà ìṣàkóso. Láìsí ọ̀rọ̀ àṣírí ìṣàkóso, ohunkóhun tí ó lè so mọ́ 127.0.0.1:3030 lè ka ipò, pa ọ̀nà abẹ́lẹ̀, tàbí dá ìbéèrè kan lóhùn fúnra rẹ̀. Ọ̀rọ̀ àṣírí ìṣàkóso àti fáìlì ẹ̀rí ìdánimọ̀ jẹ́ àṣírí ẹgbẹ́ kan náà, àwọn méjèèjì sì yẹ fún ìtọ́jú kan náà.

Èwo ni ó bá ìgbékalẹ̀ dà

Yan fáìlì ẹ̀rí ìdánimọ̀ nígbà tí ìbéèrè kan ṣoṣo bá jẹ́ ẹ̀wẹ̀ẹ́ àkọsílẹ̀, tí ẹ̀rọ ìbánisọ̀rọ̀ ń ṣiṣẹ́ gẹ́gẹ́ bí iṣẹ́ pẹ̀lú olówó tí ó dúró ṣinṣin, tí o sì lè fi fáìlì 600 pamọ́ ní ìta àwọn àdàkọ tí o kò ní ìṣàkóso lórí wọn. Yan sọ́kẹ́tì ìṣàkóso nígbà tí ọ̀rọ̀ àṣírí kọ́kọ́rọ́ tàbí ọ̀rọ̀ àṣírí PKCS#12 bá wà nínú ọ̀ràn, tí olùpamọ́ ti ń ṣọ́ ìlànà náà, tàbí tí o nílò láti wo ipò àti àwọn ìbéèrè nígbà tí ń ṣàtúnyẹ̀wò àtúnso mọ́.

Ìpò méjì ń yí ìpinnu padà. Tí olùpamọ́ bá jẹ́ /bin/sh, ẹ̀yà systemd tí ń pe fáìlì ìṣiṣẹ́ tààrà, tàbí àpótí tí ó kéré, kò sí òdì kejì sọ́kẹ́tì fún bash nìkan, fáìlì sì ni ìdáhùn tí ó din owó. Tí àṣírí bá ń yí káàkiri nígbà gbogbo, kò sí fáìlì tí ó jẹ́ ilé tí ó dára fún un: béèrè òrùka kọ́kọ́rọ́ lọ́wọ́ olùpamọ́ kékeré kí o sì jẹ́ kí ẹ̀yà pe olùpamọ́ náà, èyí tí ó ń pa ìyípadà mọ́ sí ibi kan àti ọ̀rọ̀ àṣírí ní ìta ìtàn ṣẹ́ẹ̀lì.

Ìrọ́pò ìlànà wà láàrin àwọn méjèèjì kò sì jẹ́ ti ẹnìkankan. Ìlà kan tí ó wà nísàlẹ̀ ń ṣiṣẹ́ nítorí bash ń gbòòrò rẹ̀ kí openvpn tó bẹ̀rẹ̀, kì í ṣe nítorí pé ẹ̀rọ ìbánisọ̀rọ̀ yé ìtòpọ̀ ọ̀rọ̀:

openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")

Ó já ní abẹ́ /bin/sh, nínú ẹ̀yà tí ó forí ṣẹ́ẹ̀lì kọjá, àti nínú àwọn àwòrán tí kò ní bash tàbí /dev/fd. Pa á mọ́ fún ìdánwò ìbáraẹnisọ̀rọ̀, kì í ṣe gẹ́gẹ́ bí àdéhùn tí iṣẹ́ kan gbára lé.

Dáàbò bo àṣírí náà, lẹ́yìn náà ṣàyẹ̀wò láti inú àkọsílẹ̀

Àwọn ọ̀nà méjèèjì ń fi àṣírí tí ìlànà OpenVPN lè kà sílẹ̀. Má ṣe fi ọ̀rọ̀ àṣírí sí ìlà àṣẹ tàbí sínú fáìlì ẹ̀yà, níbi tí ps àti systemctl ti ń fi í hàn fún gbogbo olùṣe àdúgbò; fi ọ̀nà sí fáìlì náà, kì í ṣe iye tí ó wà nínú rẹ̀. Níbi tí àwọn ẹ̀rí-ìmọ̀ lè rọ́pò ẹ̀wẹ̀ẹ́ àkọsílẹ̀, ìyẹn yọ ẹgbẹ́ ìbéèrè kúrò dípò fífi í pamọ́.

Ìṣiṣẹ́ tí ó tọ́ ń fi ìtẹ̀léntẹ̀le àwọn ìbéèrè tí ó parí àti ìpàdé tí ó dé «Initialization Sequence Completed». Tí ẹ̀rọ ìbánisọ̀rọ̀ bá dúró ní ìbéèrè kan náà, ìbáradé kùnà: tẹ àwọn ìlà gan-an tí sọ́kẹ́tì fi ránṣẹ́ jáde, ṣàyẹ̀wò àmì àyọká àti orúkọ ìbéèrè, kí o sì tún àpẹẹrẹ náà ṣe dípò fífi sleep kún un. Ọ̀nà abẹ́lẹ̀ tí ń ròyìn àṣeyọrí tí kò sì gbé ohunkóhun jẹ́ ìṣòro ìtọ́sọ́nà tàbí titari, kì í ṣe ti ẹ̀rí ìdánimọ̀.

Lẹ́yìn náà dán àtúnso mọ́ wò, kì í ṣe ìbẹ̀rẹ̀ àkọ́kọ́ nìkan. Gé ìpàdé ní ẹ̀gbẹ́ ẹ̀rọ ìpèsè kúrò tàbí dúró de àkókò rẹ̀; ẹ̀rọ ìbánisọ̀rọ̀ yóò béèrè lẹ́ẹ̀kan sí i, níbẹ̀ gan-an ni fáìlì tí ó dà bí ẹni tí ó tọ́ nígbà ìbẹ̀rẹ̀ yóò fi hàn bóyá ó ṣì kà fún àkọsílẹ̀ tí ń tún so mọ́.

Àwọn àpilẹ̀kọ tó jọra