[ 
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)

Reply via email to