mcpsentinel-gateway 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcpsentinel_gateway-0.3.0/PKG-INFO +245 -0
- mcpsentinel_gateway-0.3.0/README.md +223 -0
- mcpsentinel_gateway-0.3.0/pyproject.toml +45 -0
- mcpsentinel_gateway-0.3.0/setup.cfg +4 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/__init__.py +7 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/api/__init__.py +5 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/api/app.py +748 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/catalog/__init__.py +5 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/catalog/registry.py +68 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/__init__.py +24 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/config.py +43 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/core/exceptions.py +286 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/guardrails/__init__.py +13 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/guardrails/destructive.py +95 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/__init__.py +29 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/audit.py +394 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/auth.py +169 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/interceptors/scope.py +34 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/__init__.py +40 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/aws.py +504 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/__init__.py +85 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/client.py +277 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/exceptions.py +29 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/guardrails.py +54 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/models.py +225 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/awx/tools.py +408 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/__init__.py +98 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/client.py +635 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/exceptions.py +21 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/guardrails.py +72 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/models.py +264 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/azure/tools.py +445 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/__init__.py +89 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/client.py +361 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/exceptions.py +21 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/guardrails.py +68 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/models.py +274 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/gitlab/tools.py +392 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/models.py +309 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/providers/session.py +196 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/py.typed +1 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/__init__.py +40 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/context.py +39 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/guardrails.py +13 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/loader.py +65 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/models.py +279 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/rbac.py +213 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/__init__.py +23 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/manager.py +33 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel/security/secrets/resolvers.py +88 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/PKG-INFO +245 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/SOURCES.txt +87 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/dependency_links.txt +1 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/requires.txt +15 -0
- mcpsentinel_gateway-0.3.0/src/mcpsentinel_gateway.egg-info/top_level.txt +1 -0
- mcpsentinel_gateway-0.3.0/tests/test_audit.py +285 -0
- mcpsentinel_gateway-0.3.0/tests/test_auth.py +160 -0
- mcpsentinel_gateway-0.3.0/tests/test_aws.py +108 -0
- mcpsentinel_gateway-0.3.0/tests/test_aws_destructive.py +306 -0
- mcpsentinel_gateway-0.3.0/tests/test_aws_integration.py +484 -0
- mcpsentinel_gateway-0.3.0/tests/test_aws_provider.py +452 -0
- mcpsentinel_gateway-0.3.0/tests/test_aws_session.py +404 -0
- mcpsentinel_gateway-0.3.0/tests/test_awx_client.py +444 -0
- mcpsentinel_gateway-0.3.0/tests/test_awx_guardrails.py +136 -0
- mcpsentinel_gateway-0.3.0/tests/test_awx_integration.py +847 -0
- mcpsentinel_gateway-0.3.0/tests/test_awx_tools.py +543 -0
- mcpsentinel_gateway-0.3.0/tests/test_azure_client.py +603 -0
- mcpsentinel_gateway-0.3.0/tests/test_azure_destructive.py +271 -0
- mcpsentinel_gateway-0.3.0/tests/test_azure_guardrails.py +95 -0
- mcpsentinel_gateway-0.3.0/tests/test_azure_integration.py +661 -0
- mcpsentinel_gateway-0.3.0/tests/test_azure_tools.py +439 -0
- mcpsentinel_gateway-0.3.0/tests/test_basic.py +8 -0
- mcpsentinel_gateway-0.3.0/tests/test_catalog_filtering.py +97 -0
- mcpsentinel_gateway-0.3.0/tests/test_context.py +78 -0
- mcpsentinel_gateway-0.3.0/tests/test_destructive_guardrails.py +161 -0
- mcpsentinel_gateway-0.3.0/tests/test_destructive_integration.py +646 -0
- mcpsentinel_gateway-0.3.0/tests/test_e2e_blackbox.py +163 -0
- mcpsentinel_gateway-0.3.0/tests/test_gitlab_client.py +506 -0
- mcpsentinel_gateway-0.3.0/tests/test_gitlab_destructive.py +262 -0
- mcpsentinel_gateway-0.3.0/tests/test_gitlab_guardrails.py +94 -0
- mcpsentinel_gateway-0.3.0/tests/test_gitlab_integration.py +599 -0
- mcpsentinel_gateway-0.3.0/tests/test_gitlab_tools.py +367 -0
- mcpsentinel_gateway-0.3.0/tests/test_integration.py +129 -0
- mcpsentinel_gateway-0.3.0/tests/test_rbac.py +127 -0
- mcpsentinel_gateway-0.3.0/tests/test_scope_interceptor.py +108 -0
- mcpsentinel_gateway-0.3.0/tests/test_secrets_resolution.py +178 -0
- mcpsentinel_gateway-0.3.0/tests/test_security_integration.py +353 -0
- mcpsentinel_gateway-0.3.0/tests/test_security_loader.py +130 -0
- mcpsentinel_gateway-0.3.0/tests/test_security_models.py +170 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcpsentinel-gateway
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Prover acesso seguro a ferramentas de infraestrutura (AWS, Gitlab, Azure) via protocolo MCP
|
|
5
|
+
License: MIT
|
|
6
|
+
Requires-Python: >=3.12
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: fastmcp>=0.4.0
|
|
9
|
+
Requires-Dist: fastapi>=0.110.0
|
|
10
|
+
Requires-Dist: uvicorn>=0.30.0
|
|
11
|
+
Requires-Dist: pydantic>=2.7.0
|
|
12
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
13
|
+
Requires-Dist: boto3>=1.34.0
|
|
14
|
+
Requires-Dist: httpx>=0.27.0
|
|
15
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
16
|
+
Provides-Extra: dev
|
|
17
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
18
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
19
|
+
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
20
|
+
Requires-Dist: ruff>=0.4.0; extra == "dev"
|
|
21
|
+
Requires-Dist: mypy>=1.10.0; extra == "dev"
|
|
22
|
+
|
|
23
|
+
# McpSentinel — Secure Infrastructure Gateway for Model Context Protocol
|
|
24
|
+
|
|
25
|
+
[](./AGENTS.md)
|
|
26
|
+
[](./pyproject.toml)
|
|
27
|
+
[](./tests/)
|
|
28
|
+
[](./config/security.yaml)
|
|
29
|
+
[](./docs/trd.md)
|
|
30
|
+
|
|
31
|
+
**McpSentinel** é um gateway corporativo de segurança e mediação para o **Model Context Protocol (MCP)**, projetado para conceder a agentes autônomos de Inteligência Artificial acesso controlado, governado e auditável a ferramentas operacionais de infraestrutura de nuvem (**Amazon Web Services**) e gestão de código (**GitLab** e **Azure Repos**).
|
|
32
|
+
|
|
33
|
+
O McpSentinel atua como uma barreira de proteção de borda (*security edge proxy*), centralizando a execução de ferramentas, interceptando requisições, aplicando controle de acesso baseado em papéis (RBAC) multi-tenant e gerando uma trilha de auditoria síncrona com bloqueio imediato (*fail-secure*).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 🛡️ Princípios de Arquitetura e Segurança
|
|
38
|
+
|
|
39
|
+
O gateway foi concebido sob cinco pilares de segurança fundamentais:
|
|
40
|
+
|
|
41
|
+
```mermaid
|
|
42
|
+
flowchart LR
|
|
43
|
+
A[Agente IA / Cliente MCP] -->|1. Bearer Token via SSE| B(McpSentinel Edge Gateway)
|
|
44
|
+
B -->|2. RBAC & Tenant Check| C{Permitido?}
|
|
45
|
+
C -- Não -->|Bloqueio Imediato & Log BLOCKED| A
|
|
46
|
+
C -- Sim -->|3. Log Síncrono PENDING| D[(Audit Trail / stdout)]
|
|
47
|
+
D -->|4. STS AssumeRole / PAT| E[Infraestrutura: AWS / Git]
|
|
48
|
+
E -->|5. Sanitização REDACTED| B
|
|
49
|
+
B -->|6. Log SUCCESS & Resposta Segura| A
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
1. **Zero Credential Leakage:** Nenhuma credencial privilegiada de nuvem (IAM Keys, credenciais STS) ou tokens de repositório (PATs) é exposta ou trafegada para o cliente de IA. Todas as operações são mediadas pelo gateway, que assume temporariamente IAM Roles via AWS STS e despacha comandos com menor privilégio estrito.
|
|
53
|
+
2. **Gestão Declarativa via GitOps:** Identidades de agentes, perfis RBAC e tenants autorizados são integralmente modelados em arquivo declarativo versionado ([`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml)). Mudanças passam por revisão por pares e esteiras de CI/CD, sem dependência de banco de dados relacional ou painel web mutável.
|
|
54
|
+
3. **RBAC Multi-Tenant e Filtragem Dinâmica de Catálogo:**
|
|
55
|
+
- **Descoberta (`tools/list`):** O catálogo MCP é dinamicamente filtrado; agentes visualizam estritamente as ferramentas autorizadas para seu respectivo perfil.
|
|
56
|
+
- **Invocação (`tools/call`):** Validação mandatória em tempo de execução garantindo que a ferramenta solicitada e o tenant/conta AWS de destino pertençam ao escopo do agente autenticado.
|
|
57
|
+
4. **Trilha de Auditoria Síncrona Fail-Secure:** Cada invocação emite um evento estruturado em JSONLines na entrada (`PENDING`) e na saída (`SUCCESS`, `FAILED` ou `BLOCKED`). Sob a política *Fail-Secure*, qualquer falha no subsistema de persistência de log bloqueia incondicionalmente a chamada da ferramenta, garantindo que nenhuma ação seja executada sem rastro forense.
|
|
58
|
+
5. **Higienização e Mascaramento Automático:** Todos os payloads de entrada, saída e registros de log passam por sanitização recursiva, substituindo senhas, tokens e parâmetros sensíveis pelo marcador `[REDACTED]`.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 📋 Requisitos de Ambiente
|
|
63
|
+
|
|
64
|
+
- **Sistema Operacional:** Linux (x86_64 ou ARM64) ou macOS.
|
|
65
|
+
- **Runtime:** Python `>= 3.12`.
|
|
66
|
+
- **Gerenciador de Pacotes e Toolchain:** [`uv`](https://github.com/astral-sh/uv) (recomendado) ou `pip`/`venv`.
|
|
67
|
+
- **Credenciais de Provedor:** AWS Credentials configuradas no ambiente hospedeiro via variáveis de ambiente padrão (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`), arquivo de credenciais `~/.aws/credentials` ou perfil de instância/IAM Role (EC2/ECS/EKS).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## ⚡ Instalação Rápida
|
|
72
|
+
|
|
73
|
+
Clone o repositório e sincronize o ambiente virtual isolado com o `uv`:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Clone do repositório
|
|
77
|
+
git clone https://github.com/Defendi/McpSentinel.git
|
|
78
|
+
cd McpSentinel
|
|
79
|
+
|
|
80
|
+
# Criação do venv e instalação de todas as dependências (incluindo dev)
|
|
81
|
+
uv sync
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Caso utilize o `pip` padrão:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
python3.12 -m venv .venv
|
|
88
|
+
source .venv/bin/activate
|
|
89
|
+
pip install -e ".[dev]"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## ⚙️ Configuração
|
|
95
|
+
|
|
96
|
+
O McpSentinel é configurado via variáveis de ambiente e arquivos declarativos versionados.
|
|
97
|
+
|
|
98
|
+
### Variáveis de Ambiente Suportadas
|
|
99
|
+
|
|
100
|
+
As variáveis podem ser definidas no ambiente do sistema operacional ou em um arquivo `.env` na raiz do projeto:
|
|
101
|
+
|
|
102
|
+
| Variável | Padrão | Descrição |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `SENTINEL_AUTH_TOKEN` | `sentinel-secret-token` | Bearer token legado de fallback para validação de requisições HTTP. |
|
|
105
|
+
| `SENTINEL_SECURITY_CONFIG` | `config/security.yaml` | Caminho do arquivo de configuração declarativa GitOps (RBAC e agentes). |
|
|
106
|
+
| `SENTINEL_AUDIT_LOG_PATH` | `logs/audit.log` | Caminho do arquivo local para persistência síncrona de eventos de auditoria JSONLines. |
|
|
107
|
+
| `SENTINEL_HOST` | `0.0.0.0` | Endereço IP de ligação do servidor ASGI. |
|
|
108
|
+
| `SENTINEL_PORT` | `8000` | Porta TCP de escuta do servidor HTTP/SSE. |
|
|
109
|
+
| `SENTINEL_ENVIRONMENT` | `development` | Ambiente operacional (`development`, `staging`, `production`). |
|
|
110
|
+
| `SENTINEL_LOG_LEVEL` | `INFO` | Nível de logging da aplicação (`DEBUG`, `INFO`, `WARNING`, `ERROR`). |
|
|
111
|
+
|
|
112
|
+
### Configuração Declarativa GitOps (`config/security.yaml`)
|
|
113
|
+
|
|
114
|
+
O arquivo [`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml) define formalmente a tríade de segurança: **Tenants**, **Profiles** e **Agents**. Suporta interpolação de variáveis de ambiente com valores padrão `${VAR_NAME:-default}`.
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
version: "1.0"
|
|
118
|
+
|
|
119
|
+
# 1. Tenants corporativos (Contas de nuvem e escopos)
|
|
120
|
+
tenants:
|
|
121
|
+
aws_accounts:
|
|
122
|
+
- id: "dev-account"
|
|
123
|
+
account_id: "111122223333"
|
|
124
|
+
name: "Ambiente de Desenvolvimento"
|
|
125
|
+
allowed_regions:
|
|
126
|
+
- "us-east-1"
|
|
127
|
+
- "sa-east-1"
|
|
128
|
+
|
|
129
|
+
# 2. Perfis RBAC
|
|
130
|
+
profiles:
|
|
131
|
+
sre_operations:
|
|
132
|
+
description: "Perfil operacional SRE"
|
|
133
|
+
tools:
|
|
134
|
+
- "aws_get_caller_identity"
|
|
135
|
+
allowed_tenants:
|
|
136
|
+
aws_accounts:
|
|
137
|
+
- "dev-account"
|
|
138
|
+
|
|
139
|
+
# 3. Identidades dos agentes clientes
|
|
140
|
+
agents:
|
|
141
|
+
- agent_id: "agent-sre-01"
|
|
142
|
+
name: "Agente Operacional SRE Principal"
|
|
143
|
+
token: "${SENTINEL_TOKEN_SRE:-token-sre-01-secret}"
|
|
144
|
+
profile: "sre_operations"
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 🚀 Inicialização do Servidor
|
|
150
|
+
|
|
151
|
+
### Execução via Uvicorn (Recomendada em Produção/Desenvolvimento)
|
|
152
|
+
|
|
153
|
+
Inicie a aplicação ASGI Starlette com transporte Server-Sent Events (SSE):
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
uv run uvicorn mcpsentinel.api.app:app --host 0.0.0.0 --port 8000 --reload
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
O gateway inicializará e disponibilizará o endpoint MCP SSE em:
|
|
160
|
+
- **SSE Connection Endpoint:** `http://localhost:8000/sse`
|
|
161
|
+
- **Messages POST Endpoint:** `http://localhost:8000/messages/`
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 🔌 Conectando Clientes MCP
|
|
166
|
+
|
|
167
|
+
Todos os clientes devem enviar o cabeçalho de autenticação HTTP padrão:
|
|
168
|
+
```http
|
|
169
|
+
Authorization: Bearer <TOKEN_DO_AGENTE>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 1. Claude Desktop
|
|
173
|
+
|
|
174
|
+
Configure o arquivo de configuração do Claude Desktop (`claude_desktop_config.json`):
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"mcpServers": {
|
|
179
|
+
"mcpsentinel": {
|
|
180
|
+
"url": "http://localhost:8000/sse",
|
|
181
|
+
"headers": {
|
|
182
|
+
"Authorization": "Bearer token-sre-01-secret"
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### 2. Chamadas HTTP Diretas (curl / httpx)
|
|
190
|
+
|
|
191
|
+
Você pode validar a inicialização e escuta da conexão SSE com o utilitário `curl`:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Conectar ao stream de eventos SSE com Bearer Token
|
|
195
|
+
curl -N -H "Authorization: Bearer token-sre-01-secret" \
|
|
196
|
+
http://localhost:8000/sse
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Em caso de credencial ausente ou inválida, o gateway rejeita imediatamente com HTTP 401:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
curl -i http://localhost:8000/sse
|
|
203
|
+
# HTTP/1.1 401 Unauthorized
|
|
204
|
+
# {"error": "Unauthorized", "code": "AUTHENTICATION_ERROR", "detail": "Missing Authorization header"}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 🧪 Quality Gates e Testes Herméticos
|
|
210
|
+
|
|
211
|
+
O projeto possui uma suíte hermética de testes de unidade, integração e segurança, sem dependências de infraestrutura externa viva em runtime de teste.
|
|
212
|
+
|
|
213
|
+
### Execução de Testes com Cobertura
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# Execução da suíte completa com relatório de cobertura detalhado
|
|
217
|
+
uv run pytest --cov=src/mcpsentinel --cov-report=term-missing
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Status atual da cobertura: **97%** em 134 testes automatizados.
|
|
221
|
+
|
|
222
|
+
### Inspeção Estática de Código e Tipagem
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Validação de formatação e linting estrito com Ruff
|
|
226
|
+
uv run ruff check
|
|
227
|
+
|
|
228
|
+
# Checagem estrita de tipos estáticos com Mypy
|
|
229
|
+
uv run mypy src
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 📚 Rastreabilidade e Documentação do Harness
|
|
235
|
+
|
|
236
|
+
Este repositório adota a disciplina canônica do **Application Development Harness**. Consulte a documentação complementar em [`docs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/):
|
|
237
|
+
|
|
238
|
+
- **Manual de Operação e Governança:** [`docs/manual-de-operacao.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/manual-de-operacao.md) — Guia detalhado para o Administrador de Segurança (AT-01).
|
|
239
|
+
- **Technical Requirements Document (TRD):** [`docs/trd.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/trd.md) — Requisitos não-funcionais, stack e limites arquiteturais globais.
|
|
240
|
+
- **Registros de Decisões Arquiteturais (ADRs):**
|
|
241
|
+
- [`ADR 001: Transporte Remoto HTTP para Servidor MCP Centralizado`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/001-transporte-remoto-http-mcp.md)
|
|
242
|
+
- [`ADR 002: Modelo de Segurança Declarativo GitOps, RBAC e Guardrails Operacionais`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/002-seguranca-rbac-gitops-e-guardrails.md)
|
|
243
|
+
- [`ADR 003: Trilha de Auditoria Síncrona Estruturada em JSON sob Paradigma Fail-Secure`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/003-auditoria-sincrona-fail-secure.md)
|
|
244
|
+
- **Especificações de Funcionalidades:** [`docs/specs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/specs/)
|
|
245
|
+
- **Product Requirements Documents:** [`docs/prds/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/prds/)
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# McpSentinel — Secure Infrastructure Gateway for Model Context Protocol
|
|
2
|
+
|
|
3
|
+
[](./AGENTS.md)
|
|
4
|
+
[](./pyproject.toml)
|
|
5
|
+
[](./tests/)
|
|
6
|
+
[](./config/security.yaml)
|
|
7
|
+
[](./docs/trd.md)
|
|
8
|
+
|
|
9
|
+
**McpSentinel** é um gateway corporativo de segurança e mediação para o **Model Context Protocol (MCP)**, projetado para conceder a agentes autônomos de Inteligência Artificial acesso controlado, governado e auditável a ferramentas operacionais de infraestrutura de nuvem (**Amazon Web Services**) e gestão de código (**GitLab** e **Azure Repos**).
|
|
10
|
+
|
|
11
|
+
O McpSentinel atua como uma barreira de proteção de borda (*security edge proxy*), centralizando a execução de ferramentas, interceptando requisições, aplicando controle de acesso baseado em papéis (RBAC) multi-tenant e gerando uma trilha de auditoria síncrona com bloqueio imediato (*fail-secure*).
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 🛡️ Princípios de Arquitetura e Segurança
|
|
16
|
+
|
|
17
|
+
O gateway foi concebido sob cinco pilares de segurança fundamentais:
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
flowchart LR
|
|
21
|
+
A[Agente IA / Cliente MCP] -->|1. Bearer Token via SSE| B(McpSentinel Edge Gateway)
|
|
22
|
+
B -->|2. RBAC & Tenant Check| C{Permitido?}
|
|
23
|
+
C -- Não -->|Bloqueio Imediato & Log BLOCKED| A
|
|
24
|
+
C -- Sim -->|3. Log Síncrono PENDING| D[(Audit Trail / stdout)]
|
|
25
|
+
D -->|4. STS AssumeRole / PAT| E[Infraestrutura: AWS / Git]
|
|
26
|
+
E -->|5. Sanitização REDACTED| B
|
|
27
|
+
B -->|6. Log SUCCESS & Resposta Segura| A
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
1. **Zero Credential Leakage:** Nenhuma credencial privilegiada de nuvem (IAM Keys, credenciais STS) ou tokens de repositório (PATs) é exposta ou trafegada para o cliente de IA. Todas as operações são mediadas pelo gateway, que assume temporariamente IAM Roles via AWS STS e despacha comandos com menor privilégio estrito.
|
|
31
|
+
2. **Gestão Declarativa via GitOps:** Identidades de agentes, perfis RBAC e tenants autorizados são integralmente modelados em arquivo declarativo versionado ([`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml)). Mudanças passam por revisão por pares e esteiras de CI/CD, sem dependência de banco de dados relacional ou painel web mutável.
|
|
32
|
+
3. **RBAC Multi-Tenant e Filtragem Dinâmica de Catálogo:**
|
|
33
|
+
- **Descoberta (`tools/list`):** O catálogo MCP é dinamicamente filtrado; agentes visualizam estritamente as ferramentas autorizadas para seu respectivo perfil.
|
|
34
|
+
- **Invocação (`tools/call`):** Validação mandatória em tempo de execução garantindo que a ferramenta solicitada e o tenant/conta AWS de destino pertençam ao escopo do agente autenticado.
|
|
35
|
+
4. **Trilha de Auditoria Síncrona Fail-Secure:** Cada invocação emite um evento estruturado em JSONLines na entrada (`PENDING`) e na saída (`SUCCESS`, `FAILED` ou `BLOCKED`). Sob a política *Fail-Secure*, qualquer falha no subsistema de persistência de log bloqueia incondicionalmente a chamada da ferramenta, garantindo que nenhuma ação seja executada sem rastro forense.
|
|
36
|
+
5. **Higienização e Mascaramento Automático:** Todos os payloads de entrada, saída e registros de log passam por sanitização recursiva, substituindo senhas, tokens e parâmetros sensíveis pelo marcador `[REDACTED]`.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 📋 Requisitos de Ambiente
|
|
41
|
+
|
|
42
|
+
- **Sistema Operacional:** Linux (x86_64 ou ARM64) ou macOS.
|
|
43
|
+
- **Runtime:** Python `>= 3.12`.
|
|
44
|
+
- **Gerenciador de Pacotes e Toolchain:** [`uv`](https://github.com/astral-sh/uv) (recomendado) ou `pip`/`venv`.
|
|
45
|
+
- **Credenciais de Provedor:** AWS Credentials configuradas no ambiente hospedeiro via variáveis de ambiente padrão (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`), arquivo de credenciais `~/.aws/credentials` ou perfil de instância/IAM Role (EC2/ECS/EKS).
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## ⚡ Instalação Rápida
|
|
50
|
+
|
|
51
|
+
Clone o repositório e sincronize o ambiente virtual isolado com o `uv`:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# Clone do repositório
|
|
55
|
+
git clone https://github.com/Defendi/McpSentinel.git
|
|
56
|
+
cd McpSentinel
|
|
57
|
+
|
|
58
|
+
# Criação do venv e instalação de todas as dependências (incluindo dev)
|
|
59
|
+
uv sync
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Caso utilize o `pip` padrão:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python3.12 -m venv .venv
|
|
66
|
+
source .venv/bin/activate
|
|
67
|
+
pip install -e ".[dev]"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## ⚙️ Configuração
|
|
73
|
+
|
|
74
|
+
O McpSentinel é configurado via variáveis de ambiente e arquivos declarativos versionados.
|
|
75
|
+
|
|
76
|
+
### Variáveis de Ambiente Suportadas
|
|
77
|
+
|
|
78
|
+
As variáveis podem ser definidas no ambiente do sistema operacional ou em um arquivo `.env` na raiz do projeto:
|
|
79
|
+
|
|
80
|
+
| Variável | Padrão | Descrição |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `SENTINEL_AUTH_TOKEN` | `sentinel-secret-token` | Bearer token legado de fallback para validação de requisições HTTP. |
|
|
83
|
+
| `SENTINEL_SECURITY_CONFIG` | `config/security.yaml` | Caminho do arquivo de configuração declarativa GitOps (RBAC e agentes). |
|
|
84
|
+
| `SENTINEL_AUDIT_LOG_PATH` | `logs/audit.log` | Caminho do arquivo local para persistência síncrona de eventos de auditoria JSONLines. |
|
|
85
|
+
| `SENTINEL_HOST` | `0.0.0.0` | Endereço IP de ligação do servidor ASGI. |
|
|
86
|
+
| `SENTINEL_PORT` | `8000` | Porta TCP de escuta do servidor HTTP/SSE. |
|
|
87
|
+
| `SENTINEL_ENVIRONMENT` | `development` | Ambiente operacional (`development`, `staging`, `production`). |
|
|
88
|
+
| `SENTINEL_LOG_LEVEL` | `INFO` | Nível de logging da aplicação (`DEBUG`, `INFO`, `WARNING`, `ERROR`). |
|
|
89
|
+
|
|
90
|
+
### Configuração Declarativa GitOps (`config/security.yaml`)
|
|
91
|
+
|
|
92
|
+
O arquivo [`config/security.yaml`](file:///mnt/home/alexandre/Projetos/McpSentinel/config/security.yaml) define formalmente a tríade de segurança: **Tenants**, **Profiles** e **Agents**. Suporta interpolação de variáveis de ambiente com valores padrão `${VAR_NAME:-default}`.
|
|
93
|
+
|
|
94
|
+
```yaml
|
|
95
|
+
version: "1.0"
|
|
96
|
+
|
|
97
|
+
# 1. Tenants corporativos (Contas de nuvem e escopos)
|
|
98
|
+
tenants:
|
|
99
|
+
aws_accounts:
|
|
100
|
+
- id: "dev-account"
|
|
101
|
+
account_id: "111122223333"
|
|
102
|
+
name: "Ambiente de Desenvolvimento"
|
|
103
|
+
allowed_regions:
|
|
104
|
+
- "us-east-1"
|
|
105
|
+
- "sa-east-1"
|
|
106
|
+
|
|
107
|
+
# 2. Perfis RBAC
|
|
108
|
+
profiles:
|
|
109
|
+
sre_operations:
|
|
110
|
+
description: "Perfil operacional SRE"
|
|
111
|
+
tools:
|
|
112
|
+
- "aws_get_caller_identity"
|
|
113
|
+
allowed_tenants:
|
|
114
|
+
aws_accounts:
|
|
115
|
+
- "dev-account"
|
|
116
|
+
|
|
117
|
+
# 3. Identidades dos agentes clientes
|
|
118
|
+
agents:
|
|
119
|
+
- agent_id: "agent-sre-01"
|
|
120
|
+
name: "Agente Operacional SRE Principal"
|
|
121
|
+
token: "${SENTINEL_TOKEN_SRE:-token-sre-01-secret}"
|
|
122
|
+
profile: "sre_operations"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 🚀 Inicialização do Servidor
|
|
128
|
+
|
|
129
|
+
### Execução via Uvicorn (Recomendada em Produção/Desenvolvimento)
|
|
130
|
+
|
|
131
|
+
Inicie a aplicação ASGI Starlette com transporte Server-Sent Events (SSE):
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
uv run uvicorn mcpsentinel.api.app:app --host 0.0.0.0 --port 8000 --reload
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
O gateway inicializará e disponibilizará o endpoint MCP SSE em:
|
|
138
|
+
- **SSE Connection Endpoint:** `http://localhost:8000/sse`
|
|
139
|
+
- **Messages POST Endpoint:** `http://localhost:8000/messages/`
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 🔌 Conectando Clientes MCP
|
|
144
|
+
|
|
145
|
+
Todos os clientes devem enviar o cabeçalho de autenticação HTTP padrão:
|
|
146
|
+
```http
|
|
147
|
+
Authorization: Bearer <TOKEN_DO_AGENTE>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 1. Claude Desktop
|
|
151
|
+
|
|
152
|
+
Configure o arquivo de configuração do Claude Desktop (`claude_desktop_config.json`):
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"mcpServers": {
|
|
157
|
+
"mcpsentinel": {
|
|
158
|
+
"url": "http://localhost:8000/sse",
|
|
159
|
+
"headers": {
|
|
160
|
+
"Authorization": "Bearer token-sre-01-secret"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 2. Chamadas HTTP Diretas (curl / httpx)
|
|
168
|
+
|
|
169
|
+
Você pode validar a inicialização e escuta da conexão SSE com o utilitário `curl`:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Conectar ao stream de eventos SSE com Bearer Token
|
|
173
|
+
curl -N -H "Authorization: Bearer token-sre-01-secret" \
|
|
174
|
+
http://localhost:8000/sse
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Em caso de credencial ausente ou inválida, o gateway rejeita imediatamente com HTTP 401:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
curl -i http://localhost:8000/sse
|
|
181
|
+
# HTTP/1.1 401 Unauthorized
|
|
182
|
+
# {"error": "Unauthorized", "code": "AUTHENTICATION_ERROR", "detail": "Missing Authorization header"}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 🧪 Quality Gates e Testes Herméticos
|
|
188
|
+
|
|
189
|
+
O projeto possui uma suíte hermética de testes de unidade, integração e segurança, sem dependências de infraestrutura externa viva em runtime de teste.
|
|
190
|
+
|
|
191
|
+
### Execução de Testes com Cobertura
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Execução da suíte completa com relatório de cobertura detalhado
|
|
195
|
+
uv run pytest --cov=src/mcpsentinel --cov-report=term-missing
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Status atual da cobertura: **97%** em 134 testes automatizados.
|
|
199
|
+
|
|
200
|
+
### Inspeção Estática de Código e Tipagem
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Validação de formatação e linting estrito com Ruff
|
|
204
|
+
uv run ruff check
|
|
205
|
+
|
|
206
|
+
# Checagem estrita de tipos estáticos com Mypy
|
|
207
|
+
uv run mypy src
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 📚 Rastreabilidade e Documentação do Harness
|
|
213
|
+
|
|
214
|
+
Este repositório adota a disciplina canônica do **Application Development Harness**. Consulte a documentação complementar em [`docs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/):
|
|
215
|
+
|
|
216
|
+
- **Manual de Operação e Governança:** [`docs/manual-de-operacao.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/manual-de-operacao.md) — Guia detalhado para o Administrador de Segurança (AT-01).
|
|
217
|
+
- **Technical Requirements Document (TRD):** [`docs/trd.md`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/trd.md) — Requisitos não-funcionais, stack e limites arquiteturais globais.
|
|
218
|
+
- **Registros de Decisões Arquiteturais (ADRs):**
|
|
219
|
+
- [`ADR 001: Transporte Remoto HTTP para Servidor MCP Centralizado`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/001-transporte-remoto-http-mcp.md)
|
|
220
|
+
- [`ADR 002: Modelo de Segurança Declarativo GitOps, RBAC e Guardrails Operacionais`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/002-seguranca-rbac-gitops-e-guardrails.md)
|
|
221
|
+
- [`ADR 003: Trilha de Auditoria Síncrona Estruturada em JSON sob Paradigma Fail-Secure`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/adrs/003-auditoria-sincrona-fail-secure.md)
|
|
222
|
+
- **Especificações de Funcionalidades:** [`docs/specs/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/specs/)
|
|
223
|
+
- **Product Requirements Documents:** [`docs/prds/`](file:///mnt/home/alexandre/Projetos/McpSentinel/docs/prds/)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "mcpsentinel-gateway"
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "Prover acesso seguro a ferramentas de infraestrutura (AWS, Gitlab, Azure) via protocolo MCP"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.12"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
dependencies = [
|
|
13
|
+
"fastmcp>=0.4.0",
|
|
14
|
+
"fastapi>=0.110.0",
|
|
15
|
+
"uvicorn>=0.30.0",
|
|
16
|
+
"pydantic>=2.7.0",
|
|
17
|
+
"pydantic-settings>=2.0.0",
|
|
18
|
+
"boto3>=1.34.0",
|
|
19
|
+
"httpx>=0.27.0",
|
|
20
|
+
"pyyaml>=6.0.3",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[project.optional-dependencies]
|
|
24
|
+
dev = [
|
|
25
|
+
"pytest>=8.0.0",
|
|
26
|
+
"pytest-asyncio>=0.23.0",
|
|
27
|
+
"pytest-cov>=5.0.0",
|
|
28
|
+
"ruff>=0.4.0",
|
|
29
|
+
"mypy>=1.10.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[tool.ruff]
|
|
33
|
+
line-length = 100
|
|
34
|
+
|
|
35
|
+
[tool.mypy]
|
|
36
|
+
strict = true
|
|
37
|
+
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
asyncio_mode = "auto"
|
|
40
|
+
testpaths = ["tests"]
|
|
41
|
+
|
|
42
|
+
[dependency-groups]
|
|
43
|
+
dev = [
|
|
44
|
+
"types-pyyaml>=6.0.12.20260906",
|
|
45
|
+
]
|