এলডিএপি ব্যবহার করে এসএসএইচ কী প্রমাণীকরণ


59

সংক্ষেপে:

এলডিএপের মাধ্যমে এসএসএইচ কী প্রমাণীকরণ করার উপায় চাই।

সমস্যা:

আমরা ডিরেক্টরি পরিষেবাগুলির জন্য এলডিএপি (স্লাপড) ব্যবহার করি এবং আমরা সম্প্রতি বিল্ডিংয়ের দৃষ্টান্তগুলির জন্য আমাদের নিজস্ব এএমআই ব্যবহার করতে চলে এসেছি। এএমআই বিটটি যে কারণে গুরুত্বপূর্ণ তা হ'ল আদর্শভাবে , উদাহরণটি চলার সাথে সাথে আমরা কী প্রমাণীকরণের মাধ্যমে এসএসএইচে লগইন করতে সক্ষম হতে চাই এবং আমাদের কিছুটা ধীর কনফিগারেশন ম্যানেজমেন্ট টুলের জন্য কোনও স্ক্রিপ্ট যুক্ত করার জন্য অপেক্ষা করতে হবে না উদাহরণের সঠিক কী।

আদর্শ দৃশ্যটি হ'ল, এলডিএপটিতে কোনও ব্যবহারকারী যুক্ত করার সময় আমরা তাদের কীটিও যুক্ত করি এবং তারা তত্ক্ষণাত লগইন করতে সক্ষম হবে।

কী প্রমাণীকরণ একটি প্রয়োজনীয় কারণ পাসওয়ার্ড-ভিত্তিক লগইন উভয়ই কম সুরক্ষিত এবং বিরক্তিকর।

আমি এই প্রশ্নটি পড়েছি যা প্রস্তাব করে যে ওপেনএসএসএইচ-এর জন্য একটি প্যাচ রয়েছে যা এটি করার জন্য ওপেনএসএসএইচ-এলপিকে নামে পরিচিত তবে এটি আর ওপেনএসএসএইচ সার্ভারের সাথে প্রয়োজন নেই> = 6.2

ফাইল-সিস্টেম থেকে (অথবা পরিবর্তে) পরিবর্তে কমান্ড থেকে অনুমোদিত_কিগুলি আনার পক্ষে সমর্থন করার জন্য একটি sshd_config (5) বিকল্পযুক্ত AuthorizedKeysCommand যুক্ত করা হয়েছে। কমান্ডটি কোনও অনুমোদিত অ্যাকাউন্টস কম্যান্ডউজার sshd_config (5) বিকল্প দ্বারা নির্দিষ্ট অ্যাকাউন্টের অধীনে পরিচালিত হয়

এটি বাস্তবায়নের জন্য আমি কীভাবে ওপেনএসএইচ এবং এলডিএপ কনফিগার করব?

উত্তর:


64

ওপেনএসএসএইচ-এলপিকে স্কিমা অন্তর্ভুক্ত করতে এলডিএপি আপডেট করুন

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অভ্যন্তরীণ আরএফসি 1918 নেটওয়ার্কগুলি থেকে পাসওয়ার্ড প্রমাণীকরণের অনুমতি দেওয়ার জন্য আপডেট করুন এই প্রশ্নের হিসাবে:

কেবলমাত্র অভ্যন্তরীণ নেটওয়ার্ক থেকে এসএসএইচ সার্ভারে পাসওয়ার্ড প্রমাণীকরণের অনুমতি দিন

দরকারী লিংক:

সম্পাদনা: nobodyটিআরএস -80 প্রস্তাবিত হিসাবে ব্যবহারকারী যুক্ত করা হয়েছে


6
এটি দুর্দান্ত, যদিও আমি AuthorizedKeysCommandUser nobodyমূলের পরিবর্তে পরামর্শ দেব ।
টিআরএস -80

আমার ldapsearch বা সেড উভয়ের মধ্যে অবশ্যই আলাদা কিছু থাকতে হবে কারণ আপনার ব্ল্যাক ম্যাজিক কমান্ডের আউটপুটটি পাইপ করা আমাকে কোনও আউটপুট দেয় না, যদিও আমার সরল ldapsearch কমান্ড তথ্য ফিরিয়ে দিচ্ছে। আমি সেড ব্যবহার না করে আউটপুট পরিষ্কার করার জন্য একটি স্ক্রিপ্ট লিখতে যাচ্ছি।
ক্রিস এল

1
আমার পূর্ববর্তী মন্তব্য উপেক্ষা করুন। আমার সমস্যাটি sshPublicKey সম্পত্তিতে একটি পেছনের নতুন লাইন থাকার কারণে ঘটেছিল, যার ফলে ldapsearch পুরো জিনিসটিকে এনকোড করে 64 আমি সেড কমান্ডটি সহজ করে দিয়েছি:ldapsearch -u -LLL -o ldif-wrap=no '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n 's/^[ \t]*sshPublicKey:[ \t]*\(.*\)/\1/p'
ক্রিস এল

1
@ ক্রিস সত্যিই কম কালো যাদু, তবে সেড এখনও একবারে লেখার জন্য, 1-ওয়ে হ্যাশিং ফাংশন;)
ফ্রেইকে

1
আমার ওপেনএসএসএইচ সংস্করণে (5.3p1-122.el6) আছে AuthorizedKeysCommandRunAsএবং নেইAuthorizedKeysCommandUser
মভেরুন

5

Ldapsearch চালানোর সময় যে কেউ ত্রুটি পেয়েছে:

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

আমি যেমন (ফ্রিবিএসডি তে) ছিলাম ঠিক তেমনি প্রথম সেড কমান্ডটি এতে পরিবর্তন করা হবে:

/^ /{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

পিএইচপিএলডিএপ্যাডমিনে এসএসএইচ পাবলিক কী সহ কোনও ব্যবহারকারী যুক্ত করা হচ্ছে

প্রথমে "জেনেরিক: ইউজার অ্যাকাউন্ট" টেমপ্লেট দিয়ে একটি ব্যবহারকারী তৈরি করুন। তারপরে, "অবজেক্টক্লাস" বৈশিষ্ট্য বিভাগে যান, "মান যুক্ত করুন" ক্লিক করুন, এবং "ldapPublicKey" বৈশিষ্ট্যটি চয়ন করুন। আপনি জমা দেওয়ার পরে, ব্যবহারকারী সম্পাদনা পৃষ্ঠায় ফিরে যান, উপরের অংশে "নতুন বৈশিষ্ট্য যুক্ত করুন" এ ক্লিক করুন এবং "sshPublicKey" নির্বাচন করুন, পাঠ্য অঞ্চলে পাবলিক কীটি আটকে দিন এবং অবশেষে "অবজেক্ট আপডেট করুন" ক্লিক করুন ""

sshPublicKey অ্যাট্রিবিউট দেখাচ্ছে না - ওপেনলডিপ পিএইচপিএলড্যাপ এসএসএইচ কী প্রমাণীকরণ

উবুন্টু ক্লায়েন্ট:

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

এটি একটি সম্পূর্ণ উত্তর নয়, সি 4 স্বরের উত্তরের কেবল একটি সংযোজন । আমি এটি একটি মন্তব্য হিসাবে যুক্ত করা উচিত, কিন্তু আমার মন্তব্য করার যথেষ্ট খ্যাতি নেই, সুতরাং দয়া করে ডাউনोट করবেন না!

এটি আমি স্ক্রিপ্টটি ব্যবহার করছি AuthorizedKeysCommand(সি 4 স্বতঃআর ভার্সনের উপর ভিত্তি করে)। এটি বেস 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.