Docker中如何記錄非交互式連接ssh用戶操作的所有命令記錄?

網羅開發(小紅書、快手、視頻號同名)

??大家好,我是 展菲,目前在上市企業從事人工智能項目研發管理工作,平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術,包括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親…