SSHauthorized_keys命令选项:多个命令?


17

authorized_keys具有command =“ ...”选项,该选项将密钥限制为单个命令。有没有一种方法可以将一个键限制为多个命令?例如,在那里有一个正则表达式,还是通过编辑其他一些配置文件?

Answers:


9

不。它不是“允许”命令,而是“强制”命令(作为ForceCommand选项)。

唯一的可能性是对不同的命令使用不同的键或从中读取参数stdin


27

每个键只能有一个命令,因为该命令是“强制的”。

但是您可以使用包装器脚本。被调用的命令将原始命令行作为环境变量获取$SSH_ORIGINAL_COMMAND,可以对其进行评估。

例如~/.ssh/allowed-commands.sh

#!/bin/sh
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

case "$SSH_ORIGINAL_COMMAND" in
    "systemctl restart cups")
        systemctl restart cups
        ;;
    "shutdown -r now")
        shutdown -r now
        ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

然后~/.ssh/authorized_keys

command="/home/user/.ssh/allowed-commands.sh",…

1
有用。可能需要更清楚地说明,sshd本身会添加SSH_ORIGINAL_COMMAND(per man sshd),以便在脚本中可用。还给出了允许某些模式SSH_ORIGINAL_COMMAND运行的自动脚本的示例。另请参见unixwars.blogspot.com/2014/12/getting-sshoriginalcommand.html
Cedric Knight,

7

在O'Reilly撰写的伟大的SSH《安全外壳:权威指南》一书的第八章中,有一个使用如下脚本的漂亮示例:

#!/bin/sh

/bin/echo "Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit"

/bin/echo "Your choice:"

read ans

while [ "$ans" != "q" ]
do
   case "$ans" in
      1)
         /bin/date
         ;;
      2)
         /usr/bin/who
         ;;
      3)
         /usr/bin/top
         ;;
      q)
         /bin/echo "Goodbye"
         exit 0
         ;;
      *)
         /bin/echo "Invalid choice '$ans': please try again"
         ;;
   esac
   /bin/echo "Your choice:"
   read ans
done
exit 0

.authorized_keys文件中使用它的方式如下:

command="/path/to/your/script.sh" <ssh-key>

...这样做时会为您提供ssh

Welcome!
Your choices are:
1       See today's date
2       See who's logged in
3       See current processes
q       Quit
Your choice:

但是这样的脚本基本上会中断scpsftp还有一天其他所有可能有用的东西。
雅库耶

3
@Jakuje这对command一般选项无效吗?
gf_

1

其他方法使用例如给定用户的受限外壳或使用包装器,该包装器将命令限制在特定目录中找到的所有文件/脚本,从而允许在不更改包装器的情况下扩大命令列表。

另一篇文章介绍了一个通用脚本,该脚本还允许将命令行参数用作允许的命令,但允许使用以正则表达式表示的规则来锁定它们。

该示例将以以下方式表示:

command="only systemctl shutdown"

.onlyrules使用以下内容制作文件:

\:^systemctl restart cups$:{p;q}
\:^shutdown -r now$:{p;q}

这种“仅”方法的优点在于,无需为每个用户和情况编写单独的脚本。


更改外壳程序的问题在于,它将应用于所有登录,甚至包括具有不受限制的密钥的登录。此外,如果您仅使用shell登录并且没有管理员访问权限,则不能仅将已配置的shell更改为所需的内容。但是您仍然可以编辑您的authorized_keys文件。
卡巴斯德(Kasperd)'17

您可以将“受限外壳”用作ForcedCommand
Georg Lehner

对于正在使用的帐户是普通用户帐户,并且所需要的操作具有特权的情况,我可能会依靠sudo进行检查,然后将authorized_keys命令选项设置为“ sudo $ SSH_ORIGINAL_COMMAND”吗?
史蒂夫·迪
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.