Skip to main content
Glama

MemOS-MCP

by qinshu1109
Apache 2.0
3
  • Linux
  • Apple
security_manager.sh8.52 kB
#!/bin/bash # MemOS安全管理脚本 # 管理TLS配置、容器安全和数据保护 set -e MEMOS_DIR="/home/qqinshu/视频/MemOS" TLS_DIR="$MEMOS_DIR/memos_data/qdrant_tls" DOCKER_COMPOSE_FILE="$MEMOS_DIR/memos_data/docker-compose.yml" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${BLUE}ℹ️ $1${NC}" } log_success() { echo -e "${GREEN}✅ $1${NC}" } log_warning() { echo -e "${YELLOW}⚠️ $1${NC}" } log_error() { echo -e "${RED}❌ $1${NC}" } # 显示帮助信息 show_help() { echo "MemOS安全管理脚本" echo "" echo "用法: $0 [命令]" echo "" echo "命令:" echo " status 显示安全状态" echo " enable-tls 启用TLS加密" echo " disable-tls 禁用TLS加密" echo " restart 重启Qdrant服务" echo " check-certs 检查证书状态" echo " renew-certs 更新证书" echo " security-scan 安全扫描" echo " help 显示此帮助信息" } # 检查Docker是否运行 check_docker() { if ! docker info > /dev/null 2>&1; then log_error "Docker未运行或无权限访问" exit 1 fi } # 检查证书状态 check_certificates() { log_info "检查TLS证书状态..." if [ ! -d "$TLS_DIR" ]; then log_warning "TLS证书目录不存在" return 1 fi local cert_files=("ca.pem" "server-cert.pem" "client-cert.pem") local missing_files=() for cert_file in "${cert_files[@]}"; do if [ ! -f "$TLS_DIR/$cert_file" ]; then missing_files+=("$cert_file") fi done if [ ${#missing_files[@]} -gt 0 ]; then log_warning "缺少证书文件: ${missing_files[*]}" return 1 fi # 检查证书有效期 local ca_expiry=$(openssl x509 -in "$TLS_DIR/ca.pem" -noout -enddate | cut -d= -f2) local server_expiry=$(openssl x509 -in "$TLS_DIR/server-cert.pem" -noout -enddate | cut -d= -f2) log_success "所有证书文件存在" echo " CA证书到期: $ca_expiry" echo " 服务器证书到期: $server_expiry" # 检查证书是否即将过期(30天内) local ca_expiry_epoch=$(date -d "$ca_expiry" +%s) local current_epoch=$(date +%s) local days_until_expiry=$(( (ca_expiry_epoch - current_epoch) / 86400 )) if [ $days_until_expiry -lt 30 ]; then log_warning "证书将在 $days_until_expiry 天后过期,建议更新" fi return 0 } # 显示安全状态 show_security_status() { echo "🔒 MemOS安全状态报告" echo "====================" # 检查磁盘加密 echo "" log_info "磁盘加密状态:" if lsblk -f | grep -q "crypt\|luks"; then log_success "检测到磁盘加密" else log_warning "未检测到磁盘加密(个人场景可选)" fi # 检查TLS证书 echo "" log_info "TLS证书状态:" if check_certificates; then log_success "TLS证书配置正常" else log_warning "TLS证书需要配置或更新" fi # 检查Qdrant容器状态 echo "" log_info "Qdrant容器状态:" if docker ps | grep -q qdrant; then local container_id=$(docker ps | grep qdrant | awk '{print $1}') log_success "Qdrant容器运行中 (ID: $container_id)" # 检查TLS是否启用 if docker exec "$container_id" curl -k -s https://localhost:6333/ > /dev/null 2>&1; then log_success "TLS加密已启用" else log_warning "TLS加密未启用或配置错误" fi else log_warning "Qdrant容器未运行" fi # 检查文件权限 echo "" log_info "文件权限检查:" check_file_permissions # 检查网络安全 echo "" log_info "网络安全检查:" check_network_security } # 检查文件权限 check_file_permissions() { local sensitive_files=( "$TLS_DIR/ca-key.pem" "$TLS_DIR/server-key.pem" "$TLS_DIR/client-key.pem" ) for file in "${sensitive_files[@]}"; do if [ -f "$file" ]; then local perms=$(stat -c "%a" "$file") if [ "$perms" = "600" ]; then log_success "$(basename "$file"): 权限正确 ($perms)" else log_warning "$(basename "$file"): 权限不安全 ($perms),建议设置为600" fi fi done } # 检查网络安全 check_network_security() { # 检查开放端口 local qdrant_port=$(docker ps | grep qdrant | grep -o "0.0.0.0:[0-9]*" | cut -d: -f2) if [ -n "$qdrant_port" ]; then log_info "Qdrant端口: $qdrant_port (仅本地访问)" # 检查是否只绑定到localhost if docker ps | grep qdrant | grep -q "0.0.0.0:"; then log_warning "Qdrant绑定到所有接口,建议仅绑定到127.0.0.1" else log_success "Qdrant仅绑定到本地接口" fi fi } # 启用TLS enable_tls() { log_info "启用TLS加密..." # 检查证书是否存在 if ! check_certificates; then log_info "证书不存在,正在生成..." "$MEMOS_DIR/generate_tls_certs.sh" fi # 重启Qdrant容器以应用TLS配置 restart_qdrant # 验证TLS是否生效 sleep 5 if verify_tls_connection; then log_success "TLS加密启用成功" else log_error "TLS加密启用失败" exit 1 fi } # 禁用TLS disable_tls() { log_warning "禁用TLS加密..." # 备份当前配置 cp "$DOCKER_COMPOSE_FILE" "$DOCKER_COMPOSE_FILE.tls.bak" # 移除TLS配置(这里简化处理,实际应该更精确) log_info "请手动编辑docker-compose.yml移除TLS配置" log_info "备份文件: $DOCKER_COMPOSE_FILE.tls.bak" } # 重启Qdrant服务 restart_qdrant() { log_info "重启Qdrant服务..." cd "$MEMOS_DIR/memos_data" # 停止现有容器 docker compose down # 启动容器 docker compose up -d # 等待服务启动 log_info "等待服务启动..." sleep 10 # 检查服务状态 if docker ps | grep -q qdrant; then log_success "Qdrant服务重启成功" else log_error "Qdrant服务重启失败" exit 1 fi } # 验证TLS连接 verify_tls_connection() { local container_id=$(docker ps | grep qdrant | awk '{print $1}') if [ -z "$container_id" ]; then log_error "Qdrant容器未运行" return 1 fi # 测试HTTPS连接 if docker exec "$container_id" curl -k -s https://localhost:6333/ > /dev/null 2>&1; then return 0 else return 1 fi } # 更新证书 renew_certificates() { log_info "更新TLS证书..." # 备份现有证书 if [ -d "$TLS_DIR" ]; then local backup_dir="$TLS_DIR.backup.$(date +%Y%m%d_%H%M%S)" cp -r "$TLS_DIR" "$backup_dir" log_info "现有证书已备份到: $backup_dir" fi # 生成新证书 "$MEMOS_DIR/generate_tls_certs.sh" # 重启服务 restart_qdrant log_success "证书更新完成" } # 安全扫描 security_scan() { echo "🔍 MemOS安全扫描" echo "================" show_security_status echo "" log_info "安全建议:" echo " 1. 定期更新TLS证书(建议每年更新)" echo " 2. 定期备份重要数据" echo " 3. 监控容器日志异常活动" echo " 4. 保持Docker和系统更新" echo " 5. 考虑启用磁盘加密(个人场景可选)" } # 主函数 main() { case "${1:-status}" in status) show_security_status ;; enable-tls) check_docker enable_tls ;; disable-tls) check_docker disable_tls ;; restart) check_docker restart_qdrant ;; check-certs) check_certificates ;; renew-certs) check_docker renew_certificates ;; security-scan) security_scan ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } # 运行主函数 main "$@"

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/qinshu1109/memos-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server