सवाल एलडीएपी का उपयोग कर एसएसएच कुंजी प्रमाणीकरण


संक्षेप में:

एलडीएपी के माध्यम से एसएसएच कुंजी प्रमाणीकरण करने का एक तरीका चाहते हैं।

संकट:

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

आदर्श परिदृश्य यह है कि, जब उपयोगकर्ता को एलडीएपी में जोड़ते हैं तो हम अपनी कुंजी भी जोड़ते हैं और वे तुरंत लॉगिन करने में सक्षम होंगे।

कुंजी प्रमाणीकरण एक है जरूर क्योंकि पासवर्ड-आधारित लॉगिन कम सुरक्षित और परेशान दोनों है।

मैने पढ़ा है यह प्रश्न जो सुझाव देता है कि ओपनएसएसएच के लिए एक पैच है जिसे ओपनएसएसएच-एलपीके कहा जाता है लेकिन इसे ओपनएसएसएच सर्वर> = 6.2 के साथ अब आवश्यक नहीं है

एक sshd_config (5) विकल्प अधिकृत KeysCommand जोड़ा गया      (या।) के अलावा कमांड से अधिकृत_की को लाने का समर्थन करें      फाइल सिस्टम से)। आदेश एक खाते के तहत चलाया जाता है      एक अधिकृत KeysCommandUser sshd_config (5) विकल्प द्वारा निर्दिष्ट

इसे कार्यान्वित करने के लिए मैं OpenSSH और LDAP को कैसे कॉन्फ़िगर कर सकता हूं?


50
2017-12-19 20:13


मूल




जवाब:


ओपनएसएसएच-एलपीके स्कीमा को शामिल करने के लिए एलडीएपी अपडेट करें

हमें पहले जोड़ने के लिए स्कीमा के साथ एलडीएपी अपडेट करने की आवश्यकता है sshPublicKey उपयोगकर्ताओं के लिए विशेषता:

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )

एक ऐसी स्क्रिप्ट बनाएं जो उपयोगकर्ता की सार्वजनिक कुंजी के लिए एलडीएपी से पूछताछ करे:

स्क्रिप्ट को उस उपयोगकर्ता के लिए सार्वजनिक कुंजी आउटपुट करना चाहिए, उदाहरण:

ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'

अद्यतन करें sshd_config पिछले चरण से लिपि को इंगित करने के लिए

  • AuthorizedKeysCommand /path/to/script
  • AuthorizedKeysCommandUser nobody

बोनस: अद्यतन करें sshd_config इस प्रश्न में देखा गया आंतरिक RFC1918 नेटवर्क से पासवर्ड प्रमाणीकरण की अनुमति देने के लिए:

केवल आंतरिक नेटवर्क से एसएसएच सर्वर को पासवर्ड प्रमाणीकरण की अनुमति दें

उपयोगी कड़ियाँ:

संपादित करें: जोड़ा गया उपयोगकर्ता nobody टीआरएस -80 के सुझाव के रूप में


57
2017-12-19 20:13



यह शानदार है, हालांकि मैं सुझाव दूंगा AuthorizedKeysCommandUser nobody रूट की बजाय। - TRS-80
मेरे ldapsearch या sed के बारे में कुछ अलग होना चाहिए क्योंकि आउटपुट को पाइपिंग सेड ब्लैक जादू कमांड में आपके पास कोई आउटपुट नहीं है, भले ही मेरा सादा ldapsearch कमांड डेटा लौटा रहा हो। मुझे sed का उपयोग करने के बजाय आउटपुट को साफ करने के लिए एक स्क्रिप्ट लिखनी होगी। - Chris L
मेरी पिछली टिप्पणी को रद्द करें। मेरी समस्या sshPublicKey प्रॉपर्टी में पिछली नई लाइन होने के कारण हुई थी, जो बदले में ldapsearch को बेस 64 को पूरी चीज एन्कोड करने का कारण बनती है। मैंने sed आदेश को सरलीकृत किया था: ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p' - Chris L
@ क्रिस वास्तव में कम काला जादू है, लेकिन sed अभी भी एक बार लिखना है, एक बार, 1-रास्ता हैशिंग समारोह;) - Froyke
ओपनएसएसएच (5.3p1-122.el6) के मेरे संस्करण पर है AuthorizedKeysCommandRunAs और नहीं AuthorizedKeysCommandUser - mveroone


Ldapsearch चलाते समय त्रुटि प्राप्त करने वाले किसी के लिए:

sed: 1: "/^ /{H;d};": extra characters at the end of d command

जैसा कि मैं था (फ्रीबीएसडी पर), फिक्स पहले sed कमांड को बदलने के लिए है:

/^ /{H;d;};

('डी' के बाद अर्धविराम जोड़ना)।


5
2018-03-08 13:18





बस मेरी "विधि" साझा करना चाहता था, मेरा ग्राहक पक्ष डेबियन / उबंटू विशिष्ट है, लेकिन मेरा सर्वर पक्ष मूल रूप से ऊपर जैसा ही है, लेकिन थोड़ा और "HowTo:" के साथ

सर्वर:

सार्वजनिक कुंजी विशेषता सक्षम करें:

क्रेडिट:

https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

cat << EOL >~/openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
EOL

अब ldif जोड़ने के लिए इसका इस्तेमाल करें:

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif

PhpLDAPadmin में एसएसएच पब्लिक की के साथ उपयोगकर्ता को जोड़ना

सबसे पहले, "सामान्य: उपयोगकर्ता खाता" टेम्पलेट वाला उपयोगकर्ता बनाएं। फिर, "ऑब्जेक्ट क्लास" विशेषता अनुभाग पर जाएं, "मान जोड़ें" पर क्लिक करें, और "ldapPublicKey" विशेषता चुनें। सबमिट करने के बाद, उपयोगकर्ता संपादन पृष्ठ पर वापस जाएं, शीर्ष भाग पर "नई विशेषता जोड़ें" पर क्लिक करें, और "sshPublicKey" चुनें, सार्वजनिक क्षेत्र को टेक्स्ट क्षेत्र में पेस्ट करें, और अंत में "ऑब्जेक्ट अपडेट करें" पर क्लिक करें। "

sshPublicKey विशेषता नहीं दिख रही है - ओपनएलडीएपी PHPLDAP एसएसएच कुंजी ऑथ

उबंटू ग्राहक:

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart

टेस्ट कुंजी बनाएं:

ssh-keygen -t rsa

4
2017-09-18 19:44





यह एक पूर्ण जवाब नहीं है, बस एक अतिरिक्त है c4urself का जवाब। मैं इसे एक टिप्पणी के रूप में जोड़ता, लेकिन मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए कृपया नीचे मत आना!

यह वह स्क्रिप्ट है जिसका मैं उपयोग कर रहा हूं AuthorizedKeysCommand (c4urself के संस्करण के आधार पर)। यह इस पर ध्यान दिए बिना कि बेस 64 एन्कोडिंग में मान वापस किया गया है या नहीं। यह विशेष रूप से उपयोगी हो सकता है यदि आप एलडीएपी में कई अधिकृत कुंजी स्टोर करना चाहते हैं - अधिकृत_की फाइल के समान, केवल नए अक्षरों वाले कुंजियों को अलग करें।

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey')
attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi

2
2017-11-15 10:39