Securing Your Smart Home Secrets: Mastering Configuration with Home Assistant
- #Home_Assistant
- #Security
- #Configuration
- #Secrets
- #YAML

Securing Your Smart Home Secrets: Mastering Configuration with Home Assistant
Your Home Assistant configuration files contain a wealth of information about your smart home – device details, automation logic, and often, sensitive credentials. API keys for cloud services, passwords for local devices or databases, access tokens – these are all critical pieces of data that should never be exposed unnecessarily. Hardcoding these values directly into your main configuration files (like configuration.yaml
) is a significant security vulnerability, especially if you ever share your configuration or use version control like Git.
Fortunately, Home Assistant provides a robust and straightforward mechanism for managing sensitive information securely: the secrets.yaml
file.
Why Use secrets.yaml
?
- Security: Prevents hardcoding sensitive data directly in files that might be publicly shared or inadvertently exposed.
- Maintainability: Keeps your main configuration cleaner and easier to read.
- Portability: Allows you to share or move your core configuration without revealing your personal credentials.
- Best Practice: Adheres to standard security practices for handling sensitive data in configuration files.
The concept is simple: you store your sensitive values (your 'secrets') in a separate file, secrets.yaml
, which is typically excluded from version control or backups that might be stored in less secure locations. In your main configuration files, you reference these secrets using a special syntax.
Setting Up secrets.yaml
The secrets.yaml
file should reside in the same directory as your configuration.yaml
file. If you are using Home Assistant OS, Home Assistant Container, or Supervised, this is usually the /config
directory.
If the file doesn't exist, simply create it. The structure is a simple YAML key-value list:
# secrets.yaml
weather_api_key: sk_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
database_password: MySuperSecretPassword123
mqtt_broker_username: mqttuser
mqtt_broker_password: AnotherSecurePassword
email_server_password: EmailPassHere
camera_rtsp_url: rtsp://user:[email protected]/stream
Each line defines a secret using the format key: value
. The key
is the name you will use to reference the secret in your configuration, and the value
is the actual sensitive data.
Important: Ensure that secrets.yaml
has restrictive file permissions so only the Home Assistant process can read it. If using Git, add secrets.yaml
to your .gitignore
file to prevent it from being accidentally committed.
Using Secrets in Your Configuration
Once your secrets are defined in secrets.yaml
, you can reference them in any of your other Home Assistant configuration files (configuration.yaml
, or files included from it) using the !secret
tag followed by the key name.
Here's how you might use the secrets defined above:
# configuration.yaml
weather:
- platform: openweathermap
api_key: !secret weather_api_key # Referencing the weather API key
scan_interval: 300
recorder:
db_url: !secret database_url # Referencing a database connection string
mqtt:
broker: 192.168.1.10
username: !secret mqtt_broker_username # Referencing MQTT username
password: !secret mqtt_broker_password # Referencing MQTT password
notify:
- platform: smtp
name: email_notifications
server: smtp.gmail.com
port: 587
timeout: 15
sender: [email protected]
encryption: starttls
username: [email protected]
password: !secret email_server_password # Referencing email password
camera:
- platform: generic
still_image_url: http://192.168.1.20/snapshot.jpg
stream_source: !secret camera_rtsp_url # Referencing camera stream URL with credentials
When Home Assistant loads your configuration, it will see the !secret
tag, look up the corresponding key in secrets.yaml
, and substitute the actual value. This happens internally before Home Assistant initializes the integration, keeping the sensitive value out of the visible configuration file.
Tips and Best Practices
- Granularity: Give each secret a unique, descriptive key name (e.g.,
mqtt_password
instead of justpassword
if you have multiple passwords). - Consistency: Decide on a naming convention for your secret keys and stick to it.
- Comments: Add comments to your
secrets.yaml
if necessary, explaining what each secret is for, but avoid putting sensitive context in comments themselves. - Avoid Redundancy: If the same secret is used by multiple integrations, define it once in
secrets.yaml
and reference it everywhere. - Environment Variables (Advanced): For Home Assistant Container or Supervised installations, extremely sensitive secrets (like the database URL for the recorder) can sometimes be passed as environment variables during container startup instead of being stored in a file. This adds another layer of security, though it's less common for typical integration credentials. Home Assistant supports reading environment variables prefixed with
or globally. Check the documentation for the specific integration or Home Assistant's environment variable support._ - Regular Review: Periodically review your
secrets.yaml
file. Remove entries for integrations you no longer use and ensure all entries are still needed and accurate. - Secure Backups: If you back up your Home Assistant configuration, ensure that backups containing
secrets.yaml
are stored in a secure, encrypted location.
Troubleshooting
- Restart Home Assistant: After creating or modifying
secrets.yaml
or your configuration files referencing secrets, always restart Home Assistant to apply the changes. - Configuration Check: Before restarting, use the "Check Configuration" tool (available under Developer Tools -> YAML) to catch any syntax errors in your YAML files, including issues with the
!secret
tag or missing keys insecrets.yaml
. - Log Files: Check the Home Assistant logs for errors related to the integration you're configuring. Errors like "Secret not found" or configuration parsing errors will appear there if Home Assistant can't find the key in
secrets.yaml
. Ensure the key name in your configuration exactly matches the key name insecrets.yaml
(case-sensitive). - File Location: Double-check that
secrets.yaml
is in the correct location (usually the same directory asconfiguration.yaml
).
Conclusion
Implementing proper secrets management with secrets.yaml
is a fundamental step towards a more secure and maintainable Home Assistant installation. By separating your sensitive credentials from your core configuration, you protect yourself from accidental data leaks and make managing your smart home easier and safer in the long run. Make it a habit to use !secret
for any value that could potentially be sensitive, and your smart home will thank you for it.

NGC 224
Author bio: