Mark Bergman via plug on 11 Jan 2024 08:20:05 -0800 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: [PLUG] secure variables in bash |
In the message dated: Wed, 10 Jan 2024 20:18:40 -0500, The pithy ruminations from Rita via plug on [[PLUG] secure variables in bash] were: => I am hoping there is a clever, unix-y way to do this. => => I have something like this, => => secret=$(curl https://server/api/creds | jq .Secret) => process --secret=$secret => => This works fine, but I was wondering if there was a better way to secure my => "secret" with tools like ssh, gpg, etc.. I'm assuming that you've simplified the example a great deal, because in this case you aren't just vulnerable to someone seeing the contents of $secret, you are vulnerable to anyone running the 'curl' command on their own and getting your credentials directly from https://server. => => My intention is to avoid seeing secret from `ps` or `bash -x`. It seems => deceptively simple but quite hard to do. => => Any ideas? This is a FAQ (and has been for decades). In future, please look at stackexchange, etc for lots and lots (and lots!) of similar questions and a huge number of answers (of varying quality) to get an idea of the history of this issue, then maybe post here with something more specific. In short, no there is no way to really do this securely with BASH, and few ways to do this securely at all. From your question, it seems as if you are working on a multi-user machine. If so, the first question to ask is ask yourself is, do you feel lucky (https://www.youtube.com/watch?v=8Xjr2hnOHiM). Well, do you? OK, the next question is, do you trust people with root access on that machine? If not, then anything you do to secure your secret will be fundamentally insecure, even if other [unprivileged] users can't easily see what you're doing. The next question to ask yourself is how important is the secret? If it's exposed, will you get fired, go to jail, be liable for n*$10K in damages, or will it an exposure just be mildly embarassing, such as letting other people know that you regularly post to a Teletubbies fan site? There are a few things you can do in BASH to make this common scenario a little more secure. If the executable "process" can read the secret from an environment variable, rather than as an argument on the command line, then you could do something like: secret=$(curl https://server/api/creds | jq .Secret) process without exposing the contents of $secret to "ps". If you are running this interactively you can leverage things like gpg keyrings, ssl, etc, something like: # get the encrypted string from https://server # then decrypt it using a key that's entered (or accessed) interactively secret=$(curl https://server/api/creds | jq .Encrypted_string_stored_externally | gpg -d) process # that reads the value of $secret from the environment If "process" absolutely requires the secret passed on command-line, you can do things with Expect (tk/tcl), writing a wrapper in a that overwrites the command line arguments after passing them to "process", etc., but frankly all of those are hacks. Again, if you don't trust root, all of this is insecure. Even for non-root users there are a bunch of unavoidable (though usually very small) timing windows due to use of BASH and pipelines and subshells that expose a lot of info (the URI to the credentials, your encrypted string, the method you are using for decryption). If whole thing needs to be non-interactive (ie., in a cron job) then this is all much more difficult. Like anything in security, the degree of effort to keep something "secure" should be consistent with the value of the information and the likelihood of an exposure. Mark -- Mark Bergman Biker, Rock Climber, SCUBA Diver, Unix mechanic, IATSE #1 Stagehand '94 Yamaha GTS1000A^1 2023 Triumph GT Explorer https://www.flickr.com/photos/rmsppu ___________________________________________________________________________ Philadelphia Linux Users Group -- http://www.phillylinux.org Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce General Discussion -- http://lists.phillylinux.org/mailman/listinfo/plug