SystemD सेवा सुरक्षा सख्त करना (Hardening)
(roguesecurity.dev)- systemd शक्तिशाली service management features प्रदान करता है, लेकिन इसकी default settings सुरक्षा की बजाय उपयोगिता के लिए optimized होती हैं, इसलिए अलग से hardening options लागू करना ज़रूरी है
systemd-analyze securityकमांड के जरिए पूरे service या किसी खास service की security exposure metrics का विश्लेषण करके priority तय की जा सकती है- service unit स्तर पर लागू किए जा सकने वाले कई security options मौजूद हैं, और इन्हें
/etc/systemd/system/ServiceName.service.d/override.confआदि के जरिए अलग-अलग बदला जा सकता है - मुख्य options में
ProtectSystem,PrivateTmp,NoNewPrivileges,SystemCallFilter,MemoryDenyWriteExecuteआदि शामिल हैं, जो process permissions और resource access को सीमित करते हैं - perfect security को लक्ष्य बनाने की बजाय externally exposed services को पहले harden करके जोखिम घटाया जा सकता है, और self-hosting environments में भी इसका बड़ा असर होता है
systemd का अवलोकन
- systemd service management के लिए बहुत परिपक्व और मजबूत तरीका प्रदान करता है
- लेकिन सुरक्षा की बजाय तुरंत उपयोग में आसानी को प्राथमिकता देने के कारण इसकी default settings अपेक्षाकृत ढीली होती हैं
- यह दस्तावेज़ systemd service units और podman quadlet पर लागू किए जा सकने वाले कई security hardening options का परिचय देता है, ताकि compromise की संभावना घटे और compromise होने पर नुकसान का दायरा सीमित किया जा सके
- यह सभी services पर एक साथ लागू करने की guide नहीं है; हर service की प्रकृति और आवश्यक functionality के अनुसार अलग-अलग testing, log verification और tuning की ज़रूरत है
- infrastructure security की ज़िम्मेदारी पूरी तरह operator की है, और यह दस्तावेज़ केवल एक reference tool है
systemd सुरक्षा विश्लेषण
systemd-analyze securityकमांड से पूरे service security status की जाँच की जा सकती है या किसी specific service (जैसेsshd.service) की detailed settings का analysis किया जा सकता है- output में check status, feature name, description और Exposure score शामिल होते हैं; Exposure जितना अधिक होगा, जोखिम उतना बड़ा होगा
- security options को
[Service]section (systemd) या[Container]section (podman quadlet) में अतिरिक्त रूप से सेट किया जा सकता है systemctl edit ServiceName.serviceके जरिए override file बनाना recommended है, और failure होने पर आवश्यक permissions की जाँच कर उन्हें adjust करना चाहिए
service security options
- systemd कई तरह के security option keywords प्रदान करता है, जिन्हें
man systemd.exec 5,man capabilities 7आदि में देखा जा सकता है - प्रमुख security-related options
ProtectSystem→ filesystem को read-only तक सीमित करने वाला optionProtectHome→/home,/root,/run/useraccess block करने वाला optionPrivateDevices→ physical devices तक access block करके केवल/dev/nullजैसे virtual devices की अनुमति देने वाला optionProtectKernelTunables,ProtectKernelModules,ProtectKernelLogs→ kernel resources तक access block करने वाले optionsNoNewPrivileges→ setuid/setgid आदि के जरिए नए privileges हासिल करने से रोकने वाला optionMemoryDenyWriteExecute→ writable और executable memory के simultaneous उपयोग को block करने वाला option; कुछ JIT languages में समस्या हो सकती हैSystemCallFilter→ allowed system calls को सीमित करने वाला option; violation होने पर process terminate हो सकता है याEPERMलौटाया जा सकता है
प्रत्येक option का विवरण
- ProtectSystem:
strictसेट करने पर पूरे filesystem को read-only mount करता है;/dev,/proc,/sysके लिए अलग protection options चाहिए - ReadWritePaths: केवल कुछ paths को फिर से writable बनाने के लिए सेट किया जाता है
- ProtectHome:
/home,/root,/run/useraccess block करता है - PrivateDevices: physical devices तक access disable करता है और केवल
/dev/nullजैसे pseudo devices की अनुमति देता है - ProtectKernelTunables:
/proc,/sysको read-only बनाता है - ProtectControlGroups: cgroup के लिए केवल read-only access की अनुमति देता है
- ProtectKernelModules: kernel modules को explicit रूप से load करने पर रोक लगाता है
- ProtectKernelLogs: kernel log buffer तक access सीमित करता है
- ProtectProc:
invisibleसेट करने पर दूसरे users के processes को/proc/में छिपा देता है - ProcSubset: विशेष PID-संबंधित items के अलावा
/procकी अन्य सामग्री को block करता है - NoNewPrivileges: setuid, setgid, filesystem capability के जरिए नए privilege escalation को block करता है
- ProtectClock: system/hardware clock में write को block करता है
- SystemCallArchitectures:
nativeसेट करने पर केवल native syscalls जैसे x86-64 की अनुमति देता है - RestrictNamespaces: container-specific namespaces को सीमित करता है
- RestrictSUIDSGID: file setuid, setgid bits सेट करने पर रोक लगाता है
- LockPersonality: execution domain बदलने से रोकता है (आमतौर पर केवल legacy applications में ज़रूरी)
- RestrictRealtime: real-time scheduling को सीमित करता है (सिर्फ कुछ विशेष-purpose services के लिए ज़रूरी)
- RestrictAddressFamilies: allowed socket address families को सीमित करता है (जैसे
AF_INET,AF_INET6,AF_UNIXआदि) - MemoryDenyWriteExecute: writable+executable memory regions के नए निर्माण को block करता है (JIT इस्तेमाल करने वाली services सावधानी बरतें)
- ProtectHostname:
sethostname,setdomainnamesyscalls के उपयोग पर रोक लगाता है - SystemCallFilter: service-दर-service syscall allow/block सेटिंग देता है, जिससे fine-grained filtering संभव है
- groups, individual syscalls, allow/block modes आदि को adjust किया जा सकता है
- violation होने पर terminate करने की बजाय
EPERMजैसे error code लौटाने की setting भी supported है - पूरी सूची
systemd-analyze syscall-filterयाman systemd.exec(5)में देखी जा सकती है ~prefix से पूरी list को negate किया जा सकता है (उदाहरण:CapabilityBoundingSet=~CAP_SETUIDआदि)
SystemCallFilter प्रतिबंधों को समायोजित करने की प्रक्रिया
auditdका उपयोग करके service failure के समय कौन-सा syscall block हुआ, यह logs में देखा जा सकता हैsudo ausearch -i -m SECCOMP -ts recentचलाने के बाद syscall value की जाँच करें- संबंधित syscall या group को
SystemCallFilterमें जोड़कर क्रमशः समस्या हल की जा सकती है
hardening लागू करने की प्राथमिकता और संचालन संबंधी सुझाव
- सभी services पर सब कुछ लागू करना ज़रूरी नहीं है
- threat model और risk management सबसे महत्वपूर्ण हैं, खासकर externally exposed services (httpd, nginx, ssh आदि) पर इसे ज़रूर विचार करना चाहिए
- custom commands, timer units (cron के पुराने विकल्प) आदि पर भी इसे पहले से लागू करना प्रभावी हो सकता है
- जितनी कम जटिल service होगी, उतनी अधिक संभावना है कि उसमें fine tuning आसानी से की जा सके
चेकलिस्ट: recommended security option combination (प्रारंभिक लागू करने की प्राथमिकता)
ProtectSystem=strictPrivateTmp=yesProtectHome=yesयाProtectHome=tmpfsProtectClock=yes,ProtectKernelLogs=yes,ProtectKernelModules=yesRestrictSUIDGUID=yesUMask=0077LockPersonality=yesRestrictRealtime=yesMemoryDenyWriteExecute=yesDynamicUser=yesयाUserको root के अलावा किसी specific user पर सेट करना
- ऊपर दिए गए items आम तौर पर ऐसे combinations हैं जिन्हें services पर लगभग बिना असर के इस्तेमाल किया जा सकता है
- अतिरिक्त रूप से syscall filtering (
SystemCallFilter) लागू करनी हो तो detailed testing ज़रूरी है
Traefik उदाहरण configuration
- यह container-based Traefik service को systemd quadlet से चलाने और उस पर कई security options लागू करने का एक उदाहरण है
ProtectSystem=full,ProtectHome=yes,SystemCallFilter=@system-service @mount @privilegedआदि लागू किए गए हैंCapabilityBoundingSet=~CAP_SETUID CAP_SETPCAPके जरिए कुछ specific capabilities हटाई गई हैंRestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX AF_NETLINKआदि के जरिए network access restrictions लागू की गई हैं
निष्कर्ष
- systemd security hardening options Unix-परिवार के system administrators के toolbox में रखने लायक व्यावहारिक साधन हैं
- इन्हें perfect security solution नहीं, बल्कि risk कम करने वाले tool के रूप में उपयोग करना चाहिए, और हर service पर बिना सोचे-समझे security settings लागू करने की ज़रूरत नहीं है
- खासकर self-hosting environments के administrators के लिए यह security level बेहतर बनाने में बहुत मददगार हो सकता है
- "पूर्णता से अधिक व्यावहारिकता" को प्राथमिकता देते हुए, अपने काम और environment के अनुरूप सीमित रूप में भी इसे लागू करने की सिफारिश की जाती है
1 टिप्पणियां
Hacker News राय
मुझे यह दिलचस्प लगा कि automated systemd service hardening को
straceprofiling के ज़रिए लागू किया जा सकता हैhttps://github.com/desbma/shh
मुझे एक अच्छा तरीका मिला: उदाहरण में
ProtectSystem=का इस्तेमाल नहीं किया गया, लेकिनTemporaryFileSystem=/:ro, BindReadOnly=/usr/bin/binary /lib /lib64 /usr/lib usr/lib64जैसा सेट करने परआप सिर्फ़ मनचाही binary और जिन paths को पढ़ना है उन्हें ही शामिल कर सकते हैं
ProtectSystem=फिलहाल इस व्यवहार के साथ compatible नहीं हैज़्यादा जानकारी के लिए यहाँ देखें
मुझे लगता है कि यह तरीका उन services के लिए समस्या बन सकता है जिन्हें error होने पर email भेजने जैसे अतिरिक्त actions की ज़रूरत होती है
कल आए systemd hardening वाले लेख की तुलना में यह काफ़ी ज़्यादा व्यावहारिक है और इसमें तुरंत लागू किए जा सकने वाले अच्छे tips हैं
मैंने कल वाले लेख की comments में ज़्यादा वास्तविक examples देने की कोशिश की थी, लेकिन आज का लेख practical बातों को बहुत अच्छी तरह समेटता है और दिखाता है कि systemd के साथ isolation और security को तेज़ी और आसानी से कैसे मज़बूत किया जा सकता है
मुझे यह शानदार लेख लगा
संदर्भ के लिए कल वाला लेख भी छोड़ रहा हूँ
https://us.jlcarveth.dev/post/hardening-systemd.md
https://news.ycombinator.com/item?id=44928504
कुछ browsers में certificate error की वजह से access ही नहीं हो पाता
शेयर करने के लिए धन्यवाद
systemd-analyzeको--userflag के साथ इस्तेमाल करने पर systemd user units की security जाँची जा सकती है (systemd-analyze --user security)containers को Podman पर migrate करते समय मैंने systemd का ज़्यादा इस्तेमाल शुरू किया है, और यह tool systemd unit/container services की security बेहतर करने में बहुत मदद करेगा
पुराने init scripts सब अपनी-अपनी तरह के थे, इसलिए इस तरह का consistent hardening संभव नहीं था
मैंने Linux में काफ़ी देर से शुरुआत की, इसलिए systemd के बिना system की कल्पना करना मुश्किल है, और systemd के बिना systems संभालना बहुत असुविधाजनक था
हाल ही में मुझे
unsharetool मिला, जिससे/nixको पूरे का पूरा RW में remount करने जैसे experiments दूसरे processes को प्रभावित किए बिना किए जा सकेsystemd की usability थोड़ी अनगढ़ है, लेकिन ईमानदारी से कहूँ तो मेरे लिए इसका विकल्प सिर्फ़ Windows ही लगता है
मैं सोच रहा हूँ कि Linux distros इन security switches को default रूप से ज़्यादा क्यों enable नहीं करते
क्या conservative hardening के भी नुकसान हैं?
बहुत से users के लिए settings बहुत ज़्यादा और जटिल हो सकती हैं
अगर settings को बहुत aggressively बदल दिया जाए, तो अनजाने में मौजूदा config टूट सकती है
उदाहरण के लिए, अगर आपने NetworkManager को harden किया, तो आपको अलग-अलग जाँच करनी होगी कि IPv4 और IPv6 दोनों connect हो रहे हैं या नहीं,
dns=systemd-resolvedऔरdns=defaultmodes सही काम कर रहे हैं या नहीं, ModemManager और cellular integration,openvpnयाcisco anyconnectplugins, NetworkManager-dispatcher hooks वगैरह सब सही हैं या नहींयह भी सवाल है कि कितने distro maintainers को इतना भरोसा होगा कि वे अपने managed packages के switches को किस हद तक बदल सकते हैं बिना users के 0.01% से ज़्यादा environments तोड़े
अगर distros इन flags को manage करें, तो हर upstream release पर compatibility issues साथ आएँगे; और अगर upstream इन्हें सेट करे, तो backward compatibility की वजह से उन्हें और भी सावधानी से इस्तेमाल करना पड़ेगा
यह सवाल कुछ हद तक वैसा है जैसे, “distros default रूप से सख़्त MAC (SELinux आदि) क्यों नहीं इस्तेमाल करते?”
sshdजैसी चीज़ों पर भी ज़्यादा restrictions होना अच्छा होगा, लेकिनइन वजहों से major distros के लिए यह भारी पड़ता है
SELinux और AppArmor के मामले में भी maintainers को अक्सर investment के मुकाबले फायदा कम लगता है
एक बड़ा कारण यह भी है कि core system services के सामान्य व्यवहार को हर parameter के लिए अलग-अलग integration tests से जाँचने की क्षमता या resources नहीं होते
संबंधित चर्चा
https://news.ycombinator.com/item?id=29995566
systemd-analyze securityके results अलग-अलग distros में अलग होते हैंdesbma/shhstraceसे इकट्ठा की गई जानकारी के आधार परSyscallFilterजैसी unit-level rules अपने-आप generate करता है, जो SELinux केaudit2allowजैसा हैलेकिन production environment में
straceinstall करना विवादास्पद हो सकता हैhttps://github.com/desbma/shh
मुझे भी पूरी तरह नहीं पता, लेकिन कुछ settings नई जोड़ी गई हैं, इसलिए बहुत से users शायद उनसे परिचित नहीं हों
हर कोई systemd expert नहीं होता, और settings enable करने पर पुराने systemd versions में सही न चलने का जोखिम भी रहता है
SELinux, AppArmor जैसी कई features हैं, लेकिन बहुत से distros, developers और users को वे इतनी ज़रूरी नहीं लगतीं कि उन्हें automatic रूप से लागू किया जाए
hardening के लिए options इतने ज़्यादा हैं कि मुझे लगता है अलग-अलग सामान्य services के hardening examples का कोई repository होना चाहिए
users अक्सर shared hardening scripts का इस्तेमाल करते हैं, लेकिन तब पता चलता है कि exceptions से बचने के लिए उम्मीद से ज़्यादा permissions देनी पड़ती हैं
nixpkgsजैसे, जहाँ upstream support कमज़ोर हो, ऐसे distros में packaging करते समयmainstream distros packages को कैसे package और harden करते हैं, यह देखना सबसे उपयोगी होता है
ऐसे hardening तरीक़े आम तौर पर काफ़ी tested होते हैं, इसलिए अगर
postgresqlजैसी चीज़ों के hardening examples चाहिए हों, तो Debian, Ubuntu, RHEL packages से शुरुआत करना अच्छा रहेगाsystemd की बेहतरीन security features में से एक credentials management है
इसकी मदद से applications को credentials environment variables या file system में store करने की तुलना में ज़्यादा सुरक्षित तरीके से दिए जा सकते हैं
Vault वगैरह न होने वाले environments, जैसे personal projects में, मैं हमेशा यही तरीका पसंद करता हूँ
मैंने इस feature के साथ काम करने के लिए एक Go package भी खुद बनाया
systemd में credentials
credential-go package
यह कुछ वैसा लगता है जैसे nodejs या npm में 2-line code के लिए भी package बना दिया जाता है
असल में यह बस
left-padसे भी ज़्यादा जटिल नहीं हैजहाँ तक मुझे पता है, Go community में dependencies कम रखना और बेकार abstractions (जैसे function calls) से बचना एक गुण माना जाता था
इस तरह के साधारण काम तो लोग आम तौर पर मौके पर खुद ही लिख लेते थे
मैं जानना चाहता हूँ कि credentials देने का यह तरीका fork किए गए child processes तक credentials inherit होने से कैसे रोकता है
यह सच में बहुत उपयोगी लेख है
systemd के हर option की list, और “
manदेखो और शुभकामनाएँ” जैसी सलाह भी मुझे अच्छी लगीsystemd वाकई शानदार है और मैं इसे अपने servers पर सक्रिय रूप से deploy करना चाहता हूँ
एक छोटी सी tip: title में systemd की सही spelling
systemdही हैSystemD,system D,system dनहीं, बल्किsystemdसही हैवजह यह है कि इसका मतलब system daemon है, इसलिए Unix/Linux परंपरा के मुताबिक नाम का अंत छोटे
dसे किया गया हैमैं आम तौर पर इसे
systemDलिखते हुए देखता रहा हूँ, इसलिए सोचता हूँ कि यह इतना व्यापक कैसे हो गयाsystemd में syscall issues debug करने वाली tip सच में बहुत उपयोगी है