![将 ssh 限制到本地网络,git 用户除外](https://linux22.com/image/622433/%E5%B0%86%20ssh%20%E9%99%90%E5%88%B6%E5%88%B0%E6%9C%AC%E5%9C%B0%E7%BD%91%E7%BB%9C%EF%BC%8Cgit%20%E7%94%A8%E6%88%B7%E9%99%A4%E5%A4%96.png)
我有一台 Ubuntu 12.04 服务器,其中设置了 Gitlab 和 OpenVPN,作为我们的 git 和 vpn 服务器。
目前我已经在防火墙中打开了端口 1194,以用于 OpenVPN,并让用户通过 rsa 证书和 google 身份验证密钥进行身份验证。
我还没有打开防火墙来允许 SSH 通信,因为我不想让 SSH 完全暴露在 WAN 中。但是我们需要能够在不连接 VPN 的情况下进行推送和拉取。
如何仅为有限的 git 用户开放对 WAN 的 ssh 访问,同时允许管理员从 LAN 访问服务器?
我怀疑我应该在 sshd_config 文件中寻找使用匹配组的方向。正如这个问题所示:“如何设置 OpenSSH 每个用户的身份验证方法?“,有人有这方面的经验吗?
编辑:
我最初接受了使用 access.conf 来限制登录访问权限的答案。但后来的答案表明,也可以在 sshd.conf 中通过 match 指令或使用 username@hostaddress 语法来实现相同的目的。
一开始,我觉得将其放入 sshd 中更直观,而且其他管理员可能更容易维护和理解。与 sshd.conf 相比,使用 access.conf 有什么显著优势吗?
如果我要根据它们的直观程度对这里提到的选项进行排序,我会说:1. sshd.conf 2. access.conf 3. IpTables
你同意?
答案1
您可以使用以下方式控制用户从哪里登录允许群组,允许用户,拒绝群组, 和拒绝用户指令sshd_配置. 它们按以下顺序处理拒绝用户,允许用户,拒绝群组,允许群组。允许用户可以包括主机以及用户名;我认为其他人只允许名字。
假设你的
- LAN 是 192.168.1.0/24
- git 用户名是 git
- 管理员用户名为 alice 和 bob
在 sshd_config 中你会说
AllowUsers [email protected]/24 [email protected]/24 git
或者,你可以使用匹配指令。match 指令允许您根据条件(例如用户连接的地址)改变 sshd 的行为。
在全球部分sshd_配置你将会拥有
AllowUsers git
在文件末尾,你可以使用以下命令覆盖 LAN 中的此项
Match Address 192.168.1.0/24
AllowUsers alice bob git
答案2
您正在寻找pam_access
,使用它您可以配置 sshd 以接受来自本地网络的所有用户和来自任何地方的 git 用户的身份验证。
就像是:
+ : ALL : 10. crond :0 tty1 tty2 tty3 tty4 tty5 tty6
+ : git : ALL
- : ALL : ALL
在你的 access.conf 中应该可以解决问题
答案3
您可以使用 sshd_config 文件来控制每个用户/主机和网络的访问,除此之外,您还可以使用 iptables 以及 tcpwrappers。除了 iptables 之外,我建议您在这种情况下使用 tcpwrappers 来控制访问。使用 iptables:
使用 iptables 的 -s 选项。它接受格式为 nnn.nnn.nnn.nnn 或带有掩码的 IP(nnn.nnn.nnn.nnn/nnn.nnn.nnn.nnn 或 nnn.nnn.nnn.nnn/nn)。因此,为了允许来自 nnn.nnn.nnn.* 的连接,您可以编写
iptables -A INPUT -s nnn.nnn.nnn.0/255.255.255.0 -i em1 -p tcp --dport XXXXX -m state --state NEW,ESTABLISHED -j ACCEPT
或者
iptables -A INPUT -s nnn.nnn.nnn.0/24 -i em1 -p tcp --dport XXXXX -m state --state
如果您无法创建网络掩码,那么恐怕您必须为要允许连接到服务器的每个 IP 地址重复规则。
使用 tcp 包装器,打开 /etc/hosts.allow 以允许访问:
sshd: 192.168.0.0/255.255.255.0 1.2.3.4
上面它将允许您的 LAN 和单个 WAN IP,在本例中为 1.2.3.4。然后您可以简单地拒绝所有其他主机的访问。
拒绝访问:
在文本编辑器中打开文件 /etc/hosts.deny。此文件列出了不允许访问系统的主机/IP。要拒绝所有人使用 ssh,请执行以下操作:
sshd: ALL
请参阅以下内容TCP Wrapper 的参考请访问 RedHat 网站了解更多详细信息。
我的建议是您应该使用多层安全措施以使您的服务器更加安全,当然您应该对 ssh 使用基于密钥的密码身份验证。
答案4
使用 iptables 锁定盒子非常简单.....如果您想要的只是丢弃流量,除了用于 ssh 管理的单个 ip,并且本地 lan 可以达到 tcp/80(用于 http)
iptables -F
iptables -A INPUT -P tcp -p 22 -s [你的 IP 地址]/32 -j ACCEPT
iptables -A INPUT -P tcp -p 80 -s [你的本地网络地址]/[你的本地网络掩码] -j ACCEPT
iptables -A INPUT -j DROP
我不清楚您的内部网络地址/内部网络掩码是什么,但如果内部局域网是/16,并且网络地址是192.168.0.0,则这可能允许非rfc私有ip地址访问端口80(假设此配置位于具有直接传入ip流量的外围设备上)。
你可以也应该有更详细/更具体的 iptables 规则,但作为最低限度,这应该可以工作