网罗开发(小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 摘要
    • 引言
    • 常见方法分析
      • 1. 修改 `.bashrc` 或 `~/.bash_profile`
      • 2. sshd 的 `ForceCommand`
      • 3. auditd
    • 更靠谱的方案
      • 方案一:利用 `sshd` 自带的日志功能
      • 方案二:用 `command` 包装器捕获日志
    • Demo 示例
      • paramiko 脚本
      • sshd 配置
      • 查看日志
    • QA 环节
    • 总结

摘要

很多同学在容器里开了 ssh 服务,平时没什么问题。但当你需要审计的时候,就会发现坑:

  • 交互式终端下的命令(比如你手动 ssh 登录然后敲 ls)是能记录的;
  • 可一旦换成 Python 脚本(例如用 paramiko 执行 ssh.exec_command("ls")),这些命令就没法出现在 historyauditd 日志里。

那么问题来了:如何在 docker 容器中记录所有 ssh 用户执行的命令,包括非交互式的?
本文会逐步分析这个问题的成因,并给出几种可运行的解决方法。

引言

为什么交互式和非交互式会有区别?

  • 交互式 shell:登录后进入 bash/zsh,会执行 .bashrc.bash_profile 等配置文件,所以很多审计手段(比如 PROMPT_COMMAND 写日志)能生效。
  • 非交互式 shell:paramiko 这类工具在执行时,并不会启动一个完整的交互式 shell,而是直接让 sshd 帮它执行命令。这时候 .bashrc 就不会跑,自然也就没日志了。

所以很多常见的方法(改 .bashrc、加 history、启用 auditd)对 paramiko 这种场景是无效的。

常见方法分析

1. 修改 .bashrc~/.bash_profile

思路:在用户 shell 的初始化文件里加个钩子,把每条命令写到日志里。
问题:非交互式执行根本不会加载这些文件,命令直接被丢掉。

2. sshd 的 ForceCommand

思路:在 /etc/ssh/sshd_config 里写上 ForceCommand /path/to/logger.sh,所有命令都通过这个脚本转一遍。
问题:这会破坏交互体验,而且你必须自己解析和转发命令,比较繁琐。

3. auditd

思路:通过 Linux 内核审计所有系统调用,理论上能捕获 execve 之类的事件。
问题:在 docker 容器里 auditd 支持有限,很多内核钩子被屏蔽,不一定能装。

结论:上面这些办法在本地服务器行得通,但在容器里或者 paramiko 这种场景下不理想。

更靠谱的方案

有两个比较实用的方案:

方案一:利用 sshd 自带的日志功能

sshd 的配置里有个参数叫 LogLevel。默认是 INFO,只会记录登录/退出。如果改成 VERBOSE,就能记录所有用户通过 ssh 执行的命令。

配置方法:
编辑 /etc/ssh/sshd_config,添加:

LogLevel VERBOSE

然后重启 sshd:

service ssh restart

之后,你会在 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS)里看到类似这样的记录:

sshd[123]: User root executed command: ls -l
sshd[123]: User root executed command: cat /etc/passwd

这种方式优点是简单,不用额外写脚本,非交互式命令也能被捕获。

方案二:用 command 包装器捕获日志

如果你想要更细粒度的控制,比如把日志写到自定义文件,可以用 ForceCommand 配合一个包装器脚本:

# /usr/local/bin/ssh-logger.sh
#!/bin/bash
echo "$(date) - user: $USER - command: $SSH_ORIGINAL_COMMAND" >> /var/log/ssh_commands.log# 执行原始命令
exec $SSH_ORIGINAL_COMMAND

然后在 /etc/ssh/sshd_config 里加:

ForceCommand /usr/local/bin/ssh-logger.sh

重启 sshd 后,无论是 paramiko 还是交互式 ssh,都会先经过这个脚本,把命令写入日志。

缺点是会影响交互式 shell(比如你直接登录想要跑 bash,会变成只跑 ssh-logger.sh)。如果你只在容器里跑脚本任务,这没啥问题;但如果要保留交互功能,就得在脚本里做条件判断。

Demo 示例

这里我们模拟一下 paramiko 执行命令,然后在容器里看到日志。

paramiko 脚本

import paramikoclient = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("127.0.0.1", username="root", password="123456")stdin, stdout, stderr = client.exec_command("ls /etc")
print(stdout.read().decode())client.close()

sshd 配置

/etc/ssh/sshd_config 里的 LogLevel 调高:

LogLevel VERBOSE

查看日志

运行上面的 Python 脚本后,在容器里执行:

tail -f /var/log/auth.log

你会看到:

sshd[1024]: User root executed command: ls /etc

这样一来,paramiko 非交互式执行的命令也能被记录了。

QA 环节

Q: 我在容器里没找到 /var/log/auth.log 怎么办?
A: 可能是你的容器没启用 syslog,可以直接让 sshd 把日志写到 stdout,或者安装 rsyslog

Q: auditd 在容器里能不能用?
A: 大部分情况下不行,因为 auditd 需要内核支持,容器里隔离了很多能力。但在宿主机上用 auditd 是没问题的。

Q: 如果我只想要 paramiko 的日志,不要交互式的怎么办?
A: 可以用 Match 块在 sshd_config 里做条件匹配,比如根据 IP 或用户区分。

总结

  • 交互式和非交互式 ssh 的行为差别在于 shell 初始化,这就是 .bashrc 等方法失效的原因。
  • 最简单可行的方案是:sshd 配置 LogLevel VERBOSE,非交互式命令也能被完整记录。
  • 如果需要自定义日志格式,可以用 ForceCommand + 脚本包装的方式。

所以,要在 docker 容器里审计所有 ssh 用户的操作,推荐直接从 sshd 的日志功能下手,既稳定又省事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920370.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920370.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920370.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

涡旋场和挠场的对偶性方程组

要将涡旋场与挠场的动态对偶性以麦克斯韦方程组的形式嵌入爱因斯坦-嘉当理论的弯曲时空框架中。一、符号与几何基础1. 基本张量定义 度规张量: g_{\mu\nu} (描述时空弯曲, \mu,\nu 0,1,2,3 )。仿射联络: \Gamma^\la…

8.28日QT

思维导图#include <iostream>using namespace std;int main() {int a0,b0,c0,d0;string i;cout << "请输入一个字符串" << endl;getline(cin,i);int yi.size()-1;while(1){if(a<i[y]&&i[y]<z){aa1;}else if(A<i[y]&&i[y]…

跨网络通信:路由器如何实现全球互联

目录 一、跨网络的两台主机通信 二、采用不同通信标准的两个局域网内的主机通信 三、路由器实现的“认路”功能、数据传输&#xff1a;封装与解封装 四、认识IP地址 五、为什么访问目标主机需要经过路由器&#xff1f; 1、网络划分 2、寻址与转发 六、目的IP地址的核心意…

HTTP 头

HTTP 头&#xff08;HTTP Header&#xff09;是 HTTP 请求/响应中用于传递元数据的关键部分&#xff0c;分为 请求头&#xff08;Request Header&#xff09;、响应头&#xff08;Response Header&#xff09;、通用头&#xff08;General Header&#xff09; 和 实体头&#x…

vue 海康视频插件

背景&#xff1a; 在vue项目中&#xff0c;需要在pc端播放视频&#xff0c;播放的视频包括视频实时、视频回放等。 写文思路&#xff1a; 海康视频对接流程&#xff0c;了解海康视频插件&#xff0c;前端开发项目并引入依赖&#xff0c;前端开发封装的组件&#xff0c;组件的调…

【URP】Unity 插入自定义RenderPass

【从UnityURP开始探索游戏渲染】专栏-直达 自定义渲染通道是一种改变通用渲染管道&#xff08;URP&#xff09;如何渲染场景或场景中的对象的方法。自定义呈现通道(RenderPass)包含自己的Render代码&#xff0c;可以在注入点将其添加到RenderPass中。 添加自定义呈现通道(Rend…

DevSecOps 集成 CI/CD Pipeline:实用指南

就在你以为软件开发已无简化的余地时&#xff0c;新的解决方案应运而生 随着软件开发几乎每天都在攀升&#xff0c;组织不断尝试以前所未有的速度交付新功能和应用程序。虽然持续集成和持续交付 &#xff08;CI/CD&#xff09; Pipeline 彻底改变了软件部署&#xff0c;但它们…

vue2+elementui 表格单元格增加背景色,根据每列数据的大小 颜色依次变浅显示

注释&#xff1a; vue2elementui 表格列实现一个功能&#xff0c;给定两个颜色&#xff1a;红色 #f96d6f 和 绿色 #63be7b&#xff0c;列数据正数时表格单元格背景色为红色&#xff0c;列数据负数时表格单元格背景色为绿色&#xff0c;根据数据的大小颜色依次越来越淡&#xff…

【JavaEE】(19) MyBatis-plus

一、MyBatis Generator 为 MyBastis 框架设计的代码生成工具&#xff0c;简化持久层编码工作。根据数据库表自动生成 Java 实体类、Mapper 接口、SQL 的 xml 文件。让开发者专注于业务逻辑。 1、引入插件 MyBatis 官网搜索 MyBatis Generator 插件&#xff1a;Running MyBatis…

Android之腾讯TBS文件预览

文章目录前言一、效果图二、实现步骤1.去官网注册并创建应用[腾讯官网](https://console.cloud.tencent.com/tbs/client)2.下载arr文件并引入[腾讯TBS](https://download.csdn.net/download/Android_Cll/91764395)3.application实例化4.activity实例化5.下载网络文件6.PreviewA…

基于微信小程序的化妆品成分查询系统源码

源码题目&#xff1a;基于微信小程序的化妆品成分查询系统源码☑️ 文末联系获取&#xff08;含源码、技术文档&#xff09;博主简介&#xff1a;10年高级软件工程师、JAVA技术指导员、Python讲师、文章撰写修改专家、Springboot高级&#xff0c;欢迎高校老师、同行交流合作。毕…

STM32 启动执行逻辑与代码烧入方法详解:从底层原理到实操落地

STM32 启动执行逻辑与代码烧入方法详解&#xff1a;从底层原理到实操落地背景概要STM32启动和执行的核心逻辑链条代码烧入到STM32的途径方法结束语背景概要 在学习STM32时候我们知道代码需要通过一些下载器&#xff08;如ST-Link、J-Link&#xff09;或者串口下载烧入到STM32芯…

Go对接印度股票数据源指南:使用StockTV API

一、StockTV API简介 StockTV提供全球200国家的实时金融数据&#xff0c;覆盖股票、外汇、期货和加密货币市场。针对印度市场&#xff08;国家ID14&#xff09;&#xff0c;其主要优势包括&#xff1a; 毫秒级低延迟响应7x24小时稳定服务日均处理亿级数据免费技术支持 官方资源…

ESP8266:Arduino学习

ESP8266一&#xff1a;环境搭建使用Ardino框架&#xff0c;在官网下载&#xff0c;下载离线的支持包二&#xff1a;实现简单的项目1. 点灯{pinMode(LED_PIN, OUTPUT); // 设置引脚为输出模式digitalWrite(LED_PIN, HIGH); // 点亮 LED}I/O引脚的三种模式分别为&#xff1a;INPU…

青少年软件编程(python六级)等级考试试卷-客观题(2023年3月)

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 六级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程&#xff08;python六级&#xff09;等级考试试卷-客观题&#xff08;2023年3月&#xff09…

mongodb influxdb

、您需要提前配置 MongoDB 和 InfluxDB。让我帮您说明配置步骤&#xff1a; MongoDB 配置 启动 MongoDB 容器后&#xff0c;进入容器创建数据库&#xff1a; # 进入 MongoDB 容器 docker exec -it mongo mongosh -u root -p 123456# 创建 product 数据库 use product# 创建集合…

模拟电路中什么时候适合使用电流传递信号,什么时候合适使用电压传递信号

一、应用 1.实际应用中&#xff0c;需要进行权衡&#xff0c;比如抗干扰能力&#xff0c;传输距离&#xff0c;功耗 2.电压信号比较容易受到干扰&#xff0c;对噪声比较敏感&#xff0c;有噪声容限一说 3.电流信号对噪声不敏感 4.电源电压下降的稳定性或者长距离传输中的损耗问…

Flink2.0学习笔记:使用HikariCP 自定义sink实现数据库连接池化

stevensu1/EC0823: Flink2.0学习笔记&#xff1a;使用HikariCP 自定义sink实现数据库连接池化 在 Flink 流处理应用中使用 HikariCP 实现数据库连接池化&#xff0c;对于写入关系型数据库&#xff08;如 MySQL、PostgreSQL&#xff09;的 自定义 Sink 来说&#xff0c;不仅是推…

Ubuntu安装及配置Git(Ubuntu install and config Git Tools)

Setup Git sudo apt update sudo apt install git // 查看git版本 git --versionConfig Github // 不清楚username和email的可以直接在github网站上点击头像选择settings来查看 git config --global user

将C++资源管理测试框架整合到GitLab CI/CD的完整实践指南

将C资源管理测试框架整合到GitLab CI/CD的完整实践指南 摘要 本文深入探讨了如何将先进的C资源管理测试框架无缝集成到GitLab CI/CD流水线中&#xff0c;实现自动化资源监控、性能回归检测和高质量测试。通过实际案例和最佳实践&#xff0c;展示了如何构建一个能够精确控制CPU亲…