Skip to main content

Linux tmpfs secret-file alternative

Broker-owned RAM WebDAV is the default extracted secret-file provider and needs no administrator-mounted directory. See RAM WebDAV delivery. This guide applies only when Core's environment explicitly sets SERVICE_LASSO_SECRET_FILES_TRANSPORT=tmpfs for a native Linux filesystem path.

Service Lasso normally supplies resolved Secrets Broker values through a fresh process environment on every launch. Keep using that mechanism when the app supports it. For an app that expects a file, Core can create a disposable file in its own secrets directory and pass its absolute path through a declared environment variable. The app must actually support that variable; _FILE is a convention, not automatic conversion by Core.

Service manifest​

RAM storage does not establish service-to-service confidentiality when apps share a UID. Linux procfs hardening has the same identity limitation; see Service environment isolation.

{
"broker": {
"imports": [
{
"namespace": "shared/database",
"ref": "database.PASSWORD",
"required": true
}
],
"files": [
{
"path": "db-password",
"content": "${database.PASSWORD}"
}
],
"templates": [
{
"source": "templates/credentials.conf",
"target": "credentials.conf"
}
]
},
"env": {
"DB_PASSWORD_FILE": "${SERVICE_LASSO_SECRETS_DIR}/db-password",
"APP_CREDENTIALS_FILE": "${SERVICE_LASSO_SECRETS_DIR}/credentials.conf"
}
}

This is a fragment to add to the app's existing manifest. Declare every Broker ref used in template contents in broker.imports as required. Keep template sources secret-free in the service package. Literal file contents are written exactly as rendered; Core does not add a newline.

In this explicitly selected tmpfs profile, broker.files and broker.templates request disposable outputs on Linux. Each relative output path is beneath a Core-owned directory, not the app's service root. Core derives the directory name from the service ID and resolved service root, so separate folder instances do not share secret files. Use the supplied ${SERVICE_LASSO_SECRETS_DIR} selector rather than constructing the name. Do not override that reserved variable in service/global environment settings.

Install/config actions persist ordinary configuration and mark the service configured. Ephemeral outputs are prepared immediately before a fresh process launch, including restart and automatic restart. Core fetches current Broker values, recreates missing directories/files, and replaces existing outputs. An adopted or already-running process keeps its existing files. Clearing a directory is not a request to regenerate the secret in the Broker vault.

Deploy the secrets filesystem​

Provision a dedicated Linux service account, for example service-lasso, and a private, bounded tmpfs before starting Core. Example commands for an operator to adapt and run during deployment (these are not run by Core):

sudo install -d -o root -g root -m 0755 /run/service-lasso
sudo install -d -o service-lasso -g service-lasso -m 0700 /run/service-lasso/secrets
sudo mount -t tmpfs \
-o size=16M,mode=0700,uid="$(id -u service-lasso)",gid="$(id -g service-lasso)",noswap,nodev,nosuid,noexec \
tmpfs /run/service-lasso/secrets
findmnt -T /run/service-lasso/secrets -o TARGET,FSTYPE,OPTIONS

noswap requires a supporting kernel (Linux 6.4 or newer). Do not silently remove it if the kernel rejects it: upgrade the kernel or explicitly assess the deployment's swap policy. Core checks that the configured root and output directories really use tmpfs, are owned by its UID, have no group/other access, and have no symlink redirects. It does not mount filesystems or verify the noswap option. Mount and swap policy belong to deployment.

For boot persistence, use a systemd mount unit named run-service\x2dlasso-secrets.mount (confirm with systemd-escape --path --suffix=mount /run/service-lasso/secrets):

[Unit]
Description=Service Lasso disposable app secrets

[Mount]
What=tmpfs
Where=/run/service-lasso/secrets
Type=tmpfs
Options=size=16M,mode=0700,uid=1001,gid=1001,noswap,nodev,nosuid,noexec

[Install]
WantedBy=multi-user.target

Replace 1001 with the actual service account UID/GID. Order the Core systemd service after this mount and require it:

[Unit]
RequiresMountsFor=/run/service-lasso/secrets

[Service]
User=service-lasso
Group=service-lasso
Environment=SERVICE_LASSO_SECRETS_ROOT=/run/service-lasso/secrets
Environment=SERVICE_LASSO_SECRET_FILES_TRANSPORT=tmpfs

The root must already exist on tmpfs; Core never falls back to creating it on disk. A custom SERVICE_LASSO_SECRETS_ROOT must be absolute and private. Core creates per-service/output directories with mode 0700 and files with mode 0600, rejecting linked/aliased targets. Use a dedicated runtime UID: this does not isolate mutually hostile apps that share the same UID. Direct apps must run as an identity allowed to read these files; do not solve access by making the secrets world-readable.

For containers, expose the appropriate Core directory read-only in the app's mount namespace, with matching UID access and a path matching its _FILE env value. Mount namespace mapping is deployment/provider configuration; setting an environment variable alone does not make a host path accessible in a container. Do not use secret paths as executables or guarded command-line input artifacts.

Restart and storage boundaries​

The mount begins empty after reboot or replacement. With Broker available and unlocked, starting the app recreates declared secret files before spawning it, even when persisted lifecycle state says configured. Missing/denied refs, unresolved selectors, insufficient tmpfs space, redirected paths or an absent mount block launch without logging plaintext. Restore the prerequisite and retry the normal start.

Keep the encrypted Broker vault, workspace recovery journal, app data and ordinary durable configuration on their intended persistent storage. Ephemeral plaintext is excluded from Core transaction preimages, config drift/snapshots and lifecycle artifact lists. Files remain for the running app and may remain until replacement or mount destruction; Core does not promise wiping on process exit. A Core process restart alone does not destroy tmpfs. Disappearance on unmount/reboot is not protection against a privileged administrator, app-created copies, logs, dumps or a compromised consuming app. Those app/deployment policies remain outside this feature.

References: Linux tmpfs documentation, systemd mount documentation, startup Broker resolution. Governed contract: SPEC-011 ESM-1..6, issue #1730.

For the default RAM WebDAV provider and its Windows UNC/HTTP paths, see RAM WebDAV delivery and the secure provisioning lesson. Server-side memory storage does not prove that a consuming client leaves no disk copies.