أحاول تطبيق المصادقة الثنائية لـ OpenSSH. البيئة هي Centos 7 (kernel: 3.10.0-229.1.2.el7.x86_64) مع OpenSSH_6.6.1p1 و OpenSSL 1.0.1e-fips 11 فبراير 2013. لدينا Active Directory (LDAP) + Kerberos المنتشرة. المواصفات كما يلي:

  • يجب أن يُطلب من المستخدم الذي لديه تذكرة Kerberos موجودة وصالحة العامل الثاني فقط
  • يجب أن يُطلب من المستخدم الذي ليس لديه تذكرة Kerberos الحالية والصالحة لكل من كلمة المرور الخاصة به والعامل الثاني
  • يجب أن يتمكن المستخدمون المحليون (بدون حساب LDAP) من المصادقة باستخدام كلمات المرور المحلية الخاصة بهم
  • يجب عدم تقديم العامل الثاني قبل العامل الأول
  • بالإضافة إلى Kerberos ، يجب أيضًا قبول مصادقة المفتاح العام كعامل أول إذا كان ذلك متاحًا
  • يجب أن تكون الميزة مقتصرة على مجموعة من المستخدمين - يسمح للآخرين بالدخول بكلمات المرور الخاصة بهم

لإجراء عملية مصادقة العامل الثاني ، هناك وحدة PAM لجهة خارجية متاحة ولا تعرف شيئًا عن Kerberos. إذن هذا ما فعلته:

ضع هذه الأسطر في / etc / ssh / sshd_config:

# To enable PAM - this will make sshd use PAM with configuration /etc/pam.d/sshd
UsePam yes
ChallengeResponseAuthentication yes

# To enable Kerberos and public key authentication - it will let sshd use existing Kerberos tickets
GSSAPIAuthentication yes

# Enable public key authentication
PubkeyAuthentication yes

# Password validation should be done via the KDC
PasswordAuthentication yes
KerberosAuthentication yes
KerberosOrLocalPasswd yes

# Kerberos / Public Key + PAM
AuthenticationMethods gssapi-with-mic,keyboard-interactive:pam publickey,keyboard-interactive:pam password,keyboard-interactive:pam
# (only supported for OpenSSH 6.2 or higher)

قسم المصادقة لتهيئة PAM لـ sshd (/etc/pam.d/sshd)

auth       [success=ignore default=1] pam_localuser.so
auth       substack     password-auth
auth       [success=1 default=ignore] pam_localuser.so
auth       required     pam_2fa.so [...some arguments...]
auth       include      postlogin

الوحدة النمطية pam_2fa.so مسؤولة عن المطالبة بالعامل الثاني والتحقق منه.

الآن بالنسبة إلى Kerberos ، هذا يفعل كل ما أردت تحقيقه تقريبًا. ومع ذلك ، بالنسبة للحسابات المحلية ، يؤدي ذلك إلى مطالبتين متتاليتين بكلمة المرور. هذه هي مشكلتي الرئيسية هنا. هذا لأنه في هذه الحالة يتم استخدام المسار "password، keyboard-Interactive: pam" ، كما هو متوقع. (أحتاج إلى مسار المصادقة هذا بحيث يمكن لأي شخص لديه حساب Kerberos ولكن بدون بطاقة صالحة الحصول على تذكرة عن طريق إدخال كلمة المرور ثم OTP.) إذا قمت بإزالة الحزمة الفرعية للمصادقة بكلمة المرور تمامًا من تهيئة PAM ، فستظل حسابات Kerberos تعمل والحسابات المحلية لا تزال لا تعمل. بالنسبة لي ، يبدو أنه يتم تجاهل عبارة "نعم" KerberosOrLocalPasswd ، لأن UsePAM نعم موجود أيضًا. ومع ذلك ، فإن sshd يستمر بالفعل في استخدام KDC للتحقق من صحة كلمة المرور ، لأنه بخلاف ذلك لن يعمل مع حسابات LDAP أيضًا.

لذا مرة أخرى ، لتوضيح ما أرغب في تنفيذه هنا هو الرمز الكاذب الذي يصف منطق المصادقة المطلوب:

if gssapi_auth_ok(principal) or pubkey_auth_ok(pubkey):
  return second_factor_auth(user, read_otp())
else:
  if is_local_account(user):
    if local_passwd_auth(user, read_password()):
      return second_factor_auth(user, read_otp())
    else:
      return AUTH_ERR
  else:
    if krb5_auth(principal, read_password()):
      return second_factor_auth(user, read_otp())
    return AUTH_ERR

لذا أعتقد أن السيناريو الخاص بي ليس معقدًا جدًا أو طموحًا بأي شكل من الأشكال ، لكن ما زلت لا أجد طريقة واضحة لتنفيذه على الرغم من أنني أمضيت أيامًا في البحث والتجريب. هل يمكنك مساعدتي في إيجاد حل؟

شكرا جزيلا لك مقدما!

answer

لا أعرف أي طريقة لفعل ما تريد باستخدام PAM دون كتابة وحدة pam جديدة. PAM معقد نسبيًا والطريقة التي يتفاعل بها sshd مع PAM و kerberos كانت في تجربتي لدرجة أن هناك دائمًا حالة متطرفة لا تعمل.

قد يكون ما تريده ممكنًا ، لا أعرف كيف أفعله. إذا كنت بحاجة فقط إلى تأمين ssh ، فما أقترحه هو استخدامه

ForceCommand  /path/to/2fa_executable 

في ملف sshd_config الخاص بك. سيسمح لك هذا بتنفيذ المنطق الذي تريده ، والعيب هو أن 2fa_executable يحتاج إلى تعيينه لقراءة أي أسرار 2fa.

يوجد مثال ورمز على موقع Duo Security على الويب. يمكنك استخدام غلاف setuid الثنائي وأي كود 2fa تستخدمه.

تكوين Duo Unix

  • A user with an existing, valid Kerberos ticket must be asked only for the second factor.

لا يمكن تحقيق ذلك من خلال حزب الأصالة والمعاصرة.

المصادقة الناجحة القائمة على المفتاح والتي يتم إجراؤها مقابل sshd تتجاوز authكومة PAM. يتضمن هذا GSSAPI ، وهو مطلب لمصادقة Kerberos القائمة على البطاقة. ليس لديه خيار سوى القيام بذلك لأن PAM لم يتم تصميمه ببساطة مع وضع هذا النوع من المصادقة في الاعتبار.

UsePAM yesيقوم الإعداد بما يلي:

  • ChallengeResponseAuthenticationو PasswordAuthenticationسوف ربط authكومة من PAM للتحقق من صحة كلمة المرور. إن أي شكل من أشكال التوثيق غير هاتين الطريقتين لا تلمس authالمكدس.
  • عند المصادقة الناجحة ، accountسيتم استدعاء حزمة PAM لتحديد ما إذا كان المستخدم المصادق عليه مسموحًا بالوصول. (دائما)
  • و sessionسوف يطلق كومة من PAM للتعامل مع جلسة مهام الإعداد.

الملخص: لا توجد أي طريقة على الإطلاق للحصول على موجه مصادقة ثنائي موجود داخل authالحزمة لتنشيطه لشخص قام بالمصادقة باستخدام مفتاح GSSAPI أو ssh. يمكنك استخدام accountو sessionمداخن بالتزامن مع تلك أساليب المصادقة، ولكن هذا بقدر ما PAM سيذهب.

فيما يلي شرح لكيفية القيام بذلك https://cern-cert.github.io/pam_2fa/

  • الأساس: 2 عامل المصادقة مع بام
  • وحدة بام تتعرف أكثر على طرق مصادقة ssh:

    المصادقة [النجاح = 2 تجاهل = تجاهل الافتراضي = يموت] pam_ssh_user_auth.so

  • OpenSSH الأخير أو المصحح لفضح هذا إلى pam

    طرق المصادقة gssapi-with-mic ، لوحة المفاتيح التفاعلية: pam publickey ، لوحة المفاتيح التفاعلية: pam keyboard-Interactive: pam