-
-
Notifications
You must be signed in to change notification settings - Fork 14.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Provide options for storing secrets outside the Nix store #24288
Comments
FYI, check out how I handle secrets throughout all the apps here: https://github.com/ip1981/nixsap/tree/master/modules/apps Especially, with Jenkins :) |
I suspect @fpletz is now the maintainer for gitlab (sorry, I see you'r name is in this list a lot!) |
Wow, I didn't know the situation was this bad. All of these options should be removed really. It's almost as if people don't realize that the Nix store is world readable... |
@basvandijk — any plan for preventing future changes adding secrets to the Nix store, beyond eternal vigilance? |
Hmm, I didn't re-read NixOS/nix#8 completely, but it seemed to me last time that @edolstra 's solution using encryption in the store and decryption at startup time was working and there was mostly bikeshedding about encryption vs ACLs? This would be much easier than trying to patch every single upstream program that does not accept password files, especially given that some may not be willing to do it as it adds quite a bit of complexity. Wouldn't it? |
Besides being quite inconvenient, storing passwords/keys in a file with restricted access outside the store, may not solve the problem: they could end up in a systemd environment file or a unit file if you need to pass those as an command line argument. |
@jml we could add something to the PULL_REQUEST_TEMPLATE.md instructing contributors to use |
@edolstra we could do that eventually but to ease the transition we should first provide a backwards compatible |
@Ekleog regarding NixOS/nix#8, even if we have the ability to encrypt files in the Nix store I think it would be best to only encrypt files that should be encrypted. Currently we have big config files that somewhere contain a password. It would nicer if the config file remains unencrypted because then it can be shared and it makes debugging easier. Only the password needs to be encrypted. So having passwords in individual files would still be desirable. |
@basvandijk The encryption stuff allows you to encrypt only the "secret" parts of a configuration file. See edolstra@4c82120#diff-6c3fcb531890fdce200531b9ac69e4f8R14 for an example. |
@basvandijk Sometimes even the password stored in the configuration file needs to be readable. dnschain, for example, parses namecoin.conf to connect to the rpc server. |
@rnhmjoj lets see how upstream reacts to a request for a |
@edolstra that's great! What needs to be done to get this merged into Nix? |
Well, it's not clear whether this is the way to go. @kevincox listed the issues here: NixOS/nix#8 (comment) |
@rnhmjoj regarding |
@rnhmjoj regarding secrets in systemd unit files, we can always create a wrapper script that cats the password file and passes that on to the original script. I do something similar here. |
@basvandijk Regarding upstream changes for password file options: I think some |
@mbrgm sure and we should do that in case upstream doesn't provide a password file option. |
@basvandijk I would not tick the package until the PR is merged. |
@basvandijk That seems a valid alternative for authenticating to namecoind however dnschain does not support it, so it would break the service. Anyway, thank you for opening the issue. |
@rasendubi makes sense. I've unticked the wordpress checkbox. |
Well for aiccu; SixXS is closing down its IPv6 tunnel in June so it doesn't seem worth the effort to create a patch for aiccu to support password files. Lets just remove the service in 0606. |
Nix encryption is going to take a while to get there given nix's release history speed. I don't think it should be a blocker for trying alternative implementations. On the nixpkgs side, the protection would be based on unix file ACL. How about treating secrets like any other state? We could introduce a "mkState" interface that defines any kind of state reference on the filesystem. let
postgresState = mkState {
type = "directory";
name = "postgres";
owner = "postgres";
group = "postgres";
mode = "0700";
mustExist = false;
# run a command if it's missing
onMissing = "pg_init";
};
assert (toString postgresState) == "/var/lib/postgres";
# mkSecret is a specialization of mkState with a default dir to /run/keys/${name}, mode = 0700 and mustExist = true
nginxSecret = mkSecret {
owner = "nginx";
}; This would translate to (1) some activation script actions like creating the state dir (2) systemd service to initialize and/or check the secret, which can then be used as a dependency for other services. I know it's still pretty vague but hopefully enough to convey the idea. |
There are now docs for how to handle this for new modules at #142282 |
These docs handle the easy part of the problem. They are about how use use secrets outside of the store, not how to manage the secrets themselves. Ideally we wouldn't need to push this complexity onto the user. |
We can probably tick the |
This issue has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/agenix-encrypted-plaintext-passwords-and-builtins-readfile/18425/8 |
When using the declarative shared folder configuration for resilio sync it is now possible to pass a path from which to read the secret should be read at runtime. The path will not be added to the nix store. The 'secret' parameter to specify the secret directly is still supported. This option will still store the secret in the nix store. This commit follows the pattern described in this issue, for upstream programs that do not provide support for setting a password using a file: #24288
When using the declarative shared folder configuration for resilio sync it is now possible to pass a path from which to read the secret should be read at runtime. The path will not be added to the nix store. The 'secret' parameter to specify the secret directly is still supported. This option will still store the secret in the nix store. This commit follows the pattern described in this issue, for upstream programs that do not provide support for setting a password using a file: NixOS#24288
Some boxes can be checked (✅ done, 🙅 module removed, ❓ option doesn't seem to exist anymore):
Maybe some unsecure options appeared in new modules since then! |
Is there a conclusion to this issue that specifies exactly what behaviour is? |
Can someone edit the issue? @basvandijk maybe :) |
Introduction
Dear module authors and maintainers,
We currently have many modules that force users to store their secrets in the world-readble Nix store. This is bad for security. We should give users the option of specifying their secrets in individual files which can be stored outside the Nix store with suitable ownership and permissions. Users could then also use
nixops
to manage their secret files.There's still the convenient but unsafe option of storing the secret file in the Nix store using
pkgs.writeTextFile
. If NixOS/nix#8 gets resolved these files can be encrypted / made private. Also see: NixOS/rfcs#5.Proposal
The list below contains all the options that force a secret being stored in the Nix store. I propose the following:
Each option should get a warning in the documentation of the form: "Warning: this secret is stored in the world-readable Nix store!"
Each option should get an alternative
passwordFile
option.For backwards compatibility the
passwordFile
option should get a default based on thepassword
option:Some upstream programs don't support setting a password using a file. In that case an issue should be created in the upstream issue-tracker asking for that feature. (See Support specifying rpcpassword by file namecoin/namecoin-core#148 for example). A URL to the issue should be placed in the list below and in the documentation of the
password
option so that it's easier to track when it gets resolved.If after some time (lets use September 2017 for now) the upstream developers have not provided the feature to specify the password by file, the NixOS module should be changed such that the config file that contains the password is written to
/run
before the service starts up. So something like the following:Lets use this issue for planning and to track progress. Please mention in the comments if you have provided a
passwordFile
option for one of the options below. Then I check the box to indicate it has been resolved. See PR wordpress: replace the dbPassword option with dbPasswordFile #24146 for reference.If we make sure the new options are backwards compatible we could consider cherry-picking them onto
release-17.03
making sure users get these security fixes ASAP.Secret options
basicAuth
nixos/modules/services/web-servers/nginx/vhost-options.nix#L118
@globin
networking.defaultMailServer.authPass
nixos/modules/programs/ssmtp.nix#L92
PR: ssmtp: use the authPassFile option instead of authPass #24331
networking.wireless.networks.*.psk
nixos/modules/services/networking/wpa_supplicant.nix#L49
@edolstra
security.duosec.skey
nixos/modules/security/duosec.nix#L59
@thoughtpolice
services.aiccu.password
nixos/modules/services/networking/aiccu.nix#L48@edwtjo mentions: SixXS is closing down its IPv6 tunnel in June so it doesn't seem worth the effort to create a patch for aiccu to support password files. Lets just remove the service in 0606.
services.almir.director_password
nixos/modules/services/backup/almir.nix#L129
@domenkozar
services.bacula-dir.password
nixos/modules/services/backup/bacula.nix#L313
@domenkozar
Feature request for a PasswordFile parameter
services.bacula-[fd|sd].director.*.password
nixos/modules/services/backup/bacula.nix#L114
@domenkozar
See the feature request above.
services.bepasty.servers.*.secretKey
nixos/modules/services/misc/bepasty.nix#L72
@makefu
PR: bepasty: add secretKeyFile option #24755
services.btsync.httpPass
nixos/modules/services/networking/btsync.nix#L175
@thoughtpolice
services.buildbot-worker.workerPass
nixos/modules/services/continuous-integration/buildbot/worker.nix#L56
@nand0p
services.cadvisor.storageDriverPassword
nixos/modules/services/monitoring/cadvisor.nix#L54
@offlinehacker
PR: cadviser: add storageDriverPasswordFile option #24341
services.cassandra.keyStorePassword
nixos/modules/services/databases/cassandra.nix#L236
@cransom
See: https://issues.apache.org/jira/browse/CASSANDRA-13428
services.cassandra.trustStorePassword
nixos/modules/services/databases/cassandra.nix#L241
@cransom
See: https://issues.apache.org/jira/browse/CASSANDRA-13428
services.cgminer.pools.*.password
nixos/modules/services/misc/cgminer.nix#L60
@offlinehacker
services.cjdns.authorizedPasswords
nixos/modules/services/networking/cjdns.nix#L103
@ehmry
services.cfdyndns.apikey
nixos/modules/services/misc/cfdyndns.nix#L20
@colemickens
services.coturn.cli-password
nixos/modules/services/networking/coturn.nix#L249
@Ralith
services.coturn.static-auth-secret
nixos/modules/services/networking/coturn.nix#L174
@Ralith
services.cpuminer-cryptonight.pass
nixos/modules/services/misc/cpuminer-cryptonight.nix#L38
@ehmry
services.crowd.openidPassword
nixos/modules/services/web-apps/atlassian/crowd.nix#L53
@fpletz @globin
services.dd-agent.api_key
nixos/modules/services/monitoring/dd-agent.nix#L112
@shlevy
services.ddclient.password
nixos/modules/services/networking/ddclient.nix#L47
@rbvermaa
services.factorio.game-password
nixos/modules/services/games/factorio.nix#L144
@elitak
services.factorio.password
nixos/modules/services/games/factorio.nix#L130
@elitak
services.frab.secretKeyBas
nixos/modules/services/web-apps/frab.nix#L118
@fpletz
services.gammu-smsd.backend.sql.password
nixos/modules/services/misc/gammu-smsd.nix#L192
@zohl
services.gitlab.databasePassword
nixos/modules/services/misc/gitlab.nix#L203
@fpletz @offlinehacker
PR: nixos/gitlab: Store secrets in files rather than the store #31358
services.gitlab.secrets.secret
nixos/modules/services/misc/gitlab.nix#L326
@fpletz @offlinehacker
PR: nixos/gitlab: Store secrets in files rather than the store #31358
services.gitlab.smtp.password
nixos/modules/services/misc/gitlab.nix#L295
@fpletz @offlinehacker
services.gogs.database.password
nixos/modules/services/misc/gogs.nix#L102
@schneefux
PR: Gogs service password handling improvements #25116
services.grafana.database.password
nixos/modules/services/monitoring/grafana.nix#L137
@offlinehacker
services.grafana.security.adminPassword
nixos/modules/services/monitoring/grafana.nix#L157
@offlinehacker
services.grafana.security.secretKey
nixos/modules/services/monitoring/grafana.nix#L163
@offlinehacker
services.graylog.passwordSecret
nixos/modules/services/logging/graylog.nix#L68
@fadenb
services.graylog.rootPasswordSha2
nixos/modules/services/logging/graylog.nix#L82
@fadenb
services.hologram-server.ldapBindPassword
nixos/modules/services/security/hologram-server.nix#L68
@nand0p
services.hostapd.wpaPassphrase
nixos/modules/services/networking/hostapd.nix#L124
services.httpd.extraSubservices..."limesurvey"...adminPassword
nixos/modules/services/web-servers/apache-httpd/limesurvey.nix#L143
@offlinehacker
services.httpd.extraSubservices..."limesurvey"...dbPassword
nixos/modules/services/web-servers/apache-httpd/limesurvey.nix#L131
@offlinehacker
services.httpd.extraSubservices..."mediawiki"...dbPassword
nixos/modules/services/web-servers/apache-httpd/mediawiki.nix#L207
@shlevy @ip1981
services.httpd.extraSubservices..."owncloud"...adminPassword
nixos/modules/services/web-servers/apache-httpd/owncloud.nix#L403
@matejc
services.httpd.extraSubservices..."owncloud"...dbPassword
nixos/modules/services/web-servers/apache-httpd/owncloud.nix#L429
@matejc
services.httpd.extraSubservices..."owncloud"...SMTPPass
nixos/modules/services/web-servers/apache-httpd/owncloud.nix#L527
@matejc
services.httpd.extraSubservices..."wordpress"...dbPassword
nixos/modules/services/web-servers/apache-httpd/wordpress.nix#L138
@qknight
PR: wordpress: replace the dbPassword option with dbPasswordFile #24146
services.i2pd.proto.http.pass
nixos/modules/services/networking/i2pd.nix#L351
@edwtjo
services.icecast.admin.password
nixos/modules/services/audio/icecast.nix#L62
@k0ral
services.longview.mysqlPassword
nixos/modules/services/monitoring/longview.nix#L78
@rvl
PR: longview service: don't write passwords to nix store #24366
services.matrix-synapse.macaroon_secret_key
nixos/modules/services/misc/matrix-synapse.nix#L545
@roblabla
services.matrix-synapse.registration_shared_secret
nixos/modules/services/misc/matrix-synapse.nix#L453
@roblabla
services.matrix-synapse.turn_shared_secret
nixos/modules/services/misc/matrix-synapse.nix#L434
@roblabla
services.matrix-synapse.recaptcha_private_key
nixos/modules/services/misc/matrix-synapse.nix#L404
@roblabla
services.mattermost.localDatabasePassword
nixos/modules/services/web-apps/mattermost.nix#L108
@fpletz
services.murmur.password
nixos/modules/services/networking/murmur.nix#L105
@thoughtpolice
services.mysql.replication.masterPassword
nixos/modules/services/databases/mysql.nix#L149
@edolstra
services.namecoind.rpc.password
nixos/modules/services/networking/namecoind.nix#L90
@rnhmjoj
See: Support specifying rpcpassword by file namecoin/namecoin-core#148
services.nntp-proxy.upstreamPassword
nixos/modules/services/networking/nntp-proxy.nix#L99
@fadenb
services.oauth2_proxy.cookie.secret
nixos/modules/services/security/oauth2_proxy.nix#L371
@jml
services.panamax.secretKey
nixos/modules/services/cluster/panamax.nix#L63
@matejc
services.prometheus.*.consul_sd_config.password
nixos/modules/services/monitoring/prometheus/default.nix#L243
@fpletz @doshitan
services.prometheus.*.scrape_config.basic_auth.password
nixos/modules/services/monitoring/prometheus/default.nix#L128
@fpletz @doshitan
services.prometheus.unifiExporter.unifiPassword
nixos/modules/services/monitoring/prometheus/unifi-exporter.nix#L45
@fpletz @doshitan
services.redis.requirePass
nixos/modules/services/databases/redis.nix#L160
@offlinehacker
services.redmine.databasePassword
nixos/modules/services/misc/redmine.nix#L103
@domenkozar
services.redsocks.redsocks.password
nixos/modules/services/networking/redsocks.nix#L109
@Ekleog
services.rippleDataApi.couchdb.pass
nixos/modules/services/misc/ripple-data-api.nix#L109
@offlinehacker
services.rippled.ports.*.password
nixos/modules/services/misc/rippled.nix#L114
@ehmry
services.selfoss.database.password
nixos/modules/services/web-apps/selfoss.nix#L89
@regnat
services.terraria..password
nixos/modules/services/games/terraria.nix#L50
@pshendry @garbas
services.tor.torsocks.socks5Password
nixos/modules/services/security/torsocks.nix#L89
@thoughtpolice
services.tt-rss.database.password
nixos/modules/services/web-apps/tt-rss.nix#L163
@zohl
services.tt-rss.email.password
nixos/modules/services/web-apps/tt-rss.nix#L291
@zohl
services.wakeonlan.interfaces.*.password
nixos/modules/services/networking/wakeonlan.nix#L32
services.yandex-disk.password
nixos/modules/services/network-filesystems/yandex-disk.nix#L38
@grwlf @7c6f434c
services.zabbixServer.dbPassword
nixos/modules/services/monitoring/zabbix-server.nix#L66
@robberer
This list was compiled by running the following in
<nixpkgs>
and manually inspecting and processing the result:The text was updated successfully, but these errors were encountered: