[ https://issues.apache.org/jira/browse/KAFKA-2629?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14953542#comment-14953542 ]
Mike Yoder commented on KAFKA-2629: ----------------------------------- Hi - I work with [~singhashish] so I thought I'd jump in here. {quote} While flexibility is generally a good thing, in my opinion the security consequences in real-world of this approach needs to be carefully evaluated. {quote} Appreciate the feedback. You're right, security is hard. {quote} My question is that why this approach provides more security? Why trusting the operating system kernel is insufficient in this case? Why bringing in yet another another application to the trusted computing base? How does it widen the attack surfaces? What are the kinds of attacks that this approach prevents, but putting permissions on top of the file fails to do so? {quote} All reasonable questions. First, let's step back and realize that this is only an _interface_ to getting a password, not the implementation behind said interface. Many of your questions really deserve to be asked of the implementations. That being said, running an executable is a little different than ordinary file access. However I don't believe that it adds risk to the overall security of the application. Yes, the specification of the executable to run is in a config file - but if an attacker controls the config file itself, we have far bigger problems than them being able to run some program. Likewise, if an attacker can control the executable that's being run, then bad things can happen - but that's bad because the implementation has somehow been screwed up, or because the attacker has control of things that defeat other security measures as well. I think that the benefit of this approach is that it _enables_ things that aren't possible with a password simply sitting in a config file. Primarily it enables a use case where a centralized password store is contacted, and a password dispensed. The benefit with this is that the password store can audit usage, rotate passwords, and provide centralized management. {quote} Hadoop implemented something called the CredentialProvider specifically for the purpose of encrypting passwords. See https://issues.apache.org/jira/browse/HADOOP-10607. This functionality is now supported by other projects, including Hive, HBase, etc. I believe the Hadoop jira is irrelevant. This is specifically tailored to hook with services like Apache Ranger and Apache Sentry – all of which for user authentication / authorization. {quote} I disagree. The implementation of the CredentialProvider is hooked into all the "sensitive" parameters of Hadoop. It's not just for the authentication of users. One example is here: https://github.com/apache/hadoop/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/ssl/FileBasedKeyStoresFactory.java#L155 This is for core hadoop ssl's keystore password. The getPassword() call goes to the CredentialProvider interface for passwords. The CredentialProvider is an interface; the implementation can do pretty much anything it wants, including something like what is described in this jira. The popular implementation gets a password from a jceks file. An alternative implementation of this jira would be to build something like the CredentialProvider for Kafka. That's a bigger project... but accomplishes similar goals. {quote} 8.2.1 Using strong cryptography, render all authentication credentials (such as passwords/phrases) unreadable during transmission and storage on all system components. Please correct me if I'm wrong, it looks to me that you misread the standard? The statement you specifically refers to user authentication services. The password in SSL keystore serves as a master keyphrase to protect the private key stored in the keystore. {quote} That's an interesting distinction that I have not seen others make. I admit that differentiating between passwords used for human authentication and passwords used to encrypt things in a keystore is not one that occurred to me. In a way, you're right, they are somewhat different use cases, and I could be accused of misreading the standard. HOWEVER, I know many organizations who interpreted the standard like I did: a password is a password, and shall not be suffered to exist in plain text on a disk. There are corporations out there with quite rigid blanket policies regarding this. Auditors, in particular, do not have a sense of humor at all about such things. So many others could be accused of misreading the standard, too. {quote} I'd like to point out that the other side of the argument is that the system needs to trust the your customized application to be secure. {quote} Yes. {quote} Unfortunately building a secure application is often tricky \[1,2,3,4\]. {quote} No argument here. Remember, though, this is an _interface_ to such a thing, not the thing itself. You will not catch me claiming that implementations of this will be able to defeat a cold boot attack, or anything a sophisticated attacker will throw at it. {quote} Programs like gpg have mechanisms to defend against these attacks. If you really want a workflow like that it is possible to use gpg to extract the passphase from a centralized keystore, putting it into a temporary file with proper permissions and start the Kafka server. Indeed there are some tricky issues to handle in order to secure the temporary file, but in practice it is much easier for security reviews and give much better security guarantees. Does it solve your use cases? {quote} I would view that as certainly one viable implementation, yes. But I think it lacks the auditing and centralized management that others may want. The point of making an interface here instead of settling on one implementation is to enable different use cases. Tying it specifically to gpg would be problematic for some use cases. Hopefully I've addressed some of your concerns. You're right that security is difficult. However having a generic interface around the acquisition of passwords does not harm or help security per se; only the implementations can do that. > Enable getting SSL password from an executable rather than passing plaintext > password > ------------------------------------------------------------------------------------- > > Key: KAFKA-2629 > URL: https://issues.apache.org/jira/browse/KAFKA-2629 > Project: Kafka > Issue Type: Improvement > Components: security > Affects Versions: 0.9.0.0 > Reporter: Ashish K Singh > Assignee: Ashish K Singh > > Currently there are a couple of options to pass SSL passwords to Kafka, i.e., > via properties file or via command line argument. Both of these are not > recommended security practices. > * A password on a command line is a no-no: it's trivial to see that password > just by using the 'ps' utility. > * Putting a password into a file, and then passing the location to that file, > is the next best option. The access to the file will be governed by unix > access permissions which we all know and love. The downside is that the > password is still just sitting there in a file, and those who have access can > still see it trivially. > * The most general, secure solution is to provide a layer of abstraction: > provide functionality to get the password from "somewhere else". The most > flexible and generic way to do this is to simply call an executable which > returns the desired password. > ** The executable is again protected with normal file system privileges > ** The simplest form, a script that looks like "echo 'my-password'", devolves > back to putting the password in a file > ** A more interesting implementation could open up a local encrypted password > store and extract the password from it > ** A maximally secure implementation could contact an external secret manager > with centralized control and audit functionality. > ** In short: getting the password as the output of a script/executable is > maximally generic and enables both simple and complex use cases. > This JIRA intend to add a config param to enable passing an executable to > Kafka for SSL passwords. -- This message was sent by Atlassian JIRA (v6.3.4#6332)