rogpeppe / macaroon-cmd

A command-line tool for manipulating macaroons
BSD 3-Clause "New" or "Revised" License
1 stars 0 forks source link

macaroon command

Note: WORK IN PROGRESS

This command implements command-line support for creating, discharging and checking macaroons. It will usually rely on a macaroond daemon running somewhere in the system. Use macaroon login to acquire an access token to use this. The first time this runs, it will prompt for a password to use to encrypt the root keys. The login command prints an environment variable to set which provides access to the root key store.

To run macaroond, first install it (go get github.com/rogpeppe/macaroon-cmd/cmd/macaroond) then run it as:

macaroond /tmp/macaroonstoragedir

You can also run the macaroon command storing the root keys unencrypted in a local file with:

export MACAROON_ACCESS_TOKEN=localfile:/path/to/storage-directory

A "macaroons" argument to a command specifies a list of unbound macaroons, with the first element being the primary, or root, macaroon and the rest being discharges. A macaroons argument can be specified in one of the following ways:

A macaroon list is printed as a base64-encoded string holding a JSON array holding macaroons in bakery.Macaroon format, prefixed with the string "unbound:".

The base64 encoding will not include terminating "=" padding characters.

A format argument can be one of the following: json - base64 JSON encoded binary - base64 binary encoded rawjson - JSON encoded rawbinary - binary encoded Binary formats can only be used with bound macaroons.

macaroon login

Log into the local macaroon root key server. Prints:

export MACAROON_ACCESS_TOKEN=xxxxx

All commands recognize that env var and use it to talk to the server.

macaroon new [--expiry duration] op...

Create new macaroon valid for the given operations, which expires after the given duration from now.

macaroon check [--any] op... [macaroons...]

Return status indicating whether macaroons are allowed to perform all given operations. If --any flag is given, print allowed status of all operations. All the macaroons should be bound (for example using the use command). e.g. macaroon check read:/usr/bin/x dfvnmdsvflkfdjsnvldksnv dsakhjcsdhjcbsk

macaroon discharge macaroon

Acquire any discharges needed for the undischarged macaroon and print macaroon slice.

macaroon use [--format format] macaroons

Use macaroons in a request. Takes the given macaroons, which must have include all discharges, and prints it in the specified format (default binary).

macaroon caveat [-3 location] [--public-key xxxx] macaroon condition

Add caveat to macaroon, prints new macaroon. looks up public key of location if not provided (could use local cache)

macaroon show [--format text|json|binary] macaroons

Show macaroons formatted with the given format. If --raw is specified, binary output will not be base64-quoted.

UNIMPLEMENTED AS YET

macaroon newkey

Generate a new public-private key pair and print it.

macaroon discharger json-spec

Run 3rd party caveat discharge service json spec maps caveat conditions to required operations. you can discharge a caveat condition if the caveat condition matches a pattern and the provided discharge token contains a set of macaroons that allows the associated operations. e.g.

{
    condition: "answered-quiz ([a-z]+)",
    ops: ["answered:\1"],
}

Encrypt macaroons at rest; use a server listening on a unix socket to retrieve and create root keys. To obtain access to the server, authenticate somehow (initially just a password, later perhaps user too), which gives us a macaroon that will allow access to the rest of the API.

Initially, just use a single root key, encrypted with the password. Send password hashed with password-strong hash.