GPG + s3cmd

Nov 10, 2014

s3cmd is a simple tool for use with Amazon’s S3 and CloudFront networks, which I tend to use quite a lot. Like many programs, it deaults to storing your very sensitive AWS crdentials in plain text in a file called ~/.s3cfg, which is something that we can correct using GPG.

s3cmd makes this a little more challenging than average because its convention is to generate .s3cfg by dumping its entire set of configuration. Luckily for us though, as of s3cmd 1.5, configuration values are allowed to be the names of environment variables, so we can pull in our sensitive values while leaving most of the file unencrypted for ease-of-use:

[default]
access_key = $AWS_ACCESS_KEY_ID
...
secret_key = $AWS_SECRET_KEY
...

(Note that version 1.5 is still currently under development, and may have to be installed as a pre-release through something like brew install --devel s3cmd).

I then created a simple shell file containing my secrets which I stored to ~/.aws-credentials:

AWS_ACCESS_KEY_ID=my-access-key
AWS_SECRET_KEY=my-secret-key

And encrypted with:

$ gpg -r <your email> -e ~/.aws-credentials
$ ls ~/.aws-credentials.gpg
$ rm ~/.aws-credentials

Then elected for a simple wrapper script for s3cmd, which reads the encrypted credentials file and exports environment appropriately (saved as ~/bin/s3cmd-gpg):

#!/bin/sh

# s3cmd-gpg

eval `gpg -q -d $DOTFILES/aws/credentials.gpg`
export AWS_ACCESS_KEY_ID
export AWS_SECRET_KEY

s3cmd "$@"

And finally, added to simple alias to my *rc file:

$ alias s3cmd="s3cmd-gpg"

From there, s3cmd can be invoked normally:

$ s3cmd ls

Did I make a mistake? Please consider sending a pull request.