Tôi muốn cho phép hai loại xác thực này: khóa công khai + trình xác thực google HOẶC mật khẩu + trình xác thực google.

Tôi có những thứ sau trong của tôi sshd_config:

AuthenticationMethods publickey,keyboard-interactive:pam password,keyboard-interactive:pam
UsePAM yes
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication yes

Và trong /etc/pam.d/sshtôi bỏ ghi chú

#@include common-auth and added auth required pam_google_authenticator.so

ở cuối tệp.

Tuyến khóa + mã thông báo vẫn hoạt động, nhưng vì lý do nào đó mà mật khẩu của tôi luôn bị từ chối với thông báo "Quyền truy cập bị từ chối".

Tôi phát hiện ra rằng bất cứ khi nào tôi đặt UsePAMthành "có", xác thực mật khẩu không thành công. Không chắc chắn lý do tại sao?

Nội dung của /etc/pam.d/sshd: (tệp này có vẻ rất dài đối với tôi nhưng nó chỉ là mặc định cho ubuntu, có lẽ tôi có thể rút ngắn nó xuống?)

# PAM configuration for the Secure Shell service

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

# Disallow non-root logins when /etc/nologin exists.
account    required     pam_nologin.so

# Uncomment and edit /etc/security/access.conf if you need to set     complex
# access limits that are hard to express in sshd_config.
# account  required     pam_access.so

# Standard Un*x authorization.
@include common-account

# SELinux needs to be the first session rule.  This ensures that any
# lingering context has been cleared.  Without this it is possible     that a
# module could execute code in the wrong domain.
session [success=ok ignore=ignore module_unknown=ignore default=bad]            pam_selinux.so close

# Set the loginuid process attribute.
session    required     pam_loginuid.so

# Create a new session keyring.
session    optional     pam_keyinit.so force revoke

# Standard Un*x session setup and teardown.
@include common-session

# Print the message of the day upon successful login.
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session    optional     pam_motd.so  motd=/run/motd.dynamic noupdate
session    optional     pam_motd.so # [1]

# Print the status of the user's mailbox upon successful login.
session    optional     pam_mail.so standard noenv # [1]

# Set up user limits from /etc/security/limits.conf.
session    required     pam_limits.so

# Read environment variables from /etc/environment and
# /etc/security/pam_env.conf.
session    required     pam_env.so # [1]
# In Debian 4.0 (etch), locale-related environment variables were moved to
# /etc/default/locale, so read that as well.
session    required     pam_env.so user_readenv=1     envfile=/etc/default/locale

# SELinux needs to intervene at login time to ensure that the process     starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]            pam_selinux.so open

# Standard Un*x password updating.
@include common-password

auth required pam_google_authenticator.so

Nội dung của /etc/pam.d/common-auth:

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.).  The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules.  See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
auth    [success=1 default=ignore]  pam_unix.so nullok_secure
# here's the fallback if no module succeeds
auth    requisite           pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around 
auth    required            pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth    optional            pam_cap.so 
# end of pam-auth-update config

Câu hỏi của tôi thực sự được chia thành: Làm cách nào để sử dụng "UsePAM yes" cùng với "AuthenticationMethods password". Có lẽ tôi nên xóa câu hỏi này và mở một câu hỏi mới?

answer

I found out that whenever I set UsePAM to yes, the password authentication fails. Not sure why?

UsePAMtùy chọn làm cho phương pháp xác thực passwordsử dụng cùng một mô-đun PAM như bạn muốn sử dụng cho yếu tố thứ hai. Đây là lý do tại sao nó từ chối mật khẩu của bạn.


Đây là câu trả lời cho câu hỏi của bạn, giải thích "tại sao", nhưng không phải là giải pháp hoàn chỉnh "làm thế nào để làm cho nó tốt hơn". Việc thiết lập sự kết hợp này rất phức tạp. Tôi muốn học cách làm điều đó một cách đơn giản và chính xác, nhưng cho đến nay vẫn còn thời gian. Nhưng tôi cởi mở với những ý tưởng của bạn :)

Tôi đã dành cả buổi sáng để cố gắng làm cho cái này hoạt động. AFAIK bây giờ, phương pháp xác thực khóa công khai xảy ra BÊN NGOÀI ngăn xếp PAM.

Từ những gì tôi có thể quan sát, có ChallengeResponseAuthentication yesUsePAM yescó nghĩa là giá trị của PasswordAuthenticationhiệu quả bị bỏ qua và có thể được xem xét no. Điều này có nghĩa là passwordgiá trị của AuthenticationMethodsý chí luôn không thành công.

Điều này sẽ không thành vấn đề nếu chúng ta có thể quan sát trạng thái thành công hay thất bại của đăng nhập khóa công khai bên trong ngăn xếp PAM. Nhưng chúng tôi không thể - nó dường như được xử lý hoàn toàn bên trong SSH.

Điều này có nghĩa là chúng ta có thể làm (với tư cách là AuthenticationMethodscác tập hợp lệ ):

  • publickey và không có gì khác
  • Toàn bộ ngăn xếp PAM
  • publickey và toàn bộ ngăn xếp PAM

Nhưng không phải như chúng ta mong muốn, publickeyvà một phần của ngăn xếp PAM dựa trên việc có publickeythành công hay không.

Rất thích được chứng minh là sai về điều này!

Câu trả lời đơn giản là không thể yêu cầu hai yếu tố xác thực bằng mật khẩu, nhưng với một lời giải thích cho bạn sẽ giúp mọi thứ hoạt động. Bạn đang xem xác thực mật khẩu như một cách để sử dụng mật khẩu. Điều này là không đúng.

'xác thực mật khẩu' là một yêu cầu đơn giản cho một mật khẩu duy nhất. Không có lời nhắc cụ thể nào được máy chủ gửi đến máy khách. Ứng dụng khách sẽ chọn cách gắn nhãn lời nhắc - chẳng hạn như khi nó yêu cầu "Nhập mật khẩu cho user @ host :".

'keyboard-tương tác' là một yêu cầu phức tạp hơn đối với số lượng thông tin tùy ý. Đối với mỗi phần thông tin, máy chủ sẽ gửi nhãn cho lời nhắc. Hơn nữa, nó cho phép máy chủ cung cấp mô tả về dạng phản hồi mà nó mong đợi. Máy chủ cũng có thể chỉ định đầu vào nào là bí mật (mật khẩu cần được làm xáo trộn trên màn hình) và đầu vào nào không (OTP)

Trong phần lớn các trường hợp, xác thực tương tác với bàn phím được sử dụng để yêu cầu lời nhắc mật khẩu "bí mật" duy nhất, vì vậy hầu như không có bất kỳ sự khác biệt nào so với xác thực mật khẩu cho người dùng cuối.

Vì tương tác với bàn phím là cơ chế xác thực cho phép máy chủ gửi nhiều cặp phản hồi / thử thách, trình cắm PAM của Google Authenticator cần nó để gửi hai câu hỏi - mật khẩu và OTP.

Vì vậy, xác thực mật khẩu sẽ KHÔNG BAO GIỜ hoạt động với Google Authenticator, vì nó không có khả năng nhắc nhiều hơn một thứ. Google Authenticator sẽ hoạt động với khóa cá nhân và OTP vào lời nhắc mật khẩu (mặc dù không lý tưởng). Google Authenticator sẽ hoạt động tương tác với bàn phím với mật khẩu và OTP. Google Authenticator sẽ KHÔNG hoạt động với lời nhắc mật khẩu vì nó không thể yêu cầu thông tin phù hợp.

Trong phần mềm ứng dụng khách của bạn, hãy ưu tiên tính năng tương tác với bàn phím hơn mật khẩu và bạn sẽ được thiết lập với việc nhận hai lời nhắc với cấu hình hiện tại của mình. Để tránh gặp phải vấn đề này, chúng tôi có thể vô hiệu hóa hoàn toàn xác thực mật khẩu.

My question actually breaks down to: How do I use "UsePAM yes" together with "AuthenticationMethods password"

Để trả lời trực tiếp điều này, bạn không thể. Xóa mật khẩu làm phương pháp xác thực được hỗ trợ và dựa vào tính năng tương tác với bàn phím để xác thực mật khẩu của bạn. Đặt "PasswordAuthentication no" trong / etc / ssh / sshd_config

Vì vậy: / etc / ssh / sshd_config

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
PubkeyAuthentication yes
# I don't use AuthenticationMethods at all and rely on my yes/no's

/etc/pam.d/sshd (ở dưới cùng)

auth required pam_google_authenticator.so nullok