Package: pstore
pstore :: Python Protected Password StoreQuick jump:Summary|Usage examples|Installation|FAQDo you want to store and share passwords? With pstore you store the
encrypted passwords on a remote server. All encryption is done locally
by the command line interface, so the server never sees your unencrypted
passwords.Summary(back to top)pstore allows you to store and retrieve passwords and other sensitive
data in a safe manner. The permission system allows you to share these
secrets with others on the same pstore server.For passwords and other secret items, you encrypt them on the client
side automatically with the pstore client. This way the pstore server
never has any knowledge of the secret content, and your data is secure
(*) even when the server is breached.Encryption is done using GPG. One of the admins installs your public key
on the pstore server. After that you’re ready to go.(*) Security of course depends on everyone using strong secret keys and
everyone keeping them private.Usage examples(back to top)You have set your.pstorerc:$ cat ~/.pstorerc
--store-url=https://my.pstore.server/List all machines that contain example in the name:$ pstore example
  Machine                   User access
------------------------------------------------------------------------
+ new.example.com           joe, walter
+ walter.example.com        walterList machine password forwalter.example.com:$ pstore walter.example.com
ip-address = 1.2.3.4
password = wAlTeR!Add a new machine password, also accessible for joe:$ pstore -c walter2.example.com +joe
Type new machine password:
Type new machine password again:

$ pstore example
  Machine                   User access
------------------------------------------------------------------------
+ new.example.com           joe, walter
+ walter.example.com        walter
+ walter2.example.com       joe, walter

$ pstore walter2.example.com
password = abcAdd a public (unencrypted) and shared (encrypted) property to the new
machine:$ printf walter2 | pstore walter2.example.com -ps ssh-username
$ cat ssl-cert.key | pstore walter2.example.com -pe ssl-cert.key
$ pstore walter2.example.com
ssh-username = walter2
ssl-cert.key = (1533 byte encrypted)
password = abcSee thecontribdirectory for bash completion scripts and adirty
hackto supply the password to thesshclient automatically.Installation(back to top)Installing the pstore client is a matter of runningpip install./pstore-<version>.tar.gz. This will install the
necessary requirements and install the pstore binary in your path.Installing the pstore server is a little bit more work:Installpstore, the client (see above).Refer to the Django project for detailed django installation
procedures. But it should basically be something like this:Make a virtualenv (optional).Install the requirements from requirements.txt (optional, the
django-pstore installation does this too).Installdjango-pstore.Copypstore/settings.py.templatetopstore/settings.pyand
configure as needed. Those comfortable with Django, can choose to
integrate it into a different project. Don’t forget to set theDATABASESandSECRET_KEYvariables.Make known where your settings are, by exporting theDJANGO_SETTINGS_PATHand/orDJANGO_SETTINGS_MODULEenvironment variables with the right values.Rundjango-admin.pysyncdb. It will create the necessary tables
and an admin account for you.Check and alterpstore/wsgi.pyas needed.You can now run the development server to test:django-admin.pyrunserver. When you’re done testing you should
set it up on a proper webserver (nginx+uwsgi, apache+mod_wsgi or
whatever floats your boat).Don’t forget to tell the wsgi server
your virtualenv path if you’re using that.Set up users and keys:If you used the suppliedpstore/settings.pyyou’ll surf tolocalhost:8000(or where the site is running). Supply your admin
credentials.Go toAuth->Users. Add users as appropriate.Go toPstore->Public keys. Add a single public key for every
user that should be using the system. A GPG public key can be
extracted from your keyring usinggpg--export--armormy@email.addr. Thekeyvalue should look
something like this. Thedescriptionis for human consumption
only.-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)
|
mI0EULkssgEEAKeoPrMO5CHxoO8/KTXLA1FP2IQr4n3Og+DvsziIZ6vdcDmhtcsx
...
AK968N1Yrw+ytDuus3s7xPXYAw==
=TEm/
-----END PGP PUBLIC KEY BLOCK-----If you have good reasons, you can go old style and use the SSH public
key here, like this:ssh-rsa AAAAq2qMaC2...fBPcPsqMcwqsMHnBCzA= myname@myserverUsing GPG is preferred however.Set up the client:You’ll install the pstore client package on all machines that you’ll
want to connect from.Set up~/.pstorerc. You can put anything in there that you see inpstore--help, but generally you’ll want one or more--store-url=items in there. And possibly a--user=.Typepstore-cmy.first.machineto create a password formy.first.machine.You’re ready to go. Call the pstore client with--helpand--help--verbosefor more help and tips.FAQ(back to top)How do I install a downloaded tgz?sudo pip install ./pstore-<version>.tar.gz
sudo pip install ./django-pstore-<version>.tar.gzFor the client you’ll only need the first package.configure: error: no acceptable C compiler found in $PATHMake sure you have a C compiler (gcc) and python development headers.sudo apt-get install build-essential
sudo apt-get install python3-devOr you could install the dependencies manually.# for the client and server
sudo apt-get install python3-gpg python3-pycryptodome
# for the server
sudo apt-get install python3-django python3-mysqldbfatal error: gpgme.h: No such file or directorypygpgme requires the libgpgme development headers.sudo apt-get install libgpgme-devCouldn’t find index page for ‘pstore’ (maybe misspelled?)Make sure you install thepstorepackage before installingdjango-pstore. This shouldn’t be necessary anymore, as we’ve
uploaded that package to PyPI.How do I uninstall?Uninstalling the client package is done usingpip:sudo pip uninstall pstoreYou may need torm /usr/local/bin/pstoremanually.For the server, you’ll probably need to do more than just uninstallingdjango-pstore. After all, you put the app in a Django project and
you created a database for it.Note that dependencies like Django, pycryptodome, gpg, aren’t
uninstalled automatically.ImportError: No module named pstorelib.bytesWhen running./bin/pstorewhen developing, you’ll need to tell it
where the packages are:export PYTHONPATH=`pwd`NOTICE: re-using cached passwordTo make the application usable, decryption passphrase information has to
be cached. Preferably, this is done using some kind of password agent
likegpg-agent. If such an agent is unavailable, we cache the password
in cleartext in memory for the duration of the pstore command.The NOTICE is there to remind you that it is not as safe as it could be.How do I make password caching agents forget my password?Your graphical desktop environment generally starts a password caching
daemon. That could beseahorse-agentorgpg-agentor something else.I couldn’t find a way to reliably clear theseahorse-agentpassword
cache. I only found reliable ways to kill it by accident (on Ubuntu
10.04).Thegpg-agent(gnupg-agent package) seemed more stable. (Log out and
in after install.) Making it forget your cached passphrase is a matter
of sending it aSIGHUP.pkill -HUP gpg-agent(If you’re now wondering, like me, who then caches your decrypted
private ssh key: it’s the ssh-agent, even though it’s the gnome-keyring
who asked for the password. Clearing the ssh-agent cache is a matter of
doing ``ssh-add -D``.)Issues with large file supportWhen running the integration test, you could see something like this:* Large file support (adding large public file):
backend error: could not connect to http://127.0.0.1:8000

  FAIL: could not write large unencrypted file
  > NOTICE: not encrypting the valueThis is likely caused by apparmor(1) on the mysqld. We need read/write
permissions in /tmp.Further, you may need to increase themax_allowed_packetto
something higher than16MBif you want to store larger files.(back to top)