添加只能远程执行脚本的用户


14

我想创建一个只能做一件事的用户:通过ssh指定一个脚本(和脚本的命令行参数),该脚本驻留在一个特定的文件夹中(出于这个问题的目的,让我们称它为/local/remote_only_scripts/foo)并执行该脚本并返回它的输出。

为了清楚起见,我不希望用户能够执行以下操作:

  • 在本地登录到该帐户。登录应用程序是/bin/login。它不是/local/remote_only_scripts/foo文件夹中的脚本,因此不应由用户调用。
  • 远程登录帐户。再次登录(是ssh调用的内容?)不是相关文件夹中的脚本。
  • 列出目录的内容。ls在/bin/ls。它不是相应目录中的脚本。
  • 编辑该目录中的文件。emacs,vi,gedit大多数其他编辑器都不是该目录中的脚本。
  • 查看该目录中文件的内容。
  • 在该目录中执行他没有执行权限的文件。

请注意,这些是示例,还有许多其他我不希望用户执行的操作。在考虑一个动作时,问“这是由脚本来完成的/local/remote_only_scripts/foo吗?” 如果答案是否定的,则用户将无法执行此操作。如果答案是肯定的,那么用户应该能够做到。

PS:让我澄清一下“添加用户”的含义。我并不是说要向某个ssh子系统添加用户。我的意思是将用户添加到计算机系统。因此,例如,我有一个运行debian稳定版的系统,通过它的地址www.hg.bar.com对其进行调用。我想添加一个用户(通过kuser,users-admin或useradd或类似方式)给他打电话hg_guest。hg_guest无法本地登录或执行上面列表中的任何操作。hg_guest所能做的就是“远程”执行脚本。我说他应该可以通过ssh进行操作,但是现在考虑一下,也许允许他使用ssh可能允许他在本地登录,因此可能需要其他机制。

Answers:


12

authorized_keys文件中有一个命令选项。此选项似乎完全可以满足您的要求。

请注意,它不是chroot或受限shell。它只允许通过ssh执行那些命令。以您的示例为例:

ssh somehost /local/remote_only_scripts/foo

对于这个authorized_keys文件:

command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key... 

如果您不希望用户能够本地登录,则有很多方法。您可以:

  • 只需将其shell设置为/ bin / false(由于ssh需要有效的登录,您可能需要/ bin / true
  • 锁定密码,请参阅 passwd -l

编辑:添加了更多限制选项,并阐明了如何删除本地访问。


我认为您不需要在客户端的ssh中指定该命令,它是“强制”命令,因此它将始终执行;)远程站点上的用户仍需要/ etc / passwd中定义的有效shell。
jirib 2012年

1
此外command=no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty还需要一些选项来真正限制帐户。
2012年

好。我在半夜醒来,决定检查答案。由于我困倦,我不会吸收整个答案,而是要问一些让我感到困惑的问题。这如何防止hg_quest从tty登录?
HandyGandy 2012年

@HandyGandy这是最简单的部分。我添加了两种方法,但我认为还有更多
Coren 2012年

0

尝试将其作为用户的登录外壳程序:

#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
    if [ ! -x "$basedir/$prog" ]; then
        echo "Invalid program: $prog"
    else
        case "$prog $args" in
            *\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
                echo "Invalid character in command";;
            *)
                eval "$prog $args"
                echo;; # force a trailing newline after the program
        esac
    fi
done

您可能还希望authorized_keys像Coren的答案一样,在文件中明确地包含此内容。但是替换'... / foo; 与这里的程序。这将阻止命令,从SSH一样sftpscpssh hostname command


如果只希望用户能够从您的目录中执行命令(并且没有太多),则可以从上面的内容中删除“ prog”,并使用select语句提供选择的文本菜单这些程序,然后读取参数。我还将对此进行测试,以确保如果在脚本的各个点键入一堆Ctrl-C会发生什么情况。您可能也需要在其中添加一个trap命令。
2012年

0

偶然的情况下,他们只需要访问一个脚本,这对我来说真的很好。添加用户并将其默认Shell更改为脚本的路径。当他们通过ssh连接时,它将执行脚本并关闭其会话。

server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest

server1:/ # grep hg_guest /etc/passwd

hg_guest:x:2002:100 :: / home / hg_guest:/local/remote_only_scripts/foo/script.sh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.