Security & Permissions

Deploying a DAG from a UI is, fundamentally, shipping arbitrary code into your Airflow environment — the same trust boundary as any other way of getting a .py file into the DAGs folder. DagSmith is designed around that fact rather than around it.

Deploy is off by default

Writing .py files is disabled until an administrator sets deploy_enabled = True. Without it, DagSmith works purely in read-and-draft mode: no file on disk ever changes.

Authorization on every endpoint

Every API route except /api/v1/health is authorized through the Airflow Auth Manager. Draft writes require edit permission; deploy additionally requires the deployers role, on top of the global deploy_enabled flag. See Teams & Git Deploy for how this narrows further per directory.

Isolated execution

DagSmith never runs eval, exec, or dynamic importlib imports on your DAG source inside the api-server process. Import validation — the step that actually loads your DAG the way the scheduler would — always happens in a separate, time-limited subprocess.

Path safety

Every file path that arrives in a request is resolved and checked against the DAG bundle root. Nothing outside that root is reachable, and symlinks that would escape it are rejected. Writes are atomic (write to a temp file, then os.replace) and preceded by a backup.

Audit trail

Deploys, git pushes, and team/file ownership changes are recorded to an append-only JSONL audit log, viewable in the UI for anyone with edit permission.