root നൽകാതെ OpenVPN ന് CAP_NET_ADMIN നൽകുക
പ്രത്യേക അവകാശങ്ങളില്ലാത്ത ഉപയോക്താവായി ആരംഭിക്കുന്ന യൂണിറ്റിന് ഇപ്പോഴും ശരിയായ കഴിവുകളുടെ കൂട്ടം വേണം. യൂണിറ്റ്, ലൈവ് പ്രോസസ്, exec അതിർത്തി എന്ന ക്രമത്തിൽ പരിശോധിക്കുക.
സേവനം ആരംഭിക്കുന്നു, tun ഉപകരണം തുറക്കാനാകുന്നില്ലെന്ന് ലോഗ് പരാതിപ്പെടുന്നു, റൂട്ടുകൾ ഒരിക്കലും പ്രത്യക്ഷപ്പെടുന്നുമില്ല. നിങ്ങളുടെ ഷെല്ലിൽ capsh --print പ്രവർത്തിപ്പിക്കുക, cap_net_admin അവിടെത്തന്നെയുണ്ട്, ഇത് പരാജയത്തെ അസാധ്യമായി തോന്നിപ്പിക്കുന്നു. നിങ്ങളുടെ ഷെല്ലും യൂണിറ്റും തമ്മിൽ വ്യത്യാസപ്പെടുന്നത് അവകാശ കൈമാറ്റമാണ്, കർണലിന്റെ കഴിവ് നൽകാനുള്ള സന്നദ്ധതയല്ല. താഴെയുള്ള നാല് പരിശോധനകൾ ക്രമത്തിൽ ചെയ്ത് വ്യത്യാസം വിശദീകരിക്കുന്ന ആദ്യത്തേതിൽ നിർത്തുക.
നഷ്ടമായ കഴിവിനെ മറഞ്ഞ ഉപകരണത്തിൽ നിന്ന് വേർതിരിക്കുക
ലോഗ് വരിയിൽ നിന്ന് രണ്ട് പരാജയങ്ങളും ഒരുപോലെ തോന്നുന്നു. CAP_NET_ADMIN ഇല്ലാത്ത പ്രോസസിന് ടണൽ ഇന്റർഫേസ് സൃഷ്ടിക്കാനോ കോൺഫിഗർ ചെയ്യാനോ കഴിയില്ല, സാൻഡ്ബോക്സ് /dev/net/tun മറയ്ക്കുന്ന പ്രോസസിന് അത് തുടക്കത്തിലേ തുറക്കാനാകില്ല. കഴിവുകൾ ചേർക്കുന്നത് രണ്ടാമത്തെ കേസ് ശരിയാക്കില്ല.
എന്തെങ്കിലും തിരുത്തുന്നതിന് മുൻപ് ഉപകരണം സേവനത്തിന്റെ നെയിംസ്പേസിനുള്ളിൽ ഉണ്ടോ എന്ന് പരിശോധിക്കുക. PrivateDevices=yes tun നോഡ് പൂർണമായി നീക്കം ചെയ്യുന്ന സാധാരണ ഹാർഡനിംഗ് വരിയാണ്, നിയന്ത്രണാത്മകമായ ProtectSystem കോൺഫിഗറേഷൻ പാതയെ അനുമതി പിശകായി വായിക്കുന്ന വിധത്തിൽ വായന-മാത്രമാക്കാം. രണ്ടും ടണലിനെ പരാമർശിക്കുന്ന ലോഗ് വരികൾ സൃഷ്ടിക്കുന്നു, അതിനാലാണ് കുറ്റം കഴിവുകളിൽ ചാർത്തുന്നത്. ആദ്യം നോഡ് ഉണ്ടെന്നും തുറക്കാമെന്നും ഉറപ്പാക്കി പിന്നീട് മുന്നോട്ട് പോകുക.
നിങ്ങൾ ഏത് കഴിവ് കൂട്ടമാണ് നോക്കുന്നതെന്ന് അറിയുക
Linux അനുവദിച്ച, ഫലപ്രദമായ, പാരമ്പര്യമായ, പരിമിതപ്പെടുത്തുന്ന, പരിസ്ഥിതി കൂട്ടങ്ങൾ സൂക്ഷിക്കുന്നു, റൂട്ട് അല്ലാത്ത ഉപയോക്താവിന്റെ exec-നെ അതിജീവിക്കുന്നത് പരിസ്ഥിതി കൂട്ടമാണ്. ബൈനറിയിലെ ഫയൽ കഴിവുകൾ exec-ൽ അനുവദിച്ചതും ഫലപ്രദവുമായ അവകാശങ്ങൾ കൈമാറാം, പക്ഷേ ശൃംഖലയിൽ ഒന്നും ആ കൈമാറ്റം തടയാത്തിടത്തോളം മാത്രം.
ഇവിടെയാണ് sudo ആളുകളെ തെറ്റിദ്ധരിപ്പിക്കുന്നത്. sudo -u വഴി പ്രവർത്തിപ്പിക്കുന്ന കമാൻഡ് പുതിയ അവകാശ കൈമാറ്റം ആരംഭിക്കുന്നു, പരിസ്ഥിതി കൂട്ടം നഷ്ടപ്പെടുന്നു, അതിനാൽ root ആയി വിജയിക്കുന്ന അതേ പരിശോധന അവിടെ പരാജയപ്പെടുന്നു. സേവന മാനേജർ വീണ്ടും മറ്റൊരു കൈമാറ്റമാണ്, യൂണിറ്റ് പറയുന്നില്ലെങ്കിൽ അത് പരിസ്ഥിതിയിൽ ഒന്നും നൽകുന്നുമില്ല.
കഴിവ് യൂണിറ്റിൽ നൽകുക, റാപ്പറിൽ അല്ല
ഒരു ഉപകരണം സൃഷ്ടിക്കുകയും റൂട്ടുകൾ ഇൻസ്റ്റാൾ ചെയ്യുകയും വേണ്ട ടണലിനുള്ള ഏറ്റവും ചെറിയ സേവന വിഭാഗം ഇങ്ങനെയാണ്.
[Unit]
Description=OpenVPN client, office profile
After=network-online.target
[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.confAmbientCapabilities പ്രോസസ് ആരംഭിക്കുന്നതിന് മുൻപ് അവകാശം പരിസ്ഥിതി കൂട്ടത്തിൽ ഇടുന്നു, CapabilityBoundingSet ആ പട്ടികയ്ക്ക് പുറത്ത് എന്തെങ്കിലും പ്രോസസ് സൂക്ഷിക്കുന്നത് തടയുന്നു. NoNewPrivileges=yes setuid അല്ലെങ്കിൽ ഫയൽ കഴിവുകൾ വഴി അവകാശം നേടുന്നത് തടയുന്നു, യൂണിറ്റ് വ്യക്തമായി നൽകുന്ന കഴിവ് ഇപ്പോഴും ബാധകമാണ്. സേവനത്തിന് താഴ്ന്ന പോർട്ട് ബന്ധിക്കേണ്ടിവരുമ്പോൾ മാത്രം CAP_NET_BIND_SERVICE ചേർക്കുക, ഒരു ഫോറം ത്രെഡ് അങ്ങനെ ചെയ്തു എന്ന കാരണത്താൽ മാത്രം CAP_SYS_ADMIN ഒരിക്കലും ചേർക്കരുത്.
യൂണിറ്റ് ബൈനറിയെ sudo-ൽ പൊതിയുന്നുവെങ്കിൽ റാപ്പർ നീക്കുക. systemd ഇതിനകം User= പ്രയോഗിക്കുന്നു, ആ അധിക പാളിയാണ് പരിസ്ഥിതി കൂട്ടം ശൂന്യമാകാനുള്ള ഏറ്റവും സാധ്യതയുള്ള കാരണം.
യൂണിറ്റ് ഫയലിലല്ല, ലൈവ് പ്രോസസിൽ പരിശോധിക്കുക
മാനേജർ യഥാർത്ഥത്തിൽ എന്താണ് പ്രയോഗിച്ചതെന്ന് വായിക്കുക, പിന്നീട് അത് സൃഷ്ടിച്ച പ്രോസസ് വായിക്കുക.
unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/statusയൂണിറ്റ് കഴിവ് പട്ടികപ്പെടുത്തുന്നുവെങ്കിലും CapEff-ൽ അത് ഇപ്പോഴും ഇല്ലെങ്കിൽ, ഏതോ drop-in ക്രമീകരണം അതിലംഘിക്കുന്നു അല്ലെങ്കിൽ ExecStartPre ഘട്ടം പരിസ്ഥിതി മാറ്റുന്നു. പ്രധാന ഫയലാണ് അധികാരമുള്ളതെന്ന് കരുതുന്നതിന് മുൻപ് drop-in ഡയറക്ടറികളിൽ യൂണിറ്റിന്റെ പേര് തിരയുക, കാരണം പിന്നീടുള്ള ഫയൽ നിശബ്ദമായി വിജയിക്കുന്നു. യൂണിറ്റും പ്രോസസും കഴിവ് കാണിക്കുന്നുവെങ്കിലും ടണൽ ഇപ്പോഴും പരാജയപ്പെടുന്നുവെങ്കിൽ, പരിമിതപ്പെടുത്തുന്ന കൂട്ടം വിശാലമാക്കുന്നതിന് പകരം ഉപകരണ, പാത പരിശോധനകളിലേക്ക് മടങ്ങുക. അത് വിശാലമാക്കുന്നത് യഥാർത്ഥ കാരണം മറയ്ക്കുകയും സേവനത്തെ മുൻപത്തേക്കാൾ അധികാരമുള്ളതാക്കി വയ്ക്കുകയും ചെയ്യുന്നു.
ആരംഭത്തിന് ശേഷം അവകാശങ്ങൾ ഉപേക്ഷിക്കുന്നത് തിരഞ്ഞെടുക്കുക
OpenVPN അവകാശങ്ങളോടെ ആരംഭിച്ച് പിന്നീട് സ്വന്തം user, group ഓപ്ഷനുകൾ വഴി അവകാശമില്ലാത്ത അക്കൗണ്ടിലേക്ക് ഇറങ്ങാം, persist-key, persist-tun ടണലിനെ പിന്നീടും ഉപയോഗയോഗ്യമാക്കി നിർത്തുന്നു. ഈ ക്രമീകരണം പ്രോസസ് അവകാശങ്ങൾ കൈവശം വയ്ക്കുന്ന സമയവിന്യാസം ചുരുക്കുന്നു, സ്ഥിരമായ കഴിവുകളോടെ മുഴുവൻ ഡീമണും അവകാശമില്ലാതെ ആരംഭിക്കുന്നതിനേക്കാൾ ഇത് പലപ്പോഴും അനുയോജ്യമാണ്.
ഏത് മാതൃക തിരഞ്ഞെടുത്താലും യൂണിറ്റ് പുനരാരംഭിച്ച് റീബൂട്ടിന് ശേഷം പരിശോധനകൾ ആവർത്തിക്കുക, കാരണം ഇന്ററാക്ടീവ് root ഷെല്ലിൽ നിന്ന് പ്രവർത്തിക്കുകയും ബൂട്ടിൽ പരാജയപ്പെടുകയും ചെയ്യുന്ന സേവനം സാധാരണയായി കഴിവ്, ഉപകരണം, ഫയൽ അനുമതി എന്നിവയുടെ വ്യത്യാസമാണ്. യൂണിറ്റ് ക്രമീകരണങ്ങൾ പ്രോസസിന്റെ കഴിവ് ഔട്ട്പുട്ടിന് അടുത്ത് രേഖപ്പെടുത്തുക, അടുത്ത അവലോകകന് പാക്കേജ് അപ്ഡേറ്റോ drop-in-ഓ അതിർത്തി നീക്കിയോ എന്ന് കാണാൻ കഴിയും.