Cipher filter plugin
- Plugin version: v4.0.3
- Released on: 2022-06-21
- Changelog
For other versions, see the Versioned plugin docs.
For plugins not bundled by default, it is easy to install by running bin/logstash-plugin install logstash-filter-cipher
. See Working with plugins for more details.
For questions about the plugin, open a topic in the Discuss forums. For bugs or feature requests, open an issue in Github. For the list of Elastic supported plugins, please consult the Elastic Support Matrix.
This filter parses a source and apply a cipher or decipher before storing it in the target.
Prior to version 4.0.1, this plugin was not thread-safe and could not safely be used with multiple pipeline workers.
This plugin supports the following configuration options plus the Common options described later.
Setting | Input type | Required |
---|---|---|
algorithm |
string | Yes |
base64 |
boolean | No |
cipher_padding |
string | No |
iv_random_length |
number | No |
key |
string | No |
key_pad |
string | No |
key_size |
number | No |
max_cipher_reuse |
number | No |
mode |
string | Yes |
source |
string | No |
target |
string | No |
Also see Common options for a list of options supported by all filter plugins.
- This is a required setting.
- Value type is string
- There is no default value for this setting.
The cipher algorithm to use for encryption and decryption operations.
A list of supported algorithms depends on the versions of Logstash, JRuby, and Java this plugin is running in, but can be obtained by running:
cd $LOGSTASH_HOME1
bin/ruby -ropenssl -e 'puts OpenSSL::Cipher.ciphers'
- <-- your Logstash distribution root
Value type is boolean
Default value is
true
Unless this option is disabled:
- When
mode => encrypt
, the source ciphertext will bebase64
-decoded before it is deciphered. - When
mode => decrypt
, the result ciphertext will bebase64
-encoded before it is stored.
- When
Value type is string
0
: meansfalse
1
: meanstrue
There is no default value for this setting.
Enables or disables padding in encryption operations.
In encryption operations with block-ciphers, the input plaintext must be an exact multiple of the cipher’s block-size unless padding is enabled.
Disabling padding by setting this value to 0
will cause this plugin to fail to encrypt any input plaintext that doesn’t strictly adhere to the algorithm
's block size requirements.
filter { cipher { cipher_padding => 0 }}
- Value type is number
- There is no default value for this setting.
In encryption operations, this plugin generates a random Initialization Vector (IV) per encryption operation. This is a standard best-practice to ensure that the resulting ciphertexts cannot be compared to infer equivalence of the source plaintext. This unique IV is then prepended to the resulting ciphertext before it is stored, ensuring it is available to any process that needs to decrypt it.
In decryption operations, the IV is assumed to have been prepended to the ciphertext, so this plugin needs to know the length of the IV in order to split the input appropriately.
The size of the IV is generally dependent on which algorithm
is used. AES Algorithms generally use a 16-byte IV:
filter { cipher { iv_random_length => 16 }}
- Value type is string
- There is no default value for this setting.
The key to use for encryption and decryption operations.
Please read the UnlimitedStrengthCrypto topic in the jruby github repo if you see a runtime error that resembles:
java.security.InvalidKeyException: Illegal key size: possibly you need to install Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for your JRE
- Value type is string
- Default value is
"\u0000"
The character used to pad the key to the required key_size
.
- Value type is number
- Default value is
16
The cipher’s required key size, which depends on which algorithm
you are using. If a key
is specified with a shorter value, it will be padded with key_pad
.
Example, for AES-128, we must have 16 char long key. AES-256 = 32 chars
filter { cipher { key_size => 16 }
- Value type is number
- Default value is
1
If this value is set, the internal Cipher instance will be re-used up to max_cipher_reuse
times before it is re-created from scratch. This is an option for efficiency where lots of data is being encrypted and decrypted using this filter. This lets the filter avoid creating new Cipher instances over and over for each encrypt/decrypt operation.
This is optional, the default is no re-use of the Cipher instance and max_cipher_reuse = 1 by default
filter { cipher { max_cipher_reuse => 1000 }}
This is a required setting.
Value type is string
encrypt
: encrypts a plaintext value into IV + ciphertextdecrypt
: decrypts an IV + ciphertext value into plaintext
There is no default value for this setting.
- Value type is string
- Default value is
"message"
The name of the source field.
- When
mode => encrypt
, thesource
should be a field containing plaintext - When
mode => decrypt
, thesource
should be a field containing IV + ciphertext
Example, to use the message
field (default) :
filter { cipher { source => "message" } }
- Value type is string
- Default value is
"message"
The name of the target field to put the result:
- When
mode => encrypt
, the IV + ciphertext result will be stored in thetarget
field - When
mode => decrypt
, the plaintext result will be stored in thetarget
field
Example, to place the result into crypt:
filter { cipher { target => "crypt" } }
These configuration options are supported by all filter plugins:
Setting | Input type | Required |
---|---|---|
add_field |
hash | No |
add_tag |
array | No |
enable_metric |
boolean | No |
id |
string | No |
periodic_flush |
boolean | No |
remove_field |
array | No |
remove_tag |
array | No |
- Value type is hash
- Default value is
{}
If this filter is successful, add any arbitrary fields to this event. Field names can be dynamic and include parts of the event using the %{{field}}
.
Example:
filter {
cipher {
add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
}
}
# You can also add multiple fields at once:
filter {
cipher {
add_field => {
"foo_%{somefield}" => "Hello world, from %{host}"
"new_field" => "new_static_value"
}
}
}
If the event has field "somefield" == "hello"
this filter, on success, would add field foo_hello
if it is present, with the value above and the %{{host}}
piece replaced with that value from the event. The second example would also add a hardcoded field.
- Value type is array
- Default value is
[]
If this filter is successful, add arbitrary tags to the event. Tags can be dynamic and include parts of the event using the %{{field}}
syntax.
Example:
filter {
cipher {
add_tag => [ "foo_%{somefield}" ]
}
}
# You can also add multiple tags at once:
filter {
cipher {
add_tag => [ "foo_%{somefield}", "taggedy_tag"]
}
}
If the event has field "somefield" == "hello"
this filter, on success, would add a tag foo_hello
(and the second example would of course add a taggedy_tag
tag).
- Value type is boolean
- Default value is
true
Disable or enable metric logging for this specific plugin instance. By default we record all the metrics we can, but you can disable metrics collection for a specific plugin.
- Value type is string
- There is no default value for this setting.
Add a unique ID
to the plugin configuration. If no ID is specified, Logstash will generate one. It is strongly recommended to set this ID in your configuration. This is particularly useful when you have two or more plugins of the same type, for example, if you have 2 cipher filters. Adding a named ID in this case will help in monitoring Logstash when using the monitoring APIs.
filter {
cipher {
id => "ABC"
}
}
Variable substitution in the id
field only supports environment variables and does not support the use of values from the secret store.
- Value type is boolean
- Default value is
false
Call the filter flush method at regular interval. Optional.
- Value type is array
- Default value is
[]
If this filter is successful, remove arbitrary fields from this event. Fields names can be dynamic and include parts of the event using the %{{field}}
Example:
filter {
cipher {
remove_field => [ "foo_%{somefield}" ]
}
}
# You can also remove multiple fields at once:
filter {
cipher {
remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
}
}
If the event has field "somefield" == "hello"
this filter, on success, would remove the field with name foo_hello
if it is present. The second example would remove an additional, non-dynamic field.
- Value type is array
- Default value is
[]
If this filter is successful, remove arbitrary tags from the event. Tags can be dynamic and include parts of the event using the %{{field}}
syntax.
Example:
filter {
cipher {
remove_tag => [ "foo_%{somefield}" ]
}
}
# You can also remove multiple tags at once:
filter {
cipher {
remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"]
}
}
If the event has field "somefield" == "hello"
this filter, on success, would remove the tag foo_hello
if it is present. The second example would remove a sad, unwanted tag as well.