如何只允许特定用户从特定网络接口登录到 SSH 服务器?
例如
- eth0 是“外部”,eth1 是“内部”。
- user1 被信任可以从任何地方登录
- user2 只允许从“内部”登录
无法使用,AllowUsers user1@eth0
因为 AllowUsers 采用的是主机名而不是接口名。
该网站上的其他答案暗示了类似以下内容:
Match address 1.2.3.4/16 # eth0's network
AllowUsers user1
Match address 2.3.4.5/16 # eth1's network
AllowUsers user1,user2
Match address 0.0.0.0/0 # Match's equivalent of a closing brace?
但是,如果 eth0 使用 DHCP 服务器来获取其地址,那么它事先并不知道 1.2.3.4 是否是应放入 sshd_config 中的正确地址。
(如果这有区别的话,在 Ubuntu 12.04 上使用 OpenSSH)
答案1
我不知道如何在一个Match
块中做到这一点,并且你上面的评论表明这是不可能的(正如你在man
页面上提到的那样)。
但是如果你确定要通过界面进行用户限制 - 你的问题是这么说的 - 你可以运行两个sshd
,每个都有不同的sshd_config
指示它只在一个界面上监听,由ListenAddress
指令控制。
sshd
内部接口上的监听在其配置中可以有,AllowUsers user1 user2
而外部接口上的监听可以有AllowUsers user1
。我可能会通过组成员身份来做到这一点,并使用AllowGroups internal
/ AllowGroups internal external
,但这只是我的想法。
编辑: 在我看来,正确的做法是运行/usr/sbin/sshd -f /etc/ssh/sshd_config_inside
。/usr/sbin/sshd -f /etc/ssh/sshd_config_outside
安排它在启动时的工作方式,并确保你的服务启动/关闭文件做正确的事情,确实很重要,但这也是系统管理员需要做和要做的一件非常正常的事情。这是确实要做到这一点,不需要两个二进制文件,甚至不需要两个不同名称的同一个二进制文件。
答案2
我知道这是一个老问题,但我正在寻找一个无需启动 2 个 sshd 实例的解决方案。
参考您的具体问题以及 1.2.3.4/16 子网和 2.3.4.5/16 子网,您可以使用以下内容:
AllowUsers [email protected].* [email protected].* [email protected].*
参考:http://www.unixlore.net/articles/five-minutes-to-even-more-secure-ssh.html
对于我的网络,我使用以下命令允许用户 chris 从任何地方进行 ssh,但仅允许用户 1、用户 2 和用户 3 在我的内部网络 (192.168.0.0/24) 上进行 ssh:
AllowUsers chris [email protected].* [email protected].* [email protected].*
版本:Ubuntu 14.04.3 LTS 上的 SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3
答案3
Match address 1.2.3.4/16
无效,必须是Match address 1.2.0.0/16
。接口的网络地址不会改变,对吗?所以你得到什么 IP 都没关系。
另一个选择可能是(我没有这方面的个人经验)创建两个具有静态地址的虚拟接口,有两个 sshd 实例,每个实例仅绑定到其中一个地址,并从 DHCP 接口到虚拟接口进行 DNAT。
答案4
也许您可以编写一个小脚本来获取当前的 eth0 地址(从 ifconfig?)并在您的 sshd_config 中设置(使用 sed);如果我没记错的话,也可以编写钩子脚本在每次以太网接口关闭/启动时执行(这可以解决手动更新或通过 crontab 更新 sshd_config 文件的必要性)。