问题 SSH - 即使没有Shell,也可以在登录时强制执行命令


我正在创建一个没有shell的受限用户,仅用于端口转发,我需要通过pubkey登录时执行脚本,即使用户通过连接也是如此 ssh -N user@host 它没有要求SSH服务器提供shell。

该脚本应警告管理员对使用pubkey进行身份验证的连接,因此用户连接不应该跳过脚本的执行(例如,通过连接 ssh -N)。

我试图无济于事:

  • 设置命令 /etc/ssh/sshrc
  • 在命令中使用command =“COMMAND” .ssh/authorized_keys (man authorized_keys)
  • 使用命令设置脚本作为用户的shell。 (chsh -s /sbin/myscript.sh USERNAME
  • 匹配用户 /etc/ssh/sshd_config 喜欢: Match User MYUSERNAME ForceCommand "/sbin/myscript.sh"

当用户请求shell时,所有工作,但如果只记录端口转发而没有shell(ssh -N)它不起作用。


10994
2017-11-14 21:38


起源

除非请求一个,否则ForceCommand在没有pty的情况下运行。修复您的脚本,使其不需要pty。 - Todd A. Jacobs


答案:


除非客户端请求,否则ForceCommand选项在没有PTY的情况下运行。因此,您实际上没有shell以您期望的方式执行脚本。此外,OpenSSH SSHD_CONFIG(5)手册页清楚地说:

使用用户的登录shell和-c选项调用该命令。

这意味着如果您已禁用用户的登录shell,或将其设置为类似的内容 /bin/false,那么ForceCommand无法正常工作。假如说:

  1. 用户有一个合理的shell定义,
  2. 你的目标脚本是可执行的,和
  3. 你的脚本有一个合适的shebang线

然后以下应该适用于你的 全球 使用正确的用户名和自定义脚本的完全限定路径名正确修改sshd_config文件:

Match User foo
    ForceCommand /path/to/script.sh

9
2017-11-14 22:53



这只有在我不使用时才有效 ssh -N 要连接的标志。但无论如何你让我意识到只有使用sshd才能实现这个目标...脚本应该警告用pubkey进行身份验证的连接,因此用户连接不应该使用'ssh -N'跳过它。 - Iacchus


我是OP的作者;我得出结论,我需要实现的是不可能只使用SSH到日期(OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015),但是我找到了一个很棒的软件,它使用加密的SPAuthentication打开SSH端口,它的新版本(截至本文发表之日,它是GitHub主分支)具有执行命令的功能,用户始终成功授权。

FWKNOP - 加密单包授权

FWKNOP设置iptables规则,允许在通过UDP发送的单个数据包上访问给定端口。然后在授权之后允许授权用户访问给定时间,例如30秒,在此之后关闭端口,保持连接打开。

1.要在Ubuntu linux上安装:

Ubuntu存储库中当前版本(2.6.0-2.1build1)仍然不允许在成功的SPA上执行命令; (请使用GitHub中的2.6.8代替)

在客户端机器上:

sudo apt-get install fwknop-client

在服务器端:

sudo apt-get install fwknop-server

这是一个关于如何设置客户端和服务器计算机的教程 https://help.ubuntu.com/community/SinglePacketAuthorization

然后在设置之后,在服务器端:

  1. 编辑 /etc/default/fwknop-server
  2. 改变线 START_DAEMON="no" 至 START_DAEMON="yes"
  3. 然后运行:

    sudo service fwknop-server stop

    sudo service fwknop-server start

2.成功SPA的警告管理员(电子邮件,推送脚本等)

因此,如上所述,Ubuntu存储库(2.6.0-2.1build1)中的当前版本无法在成功的SPA上执行命令。如果你需要OP的这个功能,但它将在fwknop版本(2.6.8)发布,如下所述:

https://github.com/mrash/fwknop/issues/172

因此,如果您现在需要使用它,您可以使用github分支master来构建 CMD_CYCLE_OPEN 选项。

3.关于fwknop的更多资源

https://help.ubuntu.com/community/SinglePacketAuthorization

https://github.com/mrash/fwknop/ (GitHub上的项目)

http://www.cipherdyne.org/fwknop/ (项目现场)

https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (关于DO社区的教程)


2
2017-12-04 16:00





我是OP的作者。此外,您可以实现一个简单的logwatcher,如下所述用python3编写,它保持读取文件并在行包含模式时执行命令。

logwatcher.python3

#!/usr/bin/env python3

# follow.py
#
# Follow a file like tail -f.

import sys
import os
import time

def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.5)
            continue
        yield line

if __name__ == '__main__':
    logfilename = sys.argv[1]
    pattern_string = sys.argv[2]
    command_to_execute = sys.argv[3]

    print("Log filename is: {}".format(logfilename))

    logfile = open(logfilename, "r")
    loglines = follow(logfile)

    for line in loglines:
        if pattern_string in line:
            os.system(command_to_execute)

用法

  1. 使上面的脚本可执行:

chmod +x logwatcher.python3

  1. 重新启动后添加一个cronjob来启动它

crontab -e

然后在那里写下这一行并在此之后保存:

@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"

此脚本的第一个参数是要监视的日志文件,和 第二个参数是要查看的字符串 在里面。该 第三个参数是要执行的脚本 当在文件中找到该行时。

最好是在崩溃时使用更可靠的东西来启动/重启脚本。


1
2018-01-07 17:31



应该在使用startup_string的地方使用pattern_string?无法编辑自己 - jdog