创建仅具有访问特定文件夹权限的 SSH 用户

创建仅具有访问特定文件夹权限的 SSH 用户

我安装了SSH,但是我发现如果我使用原来的账户登录Ubuntu,它有太多的权限。

我想限制用户仅对 Ubuntu 中的特定文件夹具有权限。我该如何配置这样的用户?

答案1

这很简单。只需创建一个新用户,并将其主目录设置为您需要他访问的目录(此命令必须在sudoroot shell 下或中运行):

adduser --home /restricted/directory restricted_user

这将创建一个用户restricted_user、一个目录/restricted/directory,然后设置该目录的权限,以便用户可以写入该目录。默认情况下,它不具备写入任何其他目录的能力。

如果您已经有目录,您可以运行带有附加选项的adduser命令--no-create-home并手动设置权限(也可以使用 root 权限),例如:

chown restricted_user:restricted_user /restricted/directory
chmod 755 /restricted/directory

如果您需要使该用户甚至无法访问全世界可写的目录,则有两种方法可以实现。

1)如果你想要为用户提供交互式 shell 会话,请考虑以下操作本手册创建 chroot jail(在您的 中/restricted/directory)。

之后,将以下内容添加到您的sshd_config

Match user restricted_user
  ChrootDirectory /restricted/directory

2) 如果您只需要他在他的连接端点和您的主机之间复制文件,那么一切都会变得容易得多。在您的末尾添加以下几行sshd_config

Match user restricted_user
  ForceCommand internal-sftp
  ChrootDirectory /restricted/directory

Subsystem       sftp    internal-sftp

然后在开头Subsystem sftp /usr/lib/openssh/sftp-server放置一个井号 ( )来注释掉。#

重新启动 SSH 服务器后(它不会在重新启动时终止交互式会话,因此即使您配置错误,它也是安全的;此外,在您检查是否仍然能够登录之前不会关闭您正在运行的会话),一切都应该按预期工作。

答案2

创建受限用户(使其无法离开给定目录(例如,到上层目录等))的最简单方法是使用受限 Shell,并且可以使用一组有限/精选的命令。参考:

http://man.he.net/man1/rbash

首先,创建一个名为rbash(以 root 用户身份运行)的符号链接。

ln -s /bin/bash /bin/rbash

然后只需使用此受限 Shell 创建一个普通用户,并将其主目录设置为所需的文件夹:

useradd -s /bin/rbash -d /home/restricted_folder username

即使没有受限 Shell,如果您明确不将此用户添加到 sudoer 列表或任何特殊组,那么它将默认受到限制。

使用受限 Shell 时,不允许或无法执行以下操作:

  • 使用 cd 更改目录

  • 设置或取消设置 SHELL、PATH、ENV 或 BASH_ENV 的值

  • 指定包含 / 的命令名称

  • 指定包含 / 的文件名作为 . 内置命令的参数

  • 将包含斜杠的文件名指定为 hash 内置命令的 -p 选项的参数

  • 启动时从 shell 环境导入函数定义

  • 在启动时从 shell 环境中解析 SHELLOPTS 的值

  • 使用 >、>|、<>、>&、&> 和 >> 重定向运算符重定向输出

  • 使用 exec 内置命令将 shell 替换为另一个命令

  • 使用 -f 和 -d 选项向启用内置命令添加或删除内置命令

  • 使用 enablebuiltin 命令启用已禁用的 shell 内置命令

  • 为命令内置命令指定 -p 选项

  • 使用 set +r 或 set +o restricted 关闭限制模式。

这些限制在任何启动文件之后强制执行

此外/可选地,为了限制用户只能使用一组有限的/挑选的命令,你可以创建一个对该用户只读的 .bash_profile,使用

PATH=$HOME/bin

并将您允许进入 ~/bin 文件夹的所有命令符号链接到该用户:

ln -s /bin/ls /home/restricted_folder/bin/ls
ln -s /bin/mkdir /home/restricted_folder/bin/mkdir
ln -s /bin/rm /home/restricted_folder/bin/rm

ETC。

高血压

答案3

如果您只是想对用户隐藏文件夹的内容,例如其他用户的主文件夹名称,只需将权限设置为 701。所有者可以执行任何操作,其他所有人只能进入该文件夹,但不能列出其内容或更改任何内容,除非他们具有 sudo 权限。

我为客户这样做。我确保顶级文件夹由 root 拥有,但具有 701 权限,并且每个子文件夹都归我想要操作的人所有。然后,我在他们的主文件夹中创建了一个指向新受限文件夹的链接。

如果他们“cd ..”他们可以看到路径,但不知道那里还有什么其他文件或文件夹。

答案4

我想限制用户只对 Ubuntu 中的特定文件夹具有权限。

这听起来你想选择此 SSH 用户有权访问的文件夹。因此,您不一定希望包含服务器上所有可供所有人读取的目录。

对于提供某种交互式 shell 的 SSH 用户来说,这很难甚至不可能实现,因为 SSH 用户无法执行命令。 曾有几次尝试(rbashscponlyrssh),但都不再被认为足够安全,并且大多被放弃了。

因此,您不必提供交互式 shell,而是可以向 SSH 用户提供一个命令,该命令允许管理指定目录内的文件,而不提供其他任何内容。

根据您要使用的网络文件访问协议,有多种选项:

选项 1:通过 SSH 进行 SFTP

使用ForceCommandinternal-sftp,正如在whitequark 的回答

选项 2:通过 SSH 进行 rsync

rsync是一种更快、更强大的网络文件访问协议,但不像 SFTP 那样对最终用户友好。换句话说,GUI 选项rsync非常有限:免费的 Linux 选项免费的 Windows 选项商业跨平台选项

要进行设置,请按照以下方法操作。它是rsync(1)手册页中“通过远程 shell 连接使用 rsync 守护进程功能”下提到的技术的变体:

有时,使用 rsync 守护进程的各种功能(如命名模块)很有用,而实际上不允许任何新的套接字连接进入系统(除了允许远程 shell 访问所需的连接之外)。Rsync 支持使用远程 shell 连接到主机,然后生成一次性使用的“守护进程”服务器,该服务器期望在远程用户的主目录中读取其配置文件。

区别仅在于,我们不生成一次性的rsyncd服务器端,而是使用永久运行的 rsync 服务器,该服务器仅对连接可用localhost。对于生成一次性的变体rsyncd 以及所有进一步的详细信息, 请参见这个要点archive.org 版本作为备份)。

以下说明将 SSH 访问限制为命令nc localhost 873,即转发到本地rsyncd服务器的连接。与没有 的任何方法相比rsyncd,可以使用 的强大功能进行访问管理rsyncd,而 SSH 传输安全可以保护未加密的rsyncd连接。

  1. 配置/etc/rsyncd.conf以将 rsync 作为守护进程启动,并可以访问您想要公开的服务器上的文件,并且守护进程localhost仅在接口上监听(使用127.0.0.1而不是0.0.0.0)。

  2. /etc/rsyncd.conf还必须引用一个 secrets 文件。secrets 文件应包含一行,其中包含所需的用户名和密码username:password。还请对您的 secrets 文件执行chmod 600,否则 rsync 将拒绝使用它。例如:

    chmod 600 /etc/rsync/rsyncd-backup.secrets
    
  3. username在您的服务器上创建一个普通 SSH 用户。

  4. .ssh/authorized_keys通过向该用户的文件中添加带有选项的单个 SSH 密钥来删除该新 SSH 用户的 shell 访问权限:

    # /home/username/.ssh/authorized_keys
    command="/bin/nc localhost 873",no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-rsa SSH_KEY_HERE
    

    选项解释:

    • command="/bin/nc localhost 873"localhost:强制该 SSH 用户登录后执行的命令为对端口 873的 netcat 调用,基本上rsyncd通过 SSH 转发连接。
    • no-port-forwarding:不允许端口转发。
    • no-agent-forwarding:不允许代理转发
    • no-X11-forwarding:不允许 X11 转发

    如果您想提供基于密码的登录,而不是密钥,您可以调整说明以使用ForceCommand而不是 中的关键选项字段~/.ssh/authorized_keys

  5. 像这样从本地机器连接到 SSH 服务器(使用所谓的“rsync 守护进程符号”::--rsh=ssh选项):

    rsync -av --rsh=ssh username@remote_host::remote_dir local_dir/
    
    

相关内容