[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-2014?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15384994#comment-15384994
 ] 

Michael Han edited comment on ZOOKEEPER-2014 at 8/23/16 4:05 AM:
-----------------------------------------------------------------

Had an offline discussion with [~phunt], [~fpj] yesterday regarding this issue, 
the conversation is captured as following points (with some of my thoughts as 
well):

* We can't fix security issue unless we enforce authentication and 
authorization. Just by moving client APIs around is not enough because at 
protocol level the server still open to reconfiguration and someone can exploit 
this easily (by writing their own ZK client instead of using ZooKeeper client 
for example.). 

* That said though, the ZooKeeper::reconfig API should be moved out of 
ZooKeeper class (for Java client) anyway, because it's more about an admin 
feature rather than a client API. Moving reconfig out of ZooKeeper will also 
remove constraints we possibly put on normal ZooKeeper clients (such as having 
to use zookeeper.DigestAuthenticationProvider.superDigest), which is a bonus. 
Due to API backward compatibility concerns, this refactoring should happen 
before we move to beta.

* We'd like to introduce a new configuration option in zoo.cfg to turn off 
reconfig feature by default. ZK users who needs use this feature need turn it 
on explicitly. Because dynamic reconfig feature brings something new (e.g. 
cfg.dynamic file), have this feature off is good for 'the principal of least 
surprise'. Having the feature off by default will also buy us sometime to 
fortify and stabilize the feature without having it being a blocker issue.

The action items / plans I am thinking in the time frame of 3.5.3:
* Fix Security:
#* Enforce an ACL on /zookeeper/config, such that only users that have write 
permission to it can reconfig the cluster. /zookeeper/config is by default 
readable to anyone so zookeeper (none-admin) clients can load balancing on 
client side either manually (current behavior) or automatically 
(ZOOKEEPER-2016). 
#* ZooKeeper users are responsible for properly configure the ACL such that 
only a limited set of admin users are part of the ACL with write access. The 
authentication of these users will be delegated to existing mechanisms 
ZooKeeper already supports, such as SASL client login, so not much work here 
except documentation on such a requirement to use reconfig feature.
#* The default behavior is such that if /zookeeper/config node has no 
associated ACLs, then no one is allowed write access except super user. 
* Fix API:
#* Create a new class ZooKeeperAdmin that inherits ZooKeeper class.
#* Move reconfig API into ZooKeeperAdmin class.
* Introduce a new zoo.cfg option to switch reconfiguration feature on or off. 
The new configuration option will be set as 'disable reconfig' by default when 
3.5.3 shipped, and user who wants reconfig has to enable reconfig option 
explicitly.

Are these good enough for now to address all security concerns or we still miss 
something?
Comments?

CC [~shralex], [~rgs]


was (Author: hanm):
Had an offline discussion with [~phunt], [~fpj] yesterday regarding this issue, 
the conversation is captured as following points (with some of my thoughts as 
well):

* We can't fix security issue unless we enforce authentication and 
authorization. Just by moving client APIs around is not enough because at 
protocol level the server still open to reconfiguration and someone can exploit 
this easily (by writing their own ZK client instead of using ZooKeeper client 
for example.). 

* That said though, the ZooKeeper::reconfig API should be moved out of 
ZooKeeper class (for Java client) anyway, because it's more about an admin 
feature rather than a client API. Moving reconfig out of ZooKeeper will also 
remove constraints we possibly put on normal ZooKeeper clients (such as having 
to use zookeeper.DigestAuthenticationProvider.superDigest), which is a bonus. 
Due to API backward compatibility concerns, this refactoring should happen 
before we move to beta.

* We'd like to introduce a new configuration option in zoo.cfg to turn off 
reconfig feature by default. ZK users who needs use this feature need turn it 
on explicitly. Because dynamic reconfig feature brings something new (e.g. 
cfg.dynamic file), have this feature off is good for 'the principal of least 
surprise'. Having the feature off by default will also buy us sometime to 
fortify and stabilize the feature without having it being a blocker issue.

The action items / plans I am thinking in the time frame of 3.5.3:
* Fix Security:
#* Enforce an ACL on /zookeeper/config, such that only users that have write 
permission to it can reconfig the cluster. /zookeeper/config is by default 
readable to anyone so zookeeper (none-admin) clients can load balancing on 
client side either manually (current behavior) or automatically 
(ZOOKEEPER-2016). 
#* ZooKeeper users are responsible for properly configure the ACL such that 
only a limited set of admin users are part of the ACL with write access. The 
authentication of these users will be delegated to existing mechanisms 
ZooKeeper already supports, such as SASL client login, so not much work here 
except documentation on such a requirement to use reconfig feature.
#* The default behavior is such that if /zookeeper/config node has no 
associated ACLs, then no one is allowed write access except super user. 
* Fix API:
#* Create a new class ZooKeeperAdmin that inherits ZooKeeper class.
#* Move reconfig and getConfig API into ZooKeeperAdmin class.
* Introduce a new zoo.cfg option to switch reconfiguration feature on or off. 
The new configuration option will be set as 'disable reconfig' by default when 
3.5.3 shipped, and user who wants reconfig has to enable reconfig option 
explicitly.

Are these good enough for now to address all security concerns or we still miss 
something?
Comments?

CC [~shralex], [~rgs]

> Only admin should be allowed to reconfig a cluster
> --------------------------------------------------
>
>                 Key: ZOOKEEPER-2014
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-2014
>             Project: ZooKeeper
>          Issue Type: Bug
>          Components: server
>    Affects Versions: 3.5.0
>            Reporter: Raul Gutierrez Segales
>            Assignee: Michael Han
>            Priority: Blocker
>             Fix For: 3.5.3
>
>         Attachments: ZOOKEEPER-2014.patch
>
>
> ZOOKEEPER-107 introduces reconfiguration support via the reconfig() call. We 
> should, at the very least, ensure that only the Admin can reconfigure a 
> cluster. Perhaps restricting access to /zookeeper/config as well, though this 
> is debatable. Surely one could ensure Admin only access via an ACL, but that 
> would leave everyone who doesn't use ACLs unprotected. We could also force a 
> default ACL to make it a bit more consistent (maybe).
> Finally, making reconfig() only available to Admins means they have to run 
> with zookeeper.DigestAuthenticationProvider.superDigest (which I am not sure 
> if everyone does, or how would it work with other authentication providers). 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to