只允许特定用户通过 sshd 登录,但拒绝连接非列出的用户

只允许特定用户通过 sshd 登录,但拒绝连接非列出的用户

我正在运行 CentOS 服务器(7.0),我想以用户身份(而不是 root 身份)通过 sshd 登录。所以我PermitRootLogin no在配置文件中设置并su -在登录后进行设置。我收到了大量的黑客活动,因此我决定只允许一名用户通过 sshd 登录。由于用户名不是我的真实姓名或任何常用名,我认为这已经足够了。假设它是“hkbjhsqj”。

我已经尝试过 nixCraft 上介绍的两种方法:sshd_config 中的允许用户或者PAM 中的 pam_listfile.so。对我来说唯一的问题是其他人仍然有机会输入密码并在 /var/log/secure 中留下记录。我假设这些操作会消耗我的服务器资源来运行密码检查和其他操作。

假设我尝试使用用户名“admin”登录:

www$ ssh [email protected]
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

并在安全日志中:

Aug  8 08:28:40 www sshd[30497]: pam_unix(sshd:auth): check pass; user unknown
Aug  8 08:28:40 www sshd[30497]: pam_listfile(sshd:auth): Refused user admin for service sshd
Aug  8 08:28:43 www sshd[30497]: Failed password for invalid user admin from 192.168.0.1 port 52382 ssh2
Aug  8 08:28:47 www sshd[30497]: pam_unix(sshd:auth): check pass; user unknown
Aug  8 08:28:47 www sshd[30497]: pam_listfile(sshd:auth): Refused user admin for service sshd
Aug  8 08:28:50 www sshd[30497]: Failed password for invalid user admin from 192.168.0.1 port 52382 ssh2
Aug  8 08:28:52 www sshd[30497]: pam_unix(sshd:auth): check pass; user unknown
Aug  8 08:28:52 www sshd[30497]: pam_listfile(sshd:auth): Refused user admin for service sshd
Aug  8 08:28:55 www sshd[30497]: Failed password for invalid user admin from 192.168.0.1 port 52382 ssh2
Aug  8 08:28:55 www sshd[30497]: Connection closed by 192.168.0.1 [preauth]
Aug  8 08:28:55 www sshd[30497]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.1

如果我在 /etc/hosts.deny 中添加 IP,这一切都不会发生:

www$ ssh [email protected]
ssh_exchange_identification: Connection closed by remote host

并在安全日志中:

Aug  8 08:35:11 www sshd[30629]: refused connect from 192.168.0.1 (192.168.0.1)
Aug  8 08:35:30 www sshd[30638]: refused connect from 192.168.0.1 (192.168.0.1)

所以我的问题是,有没有一种方法可以拒绝来自任何地方的所有不相关用户的 ssh 请求,而无需进行密码检查,就像我将它们放入hosts.deny 列表中一样?但同时我确实需要允许来自任何地方的用户名“hkbjhsqj”的所有 ssh 请求,然后检查密码。

答案1

我认为不可能做到你所要求的。如果可以的话,有人可以“强力”在您的服务器上找到有效的用户名。我也非常确定用户名和密码是由客户端同时发送的,您可以通过在未加密的 SSH 连接上使用 Wireshark 捕获数据包来验证这一点。

通过“黑客活动”,我假设您正在谈论暴力尝试密码。有很多方法可以保护自己免受这种情况的影响,我将解释最常见的方法。

禁用 root 登录 通过拒绝使用 SSH 进行 root 登录,攻击者必须知道或猜测有效的用户名。大多数自动暴力攻击仅尝试以 root 身份登录。

身份验证失败时阻止 IP 像fail2ban和sshguard这样的守护进程会监视您的日志文件以检测登录失败。您可以将其配置为在多次登录尝试失败后阻止尝试登录的 IP 地址。对于你的情况,这就是我的建议。这可以减少日志垃圾邮件和服务器压力,因为来自该 IP 的所有数据包在到达 sshd 守护程序之前都会被阻止。例如,您可以设置fail2ban来阻止过去5分钟内有3次登录失败的IP,持续60分钟。在最坏的情况下,假设攻击者不放弃并继续前进,您将每 60 分钟在日志中看到 3 次登录失败。

公钥认证 您可以完全禁用密码身份验证,并仅允许具有特定密钥的客户端。这通常被认为是最安全的解决方案(假设客户端保持其密钥安全并加密)。要禁用密码身份验证,请将您的公钥添加到~/.ssh/authorized_keys服务器上并在 sshd_config 中设置PasswordAuthenticationno。有许多教程和工具可以帮助实现这一点。

答案2

如果您唯一关心的是日志记录量,则可以使用 sshd_config 中的 LogLevel 设置来减少日志记录量。

如果您想避免过度篡改您的 SSH 服务器,您可以使用类似fail2ban 的工具在一定次数的失败尝试后阻止 IP 地址。

相关内容