Hi Chris,

 let me describe what I'm trying to do in more details.

Goals:
* Completely automate tomcat deployment, and make sure deployment is 
reproducible and testable in different environment (hence we use ansible+git to 
manage installation and _configuration for tomcat)
* Do not make stupid thing (like storing passwords or keys in SCM) just because 
we want to automate
* Be as secure as possible

(Working) implementation:

I install and configure tomcat with ansible (server.xml is an ansible template, 
on every run ansible re-generates the template and compare it to the deployed 
version, so it needs to be able to read the deployed server.xml)
Then I generate a random pin file, the keystore and the private keys (and 
relates cert requests) with ansible on the target host.
(Thanks to Jan suggestion) I can now instruct tomcat to read the pin from the 
pin file. I do not need to store pin/keys in SCM....


I'm running on linux so I can install the following audit rule:

 auditctl -w [pin file] -p warx -F auid!=tomcat -F auid!=4294967295

so *at least* I'm sure that access to the pin file made by anybody but the 
tomcat user would be logged (so I know when I was compromised and need to rekey 
the cert)

This rule doesn't trigger when I am comparing the deployed server.xml with the 
expected version or the deployed keystore (as to check the presence of the key 
I do not need the key pin).
It only trigger when I generate the initial pin, somebody compromise my box, I 
need to renew certs (which are all events I like to be informed about)

Now back to the tomcat relevant suff:

(at least) in my setup I find it valuable to be able to read secrets from files 
I can protect with specific audit rules.
Jan suggested me a viable (and easily implemented) way to do it [1], so I'm ok.

Now the question is, given how easy is to implement Jan solution do you think 
my use case deserves an RFE (something like adding keyPassFile attribute to the 
Connector )?
I do not know tomcat enough to answer, but if you say so I'll post a BUG.

Regards and thanks for your help,
 Luca

[1]
- Add -Dorg.apache.tomcat.util.digester.PROPERTY_SOURCE=FilePropertySource to 
CATALINA_OPTS
- deploy a jar in tomcat lib with the following class:
public class FilePropertySource implements
        org.apache.tomcat.util.IntrospectionUtils.PropertySource {
    @Override
    public String getProperty(String name) {
        if (name.startsWith("file://")) {
            try {
                return readFile(name.substring(7));
            } catch (IOException e) {
                throw new RuntimeException("Unable to derefercence property " + 
name, e);
            }
        }
        return null;
    }

    String readFile(String fileName) throws IOException {
        FileReader br = new FileReader(fileName);
        try {
            StringBuilder sb = new StringBuilder();
            char[] buff = new char[4096];
            int read = -1;
            while ((read = br.read(buff)) != -1) {
                sb.append(buff, 0, read);
            }
            return sb.toString();
        } finally {
            br.close();
        }
    }
}

- in server.xml use it like ${file:///bla/bla/bla}

----- Original Message -----
> From: "Christopher Schultz" <ch...@christopherschultz.net>
> To: "Tomcat Users List" <users@tomcat.apache.org>
> Sent: Thursday, April 16, 2015 7:22:21 AM
> Subject: Re: RFE: read keystorePass from file
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
> 
> Luca,
> 
> On 4/15/15 5:40 PM, Luca Menegus wrote:
> > Hi Christopher (and Konstantin),
> > 
> > took some time to reply as I wanted to test your suggestions:
> > 
> > - "a parameterized server.xml that pulls the password [...]": If I
> > understood your hint correctly it boils down to passing secrets as
> > JVM args (using -D or env vars). I do not think that would satisfy
> > my use case as it implies passing secrets on command line or
> > environment. Not acceptable for us.
> 
> Definitely don't use system properties: those will show up in a ps
> listing, and would take the problem from already-solved to totally-broke
> n.
> 
> My actual suggestion was to use a tool like ant to do deployment-time
> replacement of a token *in the file* with another value (the
> password). Something like this:
> 
> <Connector
>    ...
>    keystorePass="@keystorePassword@"
>    ...
>    />
> 
> During deployment, you take
> /path/to/staged/webapp/conf/tomcat-server.xml and copy-with-filtering
> into /path/to/actual/tomcat/conf/server.xml. The resulting file has:
> 
> <Connector
>    ...
>    keystorePass="tiger"
>    ...
>    />
> 
> ... or whatever you told Tomcat to do.
> 
> > - "external XML entities": I gave it a try to this as it looked
> > really promising; but I couldn't get it working.
> > 
> > If I got it right your suggestion was I should load the keystore
> > password from a file by declaring the file as an external entity
> > in server.xml and then reference it in the keystorePass/keyPass
> > *attribute* of the relevant Connector entity: (PLS know that my
> > DTD/XML-fu doesn't seems to be up to the task so I might be
> > missing something obvious) I looks like loading external entities
> > as attribute values it's forbidden by design [1] ([2] to know about
> > the test I made).
> 
> Put the whole <Connector> in your external entity. Note that I've
> never bothered trying this, because it just seems like the most work
> you could do to get the same kind of protection.
> 
> > *If I'm not wrong* than the only way to do what I'm trying to do is
> > a patch. If you agree than I'll open an RFE BUG.
> 
> Let me get you back to your original question. Let me see if I've got
> this right:
> 
> Given #1: You have server.xml in revision control.
> Given #2: You don't want to put a super-secret password into revision
> control.
> Conclusion: You must store the super-secret password outside of
> server.xml.
> 
> I don't think that's the only conclusion you could have come to. Let
> me suggest some other possible conclusions, and you tell us if/why
> each of them is not acceptable.
> 
> Alt conclusion #1: Use a non-super-secret password. Who cares if
> "tiger" is in revision-control?
> 
> Alt conclusion #2: Don't put the password in the <Connector> at all.
> It will default to "changeit". Use "changeit" as the keystore's
> passphrase.
> 
> Alt conclusion #3: "Given #2" is not relevant because the super-secret
> password doesn't give a reader any access to anything. There is
> therefore no problem to solve.
> 
> What do you think?
> 
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v2
> Comment: GPGTools - http://gpgtools.org
> 
> iQIcBAEBCAAGBQJVL0cNAAoJEBzwKT+lPKRYDEUP/Rb9oSHGT4f/XwAYT08sgWHD
> y4jXWx0umFK3jzlMssmVM+MHzLlyXGJLFeztK/iT3TuS7kGmQYkwRVOVaTLjPYvq
> SfhsS3Zvei6JEJwRi35iMRc6kz+YjGomyiuLGd0fF9zGou1BXLGCEbq0+QsGD8+A
> ZZF//kV+AAmFtEHQRMvCc1DiaNPhDKqbj9OQgoNBM0u4/CVBtbNE+CgNAl4OCUKy
> wi9Lo8fBTZuNEocsasVGcSdMpxsNV0YKrVdd6hR3Uoc8OxPIdTXv/bHcs5vRaBP1
> EJixeIZgQgLh6NYwd/q8WwbOmrBXE3mn/VgLzeQ7imE5RYIYxCe6zJIMM1kNM28Q
> oKgpS9VotyRyvpLMD7a4Wmltj3tzztErlYQfl46K+ob3lkca0tPeu1mrV6GtkZ1C
> /ihKd/8rkke6RYYKV/4mRgfBDU4tOeuvobrebkSC7CoRj1DS1WCawO9Aq+Me8BcO
> m9/FWBKU+yHmjghn2M0lHzVzTKuOWSvJQePIjML4WGuv9xiv+tl16GOnX9RgUWRD
> SDxzlGK5oHT98Q4D/Cl1mHqfVBUGiCCj39FoR6a9D+SA/k/TLbCutUZtHuM6htYg
> 0L3ttSmi4EpmLVBLvdFjEXqrQ5neVyyFc7YqbgZZnn45HqwXtlg0MqZiQyZsshso
> uxnexdws2vN3wF+D4Sxx
> =tC4S
> -----END PGP SIGNATURE-----
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to