【问题标题】:kubectl exec commands are not recorded in pod's bash historykubectl exec 命令不会记录在 pod 的 bash 历史记录中
【发布时间】:2020-11-17 14:45:43
【问题描述】:

有没有办法让 kubectl exec 命令被历史命令记录在 pod 中? 我想通过监控历史命令来收集容器上执行的所有命令。

示例: kubectl exec podname -n namespace -c container -- bash -c "ls" ==> 可以用历史命令记录吗?

【问题讨论】:

    标签: bash shell kubernetes kubectl


    【解决方案1】:

    为了了解此行为的完整背景,需要澄清几件事:

    首先,kubectl execdocker exec 的简洁 API-based警告:Medium 成员的故事)包装器。

    这是必不可少的,因为这意味着它将使用 Kubernetes API 将您的命令中继到 Docker。这意味着在这种情况下,与 shell 相关的任何行为都与 Docker 如何在容器中实现命令执行直接相关,并且与 kubectl 没有太大关系。

    要记住的第二件事是命令本身:history,这是一个 shell 功能,而不是单独的二进制文件。

    实现取决于所使用的shell,但通常它会将命令历史缓存在内存中,然后在会话关闭后将其写入历史文件。可以使用 history features“强制”执行此操作,但可能会因 shell 实现而异,并且在使用 docker exec 命令时可能不是统一、可靠的方法。

    考虑到这些事情,并且您的请求似乎旨在监控容器中执行的操作,也许更好的方法是使用 Linux auditrecord commands executed by users

    这不仅不依赖于上述几点,它writes logs to a file 还允许您使用您的Kubernetes logging strategy 来挑选它们,将它们导出到您用作日志接收器的任何地方,便于后续检查。

    【讨论】:

    • 您能详细说明一下吗?我认为您的问题是关于捕获容器中执行的命令,而不是命令是否通过 kubect/docker exec 执行。你能澄清一下吗?
    • 在容器内我能够捕获命令,没有问题。在容器之外,如果用户使用 kubectl/docker exec 执行命令,我需要捕获这些命令。示例:kubectl exec podname -n namespace -c container -- bash -c "ls" 历史命令应该显示命令 "ls"。
    • 我明白了。这就是我在答案中解释的,为什么history 由于命令的性质及其对 shell 实现的依赖而没有保留。 history,如通常使用的那样,与 docker exec 一起表现不可靠,因此,审计方法。
    猜你喜欢
    • 2020-02-22
    • 2013-08-17
    • 2019-10-22
    • 1970-01-01
    • 2011-09-22
    • 2012-01-25
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多