spiffe / go-spiffe

Golang library for SPIFFE support
Apache License 2.0
149 stars 77 forks source link

Provide a SPIFFE CLI utility in this repository #23

Open evan2645 opened 5 years ago

evan2645 commented 5 years ago

There is a community need for a generalized SPIFFE CLI utility, with many useful features possible. Among them:

There are likely additional features that would fit well here (SPIFFE bundle fetching? Munging to type-specific bundles? etc). I would expect this utility to be fetchable/installable via typical go workflow, and would also expect it to fully subsume the functionality currently implemented in https://github.com/spiffe/spiffe-helper

evan2645 commented 4 years ago

There are likely additional features that would fit well here (SPIFFE bundle fetching? Munging to type-specific bundles? etc)

Perhaps:

Maybe some of the functionality from the SPIRE OIDC provider can live here too?

mcpherrinm commented 4 years ago

One case I'd be interested in is supporting processes without native workload support.

I'm thinking the user-interaction might look something like this:

spiffe --spiffe="spiffe://example.org/pickaworkload" exec   -- mysql --ssl-ca=@X509BUNDLE --ssl-cert=@X509SVID --ssl-key=@SVIDKEY

the spiffe tool would write out temp files (ideally, to somewhere like a tmpfs that's relatively secure) and exec the tool with the templated parameters filled in. Lots of bikeshedding to do on the details, and at least in the above case I'd probably want a wrapper shell script (I'd call it spiffe-mysql or something) so folks don't have to type it out.

That would work with tools like curl, mysql, etc -- anything that takes a cert bundle, client cert, and key as files.

Maybe a flag to send a signal to the child on update, too?

mcpherrinm commented 4 years ago

There's a few ways you might want to specify the paths to files:

  1. as command line options, like mysql/curl do, with some syntax like in the comment above
  2. as environment variables, for a "12 factor" style applications
  3. to preconfigured paths (for apps with config files that don't want to change)
mcpherrinm commented 4 years ago

You may also want support for different file formats...

eg, syslog wants an "openssl CA directory". Java & windows apps often want a .p12 file Some apps want a pkcs1 vs pkcs8 key. Some want the x509 cert, chain, and key all in the same file (eg, mongodb)

our internal not-yet-spiffe software supported that set of file format options & that's given almost complete coverage of software we've run into.

mcpherrinm commented 4 years ago

Handling rotation:

  1. Might want to signal a process (ideally, a child process)
  2. Might want to run a command (eg, sv restart /service/foo if you're using runit, or some equivalent systemd command, etc) to restart a process. Definitely need to use this with care; I wouldn't want to knock out a fleet with a bad restart command.
  3. Ideally apps notice files on disk changing (via inotify) and reload, or do it on some timer, requiring no coordination.
mcpherrinm commented 4 years ago

This is basically a description of spiffe-helper, but I think it's helpful to re-state what the goals are for a larger tool.