![通过 SSH 隧道传输 Web 流量时可以禁用交互式 shell 访问吗?](https://linux22.com/image/541502/%E9%80%9A%E8%BF%87%20SSH%20%E9%9A%A7%E9%81%93%E4%BC%A0%E8%BE%93%20Web%20%E6%B5%81%E9%87%8F%E6%97%B6%E5%8F%AF%E4%BB%A5%E7%A6%81%E7%94%A8%E4%BA%A4%E4%BA%92%E5%BC%8F%20shell%20%E8%AE%BF%E9%97%AE%E5%90%97%EF%BC%9F.png)
我正在研究实施 SSH 隧道作为一种廉价的 VPN 解决方案,以便外部用户访问仅面向 Intranet 的 Web 应用程序。
我目前正在使用安装了 OpenSSH 的 Ubuntu Server 10.04.1 64 位。
我正在 Windows 机器上使用 Putty 在本地端口上创建到我的 ssh 服务器的隧道。
start putty -D 9999 mysshserver.com -N
然后我告诉 Firefox 在 localhost:9999 上使用 SOCKS 代理。
-N 标志将禁用客户端的交互式 shell。有没有办法在服务器端执行此操作?
除了禁用 root 访问、使用 rsa 密钥身份验证和更改默认端口外,我还应该遵循其他明显的安全做法吗?我的目标是简单地隧道化网络流量。
答案1
四年后,这个答案值得更新。虽然我最初authorized_keys
自己使用过,并且可能在某些特定情况下仍会使用它,但您也可以使用中央sshd_config
服务器配置文件。
sshd_配置
您可以指定(针对您的特定用例)一个组,例如proxy-only
或Match
单个用户。在 中sshd_config
。这是在全局设置之后完成的,并撤销、重复或优化全局设置中给出的一些设置。
笔记:一些语法/指令sshd_config(5)
记录在man
页面中ssh_config(5)
。特别是一定要阅读图案部分ssh_config(5)
。
对于一个团体来说,这意味着你的Match
区块将像这样开始:
Match group proxy-only
您可以满足Match
以下条件:,,,,User
和。要满足多个条件Group
,只需用逗号分隔条件模式对(如上所述)。Host
LocalAddress
LocalPort
Address
group proxy-only
在这样的块内,通常会为了简洁而进行相应的缩进(但不需要),您可以声明要为用户组应用的设置,而不必authorized_keys
为该组的成员编辑每个文件。
的设置no-pty
将由authorized_keys
的设置镜像PermitTTY no
并command="/sbin/nologin"
变为ForceCommand /sbin/nologin
。
此外,您还可以设置更多设置以满足管理员的偏执,例如chroot
将用户进入他的主文件夹,最终得到如下结果:
Match group proxy-only
PermitTTY no
ForceCommand /sbin/nologin
ChrootDirectory %h
# Optionally enable these by un-commenting the needed line
# AllowTcpForwarding no
# GatewayPorts yes
# KbdInteractiveAuthentication no
# PasswordAuthentication no
# PubkeyAuthentication yes
# PermitRootLogin no
(请自行检查是否需要或想要注释掉的行,并根据需要取消注释)
是%h
一个由用户主目录替换的令牌(%u
将产生用户名和%%
百分号)。我发现它ChrootDirectory
对于限制我的sftp-only
用户特别有用:
Match group sftp-only
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
PasswordAuthentication no
请注意肯定指令可以在块中使用Match
。请参阅man
页面sshd_config(5)
了解详情(搜索Match
)。
授权密钥
注意:这句话下面的部分是我原来的答案。同时 - 但这也取决于您具体版本的功能sshd
- 在大多数情况下,我会采用上述方法。
是的,您可以尽可能细粒度地分配公钥。除了 ajdecon 推荐的 nologin 之外,我建议在密钥条目前面设置以下内容authorized_keys
:
no-pty ssh-rsa ...
no pty 告诉服务器端不应该为该键分配伪终端。
您还可以通过在前面添加以下内容来强制执行某些操作,例如针对特定键执行 nologin 操作:
command="/sbin/nologin",no-pty ssh-rsa ...
答案2
对于任何仅使用隧道的用户,请将其登录 shell 更改为 /sbin/nologin。这样,您的用户将无法访问服务器上的 shell,但仍可以从其客户端运行设置 ssh 隧道。
答案3
如果你准备放弃用户/密码验证并使用密钥登录,你可以指定范围每个公钥。
值得注意的参数包括:
命令=“命令”
指定每当使用此密钥进行身份验证时执行该命令。用户提供的命令(如果有)将被忽略。
和
限制
启用所有限制,即禁用端口、代理和 X11 转发,以及禁用 PTY 分配和 ~/.ssh/rc 的执行。
最后
转发端口 启用先前通过限制选项禁用的端口转发。
通过这些,您可以很大程度上限制特定密钥对的用户使用 SSH 会话可以执行的操作。
它看起来像这样:
restrict,port-forwarding,command="/sbin/nologin" ssh-rsa <base64-encoded key>
答案4
我建议尝试隧道工. 配置/管理起来要容易得多。