أحاول تمكين المصادقة الثنائية مع ssh باستخدام libpam-google-Authenticator. لا يحتاج كل المستخدمين إلى تمكين المصادقة. كل شخص يستخدم مفاتيح ssh العامة ، ولا أحد لديه كلمة مرور. أنا أدير Debian buster ، وقد جربت أيضًا libpam-google-Authenticator من Bullseye.

مشكلتي هي أنه بغض النظر عما أضعه في تكوين PAM ، فإن المستخدمين الذين لم يتم تمكين المصادقة عليهم لا يتم تسجيل دخولهم مباشرة ، ولكنهم يطلبون دائمًا كلمة مرور .

لقد قمت بتثبيت libpam-google-Authentator وقمت بتكوين / etc / ssh / sshd_config باستخدام:

PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no
PermitEmptyPasswords no

لم أتمكن من تحديد تهيئة PAM الصحيحة بحيث يظل المستخدمون الذين ليس لديهم ملف .google_authenticator يسجلون الدخول. اعتمادًا على ما أستخدمه ، تتم مطالبة المستخدمين بكلمة مرور (ليس لديهم واحدة) ، أو لا مسموح به على الإطلاق.

في /etc/pam.d/sshd حاولت (مثل هذا محاولة الحصول على SSH باستخدام المفتاح العام (بدون كلمة مرور) + Google Authenticator يعمل على Ubuntu 14.04.1 ):

#@include common-auth
auth       required     pam_google_authenticator.so debug nullok

في هذه الحالة ، يتم رفض المستخدمين الذين ليس لديهم إعداد مصدق باستخدام التصحيح التالي ؛

Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: start of google_authenticator for "<user>"
Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: end of google_authenticator for "<user>" Result: The return value should be ignored by PAM dispatch
Aug 05 15:11:18 <host> sshd[746620]: error: PAM: Permission denied for <user> from <IP>

هل pam_permitهناك حاجة لإعداد الحالة الاحتياطية؟

لقد حاولت ايضا توليفات مختلفة من auth requiredو auth sufficientقبل وبعد @include common-authولكنها جميعا النتيجة في المستخدمين دون الموثق يتم طلب كلمة مرور والمستخدمين في بعض الأحيان مع الموثق يجري أيضا طلب كلمة مرور.

هل لدى أي شخص وصفة لإنجاح هذا؟

answer

هنا هو تكوين عملي. قام بعض المستخدمين بتمكين المصادقة والبعض الآخر لا يسمح بذلك ، ولا يُسمح إلا بتسجيل الدخول عبر SSH باستخدام المفاتيح العامة ، وليس كلمات المرور مطلقًا.

في / etc / ssh / sshd_config ،

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PermitEmptyPasswords no

في /etc/pam.d/sshd ،

# Standard Un*x authentication.
#@include common-auth

# Require authenticator, if not configured then allow
auth    required    pam_google_authenticator.so debug nullok
auth    required    pam_permit.so

@include comon-authيجب تعطيله لأنه يتضمن pam_unix ، الذي لا أريد استخدامه. ثم تحتاج pam_permitإلى جعل المصادقة ناجحة للمستخدمين بدون مصادقة (والتي يتم pam_google_authenticatorتجاهلها بدلاً من المرور).

هذا لا يزال لا يسمح بتسجيل الدخول إلى الجذر باستخدام مفتاح ssh ؛ سجلات sshd

sshd[1244501]: fatal: Internal error: PAM auth succeeded when it should have failed

تمت مناقشة ذلك في Google Authenticator PAM على SSH يمنع تسجيل الدخول إلى الجذر بدون 2FA .

بعد أن نجحت في العمل على النحو الوارد أعلاه ، أعتقد أنه من الأجمل فعلاً فرض 2FA لمجموعات معينة باستخدام تكوين SSH كما اقترحzoredache. يتيح لك هذا بسهولة إضافة عناوين IP معينة إلى القائمة البيضاء على أنها لا تتطلب 2FA أيضًا. في هذه الحالة ، يقول sshd_config على سبيل المثال

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
#AuthenticationMethods any # default
PermitEmptyPasswords no

Match Group adm Address *,!172.16.1.0/24
    AuthenticationMethods publickey,keyboard-interactive

و /etc/pam.d/ssh يقول

 Standard Un*x authentication.
#@include common-auth

# Require authenticator; SSH should not allow any user in who doesn't have it
auth       sufficient   pam_google_authenticator.so debug nullok
auth       requisite    pam_deny.so

لا أعتقد أنك بحاجة أو تريد التعليق على @include common-auth. أو على الأقل لم أفعل ويبدو أنه يعمل بشكل صحيح. لكنني ما زلت في الغالب أختبر هذا.

Does anyone have a recipe to make this work?

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

- hosts: linux_systems
  tasks:

  - name: Add group 'totp'
    group:
      name: totp
      state: present
      system: yes

  - name: Create directory for totp secrets
    file:
      state: directory
      path: /var/lib/google-authenticator
      owner: "0"
      group: "0"
      mode: "0700"

  - name: install libpam-google-authenticator
    apt:
      update_cache: yes
      cache_valid_time: '{{ apt_cache_valid_time | default(7200) }}'
      state: present
      name:
      - libpam-google-authenticator

  - name: Create secret for 'example-user'
    args:
      creates: /var/lib/google-authenticator/example-user
    shell: |
      TOTP_USER=example-user; \
      google-authenticator \
        --force --quiet \
        --emergency-codes=10 \
        --time-based \
        --qr-mode=none \
        --allow-reuse \
        --window-size=3 \
        --rate-limit=4 --rate-time=30 \
        --secret=/var/lib/google-authenticator/${TOTP_USER}

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/login
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/sshd
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update sshd ChallengeResponseAuthentication
    notify: Restart sshd
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: '^ChallengeResponseAuthentication .*'
      line: 'ChallengeResponseAuthentication yes'

  handlers:

  - name: Restart sshd
    service:
      name: sshd
      state: restarted