refactor(proxy): rename the local development override to dangerously_permit_weak_or_unset_master_key so the name says exactly what it permits

This commit is contained in:
ryan-crabbe-berri 2026-09-19 18:53:14 -07:00
parent 99f99cfb46
commit ecf17513fb
12 changed files with 42 additions and 42 deletions

View file

@ -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 \

View file

@ -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",
)

View file

@ -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."
)

View file

@ -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,
),

View file

@ -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"

View file

@ -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:

View file

@ -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

View file

@ -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

View file

@ -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")

View file

@ -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)))

View file

@ -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

View file

@ -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;
/**