Lek*_*eyn 134 ssh security port-forwarding
ændrük建议使用反向连接与其他人建立简单的 SSH 连接(用于远程帮助)。为此,需要一个额外的用户来接受连接。该用户需要能够通过服务器转发他的端口(服务器充当代理)。
如何创建只能执行上述操作的受限用户?
新用户不得:
总结一下,我如何创建一个只能连接到 SSH 服务器而没有特权的受限 SSH 用户,以便我可以通过该连接与他的计算机进行连接?
Lek*_*eyn 198
TL;DR - 转到答案的底部,“应用限制”
添加受限用户包括两部分: 1. 创建用户 2. 配置 SSH 守护进程 (sshd)
了解 SSH 可能性的最佳方式是阅读相关手册页:
在限制某些东西之前,您需要了解 SSH 的功能。翻阅手册页会产生:
从sshd(8) 手册页的身份验证部分:
如果客户端成功验证自己,则会进入准备会话的对话框。此时,客户端可能会请求诸如分配伪 tty、转发 X11 连接、转发 TCP 连接或通过安全通道转发身份验证代理连接之类的事情 。
此后,客户端要么请求 shell 要么执行命令。然后双方进入会话模式。在这种模式下,任何一方都可以随时发送数据,这些数据转发到/来自服务器端的shell或命令,以及客户端的用户终端。
改变行为的文件及其选项是:
~/.ssh/authorized_keys
- 包含允许连接的键,可以提供选项:
command="command"
- 用户提供的命令(如果有)被忽略。请注意,除非明确禁止,否则客户端可以指定 TCP 和/或 X11 转发。请注意,此选项适用于 shell、命令或子系统执行。no-agent-forwarding
- 当此密钥用于身份验证时,禁止身份验证代理转发。no-port-forwarding
- 使用此密钥进行身份验证时禁止 TCP 转发no-X11-forwarding
- “当此密钥用于身份验证时,禁止 X11 转发。”permitopen="host:port"
- 限制本地 'ssh -L' 端口转发,使其只能连接到指定的主机和端口。~/.ssh/environment
- 该文件在登录时被读入环境(如果存在)。默认情况下禁用环境处理,并通过 PermitUserEnvironment 选项控制~/.ssh/rc
- 包含要在用户的主目录可访问之前运行的初始化例程。/etc/ssh/sshd_config
- 系统范围的配置文件
AllowAgentForwarding
- 指定是否允许 ssh-agent(1) 转发。AllowTcpForwarding
ForceCommand
- “强制执行 ForceCommand 指定的命令,忽略客户端提供的任何命令和 ~/.ssh/rc(如果存在)。该命令是通过使用带有 -c 选项的用户登录 shell 调用的。”GatewayPorts
-》指定是否允许远程主机连接到客户端转发的端口。默认情况下,sshd(8) 将远程端口转发绑定到环回地址。这可以防止其他远程主机连接到转发端口。GatewayPorts 可用于指定sshd 应该允许远程端口转发绑定到非环回地址,从而允许其他主机连接。”PermitOpen
:
指定允许 TCP 端口转发的目的地。转发规范必须是以下形式之一:
Run Code Online (Sandbox Code Playgroud)PermitOpen host:port PermitOpen IPv4_addr:port PermitOpen [IPv6_addr]:port
可以通过用空格分隔它们来指定多个转发。'any' 参数可用于删除所有限制并允许任何转发请求。默认情况下,允许所有端口转发请求。
PermitTunnel
- 指定是否允许 tun(4) 设备转发。默认为“否”X11Forwarding
- 指定是否允许 X11 转发。默认为“否”修改系统范围的配置文件/etc/ssh/sshd_config
允许应用配置,即使应用了基于密码的身份验证或~/.ssh/authorized_keys
意外删除了限制。如果您修改了全局默认值,则应相应地取消对选项的注释。
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
Run Code Online (Sandbox Code Playgroud)
现在添加一个用户:
sudo useradd -m limited-user
Run Code Online (Sandbox Code Playgroud)
ForceCommand
如果外壳设置为非外壳/bin/false
(或/bin/true
),/bin/false -c [command]
则可以省略该选项,因为它不会执行任何操作。
现在客户端只能通过SSH连接到服务器环回地址上的62222端口(它不会监听公共IP地址)
禁用AllowTcpForwarding
也会禁止使用-R
,从而阻止使用此类受限帐户转发单个端口。PermitOpen localhost:62222
假设服务器上的端口 62222 从未被使用,因为客户端可以愉快地连接到它并监听它。
如果在系统范围的配置中允许 TCP 转发并禁用基于密码的身份验证,您也可以使用按密钥设置。编辑~/.ssh/authorized_keys
并在之前添加下一个选项ssh-
(选项和 之间有一个空格ssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
Run Code Online (Sandbox Code Playgroud)
为了确保它按预期工作,需要运行一些测试用例。在下面的命令中,host
如果未在~/.ssh/config
. 在命令后面,显示了应该在客户端或服务器(如指定)上执行的命令。
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
Run Code Online (Sandbox Code Playgroud)
清单:SSH 用户不应能够: