Michael Berman created ACCUMULO-1749:
----------------------------------------
Summary: Provide tool for assisting cert provisioning across
tserver cluster
Key: ACCUMULO-1749
URL: https://issues.apache.org/jira/browse/ACCUMULO-1749
Project: Accumulo
Issue Type: Sub-task
Reporter: Michael Berman
Provisioning certs off a private root for each tserver is an annoying and
repetitive task. It would be nice for some of it to be done in an automated
way. Whether or not this should actually be accumulo's responsibility was a
contentious issue in ACCUMULO-1009. Here are some arguments for and against
the feature; see the thread on the original issue for more context.
[~ctubbsii]:
{quote}
Automatic cert provisioning within Accumulo itself seems out of scope to me (if
it were me, I'd rather use the system's certs in /etc/pki/tls/certs/, which is
the default location for the Apache web server and a bunch of other apps, and
uniquely identify the server cryptographically).
As long as we make sure Accumulo can be configured easily, we'll set the
groundwork for any provisioning utility or practice that users are already
familiar with for their other secure applications, according to their
environment's policies and practices. I'd prefer not trying to provide
everything when those functions already exist in Linux environments in standard
ways. Instead, we should leverage those standard practices, and document how to
interact with them. This significantly reduces the learning curve for system
administrators, I think.
{quote}
[~mberman]
{quote}
Regarding provisioning scenarios, I think some people will want to use certs
signed by public CAs the same way they would want to for a webserver, but I
still believe this will be unwieldy for tservers. I think the much more common
scenario would be for someone to generate a self-signed root on one box, and
then want to just cut however many more local certs on each of the nodes in the
cluster. As far as reducing the learning curve for system administrators, I
think running bin/accumulo init-ssl on each machine, and having that generate
certs in default locations and not require any additional config would actually
be less work than making them configure a bunch of properties and figure out
what relationships they want among all their certs, even if the properties
point to standardish locations. Having a separate root and trust tree for
accumulo also provides some additional protection. I may not want to trust any
accumulo that has a cert signed by a public CA, since anyone could have a cert
signed by a public CA. If my cluster has its own root, I can be confident that
any cert signed by that root is part of my cluster.
{quote}
[~mallen]:
{quote}
Getting "real" certificates is a pain in the <insert your favorite body part
here>, especially when you start talking about trying to set up your own
sub-root from which you can cut certificates. Requiring someone to understand
how to do all that and then set up a bunch of configuration properties on top
of it puts up a big barrier to entry.
Having something like Michael's suggested bin/accumulo init-ssl call do the
certificate generation and configuration for you would be my strongly preferred
choice, and would make setting up secure clusters much much easier. The work to
set up a reasonably secure SSL deployment is boilerplate, albeit complex
boilerplate. Unless you are extremely keen on handling this setup yourself, or
your company has stringent requirements in this area, having a very easy to set
up SSL configuration is a big boon.
I also agree that being able to quickly test an SSL-enabled mini-cluster is
another huge win for making this code easily testable and maintainable.
{quote}
[~ctubbsii]:
{quote}
It's not always about reducing the work... sometimes, it's about doing stuff in
the way they already know how to do (or have already done). I'd much rather not
re-invent the wheel for provisioning certs. If we just make it simple to
configure certs, system administrators can just provision using whatever
process they currently know or use. No re-inventing the wheel at all.
As for "real CA" signing... I expect a common use case would be to use an
intermediate CA that is signed by a "real CA". I'm not suggesting that anybody
go through the headache of getting every tserver cert signed by a common public
root. But... it doesn't really matter whether the "real CA" is one that is
pre-configured in a browser (something like VeriSign's root)... so long as it's
easy to configure. The point is to make it easy to control which one they'll
trust... which may be generated from their root, or an intermediate root, or a
trustStore that holds all the individual tserver public certs. The point is to
not make decisions for users regarding certificate provisioning, and to just
make it easy for them to use what they want.
{quote}
[~mberman]:
{quote}
There's absolutely nothing preventing you from provisioning certs the way you
know how, assuming you already know how and you happen to have an intermediate
cert handy. I think it would be nice for people to have an easy option as well
if they're not already so equipped. And as Michael Allen says above, there are
definitely security and operational reasons for wanting a separate trust tree
for your accumulo deployment.
{quote}
[~ctubbsii]:
{quote}
By providing a "security on" button, you're encouraging users to not even think
about security by creating an easy button (like your proposed "bin/accumulo
init-ssl") that presumably implements some sort of security without thinking
about what kind of security, what protections it offers, and what risks it
mitigates. This is a bad precedent, and it feels like your coding to developers
(like us, for ease in testing) rather than users... either that, or users who
want security but really don't know what they're doing and who just want the
comfort of "security" (not a good target audience to cater to, as a rule).
The best thing for provisioning is to simply document how one might provision
certificates... perhaps as a sequence of keytool or openssl commands. That way,
it's clear to users that Accumulo's security isn't anything special or custom
or novel. It's simply leveraging the same kinds of security that is available
to them in other applications... the same that they may already understand, or
that is well documented, or that they can get help with on StackOverflow or the
countless message boards.
{quote}
[~_alexm]:
{quote}
I'll throw in my $0.02; in short, resist the temptation to handle certificate
provisioning.
If provisioning is included, it becomes a type of one-off product that:
- does its own thing
- has to be maintained
- security/admin folks have to address separately as a one-off
When key/truststores can be reused between services, it makes life of the admin
a lot easier. For users that require encryption in transit, certificates are
typically well understood and tooling exists to generate and provision. That
being said, trying to shoehorn those certs into an internally-provisioned piece
is usually kludgy at best.
I see "accumulo init" as a case where steps – though complicated – are going to
be identical across users and are required to get the thing up and running,
whereas the generation of certificates is going to vary a bit and is still
optional.
{quote}
[~mallen]:
{quote}
I disagree that providing an easy and automated way to set up SSL provides no
more security and only adds complexity. Nor will I argue that it provides
iron-clad security. It is a step along the path towards good security.
It seems like from your previous comments, you think an administrator must make
the leap from no security to all security in one bound. I think this is a
mistake. Database administrators are not all familiar with SSL, and how to
correctly deploy it. Deploying it properly is a mechanical issue, one that can
be easily automated. (By properly I am merely referring to getting actual SSL
connections working, not yet to how the certificate material is secured.) Once
deployed, network sniffing attacks and man-in-the-middle attacks are thwarted,
even if all Accumulo tserver nodes in the system have access to the issuing CA.
Securing the issuing CA can just be a matter of having the administrator use a
password for the root certificate's private key that is different than the
instance secret. Every new node will require that that password be provided,
thwarting the ability to have that node deployed unattended, but ratcheting up
the security. One could also devise a scheme where the root certificate itself
is kept offline until needed, further increasing one's ability to control
access to it.
{quote}
--
This message was sent by Atlassian JIRA
(v6.1#6144)