MCP安全系列之缺乏日志审计
MCP安全系列之缺乏日志审计
Section titled “MCP安全系列之缺乏日志审计”这一项是关于缺乏审计的,相当于MCP的运行没有日志审计,事后无法定位和溯源,所以本篇我们演示一下如何给MCP去记录日志情况。
MCP日志记录
Section titled “MCP日志记录”比较原始的方法就是在开发MCP服务的代码中,添加日志记录代码,比如通过logger去记录,但这种方式有几个弊端,一个是开发时会导致代码冗余,要想记录的详细,需要添加很多logger代码。另一个是这种日志即使保存下来后,也可能去查看或者定位。
这里采用langfuse平台来演示,langfuse是一个开源的LLMOps平台,即大模型应用可观测平台,它可以记录Agent完整会话中的每一步,比如大模型调用情况、工具调用情况、输入输出情况等等。
首先安装langfuse,这里通过docker安装,从github下载源码后,直接运行:
docker compose up -d它会自动拉取相关镜像并启动,启动后浏览器访问3000端口进入langfuce。
准备好langfuce后,我们还是通过CherryStudio来测试MCP,MCP服务代码如下,这是没有记录日志功能的代码:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Test")
@mcp.tool()def helloworld(username: str) -> str: """根据传入的用户名来打印友好提示语""" return f"你好,{username}"
if __name__ == "__main__": mcp.run()当我们想把MCP和langfuse打通,则需要在MCP代码中把langfuse加进去,对上面的代码进行修改,具体作用见注释:
import osfrom pathlib import Path
from dotenv import load_dotenvfrom langfuse import get_client, observefrom mcp.server.fastmcp import FastMCP
# 加载.env文件,该文件配置了langfuse的key,有了key才能和langfuse交互load_dotenv(Path(__file__).with_name(".env"))
mcp = FastMCP("Test")
@mcp.tool()# 主要加的就是这行代码,加到函数上,其中name代表在langfuse中显示日志时,这个日志名称是什么,as_type是说这个函数是属于Agent调用工具类型,langfuse显示日志时会显示工具的图标,因为langfuse观测面板有多种观测对象,比如推理过程、代码执行等等,工具调用就是其中一种@observe( name="helloworld", as_type="tool")def helloworld(username: str) -> str: """根据传入的用户名来打印友好提示语""" return f"你好,{username}"
if __name__ == "__main__": mcp.run()最后还少个.env文件,内容如下:
LANGFUSE_PUBLIC_KEY=pk-lf-xxxxxxxxxxxxxLANGFUSE_SECRET_KEY=sk-lf-xxxxxxxxxxxxxLANGFUSE_BASE_URL=http://localhost:3000其中key要去langfuse平台获取,回到langfuse,创建个项目,在该项目的设置-API KEYs下,点击创建key即可。
一切准备好后,回到Cherrystudio去调用工具进行测试:

此时在langfuse的tracing下可以看到日志记录:

MCP记录日志还有很多方式,也有很多平台,不止局限于langfuse,可根据自己情况进行选择。
小枣信安:专注AI安全,包括但不限于大模型安全、智能体安全、机器人安全、AI赋能网络安全等,欢迎一起学习。