如何为端口转发创建受限 SSH 用户?

Lek*_*eyn 134 ssh security port-forwarding

ændrük建议使用反向连接与其他人建立简单的 SSH 连接(用于远程帮助)。为此,需要一个额外的用户来接受连接。该用户需要能够通过服务器转发他的端口(服务器充当代理)。

如何创建只能执行上述操作的受限用户?

新用户不得

  • 执行shell命令
  • 访问文件或上传文件到服务器
  • 使用服务器作为代理(例如 webproxy)
  • 访问由于防火墙而无法公开访问的本地服务
  • 杀死服务器

总结一下,我如何创建一个只能连接到 SSH 服务器而没有特权的受限 SSH 用户,以便我可以通过该连接与他的计算机进行连接?

Lek*_*eyn 198

TL;DR - 转到答案的底部,“应用限制”

添加受限用户包括两部分: 1. 创建用户 2. 配置 SSH 守护进程 (sshd)

配置sshd

了解 SSH 可能性的最佳方式是阅读相关手册页:

SSH 客户端可以在哪里执行操作?

在限制某些东西之前,您需要了解 SSH 的功能。翻阅手册页会产生:

  • Shell命令执行
  • 通过sftp上传文件
  • 转发端口
    • 客户端将(未)使用的端口转发到服务器
    • 服务器将他的端口转发给客户端
    • 服务器将另一台主机的端口转发给客户端(proxy-ish)
  • X11转发(显示转发)
  • 认证代理转发
  • 隧道设备转发

sshd(8) 手册页身份验证部分:

如果客户端成功验证自己,则会进入准备会话的对话框。此时,客户端可能会请求诸如分配伪 tty、转发 X11 连接、转发 TCP 连接或通过安全通道转发身份验证代理连接之类的事情 。

此后,客户端要么请求 shell 要么执行命令。然后双方进入会话模式。在这种模式下,任何一方都可以随时发送数据,这些数据转发到/来自服务器端的shell或命令,以及客户端的用户终端。

用于限制 SSH 功能的选项

改变行为的文件及其选项是:

  • ~/.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 端口转发的目的地。转发规范必须是以下形式之一:

      PermitOpen host:port
      PermitOpen IPv4_addr:port
      PermitOpen [IPv6_addr]:port
      
      Run Code Online (Sandbox Code Playgroud)

      可以通过用空格分隔它们来指定多个转发。'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 用户不应能够:

  • 执行 shell 命令 -完成
  • 访问文件或将文件上传到服务器 -完成
  • 使用服务器作为代理(例如 webproxy) -完成
  • 访问由于防火墙而无法公开访问的本地服务 -部分地,客户端无法访问除 62222 之外的其他端口,但可以侦听并连接到服务器上的端口 62222
  • 杀死服务器 -完成 (请注意,这些检查仅限于 SSH 服务器。如果您在机器上有其他易受攻击的服务,它可能允许可能的攻击者运行命令、杀死服务器等)

  • `authorized_keys` 中的 `from=` 选项也很有用。它允许您将密钥的使用限制为具有特定 IP 地址或主机名的源。例如,`from="1.1.1.1"` 或 `from="10.0.0.?,*.example.com"`。有关所有authorized_keys 选项,请参阅手册页(https://linux.die.net/man/8/sshd) 中的“AUTHORIZED_KEYS 文件格式”部分。 (4认同)
  • 为此,必须解锁由“useradd”添加的帐户。这可以通过用星号 (`*`) 替换 `/etc/shadow` 中的密码或使用 `sudo passwd limited-user` 设置密码来完成。 (3认同)
  • SFTP 工作是因为 SSH 服务器运行 `sftp-server` 命令。使用`ForceCommand`,这个命令将不再被执行。 (3认同)
  • 请注意,这会被持久的 ssh 连接破坏,所以当使用 `ssh -N` 连接时,你的 `~/.ssh/config` 文件中不应该有类似 `Host * ControlMaster auto` 的内容。如果确实需要,请使用`ssh -N -o ControlMaster=no` (3认同)
  • “AllowTcpForwarding local”禁止远程转发。(我不知道写这个答案时它是否存在。) (2认同)