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

Jason Brown commented on CASSANDRA-9633:
----------------------------------------

OK, so here we go with the updates [~bdeggleston] requested.

||9633||
|[branch|https://github.com/jasobrown/cassandra/tree/9633]|
|[dtest|http://cassci.datastax.com/view/Dev/view/jasobrown/job/jasobrown-9633-dtest/]|
|[testall|http://cassci.datastax.com/view/Dev/view/jasobrown/job/jasobrown-9633-testall/]|

To encrypt the (primary) index and summary sstable files, in addition to the 
data file, different code paths were required.

-As the summary is the once-shot read and different from all other code paths, 
I made custom classes for handling it, {{EncryptedSummaryWritableByteChannel}} 
and {{EncryptedSummaryInputStream}}. As the summary is intimately linked with 
the owning sstable & data file, the summary will simply inherit the 
key_alias/algo from the sstable, but then has it's IV written to the front of 
the summary file.

- The encrypted primary index needs to have it's own 'chunks' file, a la the 
{{Component.COMPRESSION_INFO}}, so I created 
{{Component.INDEX_COMPRESSION_INFO}} so that it gets the proper treatment. 
Thus, we can use {{CompressedSequentialWriter}} for writing out the index 
file's offsets, just like what we do for the compressed data file.

- As with the first version of this patch, encrypting the data file (and now 
the primary index) is handled by {{EncryptingCompressor}}. 

WRT to CQL changes, we simply do {{... WITH ENCRYPTION='true'}} to enable the 
sstable encryption. All the encryption parameters are already in the yaml, so 
no need to pass those in separately. Further, to disable the sstable 
encryption, simple execute {{ALTER TABLE ... WITH ENCRYPTION='false'}}. As a 
side effect of piggy-backing on the compression infrastructure, though, when 
executing {{DESCRIBE TABLE}} in cqlsh the encryption params show up as 
'compression' data, not as encryption. I believe all the code for handling the 
cqlsh describe queries is largely in the python driver, afaict. 


Some miscellaneous changes:
- {{ICompressor}} got some additional functions for instance-specific values as 
we need to carry a unique IV for each cipher.
- {{CipherFactory}} needed a small cleanup wrt caching instances (we were 
creating a crap tonne of instances on the fly)
- Apparently I messed up a small part of the merge for #11040, and thus adding 
it in here ({{HintsService}}). Without this, hints don't get encrypted when 
enabled.
- added some {{@SupressWarnings}} annotations


> Add ability to encrypt sstables
> -------------------------------
>
>                 Key: CASSANDRA-9633
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9633
>             Project: Cassandra
>          Issue Type: New Feature
>            Reporter: Jason Brown
>            Assignee: Jason Brown
>              Labels: encryption, security, sstable
>             Fix For: 3.x
>
>
> Add option to allow encrypting of sstables.
> I have a version of this functionality built on cassandra 2.0 that 
> piggy-backs on the existing sstable compression functionality and ICompressor 
> interface (similar in nature to what DataStax Enterprise does). However, if 
> we're adding the feature to the main OSS product, I'm not sure if we want to 
> use the pluggable compression framework or if it's worth investigating a 
> different path. I think there's a lot of upside in reusing the sstable 
> compression scheme, but perhaps add a new component in cqlsh for table 
> encryption and a corresponding field in CFMD.
> Encryption configuration in the yaml can use the same mechanism as 
> CASSANDRA-6018 (which is currently pending internal review).



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

Reply via email to