/etc/ssh/sshd_config
上周我一直在摸索,试图找出如何阻止除了我自己之外的所有用户的 ssh 访问。
我的目标是除了我之外的所有用户都不可能通过 ssh 登录,并且我的帐户可以通过 2fa+密码或基于密钥的身份验证访问。我目前已经完成了后半部分的工作,但我不知道如何阻止除我自己之外的所有用户。我已经有了我希望在我的工作中工作的线路sshd_config
:
AllowUsers me
DenyUsers *
但是当我尝试 ssh 到另一个用户帐户(例如fred
)时,它仍然提示我使用Password:
.我还尝试在我的顶部添加以下行/etc/pam.d/sshd
:
auth required pam_succeed_if.so user ingroup ssh
而且小组里只有我自己ssh
。
我做错了什么来阻止除我之外的所有用户进行 ssh 访问?我必须使用 PAM,因为这就是我的 2fa 的工作原理。
答案1
使用access.conf
阻止ssh,并且仅使用ssh,登录不起作用。但是,可以通过使用pam_access
另一个配置文件来完成。
首先,必须将 PAM 配置为使用 pam_access。可能不是默认情况下。 PAM 配置account required pam_access.so
中应该有一行sshd
,可能是通过password-auth
配置文件,sshd 配置可能会包含该行。
在 Fedora 上,authselect
可用于启用 PAM 配置以使用 pam_access:
sudo authselect enable-feature with-pamaccess
此时,人们可能会认为可以通过access.conf
以下行来阻止访问:
-:username:sshd
这并不能防止用户名使用服务时免于访问sshd
。原因是 pam_access 联机帮助页中的这一点:
...或 PAM 服务名称(如果是)非联网的登录。
由于ssh是网络登录(PAM的RHOST
字段已定义),因此不使用服务名称。仅使用远程主机名、IP 地址、网络组等。
此联机帮助页并不完全准确,因为仅在非联网登录时才使用 PAM 服务名称和非 tty。本地登录,例如在控制台登录提示符、桌面问候语或运行 sudo 时,将使用关联的 tty 或 X 显示而不是服务名称。
实际上,服务名称仅用于后台登录,例如 atd 或 crond。因此,您不能仅以这种方式阻止 ssh,因为 access.conf 中无法过滤 ssh 与其他任何内容。
长话短说
人们可以限制所有远程登录,不仅可以使用 ssh,还可以使用所有其他服务,通过:
+:username:LOCAL
-:username:ALL
要仅应用于 ssh,必须将 PAM 配置为对 sshd 使用不同的 access.conf 文件。将这样的行添加到/etc/pam.d/sshd
,可能就在包含以下内容的行之前account include password-auth
:
account required pam_access.so accessfile=/etc/security/access-sshd.conf
现在创建/etc/security/access-sshd.conf
仅适用于 ssh 登录的访问控制。例子:
# Don't allow user 'username' access
-:username:ALL
# Only allow user 'trusted' access and no one else
-:ALL EXCEPT trusted:ALL
# Only allow user 'username' when they are coming from localhost
+:username:127.0.0.1 ::1
-:username:ALL
请注意,使用localhost
而不是数字 IPv4 和 IPv6 地址应该可以,但对我来说不行。