LDAP का उपयोग कर SSH कुंजी प्रमाणीकरण


59

संक्षेप में:

LDAP के माध्यम से SSH कुंजी प्रमाणीकरण करने का एक तरीका चाहेंगे।

मुसीबत:

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

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

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

मैंने यह प्रश्न पढ़ा है जो बताता है कि OpenSSH के लिए एक पैच है, जिसे OpenSSH-lpk कहा जाता है, लेकिन ऐसा करने के लिए OpenSSH सर्वर> = 6.2 की आवश्यकता नहीं है

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

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

जवाबों:


64

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

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

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 )
    )

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

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

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 नेटवर्क से पासवर्ड प्रमाणीकरण की अनुमति के लिए अद्यतन जैसा कि इस प्रश्न में देखा गया है:

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

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

EDIT: nobodyसुझावित TRS-80 के रूप में जोड़ा गया उपयोगकर्ता


6
यह शानदार है, हालांकि मैं AuthorizedKeysCommandUser nobodyरूट के बजाय सुझाव दूंगा।
TRS-80

मेरे ldapsearch या sed में से कुछ के बारे में कुछ अलग होना चाहिए क्योंकि आपके पास वहां मौजूद sed ब्लैक मैजिक कमांड को आउटपुट देने से मुझे कोई आउटपुट नहीं मिलता है, भले ही मेरा प्लेन ldapsearch कमांड डेटा वापस कर रहा हो। मैं sed का उपयोग करने के बजाय आउटपुट को साफ करने के लिए एक स्क्रिप्ट लिखने जा रहा हूं।
क्रिस एल

1
मेरी पिछली टिप्पणी की अवहेलना करें। मेरी समस्या sshPublicKey संपत्ति में एक नई अनुगामी होने के कारण हुई, जिसके कारण ldapsearch का आधार 6464 पूरी बात को कूटबद्ध करता है। मैंने sed कमांड को सरल बनाया:ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p'
Chris L

1
@ क्रिस वास्तव में कम काला जादू करता है, लेकिन सेड अभी भी एक बार लिखी गई है, 1-वे हैशिंग फ़ंक्शन;)
फ्रोके

1
OpenSSH के मेरे संस्करण पर (5.3p1-122.el6) वहाँ है AuthorizedKeysCommandRunAsऔर नहींAuthorizedKeysCommandUser
mveroone

5

Ldapsearch को चलाते समय किसी को भी त्रुटि होने पर:

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

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

/^ /{H;d;};

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


4

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

सर्वर:

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

क्रेडिट:

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 में SSH सार्वजनिक कुंजी वाला उपयोगकर्ता जोड़ना

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

sshPublicKey विशेषता नहीं दिखा रहा है - OpenLDAP PHPLDAP SSH कुंजी प्रामाणिक

Ubuntu ग्राहक:

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

3

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

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

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.