Suid फ़ाइलों से छुटकारा पाने के लिए sudo के बजाय UNIX सॉकेट पर SSH का उपयोग करना

फेडोरा सिल्वरब्लू और फेडोरा किनोइट परियोजनाओं के अनुरक्षक, रेड हैट के टिमोथी रेवियर ने सुडो उपयोगिता का उपयोग करने से बचने का एक तरीका प्रस्तावित किया, जो विशेषाधिकारों को बढ़ाने के लिए सुइड बिट का उपयोग करता है। सुडो के बजाय, एक सामान्य उपयोगकर्ता के लिए रूट अधिकारों के साथ कमांड निष्पादित करने के लिए, यूनिक्स सॉकेट के माध्यम से उसी सिस्टम के स्थानीय कनेक्शन के साथ एसएसएच उपयोगिता का उपयोग करना और एसएसएच कुंजी के आधार पर अनुमतियों का सत्यापन करना प्रस्तावित है।

Sudo के बजाय ssh का उपयोग करने से आप सिस्टम पर suid प्रोग्राम से छुटकारा पा सकते हैं और वितरण के होस्ट वातावरण में विशेषाधिकार प्राप्त कमांड के निष्पादन को सक्षम कर सकते हैं जो कंटेनर आइसोलेशन घटकों, जैसे फेडोरा सिल्वरब्लू, फेडोरा किनोइट, फेडोरा सेरिसिया और फेडोरा ओनिक्स का उपयोग करते हैं। पहुंच को प्रतिबंधित करने के लिए, USB टोकन (उदाहरण के लिए, Yubikey) का उपयोग करके प्राधिकरण की पुष्टि का अतिरिक्त उपयोग किया जा सकता है।

स्थानीय यूनिक्स सॉकेट के माध्यम से पहुंच के लिए ओपनएसएसएच सर्वर घटकों को कॉन्फ़िगर करने का एक उदाहरण (एक अलग एसएसएचडी उदाहरण अपनी कॉन्फ़िगरेशन फ़ाइल के साथ लॉन्च किया जाएगा):

/etc/systemd/system/sshd-unix.socket: [यूनिट] विवरण=OpenSSH सर्वर यूनिक्स सॉकेट दस्तावेज़ीकरण=man:sshd(8) man:sshd_config(5) [सॉकेट] लिसनस्ट्रीम=/run/sshd.sock स्वीकार करें=हाँ [इंस्टॉल करें] वांटेडबाय=सॉकेट.टारगेट

/ Etc / systemd / system /[ईमेल संरक्षित]: [यूनिट] विवरण=ओपनएसएसएच प्रति-कनेक्शन सर्वर डेमॉन (यूनिक्स सॉकेट) दस्तावेज़ीकरण=मैन:sshd(8) मैन:sshd_config(5) चाहता है=sshd-keygen.target After=sshd-keygen.target [सेवा] ExecStart=- /usr/sbin/sshd -i -f /etc/ssh/sshd_config_unix मानक इनपुट=सॉकेट

/etc/ssh/sshd_config_unix: # केवल कुंजी प्रमाणीकरण छोड़ता है PermitRootLogin निषेध-पासवर्ड पासवर्ड प्रमाणीकरण कोई PermitEmptyPasswords नहीं GSSAPIA प्रमाणीकरण नहीं # चयनित उपयोगकर्ताओं तक पहुंच प्रतिबंधित करता है अनुमति उपयोगकर्ता रूट व्यवस्थापक नाम # केवल .ssh/authorized_keys का उपयोग छोड़ता है (बिना .ssh/authorized_keys2 AuthorizedKeysFile .ssh /अधिकृत_कुंजियाँ # sftp सबसिस्टम सक्षम करें sftp /usr/libexec/openssh/sftp-server

सिस्टमडी यूनिट को सक्रिय करें और लॉन्च करें: sudo systemctl डेमॉन-रीलोड sudo systemctl सक्षम करें - अब sshd-unix.socket

अपनी SSH कुंजी को /root/.ssh/authorized_keys में जोड़ें

SSH क्लाइंट की स्थापना.

Socat उपयोगिता स्थापित करें: sudo dnf install socat

हम UNIX सॉकेट के माध्यम से पहुंच के लिए प्रॉक्सी के रूप में socat को निर्दिष्ट करके /.ssh/config को पूरक करते हैं: होस्ट होस्ट.लोकल उपयोगकर्ता रूट # कंटेनरों से काम करने के लिए /run के बजाय /run/host/run का उपयोग करें ProxyCommand socat - UNIX-CLIENT: / रन/होस्ट/रन/sshd.sock # SSH कुंजी का पथ IdentityFile ~/.ssh/keys/localroot # इंटरैक्टिव शेल के लिए TTY समर्थन सक्षम करें RequestTTY हाँ # अनावश्यक आउटपुट निकालें LogLevel QUIET

अपने वर्तमान स्वरूप में, उपयोगकर्ता व्यवस्थापक नाम अब पासवर्ड दर्ज किए बिना रूट के रूप में कमांड निष्पादित करने में सक्षम होगा। ऑपरेशन की जाँच: $ ssh होस्ट.स्थानीय [रूट ~]#

हम "sshhost.local" चलाने के लिए बैश में एक sudohost उपनाम बनाते हैं, जो sudo के समान है: sudohost() { if [[ ${#} -eq 0 ]]; फिर sshhost.local "cd \"${PWD}\"; निष्पादन \"${SHELL}\" --लॉगिन" अन्यथा ssh होस्ट.स्थानीय "cd \"${PWD}\"; निष्पादन \»${@}\»» फाई }

जांचें: $ sudohost id uid=0(root) gid=0(root)groups=0(root)

हम क्रेडेंशियल जोड़ते हैं और दो-कारक प्रमाणीकरण सक्षम करते हैं, रूट एक्सेस की अनुमति केवल तभी देते हैं जब यूबिकी यूएसबी टोकन डाला जाता है।

हम जाँचते हैं कि कौन से एल्गोरिदम मौजूदा Yubikey द्वारा समर्थित हैं: lsusb -v 2>/dev/null | ग्रेप -ए2 युबिको | ग्रेप "बीसीडीडिवाइस" | awk '{प्रिंट $2}'

यदि आउटपुट 5.2.3 या अधिक है, तो कुंजी बनाते समय ed25519-sk का उपयोग करें, अन्यथा ecdsa-sk का उपयोग करें: ssh-keygen -t ed25519-sk या ssh-keygen -t ecdsa-sk

सार्वजनिक कुंजी को /root/.ssh/authorized_keys में जोड़ता है

Sshd कॉन्फ़िगरेशन में एक कुंजी प्रकार बाइंडिंग जोड़ें: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [ईमेल संरक्षित],[ईमेल संरक्षित]

हम यूनिक्स सॉकेट तक पहुंच को केवल उस उपयोगकर्ता तक सीमित रखते हैं जिसके पास विशेषाधिकार उन्नत हो सकते हैं (हमारे उदाहरण में, व्यवस्थापक नाम)। /etc/systemd/system/sshd-unix.socket में जोड़ें: [सॉकेट] ... SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

स्रोत: opennet.ru

एक टिप्पणी जोड़ें