mcp-proxy-adapter 4.1.1__py3-none-any.whl → 6.1.0__py3-none-any.whl
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.
- mcp_proxy_adapter/__main__.py +12 -0
- mcp_proxy_adapter/api/app.py +254 -33
- mcp_proxy_adapter/api/handlers.py +32 -6
- mcp_proxy_adapter/api/middleware/__init__.py +36 -30
- mcp_proxy_adapter/api/middleware/command_permission_middleware.py +148 -0
- mcp_proxy_adapter/api/middleware/error_handling.py +9 -0
- mcp_proxy_adapter/api/middleware/factory.py +243 -0
- mcp_proxy_adapter/api/middleware/logging.py +32 -6
- mcp_proxy_adapter/api/middleware/protocol_middleware.py +135 -0
- mcp_proxy_adapter/api/middleware/transport_middleware.py +122 -0
- mcp_proxy_adapter/api/middleware/unified_security.py +152 -0
- mcp_proxy_adapter/api/middleware/user_info_middleware.py +83 -0
- mcp_proxy_adapter/commands/__init__.py +19 -4
- mcp_proxy_adapter/commands/auth_validation_command.py +408 -0
- mcp_proxy_adapter/commands/base.py +66 -32
- mcp_proxy_adapter/commands/builtin_commands.py +95 -0
- mcp_proxy_adapter/commands/catalog_manager.py +838 -0
- mcp_proxy_adapter/commands/cert_monitor_command.py +620 -0
- mcp_proxy_adapter/commands/certificate_management_command.py +608 -0
- mcp_proxy_adapter/commands/command_registry.py +711 -354
- mcp_proxy_adapter/commands/dependency_manager.py +245 -0
- mcp_proxy_adapter/commands/echo_command.py +81 -0
- mcp_proxy_adapter/commands/health_command.py +7 -0
- mcp_proxy_adapter/commands/help_command.py +21 -14
- mcp_proxy_adapter/commands/hooks.py +200 -167
- mcp_proxy_adapter/commands/key_management_command.py +506 -0
- mcp_proxy_adapter/commands/load_command.py +176 -0
- mcp_proxy_adapter/commands/plugins_command.py +235 -0
- mcp_proxy_adapter/commands/protocol_management_command.py +232 -0
- mcp_proxy_adapter/commands/proxy_registration_command.py +409 -0
- mcp_proxy_adapter/commands/reload_command.py +48 -50
- mcp_proxy_adapter/commands/result.py +1 -0
- mcp_proxy_adapter/commands/role_test_command.py +141 -0
- mcp_proxy_adapter/commands/roles_management_command.py +697 -0
- mcp_proxy_adapter/commands/security_command.py +488 -0
- mcp_proxy_adapter/commands/ssl_setup_command.py +483 -0
- mcp_proxy_adapter/commands/token_management_command.py +529 -0
- mcp_proxy_adapter/commands/transport_management_command.py +144 -0
- mcp_proxy_adapter/commands/unload_command.py +158 -0
- mcp_proxy_adapter/config.py +159 -2
- mcp_proxy_adapter/core/app_factory.py +326 -0
- mcp_proxy_adapter/core/auth_validator.py +606 -0
- mcp_proxy_adapter/core/certificate_utils.py +827 -0
- mcp_proxy_adapter/core/client_security.py +384 -0
- mcp_proxy_adapter/core/config_converter.py +405 -0
- mcp_proxy_adapter/core/config_validator.py +218 -0
- mcp_proxy_adapter/core/logging.py +19 -3
- mcp_proxy_adapter/core/mtls_asgi.py +156 -0
- mcp_proxy_adapter/core/mtls_asgi_app.py +187 -0
- mcp_proxy_adapter/core/protocol_manager.py +235 -0
- mcp_proxy_adapter/core/proxy_client.py +602 -0
- mcp_proxy_adapter/core/proxy_registration.py +522 -0
- mcp_proxy_adapter/core/role_utils.py +426 -0
- mcp_proxy_adapter/core/security_adapter.py +370 -0
- mcp_proxy_adapter/core/security_factory.py +239 -0
- mcp_proxy_adapter/core/security_integration.py +277 -0
- mcp_proxy_adapter/core/server_adapter.py +345 -0
- mcp_proxy_adapter/core/server_engine.py +364 -0
- mcp_proxy_adapter/core/settings.py +1 -0
- mcp_proxy_adapter/core/ssl_utils.py +233 -0
- mcp_proxy_adapter/core/transport_manager.py +292 -0
- mcp_proxy_adapter/core/unified_config_adapter.py +579 -0
- mcp_proxy_adapter/custom_openapi.py +22 -11
- mcp_proxy_adapter/examples/README.md +230 -97
- mcp_proxy_adapter/examples/README_EN.md +258 -0
- mcp_proxy_adapter/examples/SECURITY_TESTING.md +455 -0
- mcp_proxy_adapter/examples/__pycache__/security_configurations.cpython-312.pyc +0 -0
- mcp_proxy_adapter/examples/__pycache__/security_test_client.cpython-312.pyc +0 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/basic_framework/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_auth.json +39 -0
- mcp_proxy_adapter/examples/basic_framework/configs/https_simple.json +25 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/basic_framework/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/basic_framework/main.py +63 -0
- mcp_proxy_adapter/examples/basic_framework/roles.json +21 -0
- mcp_proxy_adapter/examples/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/admin.key +52 -0
- mcp_proxy_adapter/examples/certs/admin_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/admin_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/ca_cert.pem +23 -0
- mcp_proxy_adapter/examples/certs/ca_cert.srl +1 -0
- mcp_proxy_adapter/examples/certs/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/cert_config.json +9 -0
- mcp_proxy_adapter/examples/certs/client.crt +32 -0
- mcp_proxy_adapter/examples/certs/client.key +52 -0
- mcp_proxy_adapter/examples/certs/client_admin.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_admin.key +52 -0
- mcp_proxy_adapter/examples/certs/client_user.crt +32 -0
- mcp_proxy_adapter/examples/certs/client_user.key +52 -0
- mcp_proxy_adapter/examples/certs/guest_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/guest_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/mcp_proxy_adapter_ca_ca.crt +23 -0
- mcp_proxy_adapter/examples/certs/proxy_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/proxy_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/readonly.crt +32 -0
- mcp_proxy_adapter/examples/certs/readonly.key +52 -0
- mcp_proxy_adapter/examples/certs/readonly_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/readonly_key.pem +28 -0
- mcp_proxy_adapter/examples/certs/server.crt +32 -0
- mcp_proxy_adapter/examples/certs/server.key +52 -0
- mcp_proxy_adapter/examples/certs/server_cert.pem +32 -0
- mcp_proxy_adapter/examples/certs/server_key.pem +52 -0
- mcp_proxy_adapter/examples/certs/test_ca_ca.crt +20 -0
- mcp_proxy_adapter/examples/certs/user.crt +32 -0
- mcp_proxy_adapter/examples/certs/user.key +52 -0
- mcp_proxy_adapter/examples/certs/user_cert.pem +21 -0
- mcp_proxy_adapter/examples/certs/user_key.pem +28 -0
- mcp_proxy_adapter/examples/client_configs/api_key_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/basic_auth_client.json +13 -0
- mcp_proxy_adapter/examples/client_configs/certificate_client.json +22 -0
- mcp_proxy_adapter/examples/client_configs/jwt_client.json +15 -0
- mcp_proxy_adapter/examples/client_configs/no_auth_client.json +9 -0
- mcp_proxy_adapter/examples/commands/__init__.py +1 -0
- mcp_proxy_adapter/examples/create_certificates_simple.py +307 -0
- mcp_proxy_adapter/examples/debug_request_state.py +144 -0
- mcp_proxy_adapter/examples/debug_role_chain.py +205 -0
- mcp_proxy_adapter/examples/demo_client.py +341 -0
- mcp_proxy_adapter/examples/full_application/commands/custom_echo_command.py +99 -0
- mcp_proxy_adapter/examples/full_application/commands/dynamic_calculator_command.py +106 -0
- mcp_proxy_adapter/examples/full_application/configs/http_auth.json +37 -0
- mcp_proxy_adapter/examples/full_application/configs/http_simple.json +23 -0
- mcp_proxy_adapter/examples/full_application/configs/https_auth.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/https_simple.json +25 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_no_roles.json +39 -0
- mcp_proxy_adapter/examples/full_application/configs/mtls_with_roles.json +45 -0
- mcp_proxy_adapter/examples/full_application/hooks/application_hooks.py +97 -0
- mcp_proxy_adapter/examples/full_application/hooks/builtin_command_hooks.py +95 -0
- mcp_proxy_adapter/examples/full_application/main.py +138 -0
- mcp_proxy_adapter/examples/full_application/roles.json +21 -0
- mcp_proxy_adapter/examples/generate_all_certificates.py +429 -0
- mcp_proxy_adapter/examples/generate_certificates.py +121 -0
- mcp_proxy_adapter/examples/keys/ca_key.pem +28 -0
- mcp_proxy_adapter/examples/keys/mcp_proxy_adapter_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/keys/test_ca_ca.key +28 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log +220 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_access.log.5 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log +2 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.1 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.2 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.3 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.4 +1 -0
- mcp_proxy_adapter/examples/logs/mcp_proxy_adapter_error.log.5 +1 -0
- mcp_proxy_adapter/examples/proxy_registration_example.py +401 -0
- mcp_proxy_adapter/examples/roles.json +38 -0
- mcp_proxy_adapter/examples/run_example.py +81 -0
- mcp_proxy_adapter/examples/run_security_tests.py +326 -0
- mcp_proxy_adapter/examples/run_security_tests_fixed.py +300 -0
- mcp_proxy_adapter/examples/security_test_client.py +743 -0
- mcp_proxy_adapter/examples/server_configs/config_basic_http.json +204 -0
- mcp_proxy_adapter/examples/server_configs/config_http_token.json +238 -0
- mcp_proxy_adapter/examples/server_configs/config_https.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_https_token.json +231 -0
- mcp_proxy_adapter/examples/server_configs/config_mtls.json +215 -0
- mcp_proxy_adapter/examples/server_configs/config_proxy_registration.json +250 -0
- mcp_proxy_adapter/examples/server_configs/config_simple.json +46 -0
- mcp_proxy_adapter/examples/server_configs/roles.json +38 -0
- mcp_proxy_adapter/examples/test_examples.py +344 -0
- mcp_proxy_adapter/examples/universal_client.py +628 -0
- mcp_proxy_adapter/main.py +186 -0
- mcp_proxy_adapter/utils/config_generator.py +639 -0
- mcp_proxy_adapter/version.py +2 -1
- mcp_proxy_adapter-6.1.0.dist-info/METADATA +205 -0
- mcp_proxy_adapter-6.1.0.dist-info/RECORD +193 -0
- mcp_proxy_adapter-6.1.0.dist-info/entry_points.txt +2 -0
- {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/licenses/LICENSE +2 -2
- mcp_proxy_adapter/api/middleware/auth.py +0 -146
- mcp_proxy_adapter/api/middleware/rate_limit.py +0 -152
- mcp_proxy_adapter/commands/reload_settings_command.py +0 -125
- mcp_proxy_adapter/examples/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/README.md +0 -60
- mcp_proxy_adapter/examples/basic_server/__init__.py +0 -7
- mcp_proxy_adapter/examples/basic_server/basic_custom_settings.json +0 -39
- mcp_proxy_adapter/examples/basic_server/config.json +0 -35
- mcp_proxy_adapter/examples/basic_server/custom_settings_example.py +0 -238
- mcp_proxy_adapter/examples/basic_server/server.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/README.md +0 -127
- mcp_proxy_adapter/examples/custom_commands/__init__.py +0 -27
- mcp_proxy_adapter/examples/custom_commands/advanced_hooks.py +0 -250
- mcp_proxy_adapter/examples/custom_commands/auto_commands/__init__.py +0 -6
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/auto_commands/auto_info_command.py +0 -111
- mcp_proxy_adapter/examples/custom_commands/config.json +0 -35
- mcp_proxy_adapter/examples/custom_commands/custom_health_command.py +0 -169
- mcp_proxy_adapter/examples/custom_commands/custom_help_command.py +0 -215
- mcp_proxy_adapter/examples/custom_commands/custom_openapi_generator.py +0 -76
- mcp_proxy_adapter/examples/custom_commands/custom_settings.json +0 -96
- mcp_proxy_adapter/examples/custom_commands/custom_settings_manager.py +0 -241
- mcp_proxy_adapter/examples/custom_commands/data_transform_command.py +0 -135
- mcp_proxy_adapter/examples/custom_commands/echo_command.py +0 -122
- mcp_proxy_adapter/examples/custom_commands/hooks.py +0 -230
- mcp_proxy_adapter/examples/custom_commands/intercept_command.py +0 -123
- mcp_proxy_adapter/examples/custom_commands/manual_echo_command.py +0 -103
- mcp_proxy_adapter/examples/custom_commands/server.py +0 -228
- mcp_proxy_adapter/examples/custom_commands/test_hooks.py +0 -176
- mcp_proxy_adapter/examples/deployment/README.md +0 -49
- mcp_proxy_adapter/examples/deployment/__init__.py +0 -7
- mcp_proxy_adapter/examples/deployment/config.development.json +0 -8
- mcp_proxy_adapter/examples/deployment/config.json +0 -29
- mcp_proxy_adapter/examples/deployment/config.production.json +0 -12
- mcp_proxy_adapter/examples/deployment/config.staging.json +0 -11
- mcp_proxy_adapter/examples/deployment/docker-compose.yml +0 -31
- mcp_proxy_adapter/examples/deployment/run.sh +0 -43
- mcp_proxy_adapter/examples/deployment/run_docker.sh +0 -84
- mcp_proxy_adapter/schemas/base_schema.json +0 -114
- mcp_proxy_adapter/schemas/openapi_schema.json +0 -314
- mcp_proxy_adapter/tests/__init__.py +0 -0
- mcp_proxy_adapter/tests/api/__init__.py +0 -3
- mcp_proxy_adapter/tests/api/test_cmd_endpoint.py +0 -115
- mcp_proxy_adapter/tests/api/test_custom_openapi.py +0 -617
- mcp_proxy_adapter/tests/api/test_handlers.py +0 -522
- mcp_proxy_adapter/tests/api/test_middleware.py +0 -340
- mcp_proxy_adapter/tests/api/test_schemas.py +0 -546
- mcp_proxy_adapter/tests/api/test_tool_integration.py +0 -531
- mcp_proxy_adapter/tests/commands/__init__.py +0 -3
- mcp_proxy_adapter/tests/commands/test_config_command.py +0 -211
- mcp_proxy_adapter/tests/commands/test_echo_command.py +0 -127
- mcp_proxy_adapter/tests/commands/test_help_command.py +0 -136
- mcp_proxy_adapter/tests/conftest.py +0 -131
- mcp_proxy_adapter/tests/functional/__init__.py +0 -3
- mcp_proxy_adapter/tests/functional/test_api.py +0 -253
- mcp_proxy_adapter/tests/integration/__init__.py +0 -3
- mcp_proxy_adapter/tests/integration/test_cmd_integration.py +0 -129
- mcp_proxy_adapter/tests/integration/test_integration.py +0 -255
- mcp_proxy_adapter/tests/performance/__init__.py +0 -3
- mcp_proxy_adapter/tests/performance/test_performance.py +0 -189
- mcp_proxy_adapter/tests/stubs/__init__.py +0 -10
- mcp_proxy_adapter/tests/stubs/echo_command.py +0 -104
- mcp_proxy_adapter/tests/test_api_endpoints.py +0 -271
- mcp_proxy_adapter/tests/test_api_handlers.py +0 -289
- mcp_proxy_adapter/tests/test_base_command.py +0 -123
- mcp_proxy_adapter/tests/test_batch_requests.py +0 -117
- mcp_proxy_adapter/tests/test_command_registry.py +0 -281
- mcp_proxy_adapter/tests/test_config.py +0 -127
- mcp_proxy_adapter/tests/test_utils.py +0 -65
- mcp_proxy_adapter/tests/unit/__init__.py +0 -3
- mcp_proxy_adapter/tests/unit/test_base_command.py +0 -436
- mcp_proxy_adapter/tests/unit/test_config.py +0 -217
- mcp_proxy_adapter-4.1.1.dist-info/METADATA +0 -200
- mcp_proxy_adapter-4.1.1.dist-info/RECORD +0 -110
- {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/WHEEL +0 -0
- {mcp_proxy_adapter-4.1.1.dist-info → mcp_proxy_adapter-6.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,455 @@
|
|
1
|
+
# Security Testing Framework
|
2
|
+
|
3
|
+
This directory contains a comprehensive security testing framework for MCP Proxy Adapter that validates various security configurations and scenarios.
|
4
|
+
|
5
|
+
**Author**: Vasiliy Zdanovskiy
|
6
|
+
**Email**: vasilyvz@gmail.com
|
7
|
+
|
8
|
+
## Overview
|
9
|
+
|
10
|
+
The security testing framework provides:
|
11
|
+
|
12
|
+
- **Positive Tests**: Valid security configurations that should work
|
13
|
+
- **Negative Tests**: Invalid configurations that should be rejected
|
14
|
+
- **Certificate Tests**: mTLS and certificate-based authentication testing
|
15
|
+
- **Multiple Server Configurations**: HTTP, HTTPS, Token Auth, mTLS
|
16
|
+
- **Client Testing**: Using mcp_security_framework for comprehensive client testing
|
17
|
+
|
18
|
+
## Directory Structure
|
19
|
+
|
20
|
+
```
|
21
|
+
examples/
|
22
|
+
├── security_test_client.py # Security test client using mcp_security_framework
|
23
|
+
├── run_security_tests.py # Main test runner
|
24
|
+
├── server_configs/ # Server configuration files
|
25
|
+
│ ├── config_basic_http.json # Basic HTTP without security
|
26
|
+
│ ├── config_http_token.json # HTTP with token authentication
|
27
|
+
│ ├── config_https.json # HTTPS without authentication
|
28
|
+
│ ├── config_https_token.json # HTTPS with token authentication
|
29
|
+
│ ├── config_mtls.json # mTLS with certificate authentication
|
30
|
+
│ └── roles.json # Role definitions for testing
|
31
|
+
└── SECURITY_TESTING.md # This file
|
32
|
+
```
|
33
|
+
|
34
|
+
## Server Configurations
|
35
|
+
|
36
|
+
### 1. Basic HTTP (config_basic_http.json)
|
37
|
+
- **Port**: 8000
|
38
|
+
- **Security**: Disabled
|
39
|
+
- **Authentication**: None
|
40
|
+
- **SSL/TLS**: Disabled
|
41
|
+
- **Use Case**: Basic testing without security
|
42
|
+
|
43
|
+
### 2. HTTP + Token (config_http_token.json)
|
44
|
+
- **Port**: 8001
|
45
|
+
- **Security**: Enabled
|
46
|
+
- **Authentication**: API Key
|
47
|
+
- **SSL/TLS**: Disabled
|
48
|
+
- **Use Case**: Token-based authentication over HTTP
|
49
|
+
|
50
|
+
### 3. HTTPS (config_https.json)
|
51
|
+
- **Port**: 8443
|
52
|
+
- **Security**: Enabled
|
53
|
+
- **Authentication**: None
|
54
|
+
- **SSL/TLS**: Enabled
|
55
|
+
- **Use Case**: Secure communication without authentication
|
56
|
+
|
57
|
+
### 4. HTTPS + Token (config_https_token.json)
|
58
|
+
- **Port**: 8444
|
59
|
+
- **Security**: Enabled
|
60
|
+
- **Authentication**: API Key
|
61
|
+
- **SSL/TLS**: Enabled
|
62
|
+
- **Use Case**: Secure communication with token authentication
|
63
|
+
|
64
|
+
### 5. mTLS (config_mtls.json)
|
65
|
+
- **Port**: 9443
|
66
|
+
- **Security**: Enabled
|
67
|
+
- **Authentication**: Certificate-based
|
68
|
+
- **SSL/TLS**: Enabled with mutual authentication
|
69
|
+
- **Use Case**: Highest security with certificate validation
|
70
|
+
|
71
|
+
## Test Scenarios
|
72
|
+
|
73
|
+
### Positive Tests
|
74
|
+
|
75
|
+
These tests verify that valid configurations work correctly:
|
76
|
+
|
77
|
+
1. **Basic HTTP Tests**
|
78
|
+
- Health endpoint access
|
79
|
+
- Echo command execution
|
80
|
+
- Security command access
|
81
|
+
|
82
|
+
2. **HTTP + Token Tests**
|
83
|
+
- Authentication with valid API key
|
84
|
+
- Role-based access control
|
85
|
+
- Rate limiting validation
|
86
|
+
|
87
|
+
3. **HTTPS Tests**
|
88
|
+
- SSL/TLS handshake
|
89
|
+
- Certificate validation
|
90
|
+
- Secure communication
|
91
|
+
|
92
|
+
4. **HTTPS + Token Tests**
|
93
|
+
- Combined SSL and token authentication
|
94
|
+
- Security headers validation
|
95
|
+
- Mixed authentication methods
|
96
|
+
|
97
|
+
5. **mTLS Tests**
|
98
|
+
- Mutual certificate authentication
|
99
|
+
- Certificate chain validation
|
100
|
+
- Role extraction from certificates
|
101
|
+
|
102
|
+
### Negative Tests
|
103
|
+
|
104
|
+
These tests verify that invalid configurations are properly rejected:
|
105
|
+
|
106
|
+
1. **Invalid API Key**
|
107
|
+
- Test with wrong API key
|
108
|
+
- Expected: Authentication failure
|
109
|
+
|
110
|
+
2. **No Authentication on Auth Server**
|
111
|
+
- Test without credentials on auth-required server
|
112
|
+
- Expected: Access denied
|
113
|
+
|
114
|
+
3. **Protocol Mismatch**
|
115
|
+
- HTTP client connecting to HTTPS server
|
116
|
+
- Expected: Connection failure
|
117
|
+
|
118
|
+
4. **Invalid Certificates**
|
119
|
+
- Expired certificates
|
120
|
+
- Wrong organization certificates
|
121
|
+
- Expected: Certificate validation failure
|
122
|
+
|
123
|
+
### Certificate Tests
|
124
|
+
|
125
|
+
Specific tests for certificate-based authentication:
|
126
|
+
|
127
|
+
1. **Admin Certificate**
|
128
|
+
- Full administrative access
|
129
|
+
- Expected: All operations allowed
|
130
|
+
|
131
|
+
2. **User Certificate**
|
132
|
+
- Standard user access
|
133
|
+
- Expected: Read/write operations allowed
|
134
|
+
|
135
|
+
3. **Readonly Certificate**
|
136
|
+
- Read-only access
|
137
|
+
- Expected: Only read operations allowed
|
138
|
+
|
139
|
+
4. **Expired Certificate**
|
140
|
+
- Certificate past expiration date
|
141
|
+
- Expected: Authentication failure
|
142
|
+
|
143
|
+
5. **Wrong Organization Certificate**
|
144
|
+
- Certificate from unauthorized organization
|
145
|
+
- Expected: Authentication failure
|
146
|
+
|
147
|
+
## Usage
|
148
|
+
|
149
|
+
### Prerequisites
|
150
|
+
|
151
|
+
1. Install dependencies:
|
152
|
+
```bash
|
153
|
+
pip install mcp_security_framework aiohttp
|
154
|
+
```
|
155
|
+
|
156
|
+
2. Generate certificates (if not already present):
|
157
|
+
```bash
|
158
|
+
python examples/generate_certificates.py
|
159
|
+
```
|
160
|
+
|
161
|
+
### Running Tests
|
162
|
+
|
163
|
+
#### Run All Tests
|
164
|
+
```bash
|
165
|
+
python examples/run_security_tests.py
|
166
|
+
```
|
167
|
+
|
168
|
+
#### Run Specific Test Types
|
169
|
+
```bash
|
170
|
+
# Positive tests only
|
171
|
+
python examples/run_security_tests.py --positive-only
|
172
|
+
|
173
|
+
# Negative tests only
|
174
|
+
python examples/run_security_tests.py --negative-only
|
175
|
+
|
176
|
+
# Certificate tests only
|
177
|
+
python examples/run_security_tests.py --certificates-only
|
178
|
+
```
|
179
|
+
|
180
|
+
#### Run with Custom Certificate Directory
|
181
|
+
```bash
|
182
|
+
python examples/run_security_tests.py --cert-dir ./certs
|
183
|
+
```
|
184
|
+
|
185
|
+
#### Save Results to File
|
186
|
+
```bash
|
187
|
+
python examples/run_security_tests.py --output test_results.json
|
188
|
+
```
|
189
|
+
|
190
|
+
### Using the Security Test Client
|
191
|
+
|
192
|
+
The security test client can be used independently:
|
193
|
+
|
194
|
+
```bash
|
195
|
+
# Test basic HTTP
|
196
|
+
python examples/security_test_client.py --server-url http://localhost:8000
|
197
|
+
|
198
|
+
# Test HTTPS with certificates
|
199
|
+
python examples/security_test_client.py --server-url https://localhost:8443 --cert-dir ./certs
|
200
|
+
|
201
|
+
# Test with specific API key
|
202
|
+
python examples/security_test_client.py --server-url http://localhost:8001 --api-key test-api-key
|
203
|
+
```
|
204
|
+
|
205
|
+
## Test Client Features
|
206
|
+
|
207
|
+
The `SecurityTestClient` provides:
|
208
|
+
|
209
|
+
### Authentication Methods
|
210
|
+
- **None**: No authentication
|
211
|
+
- **API Key**: Token-based authentication
|
212
|
+
- **Certificate**: mTLS certificate authentication
|
213
|
+
|
214
|
+
### SSL/TLS Support
|
215
|
+
- SSL context creation
|
216
|
+
- Certificate validation
|
217
|
+
- Hostname verification
|
218
|
+
- TLS version configuration
|
219
|
+
|
220
|
+
### Test Endpoints
|
221
|
+
- **Health Check**: `/health`
|
222
|
+
- **Echo Command**: `/cmd` (JSON-RPC)
|
223
|
+
- **Security Command**: `/cmd` (JSON-RPC)
|
224
|
+
|
225
|
+
### Error Handling
|
226
|
+
- Connection timeout handling
|
227
|
+
- SSL/TLS error detection
|
228
|
+
- Authentication failure detection
|
229
|
+
- Detailed error reporting
|
230
|
+
|
231
|
+
## Security Features Tested
|
232
|
+
|
233
|
+
### 1. SSL/TLS Security
|
234
|
+
- Certificate validation
|
235
|
+
- TLS version enforcement
|
236
|
+
- Cipher suite selection
|
237
|
+
- Hostname verification
|
238
|
+
|
239
|
+
### 2. Authentication
|
240
|
+
- API key validation
|
241
|
+
- Certificate-based authentication
|
242
|
+
- Role extraction from certificates
|
243
|
+
- Permission checking
|
244
|
+
|
245
|
+
### 3. Authorization
|
246
|
+
- Role-based access control
|
247
|
+
- Permission inheritance
|
248
|
+
- Resource-level permissions
|
249
|
+
- Admin privilege validation
|
250
|
+
|
251
|
+
### 4. Rate Limiting
|
252
|
+
- Request rate enforcement
|
253
|
+
- Burst limit validation
|
254
|
+
- Role-based exemptions
|
255
|
+
- Time window management
|
256
|
+
|
257
|
+
### 5. Security Headers
|
258
|
+
- Content-Type-Options
|
259
|
+
- Frame-Options
|
260
|
+
- XSS-Protection
|
261
|
+
- HSTS (HTTP Strict Transport Security)
|
262
|
+
|
263
|
+
### 6. Certificate Management
|
264
|
+
- Certificate expiration checking
|
265
|
+
- Certificate revocation list (CRL)
|
266
|
+
- Certificate chain validation
|
267
|
+
- Organization validation
|
268
|
+
|
269
|
+
## Expected Test Results
|
270
|
+
|
271
|
+
### Positive Tests
|
272
|
+
All positive tests should:
|
273
|
+
- ✅ Successfully connect to server
|
274
|
+
- ✅ Authenticate properly
|
275
|
+
- ✅ Execute commands successfully
|
276
|
+
- ✅ Return expected responses
|
277
|
+
- ✅ Complete within reasonable time
|
278
|
+
|
279
|
+
### Negative Tests
|
280
|
+
All negative tests should:
|
281
|
+
- ❌ Fail to authenticate
|
282
|
+
- ❌ Return appropriate error codes
|
283
|
+
- ❌ Log security violations
|
284
|
+
- ❌ Prevent unauthorized access
|
285
|
+
- ❌ Handle errors gracefully
|
286
|
+
|
287
|
+
### Certificate Tests
|
288
|
+
Certificate tests should:
|
289
|
+
- ✅ Accept valid certificates
|
290
|
+
- ❌ Reject expired certificates
|
291
|
+
- ❌ Reject wrong organization certificates
|
292
|
+
- ✅ Extract roles correctly
|
293
|
+
- ✅ Enforce role-based permissions
|
294
|
+
|
295
|
+
## Troubleshooting
|
296
|
+
|
297
|
+
### Common Issues
|
298
|
+
|
299
|
+
1. **Certificate Not Found**
|
300
|
+
```
|
301
|
+
Error: Certificate files not found
|
302
|
+
Solution: Run generate_certificates.py first
|
303
|
+
```
|
304
|
+
|
305
|
+
2. **Port Already in Use**
|
306
|
+
```
|
307
|
+
Error: Address already in use
|
308
|
+
Solution: Stop existing servers or change ports in config
|
309
|
+
```
|
310
|
+
|
311
|
+
3. **SSL Handshake Failed**
|
312
|
+
```
|
313
|
+
Error: SSL handshake failed
|
314
|
+
Solution: Check certificate validity and CA certificate
|
315
|
+
```
|
316
|
+
|
317
|
+
4. **Authentication Failed**
|
318
|
+
```
|
319
|
+
Error: Authentication failed
|
320
|
+
Solution: Verify API key or certificate configuration
|
321
|
+
```
|
322
|
+
|
323
|
+
### Debug Mode
|
324
|
+
|
325
|
+
Enable debug logging for detailed troubleshooting:
|
326
|
+
|
327
|
+
```bash
|
328
|
+
# Set debug environment variable
|
329
|
+
export DEBUG=1
|
330
|
+
|
331
|
+
# Run tests with verbose output
|
332
|
+
python examples/run_security_tests.py --verbose
|
333
|
+
```
|
334
|
+
|
335
|
+
### Certificate Validation
|
336
|
+
|
337
|
+
To validate certificates manually:
|
338
|
+
|
339
|
+
```bash
|
340
|
+
# Check certificate validity
|
341
|
+
openssl x509 -in certs/admin.crt -text -noout
|
342
|
+
|
343
|
+
# Verify certificate chain
|
344
|
+
openssl verify -CAfile certs/ca_cert.pem certs/admin.crt
|
345
|
+
|
346
|
+
# Check certificate expiration
|
347
|
+
openssl x509 -in certs/admin.crt -noout -dates
|
348
|
+
```
|
349
|
+
|
350
|
+
## Integration with CI/CD
|
351
|
+
|
352
|
+
The security testing framework can be integrated into CI/CD pipelines:
|
353
|
+
|
354
|
+
```yaml
|
355
|
+
# Example GitHub Actions workflow
|
356
|
+
name: Security Tests
|
357
|
+
on: [push, pull_request]
|
358
|
+
|
359
|
+
jobs:
|
360
|
+
security-tests:
|
361
|
+
runs-on: ubuntu-latest
|
362
|
+
steps:
|
363
|
+
- uses: actions/checkout@v2
|
364
|
+
- name: Set up Python
|
365
|
+
uses: actions/setup-python@v2
|
366
|
+
with:
|
367
|
+
python-version: '3.12'
|
368
|
+
- name: Install dependencies
|
369
|
+
run: |
|
370
|
+
pip install -e .
|
371
|
+
pip install mcp_security_framework aiohttp
|
372
|
+
- name: Generate certificates
|
373
|
+
run: python examples/generate_certificates.py
|
374
|
+
- name: Run security tests
|
375
|
+
run: python examples/run_security_tests.py --output results.json
|
376
|
+
- name: Upload test results
|
377
|
+
uses: actions/upload-artifact@v2
|
378
|
+
with:
|
379
|
+
name: security-test-results
|
380
|
+
path: results.json
|
381
|
+
```
|
382
|
+
|
383
|
+
## Performance Considerations
|
384
|
+
|
385
|
+
### Test Execution Time
|
386
|
+
- **Basic HTTP**: ~1-2 seconds per test
|
387
|
+
- **HTTPS**: ~2-3 seconds per test
|
388
|
+
- **mTLS**: ~3-5 seconds per test
|
389
|
+
- **Full Test Suite**: ~30-60 seconds
|
390
|
+
|
391
|
+
### Resource Usage
|
392
|
+
- **Memory**: ~50-100 MB per server instance
|
393
|
+
- **CPU**: Low usage during normal operation
|
394
|
+
- **Network**: Minimal traffic for test scenarios
|
395
|
+
|
396
|
+
### Optimization Tips
|
397
|
+
1. Run tests in parallel (with different ports)
|
398
|
+
2. Use connection pooling for multiple requests
|
399
|
+
3. Implement test result caching
|
400
|
+
4. Use lightweight certificates for testing
|
401
|
+
|
402
|
+
## Security Best Practices
|
403
|
+
|
404
|
+
### For Testing
|
405
|
+
1. Use dedicated test certificates
|
406
|
+
2. Never use production certificates in tests
|
407
|
+
3. Implement proper cleanup after tests
|
408
|
+
4. Validate all security headers
|
409
|
+
5. Test both positive and negative scenarios
|
410
|
+
|
411
|
+
### For Production
|
412
|
+
1. Use strong certificate authorities
|
413
|
+
2. Implement certificate rotation
|
414
|
+
3. Monitor certificate expiration
|
415
|
+
4. Use secure cipher suites
|
416
|
+
5. Enable security headers
|
417
|
+
6. Implement rate limiting
|
418
|
+
7. Log security events
|
419
|
+
|
420
|
+
## Contributing
|
421
|
+
|
422
|
+
When adding new security tests:
|
423
|
+
|
424
|
+
1. **Follow Naming Convention**
|
425
|
+
- Test files: `test_<feature>_<scenario>.py`
|
426
|
+
- Config files: `config_<type>_<auth>.json`
|
427
|
+
|
428
|
+
2. **Include Both Positive and Negative Tests**
|
429
|
+
- Test valid configurations
|
430
|
+
- Test invalid configurations
|
431
|
+
- Verify error handling
|
432
|
+
|
433
|
+
3. **Document Test Scenarios**
|
434
|
+
- Describe expected behavior
|
435
|
+
- Document test prerequisites
|
436
|
+
- Include troubleshooting steps
|
437
|
+
|
438
|
+
4. **Update This Documentation**
|
439
|
+
- Add new test scenarios
|
440
|
+
- Update usage examples
|
441
|
+
- Document new features
|
442
|
+
|
443
|
+
## Support
|
444
|
+
|
445
|
+
For issues and questions:
|
446
|
+
|
447
|
+
1. Check the troubleshooting section
|
448
|
+
2. Review test logs for detailed error messages
|
449
|
+
3. Verify certificate and configuration files
|
450
|
+
4. Test with minimal configuration first
|
451
|
+
5. Contact the development team
|
452
|
+
|
453
|
+
## License
|
454
|
+
|
455
|
+
This security testing framework is part of the MCP Proxy Adapter project and follows the same license terms.
|
@@ -0,0 +1,37 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 8001,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": false
|
10
|
+
},
|
11
|
+
"security": {
|
12
|
+
"enabled": true,
|
13
|
+
"auth": {
|
14
|
+
"enabled": true,
|
15
|
+
"methods": ["api_key"],
|
16
|
+
"api_keys": {
|
17
|
+
"admin": "admin-secret-key-123",
|
18
|
+
"user": "user-secret-key-456"
|
19
|
+
}
|
20
|
+
},
|
21
|
+
"rate_limit": {
|
22
|
+
"enabled": true,
|
23
|
+
"requests_per_minute": 60,
|
24
|
+
"requests_per_hour": 1000,
|
25
|
+
"burst_limit": 10
|
26
|
+
}
|
27
|
+
},
|
28
|
+
"logging": {
|
29
|
+
"level": "INFO",
|
30
|
+
"console_output": true,
|
31
|
+
"file_output": false
|
32
|
+
},
|
33
|
+
"commands": {
|
34
|
+
"auto_discovery": true,
|
35
|
+
"commands_directory": "./commands"
|
36
|
+
}
|
37
|
+
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 8000,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": false
|
10
|
+
},
|
11
|
+
"security": {
|
12
|
+
"enabled": false
|
13
|
+
},
|
14
|
+
"logging": {
|
15
|
+
"level": "INFO",
|
16
|
+
"console_output": true,
|
17
|
+
"file_output": false
|
18
|
+
},
|
19
|
+
"commands": {
|
20
|
+
"auto_discovery": true,
|
21
|
+
"commands_directory": "./commands"
|
22
|
+
}
|
23
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 8444,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": true,
|
10
|
+
"cert_file": "./certs/server.crt",
|
11
|
+
"key_file": "./certs/server.key"
|
12
|
+
},
|
13
|
+
"security": {
|
14
|
+
"enabled": true,
|
15
|
+
"auth": {
|
16
|
+
"enabled": true,
|
17
|
+
"methods": ["api_key"],
|
18
|
+
"api_keys": {
|
19
|
+
"admin": "admin-secret-key-123",
|
20
|
+
"user": "user-secret-key-456"
|
21
|
+
}
|
22
|
+
},
|
23
|
+
"rate_limit": {
|
24
|
+
"enabled": true,
|
25
|
+
"requests_per_minute": 60,
|
26
|
+
"requests_per_hour": 1000,
|
27
|
+
"burst_limit": 10
|
28
|
+
}
|
29
|
+
},
|
30
|
+
"logging": {
|
31
|
+
"level": "INFO",
|
32
|
+
"console_output": true,
|
33
|
+
"file_output": false
|
34
|
+
},
|
35
|
+
"commands": {
|
36
|
+
"auto_discovery": true,
|
37
|
+
"commands_directory": "./commands"
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 8443,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": true,
|
10
|
+
"cert_file": "./certs/server.crt",
|
11
|
+
"key_file": "./certs/server.key"
|
12
|
+
},
|
13
|
+
"security": {
|
14
|
+
"enabled": false
|
15
|
+
},
|
16
|
+
"logging": {
|
17
|
+
"level": "INFO",
|
18
|
+
"console_output": true,
|
19
|
+
"file_output": false
|
20
|
+
},
|
21
|
+
"commands": {
|
22
|
+
"auto_discovery": true,
|
23
|
+
"commands_directory": "./commands"
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 9443,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": true,
|
10
|
+
"cert_file": "./certs/server.crt",
|
11
|
+
"key_file": "./certs/server.key",
|
12
|
+
"ca_cert": "./certs/ca.crt",
|
13
|
+
"verify_client": true,
|
14
|
+
"client_cert_required": true
|
15
|
+
},
|
16
|
+
"security": {
|
17
|
+
"enabled": true,
|
18
|
+
"auth": {
|
19
|
+
"enabled": true,
|
20
|
+
"methods": ["certificate"],
|
21
|
+
"certificate_auth": true
|
22
|
+
},
|
23
|
+
"rate_limit": {
|
24
|
+
"enabled": true,
|
25
|
+
"requests_per_minute": 60,
|
26
|
+
"requests_per_hour": 1000,
|
27
|
+
"burst_limit": 10
|
28
|
+
}
|
29
|
+
},
|
30
|
+
"logging": {
|
31
|
+
"level": "INFO",
|
32
|
+
"console_output": true,
|
33
|
+
"file_output": false
|
34
|
+
},
|
35
|
+
"commands": {
|
36
|
+
"auto_discovery": true,
|
37
|
+
"commands_directory": "./commands"
|
38
|
+
}
|
39
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
{
|
2
|
+
"server": {
|
3
|
+
"host": "0.0.0.0",
|
4
|
+
"port": 9444,
|
5
|
+
"debug": false,
|
6
|
+
"log_level": "INFO"
|
7
|
+
},
|
8
|
+
"ssl": {
|
9
|
+
"enabled": true,
|
10
|
+
"cert_file": "./certs/server.crt",
|
11
|
+
"key_file": "./certs/server.key",
|
12
|
+
"ca_cert": "./certs/ca.crt",
|
13
|
+
"verify_client": true,
|
14
|
+
"client_cert_required": true
|
15
|
+
},
|
16
|
+
"security": {
|
17
|
+
"enabled": true,
|
18
|
+
"auth": {
|
19
|
+
"enabled": true,
|
20
|
+
"methods": ["certificate"],
|
21
|
+
"certificate_auth": true
|
22
|
+
},
|
23
|
+
"permissions": {
|
24
|
+
"enabled": true,
|
25
|
+
"roles_file": "./roles.json",
|
26
|
+
"default_role": "user",
|
27
|
+
"deny_by_default": true
|
28
|
+
},
|
29
|
+
"rate_limit": {
|
30
|
+
"enabled": true,
|
31
|
+
"requests_per_minute": 60,
|
32
|
+
"requests_per_hour": 1000,
|
33
|
+
"burst_limit": 10
|
34
|
+
}
|
35
|
+
},
|
36
|
+
"logging": {
|
37
|
+
"level": "INFO",
|
38
|
+
"console_output": true,
|
39
|
+
"file_output": false
|
40
|
+
},
|
41
|
+
"commands": {
|
42
|
+
"auto_discovery": true,
|
43
|
+
"commands_directory": "./commands"
|
44
|
+
}
|
45
|
+
}
|