我安装了SSH,但是我发现如果我使用原来的账户登录Ubuntu,它有太多的权限。
我想限制用户仅对 Ubuntu 中的特定文件夹具有权限。我该如何配置这样的用户?
答案1
这很简单。只需创建一个新用户,并将其主目录设置为您需要他访问的目录(此命令必须在sudo
root 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,并且可以使用一组有限/精选的命令。参考:
首先,创建一个名为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 用户无法执行命令。 曾有几次尝试(rbash
、scponly
、rssh
),但都不再被认为足够安全,并且大多被放弃了。
因此,您不必提供交互式 shell,而是可以向 SSH 用户提供一个命令,该命令允许管理指定目录内的文件,而不提供其他任何内容。
根据您要使用的网络文件访问协议,有多种选项:
选项 1:通过 SSH 进行 SFTP
使用ForceCommand
internal-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
连接。
配置
/etc/rsyncd.conf
以将 rsync 作为守护进程启动,并可以访问您想要公开的服务器上的文件,并且守护进程localhost
仅在接口上监听(使用127.0.0.1
而不是0.0.0.0
)。您
/etc/rsyncd.conf
还必须引用一个 secrets 文件。secrets 文件应包含一行,其中包含所需的用户名和密码username:password
。还请对您的 secrets 文件执行chmod 600
,否则 rsync 将拒绝使用它。例如:chmod 600 /etc/rsync/rsyncd-backup.secrets
username
在您的服务器上创建一个普通 SSH 用户。.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
。像这样从本地机器连接到 SSH 服务器(使用所谓的“rsync 守护进程符号”
::
和--rsh=ssh
选项):rsync -av --rsh=ssh username@remote_host::remote_dir local_dir/