diff --git a/.circleci/config.yml b/.circleci/config.yml index 733af22631e..4d38d0abe27 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1650,7 +1650,7 @@ jobs: command: | docker run -d \ -p 4001:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL="postgresql://postgres:postgres@host.docker.internal:5432/litellm_test" \ -e LITELLM_MASTER_KEY="sk-1234" \ --name schema-seed \ @@ -1671,7 +1671,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL="postgresql://postgres:postgres@host.docker.internal:5432/litellm_test" \ -e DEFAULT_NUM_WORKERS_LITELLM_PROXY=1 \ -e DISABLE_SCHEMA_UPDATE="True" \ @@ -1746,7 +1746,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e USE_PRISMA_MIGRATE=True \ -e FAKE_OPENAI_API_BASE=http://host.docker.internal:8190 \ @@ -1842,7 +1842,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e AZURE_API_KEY=$AZURE_API_KEY \ -e AZURE_API_BASE=$AZURE_API_BASE \ @@ -1931,7 +1931,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=$REDIS_HOST \ -e REDIS_PASSWORD=$REDIS_PASSWORD \ @@ -1992,7 +1992,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=$REDIS_HOST \ -e REDIS_PASSWORD=$REDIS_PASSWORD \ @@ -2070,7 +2070,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=host.docker.internal \ -e REDIS_PORT=6379 \ @@ -2153,7 +2153,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=$REDIS_HOST \ -e REDIS_PASSWORD=$REDIS_PASSWORD \ @@ -2176,7 +2176,7 @@ jobs: command: | docker run -d \ -p 4001:4001 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=$REDIS_HOST \ -e REDIS_PASSWORD=$REDIS_PASSWORD \ @@ -2254,7 +2254,7 @@ jobs: docker run -d \ --restart on-failure \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e STORE_MODEL_IN_DB="True" \ -e LITELLM_MASTER_KEY="sk-1234" \ @@ -2329,7 +2329,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e REDIS_HOST=$REDIS_HOST \ -e REDIS_PASSWORD=$REDIS_PASSWORD \ @@ -2412,7 +2412,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e LITELLM_MASTER_KEY="sk-1234" \ -e OPENAI_API_KEY=$OPENAI_API_KEY \ @@ -2504,7 +2504,7 @@ jobs: command: | docker run -d \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DATABASE_URL=postgresql://postgres:postgres@host.docker.internal:5432/circle_test \ -e LITELLM_MASTER_KEY="sk-1234" \ -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \ @@ -2686,7 +2686,7 @@ jobs: name: Start LiteLLM proxy environment: LITELLM_MASTER_KEY: "sk-1234" - LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY: "true" + LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY: "true" MOCK_LLM_URL: "http://127.0.0.1:8090/v1" DISABLE_SCHEMA_UPDATE: "true" SERVER_ROOT_PATH: "" @@ -2830,7 +2830,7 @@ jobs: name: Start LiteLLM proxy under a server root path environment: LITELLM_MASTER_KEY: "sk-1234" - LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY: "true" + LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY: "true" MOCK_LLM_URL: "http://127.0.0.1:8090/v1" DISABLE_SCHEMA_UPDATE: "true" # Output flows to this step's own log, so a boot crash is visible here @@ -2916,7 +2916,7 @@ jobs: command: | docker run --name my-app \ -p 4000:4000 \ - -e LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY=true \ + -e LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY=true \ -e DEFAULT_NUM_WORKERS_LITELLM_PROXY=1 \ -e DATABASE_URL="postgresql://wrong:wrong@wrong:5432/wrong" \ myapp:latest \ diff --git a/litellm/proxy/_types.py b/litellm/proxy/_types.py index 40a5caf1ba8..4fd4056bd7b 100644 --- a/litellm/proxy/_types.py +++ b/litellm/proxy/_types.py @@ -2590,7 +2590,7 @@ class ConfigGeneralSettings(LiteLLMPydanticObjectBase): use_google_kms: bool | None = Field(None, description="decrypt keys with google kms") use_azure_key_vault: bool | None = Field(None, description="load keys from azure key vault") master_key: str | None = Field(None, description="require a key for all calls to proxy") - dangerously_allow_unsafe_proxy: bool | None = Field( + dangerously_permit_weak_or_unset_master_key: bool | None = Field( None, description="local development only: start even when master_key is unset, empty, or a publicly known default", ) diff --git a/litellm/proxy/auth/master_key_boot_check.py b/litellm/proxy/auth/master_key_boot_check.py index 4b91cbc676d..aa50c4e34c1 100644 --- a/litellm/proxy/auth/master_key_boot_check.py +++ b/litellm/proxy/auth/master_key_boot_check.py @@ -10,8 +10,8 @@ from typing_extensions import assert_never from litellm._logging import verbose_proxy_logger -UNSAFE_PROXY_OVERRIDE_SETTING: Final = "dangerously_allow_unsafe_proxy" -UNSAFE_PROXY_OVERRIDE_ENV_VAR: Final = "LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY" +WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING: Final = "dangerously_permit_weak_or_unset_master_key" +WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR: Final = "LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY" MASTER_KEY_SETTING: Final = "master_key" MASTER_KEY_ENV_VAR: Final = "LITELLM_MASTER_KEY" SALT_KEY_ENV_VAR: Final = "LITELLM_SALT_KEY" @@ -86,7 +86,7 @@ def master_key_boot_verdict( reason: Final = _unsafe_reason(master_key) if reason is None: return SafeMasterKey() - if override_env_is_on or general_settings.get(UNSAFE_PROXY_OVERRIDE_SETTING) is True: + if override_env_is_on or general_settings.get(WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING) is True: return UnsafeMasterKeyAllowed(reason=reason) config_file_only_relays_the_environment: Final = master_key is not None and master_key == environment_master_key return UnsafeMasterKeyRefused( @@ -121,7 +121,7 @@ def enforce_master_key_boot_verdict(verdict: MasterKeyBootVerdict, announce: Cal case UnsafeMasterKeyAllowed(reason=reason): verbose_proxy_logger.warning( "%s is on, so the proxy is starting with %s. Never run this outside local development.", - UNSAFE_PROXY_OVERRIDE_SETTING, + WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING, _UNSAFE_STATE[reason], ) case UnsafeMasterKeyRefused(reason=reason): @@ -192,8 +192,8 @@ _RESTART_TO_MIGRATE_STEP: Final = ( ) _OVERRIDE_HINT: Final = ( - f"Local development only: set {UNSAFE_PROXY_OVERRIDE_ENV_VAR}=true, or\n" - f"general_settings.{UNSAFE_PROXY_OVERRIDE_SETTING}: true, to start anyway." + f"Local development only: set {WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR}=true, or\n" + f"general_settings.{WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING}: true, to start anyway." ) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index c0c8dfeaeee..5cea5197a51 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -345,7 +345,7 @@ from litellm.proxy.auth.login_throttle import ( from litellm.proxy.auth.master_key_boot_check import ( MASTER_KEY_ENV_VAR, SALT_KEY_ENV_VAR, - UNSAFE_PROXY_OVERRIDE_ENV_VAR, + WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR, announce_on_stderr_at_exit, enforce_master_key_boot_verdict, master_key_boot_verdict, @@ -1244,7 +1244,7 @@ async def proxy_startup_event(app: FastAPI) -> AsyncGenerator[None, None]: environment_master_key=os.getenv(MASTER_KEY_ENV_VAR), general_settings=general_settings, config_file_path=user_config_file_path, - override_env_is_on=get_secret_bool(UNSAFE_PROXY_OVERRIDE_ENV_VAR) is True, + override_env_is_on=get_secret_bool(WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR) is True, salt_key_is_set=os.getenv(SALT_KEY_ENV_VAR) is not None, database_is_configured=prisma_client is not None or get_secret("DATABASE_URL", None) is not None, ), diff --git a/tests/e2e/ui/run_e2e.sh b/tests/e2e/ui/run_e2e.sh index c5a992e4527..5c367ba0024 100755 --- a/tests/e2e/ui/run_e2e.sh +++ b/tests/e2e/ui/run_e2e.sh @@ -145,7 +145,7 @@ fi # --- Credentials --- export LITELLM_MASTER_KEY="sk-1234" -export LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY="true" +export LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY="true" export MOCK_LLM_URL="http://127.0.0.1:${MOCK_LLM_PORT}/v1" export E2E_MOCK_PRESIDIO_URL="http://127.0.0.1:${MOCK_PRESIDIO_PORT}" export DISABLE_SCHEMA_UPDATE="true" diff --git a/tests/mcp_tests/test_proxy_mcp_e2e.py b/tests/mcp_tests/test_proxy_mcp_e2e.py index 9e3e421b4dd..a730f6c10ee 100644 --- a/tests/mcp_tests/test_proxy_mcp_e2e.py +++ b/tests/mcp_tests/test_proxy_mcp_e2e.py @@ -54,7 +54,7 @@ def _clear_proxy_database_env() -> typing.Iterator[None]: # the LITELLM_MASTER_KEY env var, overriding whatever initialize() set from # the config file. We must set it here so the lifespan doesn't reset it to None. mp.setenv("LITELLM_MASTER_KEY", "sk-1234") - mp.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + mp.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") try: yield finally: diff --git a/tests/proxy_security_tests/test_master_key_not_in_db.py b/tests/proxy_security_tests/test_master_key_not_in_db.py index df0834aa884..2f00e57037a 100644 --- a/tests/proxy_security_tests/test_master_key_not_in_db.py +++ b/tests/proxy_security_tests/test_master_key_not_in_db.py @@ -21,7 +21,7 @@ def override_env_settings(monkeypatch): def test_client(): """Starting the test client triggers FastAPI startup, where Prisma connects to the DB.""" with pytest.MonkeyPatch.context() as boot_env: - boot_env.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + boot_env.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") with TestClient(app) as client: yield client diff --git a/tests/proxy_unit_tests/test_aproxy_startup.py b/tests/proxy_unit_tests/test_aproxy_startup.py index f2e1d0a521d..7604c96e07c 100644 --- a/tests/proxy_unit_tests/test_aproxy_startup.py +++ b/tests/proxy_unit_tests/test_aproxy_startup.py @@ -30,7 +30,7 @@ async def test_proxy_gunicorn_startup_direct_config(monkeypatch): Test both approaches """ - monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + monkeypatch.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") try: from litellm._logging import verbose_proxy_logger, verbose_router_logger import logging @@ -61,7 +61,7 @@ async def test_proxy_gunicorn_startup_direct_config(monkeypatch): @pytest.mark.asyncio async def test_proxy_gunicorn_startup_config_dict(monkeypatch): - monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + monkeypatch.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") try: from litellm._logging import verbose_proxy_logger, verbose_router_logger import logging diff --git a/tests/test_litellm/proxy/auth/test_master_key_boot_check.py b/tests/test_litellm/proxy/auth/test_master_key_boot_check.py index 0b55d045de5..aca65f4c7e6 100644 --- a/tests/test_litellm/proxy/auth/test_master_key_boot_check.py +++ b/tests/test_litellm/proxy/auth/test_master_key_boot_check.py @@ -14,8 +14,8 @@ from litellm.proxy.auth.master_key_boot_check import ( MIGRATE_FROM_MASTER_KEY_ENV_VAR, PRINT_NEW_MASTER_KEY_COMMAND, ROTATION_DOCS_URL, - UNSAFE_PROXY_OVERRIDE_ENV_VAR, - UNSAFE_PROXY_OVERRIDE_SETTING, + WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR, + WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING, ConfigFileSource, EnvironmentSource, MasterKeyBootVerdict, @@ -79,14 +79,14 @@ def test_keys_that_only_resemble_the_known_default_are_safe(master_key: str): @pytest.mark.parametrize("master_key", [None, "", "sk-1234"]) def test_either_override_lets_an_unsafe_key_through(master_key: str | None): from_env = _verdict(master_key, override_env_is_on=True) - from_yaml = _verdict(master_key, {UNSAFE_PROXY_OVERRIDE_SETTING: True}) + from_yaml = _verdict(master_key, {WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING: True}) assert isinstance(from_env, UnsafeMasterKeyAllowed) assert from_env == from_yaml def test_override_switched_off_in_yaml_still_refuses(): - assert isinstance(_verdict("sk-1234", {UNSAFE_PROXY_OVERRIDE_SETTING: False}), UnsafeMasterKeyRefused) + assert isinstance(_verdict("sk-1234", {WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING: False}), UnsafeMasterKeyRefused) def test_yaml_master_key_is_the_source_even_when_it_resolved_to_nothing(): @@ -364,8 +364,8 @@ def test_override_hint_is_the_last_paragraph(migration: StoredSecretsMigration | text = render_refusal(_refusal(migration=migration)) last_paragraph = text.split("\n\n")[-1] - assert UNSAFE_PROXY_OVERRIDE_ENV_VAR in last_paragraph - assert f"general_settings.{UNSAFE_PROXY_OVERRIDE_SETTING}" in last_paragraph + assert WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_ENV_VAR in last_paragraph + assert f"general_settings.{WEAK_OR_UNSET_MASTER_KEY_OVERRIDE_SETTING}" in last_paragraph @pytest.mark.skipif(shutil.which("openssl") is None, reason="the printed command shells out to openssl") diff --git a/tests/test_litellm/proxy/conftest.py b/tests/test_litellm/proxy/conftest.py index b31d2229466..8ef5017a952 100644 --- a/tests/test_litellm/proxy/conftest.py +++ b/tests/test_litellm/proxy/conftest.py @@ -268,7 +268,7 @@ def create_proxy_test_client( # Set environment variables set_proxy_environment_variables(monkeypatch, database_url=database_url) - monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + monkeypatch.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") # Initialize proxy asyncio.run(initialize(config=config_fp, debug=init_options.get("debug", False))) diff --git a/tests/test_litellm/proxy/test_proxy_server.py b/tests/test_litellm/proxy/test_proxy_server.py index 32f18ce1e4e..493c461e8b4 100644 --- a/tests/test_litellm/proxy/test_proxy_server.py +++ b/tests/test_litellm/proxy/test_proxy_server.py @@ -1635,7 +1635,7 @@ def _boot_with_general_settings(monkeypatch, tmp_path, general_settings): config_path.write_text(yaml.dump({"general_settings": general_settings})) for name in ( "LITELLM_MASTER_KEY", - "LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", + "LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "LITELLM_MIGRATE_FROM_MASTER_KEY", "LITELLM_SALT_KEY", "WORKER_CONFIG", @@ -1796,11 +1796,11 @@ async def test_proxy_startup_boots_an_unsafe_master_key_under_the_override(monke general_settings = { "master_key": "sk-1234", - **({"dangerously_allow_unsafe_proxy": True} if override == "yaml" else {}), + **({"dangerously_permit_weak_or_unset_master_key": True} if override == "yaml" else {}), } _, announced = _boot_with_general_settings(monkeypatch, tmp_path, general_settings) if override == "env": - monkeypatch.setenv("LITELLM_DANGEROUSLY_ALLOW_UNSAFE_PROXY", "true") + monkeypatch.setenv("LITELLM_DANGEROUSLY_PERMIT_WEAK_OR_UNSET_MASTER_KEY", "true") async with proxy_startup_event(FastAPI()): from litellm.proxy.proxy_server import master_key diff --git a/ui/litellm-dashboard/src/lib/http/schema.d.ts b/ui/litellm-dashboard/src/lib/http/schema.d.ts index 1b62e59054d..4c04d97231b 100644 --- a/ui/litellm-dashboard/src/lib/http/schema.d.ts +++ b/ui/litellm-dashboard/src/lib/http/schema.d.ts @@ -26728,10 +26728,10 @@ export interface components { */ custom_auth?: string | null; /** - * Dangerously Allow Unsafe Proxy + * Dangerously Permit Weak Or Unset Master Key * @description local development only: start even when master_key is unset, empty, or a publicly known default */ - dangerously_allow_unsafe_proxy?: boolean | null; + dangerously_permit_weak_or_unset_master_key?: boolean | null; /** @description custom args for instantiating dynamodb client - e.g. billing provision */ database_args?: components["schemas"]["DynamoDBArgs"] | null; /**