root ఇవ్వకుండా OpenVPN కు CAP_NET_ADMIN ఇవ్వడం
ప్రత్యేక హక్కులు లేని వినియోగదారుగా ప్రారంభమయ్యే యూనిట్కు ఇంకా సరైన సామర్థ్య సమితి అవసరం. యూనిట్, ప్రత్యక్ష ప్రక్రియ మరియు exec పరిమితిని ఈ క్రమంలో తనిఖీ చేయండి.
సేవ ప్రారంభమవుతుంది, tun పరికరాన్ని తెరవలేమని లాగ్ ఫిర్యాదు చేస్తుంది, మరియు మార్గాలు ఎప్పటికీ కనిపించవు. మీ షెల్లో capsh --print అమలు చేయండి మరియు cap_net_admin అక్కడే ఉంటుంది, ఇది వైఫల్యాన్ని అసంభవంగా చూపిస్తుంది. మీ షెల్ మరియు యూనిట్ మధ్య భిన్నమైనది హక్కుల మార్పిడి, కెర్నల్ సామర్థ్యాన్ని ఇవ్వాలనే సుముఖత కాదు. క్రింది నాలుగు తనిఖీలను క్రమంగా చేసి, భేదాన్ని వివరించే మొదటి దానిలో ఆగండి.
తప్పిపోయిన సామర్థ్యాన్ని దాచిన పరికరం నుండి వేరు చేయండి
లాగ్ లైన్ నుండి రెండు వైఫల్యాలు ఒకేలా కనిపిస్తాయి. CAP_NET_ADMIN లేని ప్రక్రియ టన్నెల్ ఇంటర్ఫేస్ను సృష్టించలేదు లేదా కాన్ఫిగర్ చేయలేదు, మరియు దాని శాండ్బాక్స్ /dev/net/tun ను దాచే ప్రక్రియ దానిని మొదటినుంచీ తెరవలేదు. సామర్థ్యాలు జోడించడం రెండవ సందర్భాన్ని సరిచేయదు.
ఏదైనా సవరించే ముందు పరికరం సేవ యొక్క పేరు స్థలంలో ఉందో లేదో తనిఖీ చేయండి. PrivateDevices=yes tun నోడ్ను పూర్తిగా తొలగించే సాధారణ కఠినతరం చేసే లైన్, మరియు పరిమితించే ProtectSystem కాన్ఫిగరేషన్ మార్గాన్ని అనుమతి లోపంగా చదవబడే విధంగా చదవడానికి-మాత్రమే చేయగలదు. రెండూ టన్నెల్ను ప్రస్తావించే లాగ్ లైన్లను ఉత్పత్తి చేస్తాయి, అందుకే సామర్థ్యాలపై నింద పడుతుంది. మొదట నోడ్ ఉందని మరియు తెరవగలమని నిర్ధారించుకుని, తర్వాత ముందుకు సాగండి.
మీరు ఏ సామర్థ్య సమితిని చూస్తున్నారో తెలుసుకోండి
Linux అనుమతించిన, ప్రభావవంతమైన, వారసత్వ, పరిమితించే మరియు పరిసర సమితులను ఉంచుతుంది, మరియు root కాని వినియోగదారు 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 పరిమితిని కదిలించిందో లేదో చూడగలరు.