用户只能访问一个文件

用户只能访问一个文件

我正在开发一款具有基于 Web 的 GUI 的设备,用于在 Ubuntu 无头系统上设置网络。最初,系统将设置为 DHCP,但初始配置之一是使用 GUI 为其应用静态 IP 地址。

我确信如果他们最终无意中提交了不正确通过 GUI 进行 TCP/IP 设置后,设备将重新启动或重启网络服务,但现在用户无法通过浏览器访问 GUI。

我正在考虑设置一个 Ubuntu“网络灾难”用户,其凭据为最终用户所知,这将允许他们仅通过终端会话(插入设备的键盘和显示器)登录系统。

但是,我只希望他们在登录后才能访问 /etc/network/interfaces。理想情况下,他们被锁定在他们的主文件夹中(或者可能将 /etc/network 设置为他们的主文件夹),并且无法在文件系统上导航到任何其他位置。他们唯一具有读/写权限的文件是接口文件。

这可能吗?我读过很多关于设置 SSH 用户等的帖子,但我还没有看到任何关于将一个用户限制在其主文件夹中的内容,仅此而已……?

答案1

您没有提到是否要阻止他们查看其他文件,因此这可能对您有用。

Sudo 允许您在 sudoers 文件中定义一个条目,该条目将允许特定的非特权用户以提升的权限发出带有特定参数的特定命令。

来自样品

# joe may su only to operator
joe     ALL = /usr/bin/su operator

看来这样的东西会对你有帮助;

joe     ALL = /bin/vi /etc/network/interfaces

或者更好

joe     ALL = /bin/vi /etc/network/interfaces.d/eth0.cfg

答案2

如果您只希望用户能够查看、访问和更改单个文件,vi 不是一个好选择。原因是任何使用 vi 的人都可以立即进入 vi 中的 shell 并运行他们想要的任何命令,尤其是当他们以 root 身份进入 vi 时,如果他们正在编辑,情况肯定如此/etc/network/interfaces。事实上,允许他们登录并获取任何类型的 shell 都会立即使您的目标失败。

以下是我建议您尝试的两部分解决方案:

概括:

  1. 允许用户仅通过 sftp 将特定文件传输到特定位置,而无需获取任何其他类型的 shell。
  2. 创建一个 cron 作业,自动检查更改并有条件地将“新”接口文件复制到位并重新启动网络。

指导:

  1. 设置只能使用 ssh 协议进行 sftp 应用程序的用户。以下帖子中接受的答案对我来说很有效:

    https://serverfault.com/questions/354615/allow-sftp-but-disallow-ssh

    笔记:

    • 为了方便起见,您也可以使用 sftponly 名称作为您的用户,因为 sftponly 组将自动生成
    • 用作/home/sftponly用户的主目录是完全可以接受的。这是我的用户 sftponly 在 /etc/passwd 中的样子:

      mgodby@mg-ws1:~$ grep sftponly /etc/passwd
      sftponly:x:1002:1002::/home/sftponly:/bin/false
      
    • 以 root 身份手动创建目录/home/sftponly并分配其所有权和权限,如下所示:

      mgodby@mg-ws1:/etc$ ls -l /home | grep sftponly
      drwxr-xr-x  2 root   root    4096 Aug 27 16:07 sftponly
      
    • 预先创建接口文件/home/sftponly并将权限更改为如下所示:

      mgodby@mg-ws1:~$ ls -l /home/sftponly
      total 4
      -rw-rw-r-- 1 sftponly sftponly 95 Aug 27 16:14 interfaces
      


  2. 现在我们已经创建了一个用户,其唯一的能力是通过 sftp 将一个名为“interfaces”的文件放入特定目录中,我们需要一个 cron 作业来自动将新interfaces文件付诸实施。

    • 在某处创建一个脚本(/root对于这个来说非常安全),使其可执行,然后将此处的内容粘贴到其中:新网
    • newnet.sh创建一个 cron 作业,每分钟运行一次脚本。如果我命名脚本并将其放入目录中, crontab 条目将如下所示/root

      * * * * * /root/newnet.sh
      
    • 这将启动一个 cron 任务,/home/sftponly/interfaces每 1 分钟自动检查一次与 的差异/etc/network/interfaces。如果发现任何差异,它将把新interfaces文件复制到位并重新启动所有托管网络接口。

请让我知道您是否可以接受这个解决方案。

答案3

使用以下方式限制他们登录到 TTY /etc/security/access.conf

-:poor_user:ALL EXCEPT tty1 tty2 # Other ttys if needed.

编写一个仅打开编辑器(以及一个弱编辑器)的自定义 shell:

//file: poor_shell.c
#include <unistd.h>
int main(void)
{
    execl("/usr/bin/nano", "nano", "/etc/network/interfaces", NULL);
}

编译,使其具有setuidroot 权限(或使/etc/network/interfaces组可写,并将其组设置为poor_user的组):

gcc -o poor_shell poor_shell.c
chown root:root poor_shell
cp poor_shell /bin
# Either
chmod u+s /bin/poor_shell
# Or:
chown root:poor_user /etc/network/interfaces
chmod g+w /etc/network/interfaces

并将该用户的 shell 设置为/bin/poor_shell

chsh poor_user /bin/poor_shell

相关内容