VPN இணைப்புக்குப் பின் செயலை டீமானாக அல்ல, பயனராக இயக்கவும்
USER=alice எனக் கூறும் சூழல் மாறி hook எந்தக் கணக்கில் இயங்குகிறது என்பதை மாற்றாது. நிகழ்வு, தூண்டி, செயலைப் பிரித்து, பின்னர் UID-ஐ நிரூபிக்கவும்.
VPN டீமானின் இணைப்பு hook கள் டீமானாகவே இயங்குகின்றன, பொதுவாக அது அவை root ஆக இயங்குகின்றன என்பதைக் குறிக்கிறது. அந்த hook களில் ஒன்று யாராவது வீட்டு அடைவில் எழுதும்போது அல்லது டெஸ்க்டாப் உதவியாளரை மீண்டும் தொடங்கும்போது, நீங்கள் ஒரு வலைப்பிணைய நிகழ்வுக்கு எந்த உள்ளூர் பயனராகவும் செயல்படும் திறனைக் கொடுத்துள்ளீர்கள். வழக்கமான குறுக்குவழி, அதாவது சூழல் மாறியிலிருந்து பயனர் பெயரைப் படித்து அதை அனுப்புவது, அதைச் சரிசெய்யாது. அது செயலுக்கு மீண்டும் லேபிள் இடுகிறது, ஆனால் எந்தக் கணக்கு அதைச் செய்கிறது என்பதை மாற்றாது. வேலை செய்வது மூன்று பகுதி ஒப்படைப்பு, அதில் சிறப்புரிமை பெற்ற படி என்ன நடந்தது என்று சொல்கிறது, தனி அலகு சரியான அடையாளத்தில் செயலைச் செய்கிறது.
சூழலில் உள்ள பயனர் பெயர் அடையாள சுவிட்சு அல்ல
Unix ஒரு செயல்முறை எதைத் தொடலாம் என்பதை அதன் செயல்படும் பயனர் ID மூலம் தீர்மானிக்கிறது, அதன் சூழலில் உள்ள சரங்களால் அல்ல. USER=alice அமைப்பதோ LOGNAME ஏற்றுமதி செய்வதோ கவனக்குறைவான மென்பொருள் அதன் வெளியீட்டில் என்ன அச்சிடுகிறது என்பதை மாற்றுகிறது; கோப்பு உரிமைச் சரிபார்ப்புகளில் எதையும் மாற்றாது. அந்த மாறியுடன் root ஆக இயங்கும் hook இன்னும் root ஆகவே Alice இன் கோப்புகளைத் திறக்கிறது.
பெயர்களும் ஒரே பெயர் அல்ல. தொலை அணுகல் உள்நுழைவு, உள்ளூர் Unix கணக்கு மற்றும் சான்றிதழின் பொதுப் பெயர் ஆகியவை அடிக்கடி ஒத்துப்போகும், சில சமயங்களில் போகாத மூன்று அடையாளங்காட்டிகள். a.smith ஆக அங்கீகாரம் பெறும் பயனருக்கு உள்ளூர் கணக்கே இல்லாமல் இருக்கலாம், அல்லது அடைவு சேவை மூலம் asmith க்கு மேப் செய்யப்படலாம். ஒரு சரம் மூன்று பாத்திரங்களையும் செய்கிறது என்று கருதும் எந்த வடிவமைப்பும் முதல் ஒப்பந்ததாரரிடமே உடையும்.
எனவே முதல் கேள்வி «எந்தப் பயனர் இணைக்கப்பட்டுள்ளார்» அல்ல, மாறாக «எந்த உள்ளூர் கணக்குக்கு இந்தச் செயலைச் செய்ய அனுமதி உள்ளது» என்பதே. அதற்கு உங்கள் சொந்தக் கணக்கு தரவுத்தளத்திலிருந்து பதிலளிக்கவும், வாடிக்கையாளர் அனுப்பியதிலிருந்து அல்ல:
id -u alice
getent passwd alice | cut -d: -f1,3,6
stat -c '%U:%G %a %n' /home/alice/.local/state/vpn-status.json
மூன்றாவது கட்டளைதான் மக்கள் தவிர்ப்பது. இலக்குக் கோப்பு root உடையதாக இருந்தால், முந்தைய hook அதை உருவாக்கியதால், சரியாக உள்ளமைக்கப்பட்ட பயனர் செயல் systemd பிரச்சினை போலத் தோன்றும், ஆனால் அல்லாத ஒரு அனுமதிப் பிழையுடன் தோல்வியடையும்.
டீமான் தன் இடத்திலேயே இருக்கிறது
VPN சேவையின் சொந்த User= ஐ Alice ஆக மாற்றுவது தவறான நெம்புகோல். இது டீமான் இடைமுகங்களை எவ்வாறு பிணைக்கிறது, விசைகளை எவ்வாறு படிக்கிறது, தன் நிலைக் கோப்பை எவ்வாறு எழுதுகிறது மற்றும் வழித்தடங்களை எவ்வாறு நிர்வகிக்கிறது என்பதை மாற்றி, அந்த ஆபத்து முழுவதையும் வேலை செய்து கொண்டிருந்த அலகுக்குள் நகர்த்துகிறது. டீமானுக்கு அதன் சிறப்புரிமைகள் தேவை; அடுத்த செயலுக்குத் தேவையில்லை.
அலகைத் தொடுவதற்கு முன் அது உண்மையில் என்ன செய்கிறது என்பதைப் பாருங்கள். இரண்டு கட்டளைகள் செயலாக்க அடையாளத்தையும் நடைமுறையில் உள்ள சரியான கட்டளை வரிகளையும் சொல்கின்றன, ஒரு மேலெழுதல் சேர்த்த அனைத்தும் உட்பட:
systemctl show -p User -p Group -p ExecStart openvpn-server@server
systemctl cat openvpn-server@server
இயல்புநிலை தொகுப்பு நிறுவலில் டீமான் root, --up ஸ்கிரிப்ட் அதை மரபுரிமையாகப் பெறுகிறது. ஊகிப்பதற்குப் பதிலாக அதை உறுதிப்படுத்துங்கள், ஏனெனில் கடினமாக்கப்பட்ட விநியோகம் அதை அர்ப்பணிக்கப்பட்ட கணக்குக்கு நகர்த்தியிருக்கலாம், கையால் எழுதப்பட்ட drop-in வேறு விதிகளுடன் கூடிய உறையின் வழியாக hook ஐ இயக்கலாம்.
மூன்று பெயரிடப்பட்ட பகுதிகள், ஒரு குறுகிய தூண்டி
பராமரிப்பைத் தாங்கும் ஏற்பாட்டில் ஒரு நிகழ்வு, ஒரு தூண்டி மற்றும் ஒரு செயல் உள்ளன. டீமான் பெயரிடப்பட்ட அமர்வு எழுந்ததாகத் தெரிவிக்கிறது. தூண்டி அந்தச் சிறிய உண்மையை ஏற்று ஒரு நிலையான செயலைக் கேட்கிறது. செயல் தொடும் கோப்புகளின் உரிமையாளரான உள்ளூர் கணக்கின் கீழ் இயங்குகிறது. சங்கிலியில் எதுவும் தன்னிச்சையான கட்டளை பாதையை ஏற்கவில்லை.
செயல் தானே ஒரு சாதாரண சேவை அலகு, அடையாளம் என்பது அதற்குள் உள்ள ஒரு கட்டளை:
[Service]
Type=oneshot
User=alice
Group=alice
ExecStart=/usr/local/bin/refresh-vpn-status --slot %i
User=alice முழு அலகுக்கும் பொருந்தும் என்பதைக் கவனியுங்கள், மேலும் systemd தெரிந்துகொள்ளத் தகுந்த ஒரு விதிவிலக்கைப் பதிவு செய்கிறது: + முன்னொட்டு உள்ள கட்டளை அதைப் பொருட்படுத்தாமல் முழு சிறப்புரிமைகளுடன் இயங்குகிறது. அந்த முன்னொட்டு ஒரு சிறப்புரிமைப் படிக்கான சட்டப்பூர்வ கருவி, மேலும் நீங்கள் இப்போது கட்டிய பிரிப்பை ரத்து செய்யும் வசதியான வழி, எனவே அந்த அலகில் உள்ள எந்த + ஐயும் மறுஆய்வில் நியாயப்படுத்த வேண்டிய ஒன்றாகக் கருதுங்கள்.
தூண்டியின் உள்ளீட்டைக் குறைந்தபட்சமாகவும் ரகசியமற்றதாகவும் வைத்திருங்கள். அமர்வு அடையாளங்காட்டி, மேப் செய்யப்பட்ட கணக்கு மற்றும் நேர முத்திரை ஆகியவை பொதுவாகத் தேவையான அனைத்தும். எல்லைக்கு அப்பால் ஒரு shell துணுக்கு, இயக்கக்கூடிய கோப்புப் பாதை அல்லது வாடிக்கையாளர் வழங்கிய சூழல் தொகுதியை ஒருபோதும் அனுப்ப வேண்டாம், ஏனெனில் பெறும் தரப்புக்கு சட்டப்பூர்வ மதிப்பையும் உட்செலுத்தப்பட்ட மதிப்பையும் வேறுபடுத்த வழியில்லை.
உண்மையில் இயங்கிய அடையாளத்தைச் சரிபார்க்கவும்
உள்ளமைவு மறுஆய்வு சான்று அல்ல. அங்கீகரிக்கப்பட்ட சோதனை இணைப்புக்குப் பிறகு, கோப்பைத் தொட்ட UID ஐயும் டீமான் இன்னும் பயன்படுத்தும் UID ஐயும் உறுதிப்படுத்துங்கள்:
stat -c '%U %G %y %n' /home/alice/.local/state/vpn-status.json
ps -o user=,pid=,cmd= -p "$(pgrep -o -f 'openvpn --daemon')"
systemd-run --uid=alice --pipe /usr/local/bin/refresh-vpn-status --dry-run
முதல் வரி Alice ஐயும் உங்கள் சோதனைச் சாளரத்திற்குள் ஒரு நேர முத்திரையையும் காட்ட வேண்டும். இரண்டாவது இன்னும் root அல்லது தொகுப்பின் சேவைக் கணக்கைக் காட்ட வேண்டும், இது டீமான் நகரவில்லை என்பதை நிரூபிக்கிறது. மூன்றாவது உண்மையான மீள் இணைப்புக்காகக் காத்திராமல் செயலின் அனுமதிகளைச் சோதிக்கும் மலிவான வழி.
கோப்பின் உரிமையாளர் Alice ஆனால் அதன் குழு அல்லது பயன்முறை இயக்கங்களுக்கிடையே மாறியிருந்தால், தர்க்கப் பிழைக்குப் பதிலாக UMask= அல்லது அடைவு அனுமதி வேறுபாட்டைத் தேடுங்கள். நேர முத்திரை சிறிதும் நகரவில்லை என்றால், தூண்டி ஒருபோதும் எழவில்லை, பயனுள்ள அடுத்த படி மற்றொரு வாடிக்கையாளர் மீள் இணைப்பு அல்ல, செயல் அலகுக்கான journalctl -u ஆகும்.
இணைப்பு நிகழ்வு இன்னும் எதை நிரூபிக்கவில்லை
நிறுவப்பட்ட சுரங்கப்பாதை ஒரு உண்மை. டெஸ்க்டாப் அமர்வு திறக்கப்பட்டுள்ளது, அமர்வு பஸ் அணுகக்கூடியது, அல்லது செயல் விரும்பும் தனியார் வளம் இப்போது கிடைக்கிறது என்று அது பொருள் கொள்ளாது. Alice இன் UID கீழ் உள்ள oneshot அலகுக்கு அவரது அடையாளம் உள்ளது, அவரது அமர்வில் எதுவும் இல்லை, எனவே வரைகலை பஸ் தேவைப்படும் அனைத்தும் ஆதரிக்கப்படும் பயனர் அமர்வு முறைமையின் வழியாகச் செல்ல வேண்டும், அவர் வெளியேறியிருக்கும்போது என்ன நடக்கிறது என்பதை வரையறுக்க வேண்டும்.
மீள் இணைப்புகளும் திரும்பத் திரும்ப நடக்கின்றன. ரயிலில் தூங்கும் மடிக்கணினி ஒரு மணி நேரத்தில் ஒரு டஜன் இணைப்பு நிகழ்வுகளை உருவாக்கலாம், ஒவ்வொரு முறையும் ஒரு வரியைச் சேர்க்கும் hook நிலைக் கோப்பை யாரும் படிக்க முடியாத பதிவாக மாற்றுகிறது. செயலை இடெம்போடென்ட் ஆக்குங்கள், அல்லது அமர்வால் விசையிடப்பட்ட ஒரு பதிவை மாற்ற அனுமதியுங்கள்.
இறுதியாக, சேத ஆரத்தை அலகினுள்ளேயே வரம்பிடுங்கள்: நிலை அடைவுக்கு வெளியே படிக்க-மட்டும் கோப்பு முறைமைக் காட்சி, புதிய சிறப்புரிமைகள் இல்லை, மற்றும் வெளிப்படையான நேர வரம்பு. டீமானுக்கும் பயனர் செயலுக்கும் இடையிலான பிரிப்பு தனியாகவே மதிப்புள்ளது, ஆனால் நீங்கள் அங்கீகரித்த ஒன்றைத் தவிர செயலால் வேறு எதுவும் செய்ய முடியாதபோது அது மிக அதிக மதிப்புள்ளது.