Ssh

如何配置 pam sshd 以允許不同使用者/組的不同規則?

  • December 4, 2016

我正在我工作的公司的出站伺服器上配置Google雙重身份驗證。

以下是相關配置 /etc/ssh/sshd_config

ubuntu@stage-itai-1:~$ egrep -v '^#' /etc/ssh/sshd_config  | sed '/^\s*$/d'
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication yes
PasswordAuthentication no
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes
Match Group gauth
   AuthenticationMethods publickey,keyboard-interactive

/etc/pam.d/sshd:

ubuntu@stage-itai-1:~$ egrep -v '^#' /etc/pam.d/sshd  | sed '/^\s*$/d'
auth required pam_google_authenticator.so nullok
account    required     pam_nologin.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_keyinit.so force revoke
@include common-session
session    optional     pam_motd.so  motd=/run/motd.dynamic noupdate
session    optional     pam_motd.so # [1]
session    optional     pam_mail.so standard noenv # [1]
session    required     pam_limits.so
session    required     pam_env.so # [1]
session    required     pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open
@include common-password

作為“gauth”組成員的使用者應該被強制提供公鑰和Google驗證碼,這是預期的和有效的。

不是“gauth”組成員的使用者應該被強制提供公鑰,但實際上他們可以在不提供公鑰或密碼的情況下連接到機器。

機器上有一個稱為“救援”的特殊使用者,該使用者應該被強制只提供密碼,其目的是永遠不會被鎖定在機器之外,但實際上使用者可以在沒有密碼的情況下連接密碼。

我的問題是,我如何執行我的“假定”規則,這意味著:

  • “gauth”組的使用者必須同時提供公鑰和 Google OTP
  • 不是“gauth”組成員的使用者只能通過提供公鑰登錄。
  • 使用者“rescue”應該只能通過提供密碼(或同時提供公鑰)登錄。

如何做呢?

編輯#1:

按照 FaCe 的回答,我的配置/etc/ssh/sshd_config如下:

對於整個文件,我已將 PasswordAuthentication 改回“是”,將“ChallengeResponseAuthentication”改回“否”,然後在文件底部添加以下行:

Match Group guath
   PasswordAuthentication no
   ChallengeResponseAuthentication yes
   AuthenticationMethods publickey,keyboard-interactive
Match User rescue
   PasswordAuthentication yes
   ChallengeResponseAuthentication no
   AuthenticationMethods password

重置 ssh 服務後我無法登錄,無論我使用哪個使用者,我都會收到以下錯誤:

ssh_exchange_identification: Connection closed by remote host

並且沒有任何內容顯示在/var/log/auth.log.

任何人都可以對此事有所了解嗎?

您需要使用多個匹配組指令:

Match Group foo
   # blah settings
Match Group bar
   # blah settings
   ...
Standard settings
Match Group guath
   PasswordAuthentication no
   ChallengeResponseAuthentication yes
   AuthenticationMethods publickey,keyboard-interactive

不確定您的 Ubuntu 版本,但在 Debian Jessie 上,ChallengeResponseAuthentication關鍵字不能是Match塊的一部分。根據man sshd_config

Only a subset of keywords may be used on the lines following a Match keyword. 

Available keywords are:
            AcceptEnv, AllowAgentForwarding, AllowGroups, AllowTcpForwarding, AllowUsers, AuthenticationMethods,
            AuthorizedKeysCommand, AuthorizedKeysCommandUser, AuthorizedKeysFile, AuthorizedPrincipalsFile, Banner,
            ChrootDirectory, DenyGroups, DenyUsers, ForceCommand, GatewayPorts, GSSAPIAuthentication,
            HostbasedAuthentication, HostbasedUsesNameFromPacketOnly, KbdInteractiveAuthentication,
            KerberosAuthentication, MaxAuthTries, MaxSessions, PasswordAuthentication, PermitEmptyPasswords,
            PermitOpen, PermitRootLogin, PermitTTY, PermitTunnel, PermitUserRC, PubkeyAuthentication, RekeyLimit,
            RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset, X11Forwarding and X11UseLocalHost.

引用自:https://serverfault.com/questions/783798