意图
我想允许 SSH root 访问我的服务器,但出于安全原因,只能从本地网络进行访问。
环境
- 操作系统:GNU/Linux Debian 9 Stretch 完全更新。
- SSH:OpenSSH 版本 1:7.4p1-10+deb9u3。
程序
在主配置文件中:
/etc/ssh/sshd_config
我删除了禁止直接 root 访问的全局行,即:
PermitRootLogin no
并将其设置如下:
# root is allowed from local network only Match Address 192.168.0.* PermitRootLogin yes # otherwise you need to log in as a user Match all PermitRootLogin no
我已暂时启用密码访问:
PasswordAuthentication yes
我已经为 root 帐户生成了私钥-公钥对:
ssh-keygen -t rsa -b 8192
当然,是在以 root 身份登录时。
然后在客户端笔记本电脑上,我使用以下命令复制了公钥:
ssh-copy-id [email protected] -p yyyyy # I have hidden the port number and ip
然后我就能够使用公钥作为 root 成功登录到我的服务器,因此我禁用了密码访问:
# use only public key, never a password PubkeyAuthentication yes PasswordAuthentication no AuthenticationMethods publickey
问题
我是否执行了所有必要的步骤,以使非本地计算机甚至无法尝试登录我的服务器?
如果我没有,请详细说明您的建议?
答案1
我是否执行了所有必要的步骤,以使非本地计算机甚至无法尝试登录我的服务器?
您阻止他们尝试登录您的服务器作为根用户。所以这会有所不同:
- 如果您为第二个帐户添加 SSH 密钥。
- 在任何此类维护步骤中,您临时启用了密码登录。除非你粗暴地断开网络与互联网的连接,但我注意到你在步骤中没有提到这一点。
如果您打算满足上述问题,那么直接编写代码似乎更好。例如,我相信您可以用一行控制所有用户的登录。这将避免需要“暂时”暴露于基于互联网的密码猜测攻击:-)。
AllowUsers *@192.168.0.*
但您不应该依赖 SSH 守护进程配置。您应该询问为什么不在中央防火墙中强制执行此策略。 例如,如果您不想进行非本地登录,则无需让自己暴露在 SSH 服务器的预身份验证代码中的假设错误中。
我将仅限于提出一条主动提出的建议。如果您改进本地系统以将主机名解析为 IPv6 地址,您可能会感到惊讶,即使是无意的。因为上面的内容不允许对 IPv6 地址进行任何连接:)。如果您纯粹依赖中央防火墙,那么您也不必担心这一点。
最简单的网络配置是拥有一个集中式防火墙,将您的本地网络与互联网流量(以及其他任何流量,例如访客无线网络)区分开来。阻止任何来自互联网的连接,除非您有特定原因允许连接。
这已被标准化为家庭/小型企业路由器的默认设置。 (您仍然应该验证这样的假设,因为这些设备非常便宜并且安全性受到挑战。这一特定问题是活动人士非常明显的问题做请注意,但众所周知,某些设备在首次实施 IPv6 时做出了“错误”选择)。
当然,如果您愿意,您也可以在主机本身上配置“冗余”防火墙。例如,这对于强制执行“默认不开放端口”策略可能很有用。乌班图或者德班。缺点是防火墙很难记住、配置,并且在它们破坏时进行故障排除,而现在您有两个独立的防火墙!从一到两个会显着增加复杂性,每次您想要开始使用纯服务器应用程序(例如 SSH)或未设计某些最可靠变体的点对点应用程序时打孔。
下一个最简单的网络配置是以 sshd 的方式添加冗余选项ListenAddress
。要添加一些 IPv6 支持,您可以确保您的路由器分配唯一本地地址以及全局可路由地址,并侦听唯一本地地址。当您拥有 IPv6 时,强制使用特定的ListenAddress
' 会增加实质性的安全裕度。这与您只有 IPv4 的时代不同,互联网无论如何都无法攻击您的服务器(因为 NAT),除非
- 您的服务器是路由器或
- 您有一个纯调制解调器,而不是调制解调器+路由器的组合,或者
- 你至少租了一间额外的全球IP地址,它已分配给您的服务器。
一般来说,使用防火墙仍然有意义(我不记得任何具体的例外),同时将诸如此类的东西视为ListenAddress
第二个安全边际。
不仅使用服务器自己的 IP 地址,还使用范围IMO 上列出的技术中,它是迄今为止最不理想的技术:)。