Introduced settings filtering
Enables filtering out sensitive settings from the nodes info API rest endpoint. Also provide a mechanism to filter out additional settings via a new `shield.hide_settings` setting. Original commit: elastic/x-pack-elasticsearch@9bab5049e7
This commit is contained in:
parent
5ba1bdb816
commit
3015ebccdb
|
@ -12,9 +12,9 @@ import org.elasticsearch.shield.action.ShieldActionModule;
|
||||||
import org.elasticsearch.shield.audit.AuditTrailModule;
|
import org.elasticsearch.shield.audit.AuditTrailModule;
|
||||||
import org.elasticsearch.shield.authc.AuthenticationModule;
|
import org.elasticsearch.shield.authc.AuthenticationModule;
|
||||||
import org.elasticsearch.shield.authz.AuthorizationModule;
|
import org.elasticsearch.shield.authz.AuthorizationModule;
|
||||||
import org.elasticsearch.shield.signature.SignatureModule;
|
|
||||||
import org.elasticsearch.shield.rest.ShieldRestModule;
|
|
||||||
import org.elasticsearch.shield.license.LicenseModule;
|
import org.elasticsearch.shield.license.LicenseModule;
|
||||||
|
import org.elasticsearch.shield.rest.ShieldRestModule;
|
||||||
|
import org.elasticsearch.shield.signature.SignatureModule;
|
||||||
import org.elasticsearch.shield.ssl.SSLModule;
|
import org.elasticsearch.shield.ssl.SSLModule;
|
||||||
import org.elasticsearch.shield.support.AbstractShieldModule;
|
import org.elasticsearch.shield.support.AbstractShieldModule;
|
||||||
import org.elasticsearch.shield.transport.ShieldTransportModule;
|
import org.elasticsearch.shield.transport.ShieldTransportModule;
|
||||||
|
@ -54,5 +54,8 @@ public class ShieldModule extends AbstractShieldModule.Spawn {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(boolean clientMode) {
|
protected void configure(boolean clientMode) {
|
||||||
|
if (!clientMode) {
|
||||||
|
bind(ShieldSettingsFilter.class).asEagerSingleton();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.shield;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.component.AbstractComponent;
|
||||||
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
import org.elasticsearch.common.regex.Regex;
|
||||||
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.settings.SettingsFilter;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ShieldSettingsFilter extends AbstractComponent implements SettingsFilter.Filter {
|
||||||
|
|
||||||
|
static final String HIDE_SETTINGS_SETTING = "shield.hide_settings";
|
||||||
|
|
||||||
|
private final Set<String> removePatterns;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ShieldSettingsFilter(Settings settings, SettingsFilter settingsFilter) {
|
||||||
|
super(settings);
|
||||||
|
settingsFilter.addFilter(this);
|
||||||
|
this.removePatterns = new CopyOnWriteArraySet<>();
|
||||||
|
removePatterns.add(HIDE_SETTINGS_SETTING);
|
||||||
|
Collections.addAll(removePatterns, settings.getAsArray(HIDE_SETTINGS_SETTING));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void filterOut(String... patterns) {
|
||||||
|
Collections.addAll(removePatterns, patterns);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void filter(ImmutableSettings.Builder settings) {
|
||||||
|
for (Iterator<Map.Entry<String, String>> iter = settings.internalMap().entrySet().iterator(); iter.hasNext();) {
|
||||||
|
Map.Entry<String, String> setting = iter.next();
|
||||||
|
for (String regexp : removePatterns) {
|
||||||
|
if (Regex.simpleMatch(regexp, setting.getKey())) {
|
||||||
|
iter.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ package org.elasticsearch.shield.authc;
|
||||||
|
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
import org.elasticsearch.common.logging.ESLogger;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.User;
|
import org.elasticsearch.shield.User;
|
||||||
import org.elasticsearch.transport.TransportMessage;
|
import org.elasticsearch.transport.TransportMessage;
|
||||||
|
|
||||||
|
@ -115,6 +116,9 @@ public abstract class Realm<T extends AuthenticationToken> implements Comparable
|
||||||
return internal;
|
return internal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void filterOutSensitiveSettings(String realmName, ShieldSettingsFilter filter) {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new realm based on the given settigns.
|
* Creates a new realm based on the given settigns.
|
||||||
*
|
*
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.authc.esusers.ESUsersRealm;
|
import org.elasticsearch.shield.authc.esusers.ESUsersRealm;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
@ -26,14 +27,16 @@ public class Realms extends AbstractLifecycleComponent<Realms> implements Iterab
|
||||||
|
|
||||||
private final Environment env;
|
private final Environment env;
|
||||||
private final Map<String, Realm.Factory> factories;
|
private final Map<String, Realm.Factory> factories;
|
||||||
|
private final ShieldSettingsFilter settingsFilter;
|
||||||
|
|
||||||
private List<Realm> realms = Collections.emptyList();
|
private List<Realm> realms = Collections.emptyList();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public Realms(Settings settings, Environment env, Map<String, Realm.Factory> factories) {
|
public Realms(Settings settings, Environment env, Map<String, Realm.Factory> factories, ShieldSettingsFilter settingsFilter) {
|
||||||
super(settings);
|
super(settings);
|
||||||
this.env = env;
|
this.env = env;
|
||||||
this.factories = factories;
|
this.factories = factories;
|
||||||
|
this.settingsFilter = settingsFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -79,6 +82,7 @@ public class Realms extends AbstractLifecycleComponent<Realms> implements Iterab
|
||||||
if (factory == null) {
|
if (factory == null) {
|
||||||
throw new ShieldSettingsException("unknown realm type [" + type + "] set for realm [" + name + "]");
|
throw new ShieldSettingsException("unknown realm type [" + type + "] set for realm [" + name + "]");
|
||||||
}
|
}
|
||||||
|
factory.filterOutSensitiveSettings(name, settingsFilter);
|
||||||
RealmConfig config = new RealmConfig(name, realmSettings, settings, env);
|
RealmConfig config = new RealmConfig(name, realmSettings, settings, env);
|
||||||
if (!config.enabled()) {
|
if (!config.enabled()) {
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
|
|
|
@ -11,16 +11,17 @@ import org.elasticsearch.common.primitives.Ints;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
import org.elasticsearch.shield.authc.RealmConfig;
|
import org.elasticsearch.shield.authc.RealmConfig;
|
||||||
import org.elasticsearch.shield.authc.support.SecuredString;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSearchScope;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSession.GroupsResolver;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSession.GroupsResolver;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.SessionFactory;
|
import org.elasticsearch.shield.authc.ldap.support.SessionFactory;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSearchScope;
|
import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
import org.elasticsearch.shield.ssl.ClientSSLService;
|
||||||
|
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
||||||
import static org.elasticsearch.shield.authc.ldap.support.LdapUtils.*;
|
import static org.elasticsearch.shield.authc.ldap.support.LdapUtils.createFilter;
|
||||||
|
import static org.elasticsearch.shield.authc.ldap.support.LdapUtils.search;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This Class creates LdapSessions authenticating via the custom Active Directory protocol. (that being
|
* This Class creates LdapSessions authenticating via the custom Active Directory protocol. (that being
|
||||||
|
|
|
@ -9,6 +9,7 @@ import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.rest.RestController;
|
import org.elasticsearch.rest.RestController;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.authc.RealmConfig;
|
import org.elasticsearch.shield.authc.RealmConfig;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.AbstractLdapRealm;
|
import org.elasticsearch.shield.authc.ldap.support.AbstractLdapRealm;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapRoleMapper;
|
import org.elasticsearch.shield.authc.ldap.support.LdapRoleMapper;
|
||||||
|
@ -39,6 +40,11 @@ public class LdapRealm extends AbstractLdapRealm {
|
||||||
this.clientSSLService = clientSSLService;
|
this.clientSSLService = clientSSLService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void filterOutSensitiveSettings(String realmName, ShieldSettingsFilter filter) {
|
||||||
|
LdapUserSearchSessionFactory.filterOutSensitiveSettings(realmName, filter);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LdapRealm create(RealmConfig config) {
|
public LdapRealm create(RealmConfig config) {
|
||||||
SessionFactory sessionFactory = sessionFactory(config, clientSSLService);
|
SessionFactory sessionFactory = sessionFactory(config, clientSSLService);
|
||||||
|
|
|
@ -9,10 +9,10 @@ import com.unboundid.ldap.sdk.*;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
import org.elasticsearch.shield.authc.RealmConfig;
|
import org.elasticsearch.shield.authc.RealmConfig;
|
||||||
import org.elasticsearch.shield.authc.support.SecuredString;
|
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSession.GroupsResolver;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSession.GroupsResolver;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.SessionFactory;
|
import org.elasticsearch.shield.authc.ldap.support.SessionFactory;
|
||||||
|
import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
import org.elasticsearch.shield.ssl.ClientSSLService;
|
||||||
|
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
|
@ -7,11 +7,11 @@ package org.elasticsearch.shield.authc.ldap;
|
||||||
|
|
||||||
import com.unboundid.ldap.sdk.*;
|
import com.unboundid.ldap.sdk.*;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
|
||||||
import org.elasticsearch.common.primitives.Ints;
|
import org.elasticsearch.common.primitives.Ints;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.authc.RealmConfig;
|
import org.elasticsearch.shield.authc.RealmConfig;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSearchScope;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSearchScope;
|
||||||
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
import org.elasticsearch.shield.authc.ldap.support.LdapSession;
|
||||||
|
@ -21,7 +21,6 @@ import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
import org.elasticsearch.shield.ssl.ClientSSLService;
|
||||||
|
|
||||||
import javax.net.SocketFactory;
|
import javax.net.SocketFactory;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import static com.unboundid.ldap.sdk.Filter.createEqualityFilter;
|
import static com.unboundid.ldap.sdk.Filter.createEqualityFilter;
|
||||||
|
@ -54,6 +53,14 @@ public class LdapUserSearchSessionFactory extends SessionFactory {
|
||||||
serverSet = serverSet(settings, sslService);
|
serverSet = serverSet(settings, sslService);
|
||||||
connectionPool = connectionPool(config.settings(), serverSet, timeout);
|
connectionPool = connectionPool(config.settings(), serverSet, timeout);
|
||||||
groupResolver = groupResolver(settings);
|
groupResolver = groupResolver(settings);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void filterOutSensitiveSettings(String realmName, ShieldSettingsFilter filter) {
|
||||||
|
filter.filterOut("shield.authc.realms." + realmName + ".bind_dn");
|
||||||
|
filter.filterOut("shield.authc.realms." + realmName + ".bind_password");
|
||||||
|
filter.filterOut("shield.authc.realms." + realmName + ".hostname_verification");
|
||||||
}
|
}
|
||||||
|
|
||||||
static LDAPConnectionPool connectionPool(Settings settings, ServerSet serverSet, TimeValue timeout) {
|
static LDAPConnectionPool connectionPool(Settings settings, ServerSet serverSet, TimeValue timeout) {
|
||||||
|
|
|
@ -8,7 +8,6 @@ package org.elasticsearch.shield.authc.ldap.support;
|
||||||
import com.unboundid.ldap.sdk.LDAPConnectionOptions;
|
import com.unboundid.ldap.sdk.LDAPConnectionOptions;
|
||||||
import com.unboundid.ldap.sdk.LDAPException;
|
import com.unboundid.ldap.sdk.LDAPException;
|
||||||
import com.unboundid.ldap.sdk.LDAPURL;
|
import com.unboundid.ldap.sdk.LDAPURL;
|
||||||
import com.unboundid.ldap.sdk.ServerSet;
|
|
||||||
import com.unboundid.util.ssl.HostNameSSLSocketVerifier;
|
import com.unboundid.util.ssl.HostNameSSLSocketVerifier;
|
||||||
import org.elasticsearch.common.Strings;
|
import org.elasticsearch.common.Strings;
|
||||||
import org.elasticsearch.common.logging.ESLogger;
|
import org.elasticsearch.common.logging.ESLogger;
|
||||||
|
@ -18,7 +17,6 @@ import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
import org.elasticsearch.shield.authc.RealmConfig;
|
import org.elasticsearch.shield.authc.RealmConfig;
|
||||||
import org.elasticsearch.shield.authc.support.SecuredString;
|
import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,12 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractSSLService extends AbstractComponent {
|
public abstract class AbstractSSLService extends AbstractComponent {
|
||||||
|
|
||||||
|
public static final String CIPHERS_SETTING = "ciphers";
|
||||||
|
public static final String SUPPORTED_PROTOCOLS_SETTING = "supported_protocols";
|
||||||
|
|
||||||
|
public static final String[] DEFAULT_SUPPORTED_PROTOCOLS = new String[] { "TLSv1", "TLSv1.1", "TLSv1.2" };
|
||||||
|
|
||||||
static final String[] DEFAULT_CIPHERS = new String[] { "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" };
|
static final String[] DEFAULT_CIPHERS = new String[] { "TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA" };
|
||||||
static final String[] DEFAULT_SUPPORTED_PROTOCOLS = new String[] { "TLSv1", "TLSv1.1", "TLSv1.2" };
|
|
||||||
static final TimeValue DEFAULT_SESSION_CACHE_TIMEOUT = TimeValue.timeValueHours(24);
|
static final TimeValue DEFAULT_SESSION_CACHE_TIMEOUT = TimeValue.timeValueHours(24);
|
||||||
static final int DEFAULT_SESSION_CACHE_SIZE = 1000;
|
static final int DEFAULT_SESSION_CACHE_SIZE = 1000;
|
||||||
static final String DEFAULT_PROTOCOL = "TLS";
|
static final String DEFAULT_PROTOCOL = "TLS";
|
||||||
|
@ -53,11 +57,11 @@ public abstract class AbstractSSLService extends AbstractComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] supportedProtocols() {
|
public String[] supportedProtocols() {
|
||||||
return componentSettings.getAsArray("supported_protocols", DEFAULT_SUPPORTED_PROTOCOLS);
|
return componentSettings.getAsArray(SUPPORTED_PROTOCOLS_SETTING, DEFAULT_SUPPORTED_PROTOCOLS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] ciphers() {
|
public String[] ciphers() {
|
||||||
return componentSettings.getAsArray("ciphers", DEFAULT_CIPHERS);
|
return componentSettings.getAsArray(CIPHERS_SETTING, DEFAULT_CIPHERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SSLEngine createSSLEngine() {
|
public SSLEngine createSSLEngine() {
|
||||||
|
@ -69,8 +73,8 @@ public abstract class AbstractSSLService extends AbstractComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
public SSLEngine createSSLEngine(Settings settings, String host, int port) {
|
public SSLEngine createSSLEngine(Settings settings, String host, int port) {
|
||||||
String[] ciphers = settings.getAsArray("ciphers", ciphers());
|
String[] ciphers = settings.getAsArray(CIPHERS_SETTING, ciphers());
|
||||||
String[] supportedProtocols = settings.getAsArray("supported_protocols", supportedProtocols());
|
String[] supportedProtocols = settings.getAsArray(SUPPORTED_PROTOCOLS_SETTING, supportedProtocols());
|
||||||
return createSSLEngine(sslContext(settings), ciphers, supportedProtocols, host, port);
|
return createSSLEngine(sslContext(settings), ciphers, supportedProtocols, host, port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,6 +96,26 @@ public abstract class AbstractSSLService extends AbstractComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The list of sensitive settings. (these settings shouldnot be exposed via rest API for example)
|
||||||
|
*/
|
||||||
|
public static String[] sensitiveSettings() {
|
||||||
|
return new String[] {
|
||||||
|
CIPHERS_SETTING,
|
||||||
|
SUPPORTED_PROTOCOLS_SETTING,
|
||||||
|
"protocol",
|
||||||
|
"session.cache_size",
|
||||||
|
"session.cache_timeout",
|
||||||
|
"keystore.path",
|
||||||
|
"keystore.password",
|
||||||
|
"keystore.algorithm",
|
||||||
|
"keystore.key_password",
|
||||||
|
"truststore.path",
|
||||||
|
"truststore.password",
|
||||||
|
"truststore.algorithm"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
protected abstract SSLSettings sslSettings(Settings customSettings);
|
protected abstract SSLSettings sslSettings(Settings customSettings);
|
||||||
|
|
||||||
SSLEngine createSSLEngine(SSLContext sslContext, String[] ciphers, String[] supportedProtocols, String host, int port) {
|
SSLEngine createSSLEngine(SSLContext sslContext, String[] ciphers, String[] supportedProtocols, String host, int port) {
|
||||||
|
@ -219,7 +243,7 @@ public abstract class AbstractSSLService extends AbstractComponent {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static class SSLSettings {
|
public static class SSLSettings {
|
||||||
|
|
||||||
private static final ESLogger logger = Loggers.getLogger(SSLSettings.class);
|
private static final ESLogger logger = Loggers.getLogger(SSLSettings.class);
|
||||||
|
|
||||||
|
|
|
@ -8,12 +8,17 @@ package org.elasticsearch.shield.ssl;
|
||||||
import org.elasticsearch.common.inject.Inject;
|
import org.elasticsearch.common.inject.Inject;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
|
|
||||||
public class ServerSSLService extends AbstractSSLService {
|
public class ServerSSLService extends AbstractSSLService {
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ServerSSLService(Settings settings) {
|
public ServerSSLService(Settings settings, ShieldSettingsFilter settingsFilter) {
|
||||||
super(settings);
|
super(settings);
|
||||||
|
|
||||||
|
// we need to filter out all this sensitive information from all rest
|
||||||
|
// responses
|
||||||
|
settingsFilter.filterOut("shield.ssl.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -14,6 +14,7 @@ import org.elasticsearch.common.network.NetworkService;
|
||||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.util.BigArrays;
|
import org.elasticsearch.common.util.BigArrays;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
import org.elasticsearch.shield.ssl.ClientSSLService;
|
||||||
import org.elasticsearch.shield.ssl.ServerSSLService;
|
import org.elasticsearch.shield.ssl.ServerSSLService;
|
||||||
import org.elasticsearch.shield.transport.filter.IPFilter;
|
import org.elasticsearch.shield.transport.filter.IPFilter;
|
||||||
|
@ -34,17 +35,20 @@ public class ShieldNettyTransport extends NettyTransport {
|
||||||
|
|
||||||
private final ServerSSLService serverSslService;
|
private final ServerSSLService serverSslService;
|
||||||
private final ClientSSLService clientSSLService;
|
private final ClientSSLService clientSSLService;
|
||||||
|
private final ShieldSettingsFilter settingsFilter;
|
||||||
private final @Nullable IPFilter authenticator;
|
private final @Nullable IPFilter authenticator;
|
||||||
private final boolean ssl;
|
private final boolean ssl;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ShieldNettyTransport(Settings settings, ThreadPool threadPool, NetworkService networkService, BigArrays bigArrays, Version version,
|
public ShieldNettyTransport(Settings settings, ThreadPool threadPool, NetworkService networkService, BigArrays bigArrays, Version version,
|
||||||
@Nullable IPFilter authenticator, @Nullable ServerSSLService serverSSLService, ClientSSLService clientSSLService) {
|
@Nullable IPFilter authenticator, @Nullable ServerSSLService serverSSLService, ClientSSLService clientSSLService,
|
||||||
|
ShieldSettingsFilter settingsFilter) {
|
||||||
super(settings, threadPool, networkService, bigArrays, version);
|
super(settings, threadPool, networkService, bigArrays, version);
|
||||||
this.authenticator = authenticator;
|
this.authenticator = authenticator;
|
||||||
this.ssl = settings.getAsBoolean("shield.transport.ssl", false);
|
this.ssl = settings.getAsBoolean("shield.transport.ssl", false);
|
||||||
this.serverSslService = serverSSLService;
|
this.serverSslService = serverSSLService;
|
||||||
this.clientSSLService = clientSSLService;
|
this.clientSSLService = clientSSLService;
|
||||||
|
this.settingsFilter = settingsFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -64,6 +68,7 @@ public class ShieldNettyTransport extends NettyTransport {
|
||||||
public SslServerChannelPipelineFactory(NettyTransport nettyTransport, String name, Settings settings, Settings profileSettings) {
|
public SslServerChannelPipelineFactory(NettyTransport nettyTransport, String name, Settings settings, Settings profileSettings) {
|
||||||
super(nettyTransport, name, settings);
|
super(nettyTransport, name, settings);
|
||||||
this.profileSettings = profileSettings;
|
this.profileSettings = profileSettings;
|
||||||
|
settingsFilter.filterOut("transport.profiles." + name + ".shield.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,7 +16,6 @@ import org.elasticsearch.test.ShieldIntegrationTest;
|
||||||
import org.elasticsearch.test.rest.client.http.HttpRequestBuilder;
|
import org.elasticsearch.test.rest.client.http.HttpRequestBuilder;
|
||||||
import org.elasticsearch.test.rest.client.http.HttpResponse;
|
import org.elasticsearch.test.rest.client.http.HttpResponse;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -29,18 +28,11 @@ import static org.hamcrest.Matchers.*;
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractPrivilegeTests extends ShieldIntegrationTest {
|
public abstract class AbstractPrivilegeTests extends ShieldIntegrationTest {
|
||||||
|
|
||||||
private CloseableHttpClient httpClient;
|
private CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||||
|
|
||||||
@Before
|
|
||||||
public void createHttpClient() {
|
|
||||||
httpClient = HttpClients.createDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void closeHttpClient() throws IOException {
|
public void cleanup() throws IOException {
|
||||||
if (httpClient != null) {
|
httpClient.close();
|
||||||
httpClient.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertAccessIsAllowed(String user, String method, String uri, String body, Map<String, String> params) throws IOException {
|
protected void assertAccessIsAllowed(String user, String method, String uri, String body, Map<String, String> params) throws IOException {
|
||||||
|
|
|
@ -0,0 +1,178 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License;
|
||||||
|
* you may not use this file except in compliance with the Elastic License.
|
||||||
|
*/
|
||||||
|
package org.elasticsearch.integration;
|
||||||
|
|
||||||
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
|
import org.apache.http.impl.client.HttpClients;
|
||||||
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.transport.InetSocketTransportAddress;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
|
import org.elasticsearch.http.HttpServerTransport;
|
||||||
|
import org.elasticsearch.node.internal.InternalNode;
|
||||||
|
import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
|
import org.elasticsearch.shield.authc.support.UsernamePasswordToken;
|
||||||
|
import org.elasticsearch.shield.ssl.AbstractSSLService;
|
||||||
|
import org.elasticsearch.test.ShieldIntegrationTest;
|
||||||
|
import org.elasticsearch.test.ShieldSettingsSource;
|
||||||
|
import org.elasticsearch.test.rest.client.http.HttpRequestBuilder;
|
||||||
|
import org.elasticsearch.test.rest.client.http.HttpResponse;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.elasticsearch.test.ElasticsearchIntegrationTest.ClusterScope;
|
||||||
|
import static org.elasticsearch.test.ElasticsearchIntegrationTest.Scope.SUITE;
|
||||||
|
import static org.hamcrest.CoreMatchers.notNullValue;
|
||||||
|
import static org.hamcrest.CoreMatchers.nullValue;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
|
@ClusterScope(scope = SUITE)
|
||||||
|
public class SettingsFilterTests extends ShieldIntegrationTest {
|
||||||
|
|
||||||
|
private CloseableHttpClient httpClient = HttpClients.createDefault();
|
||||||
|
private InetSocketTransportAddress address;
|
||||||
|
private String clientPortSetting;
|
||||||
|
@Before
|
||||||
|
public void init() {
|
||||||
|
HttpServerTransport httpServerTransport = internalCluster().getDataNodeInstance(HttpServerTransport.class);
|
||||||
|
address = (InetSocketTransportAddress) httpServerTransport.boundAddress().boundAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void cleanup() throws IOException {
|
||||||
|
httpClient.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Settings nodeSettings(int nodeOrdinal) {
|
||||||
|
int clientProfilePort = randomIntBetween(49000, 65400);
|
||||||
|
return ImmutableSettings.builder().put(super.nodeSettings(nodeOrdinal))
|
||||||
|
.put(InternalNode.HTTP_ENABLED, true)
|
||||||
|
|
||||||
|
// ldap realm filtering
|
||||||
|
.put("shield.authc.realms.esusers.type", "esusers")
|
||||||
|
.put("shield.authc.realms.ldap1.type", "ldap")
|
||||||
|
.put("shield.authc.realms.ldap1.enabled", "false")
|
||||||
|
.put("shield.authc.realms.ldap1.url", "ldap://host.domain")
|
||||||
|
.put("shield.authc.realms.ldap1.hostname_verification", randomAsciiOfLength(5))
|
||||||
|
.put("shield.authc.realms.ldap1.bind_dn", randomAsciiOfLength(5))
|
||||||
|
.put("shield.authc.realms.ldap1.bind_password", randomAsciiOfLength(5))
|
||||||
|
|
||||||
|
.put("shield.ssl.keystore.path", "/path/to/keystore")
|
||||||
|
.put("shield.ssl.ciphers", "_ciphers")
|
||||||
|
.put("shield.ssl.supported_protocols", randomFrom(AbstractSSLService.DEFAULT_SUPPORTED_PROTOCOLS))
|
||||||
|
.put("shield.ssl.keystore.password", randomAsciiOfLength(5))
|
||||||
|
.put("shield.ssl.keystore.algorithm", "_algorithm")
|
||||||
|
.put("shield.ssl.keystore.key_password", randomAsciiOfLength(5))
|
||||||
|
.put("shield.ssl.truststore.password", randomAsciiOfLength(5))
|
||||||
|
.put("shield.ssl.truststore.algorithm", "_algorithm")
|
||||||
|
|
||||||
|
// client profile
|
||||||
|
.put("transport.profiles.client.port", clientProfilePort + "-" + (clientProfilePort + 100))
|
||||||
|
.put("transport.profiles.client.shield.keystore.path", "/path/to/keystore")
|
||||||
|
.put("transport.profiles.client.shield.ciphers", "_ciphers")
|
||||||
|
.put("transport.profiles.client.shield.supported_protocols", randomFrom(AbstractSSLService.DEFAULT_SUPPORTED_PROTOCOLS))
|
||||||
|
.put("transport.profiles.client.shield.keystore.password", randomAsciiOfLength(5))
|
||||||
|
.put("transport.profiles.client.shield.keystore.algorithm", "_algorithm")
|
||||||
|
.put("transport.profiles.client.shield.keystore.key_password", randomAsciiOfLength(5))
|
||||||
|
.put("transport.profiles.client.shield.truststore.password", randomAsciiOfLength(5))
|
||||||
|
.put("transport.profiles.client.shield.truststore.algorithm", "_algorithm")
|
||||||
|
|
||||||
|
// custom settings
|
||||||
|
.put("foo.bar", "_secret")
|
||||||
|
.put("foo.baz", "_secret")
|
||||||
|
.put("bar.baz", "_secret")
|
||||||
|
.put("baz.foo", "_not_a_secret") // should not be filtered
|
||||||
|
.put("shield.hide_settings", "foo.*,bar.baz")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean sslTransportEnabled() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFiltering() throws Exception {
|
||||||
|
HttpResponse response = executeRequest("GET", "/_nodes", null, Collections.<String, String>emptyMap());
|
||||||
|
List<Settings> list = extractSettings(response.getBody());
|
||||||
|
for (Settings settings : list) {
|
||||||
|
|
||||||
|
assertThat(settings.get("shield.authc.realms.ldap1.hostname_verification"), nullValue());
|
||||||
|
assertThat(settings.get("shield.authc.realms.ldap1.bind_password"), nullValue());
|
||||||
|
assertThat(settings.get("shield.authc.realms.ldap1.bind_dn"), nullValue());
|
||||||
|
assertThat(settings.get("shield.authc.realms.ldap1.url"), is("ldap://host.domain"));
|
||||||
|
|
||||||
|
assertThat(settings.get("shield.ssl.keystore.path"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.ciphers"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.supported_protocols"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.keystore.password"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.keystore.algorithm"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.keystore.key_password"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.truststore.password"), nullValue());
|
||||||
|
assertThat(settings.get("shield.ssl.truststore.algorithm"), nullValue());
|
||||||
|
|
||||||
|
// the client profile settings is also filtered out
|
||||||
|
assertThat(settings.get("transport.profiles.client.port"), notNullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.keystore.path"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.ciphers"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.supported_protocols"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.keystore.password"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.keystore.algorithm"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.keystore.key_password"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.truststore.password"), nullValue());
|
||||||
|
assertThat(settings.get("transport.profiles.client.shield.truststore.algorithm"), nullValue());
|
||||||
|
|
||||||
|
assertThat(settings.get("shield.hide_settings"), nullValue());
|
||||||
|
assertThat(settings.get("foo.bar"), nullValue());
|
||||||
|
assertThat(settings.get("foo.baz"), nullValue());
|
||||||
|
assertThat(settings.get("bar.baz"), nullValue());
|
||||||
|
assertThat(settings.get("baz.foo"), is("_not_a_secret"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static List<Settings> extractSettings(String data) throws Exception {
|
||||||
|
List<Settings> settingsList = new ArrayList<>();
|
||||||
|
XContentParser parser = JsonXContent.jsonXContent.createParser(data.getBytes(UTF8));
|
||||||
|
XContentParser.Token token = null;
|
||||||
|
while ((token = parser.nextToken()) != null) {
|
||||||
|
if (token == XContentParser.Token.FIELD_NAME && parser.currentName().equals("settings")) {
|
||||||
|
parser.nextToken();
|
||||||
|
XContentBuilder builder = XContentBuilder.builder(parser.contentType().xContent());
|
||||||
|
settingsList.add(ImmutableSettings.builder().loadFromSource(builder.copyCurrentStructure(parser).bytes().toUtf8()).build());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return settingsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected HttpResponse executeRequest(String method, String uri, String body, Map<String, String> params) throws IOException {
|
||||||
|
HttpServerTransport httpServerTransport = internalCluster().getDataNodeInstance(HttpServerTransport.class);
|
||||||
|
address = (InetSocketTransportAddress) httpServerTransport.boundAddress().boundAddress();
|
||||||
|
HttpRequestBuilder requestBuilder = new HttpRequestBuilder(httpClient)
|
||||||
|
.host(address.address().getHostName())
|
||||||
|
.port(address.address().getPort())
|
||||||
|
.method(method)
|
||||||
|
.path(uri);
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
||||||
|
requestBuilder.addParam(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
if (body != null) {
|
||||||
|
requestBuilder.body(body);
|
||||||
|
}
|
||||||
|
requestBuilder.addHeader(UsernamePasswordToken.BASIC_AUTH_HEADER, UsernamePasswordToken.basicAuthHeaderValue(ShieldSettingsSource.DEFAULT_USER_NAME, new SecuredString(ShieldSettingsSource.DEFAULT_PASSWORD.toCharArray())));
|
||||||
|
return requestBuilder.execute();
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.User;
|
import org.elasticsearch.shield.User;
|
||||||
import org.elasticsearch.shield.audit.AuditTrail;
|
import org.elasticsearch.shield.audit.AuditTrail;
|
||||||
import org.elasticsearch.shield.authc.support.SecuredString;
|
import org.elasticsearch.shield.authc.support.SecuredString;
|
||||||
|
@ -61,7 +62,7 @@ public class InternalAuthenticationServiceTests extends ElasticsearchTestCase {
|
||||||
when(firstRealm.type()).thenReturn("first");
|
when(firstRealm.type()).thenReturn("first");
|
||||||
secondRealm = mock(Realm.class);
|
secondRealm = mock(Realm.class);
|
||||||
when(secondRealm.type()).thenReturn("second");
|
when(secondRealm.type()).thenReturn("second");
|
||||||
realms = new Realms(ImmutableSettings.EMPTY, new Environment(ImmutableSettings.EMPTY), Collections.<String, Realm.Factory>emptyMap()) {
|
realms = new Realms(ImmutableSettings.EMPTY, new Environment(ImmutableSettings.EMPTY), Collections.<String, Realm.Factory>emptyMap(), mock(ShieldSettingsFilter.class)) {
|
||||||
@Override
|
@Override
|
||||||
protected List<Realm> initRealms() {
|
protected List<Realm> initRealms() {
|
||||||
return ImmutableList.of(firstRealm, secondRealm);
|
return ImmutableList.of(firstRealm, secondRealm);
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.env.Environment;
|
import org.elasticsearch.env.Environment;
|
||||||
import org.elasticsearch.rest.RestRequest;
|
import org.elasticsearch.rest.RestRequest;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.User;
|
import org.elasticsearch.shield.User;
|
||||||
import org.elasticsearch.shield.authc.esusers.ESUsersRealm;
|
import org.elasticsearch.shield.authc.esusers.ESUsersRealm;
|
||||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
|
@ -20,6 +21,7 @@ import org.junit.Test;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -27,6 +29,7 @@ import static org.hamcrest.Matchers.*;
|
||||||
public class RealmsTests extends ElasticsearchTestCase {
|
public class RealmsTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
private Map<String, Realm.Factory> factories;
|
private Map<String, Realm.Factory> factories;
|
||||||
|
private ShieldSettingsFilter settingsFilter;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void init() throws Exception {
|
public void init() throws Exception {
|
||||||
|
@ -36,6 +39,7 @@ public class RealmsTests extends ElasticsearchTestCase {
|
||||||
DummyRealm.Factory factory = new DummyRealm.Factory("type_" + i, rarely());
|
DummyRealm.Factory factory = new DummyRealm.Factory("type_" + i, rarely());
|
||||||
factories.put("type_" + i, factory);
|
factories.put("type_" + i, factory);
|
||||||
}
|
}
|
||||||
|
settingsFilter = mock(ShieldSettingsFilter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -54,7 +58,7 @@ public class RealmsTests extends ElasticsearchTestCase {
|
||||||
}
|
}
|
||||||
Settings settings = builder.build();
|
Settings settings = builder.build();
|
||||||
Environment env = new Environment(settings);
|
Environment env = new Environment(settings);
|
||||||
Realms realms = new Realms(settings, env, factories);
|
Realms realms = new Realms(settings, env, factories, settingsFilter);
|
||||||
realms.start();
|
realms.start();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Realm realm : realms) {
|
for (Realm realm : realms) {
|
||||||
|
@ -75,12 +79,12 @@ public class RealmsTests extends ElasticsearchTestCase {
|
||||||
.put("shield.authc.realms.realm_2.order", 1)
|
.put("shield.authc.realms.realm_2.order", 1)
|
||||||
.build();
|
.build();
|
||||||
Environment env = new Environment(settings);
|
Environment env = new Environment(settings);
|
||||||
new Realms(settings, env, factories).start();
|
new Realms(settings, env, factories, settingsFilter).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWithEmptySettings() throws Exception {
|
public void testWithEmptySettings() throws Exception {
|
||||||
Realms realms = new Realms(ImmutableSettings.EMPTY, new Environment(ImmutableSettings.EMPTY), factories);
|
Realms realms = new Realms(ImmutableSettings.EMPTY, new Environment(ImmutableSettings.EMPTY), factories, settingsFilter);
|
||||||
realms.start();
|
realms.start();
|
||||||
Iterator<Realm> iter = realms.iterator();
|
Iterator<Realm> iter = realms.iterator();
|
||||||
assertThat(iter.hasNext(), is(true));
|
assertThat(iter.hasNext(), is(true));
|
||||||
|
@ -112,7 +116,7 @@ public class RealmsTests extends ElasticsearchTestCase {
|
||||||
}
|
}
|
||||||
Settings settings = builder.build();
|
Settings settings = builder.build();
|
||||||
Environment env = new Environment(settings);
|
Environment env = new Environment(settings);
|
||||||
Realms realms = new Realms(settings, env, factories);
|
Realms realms = new Realms(settings, env, factories, mock(ShieldSettingsFilter.class));
|
||||||
realms.start();
|
realms.start();
|
||||||
Iterator<Realm> iterator = realms.iterator();
|
Iterator<Realm> iterator = realms.iterator();
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,8 @@ import org.junit.Test;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
|
import static org.hamcrest.Matchers.hasItem;
|
||||||
|
|
||||||
@Network
|
@Network
|
||||||
public class OpenLdapTests extends ElasticsearchTestCase {
|
public class OpenLdapTests extends ElasticsearchTestCase {
|
||||||
|
|
|
@ -6,8 +6,10 @@
|
||||||
package org.elasticsearch.shield.ssl;
|
package org.elasticsearch.shield.ssl;
|
||||||
|
|
||||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.shield.ShieldSettingsException;
|
import org.elasticsearch.shield.ShieldSettingsException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
@ -23,35 +25,40 @@ import java.util.List;
|
||||||
|
|
||||||
import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
|
import static org.elasticsearch.common.settings.ImmutableSettings.settingsBuilder;
|
||||||
import static org.hamcrest.Matchers.*;
|
import static org.hamcrest.Matchers.*;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
Path testnodeStore;
|
Path testnodeStore;
|
||||||
|
ShieldSettingsFilter settingsFilter;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
testnodeStore = Paths.get(getClass().getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testnode.jks").toURI());
|
testnodeStore = Paths.get(getClass().getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testnode.jks").toURI());
|
||||||
|
settingsFilter = mock(ShieldSettingsFilter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = ElasticsearchSSLException.class)
|
@Test(expected = ElasticsearchSSLException.class)
|
||||||
public void testThatInvalidProtocolThrowsException() throws Exception {
|
public void testThatInvalidProtocolThrowsException() throws Exception {
|
||||||
new ServerSSLService(settingsBuilder()
|
Settings settings = settingsBuilder()
|
||||||
.put("shield.ssl.protocol", "non-existing")
|
.put("shield.ssl.protocol", "non-existing")
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.put("shield.ssl.truststore.path", testnodeStore)
|
.put("shield.ssl.truststore.path", testnodeStore)
|
||||||
.put("shield.ssl.truststore.password", "testnode")
|
.put("shield.ssl.truststore.password", "testnode")
|
||||||
.build()).createSSLEngine();
|
.build();
|
||||||
|
new ServerSSLService(settings, settingsFilter).createSSLEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testThatCustomTruststoreCanBeSpecified() throws Exception {
|
public void testThatCustomTruststoreCanBeSpecified() throws Exception {
|
||||||
Path testClientStore = Paths.get(getClass().getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testclient.jks").toURI());
|
Path testClientStore = Paths.get(getClass().getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testclient.jks").toURI());
|
||||||
|
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
Settings settings = settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build());
|
.build();
|
||||||
|
ServerSSLService sslService = new ServerSSLService(settings, settingsFilter);
|
||||||
|
|
||||||
ImmutableSettings.Builder settingsBuilder = settingsBuilder()
|
ImmutableSettings.Builder settingsBuilder = settingsBuilder()
|
||||||
.put("truststore.path", testClientStore)
|
.put("truststore.path", testClientStore)
|
||||||
|
@ -69,7 +76,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
|
|
||||||
SSLContext sslContext = sslService.sslContext();
|
SSLContext sslContext = sslService.sslContext();
|
||||||
SSLContext cachedSslContext = sslService.sslContext();
|
SSLContext cachedSslContext = sslService.sslContext();
|
||||||
|
@ -84,7 +91,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.path", differentPasswordsStore)
|
.put("shield.ssl.keystore.path", differentPasswordsStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.put("shield.ssl.keystore.key_password", "testnode1")
|
.put("shield.ssl.keystore.key_password", "testnode1")
|
||||||
.build()).createSSLEngine();
|
.build(), settingsFilter).createSSLEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = ElasticsearchSSLException.class)
|
@Test(expected = ElasticsearchSSLException.class)
|
||||||
|
@ -93,7 +100,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
new ServerSSLService(settingsBuilder()
|
new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", differentPasswordsStore)
|
.put("shield.ssl.keystore.path", differentPasswordsStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build()).createSSLEngine();
|
.build(), settingsFilter).createSSLEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -101,7 +108,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
SSLEngine engine = sslService.createSSLEngine();
|
SSLEngine engine = sslService.createSSLEngine();
|
||||||
assertThat(Arrays.asList(engine.getEnabledProtocols()), not(hasItem("SSLv3")));
|
assertThat(Arrays.asList(engine.getEnabledProtocols()), not(hasItem("SSLv3")));
|
||||||
}
|
}
|
||||||
|
@ -111,7 +118,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
SSLSessionContext context = sslService.sslContext().getServerSessionContext();
|
SSLSessionContext context = sslService.sslContext().getServerSessionContext();
|
||||||
assertThat(context.getSessionCacheSize(), equalTo(1000));
|
assertThat(context.getSessionCacheSize(), equalTo(1000));
|
||||||
assertThat(context.getSessionTimeout(), equalTo((int) TimeValue.timeValueHours(24).seconds()));
|
assertThat(context.getSessionTimeout(), equalTo((int) TimeValue.timeValueHours(24).seconds()));
|
||||||
|
@ -124,7 +131,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.put("shield.ssl.session.cache_size", "300")
|
.put("shield.ssl.session.cache_size", "300")
|
||||||
.put("shield.ssl.session.cache_timeout", "600s")
|
.put("shield.ssl.session.cache_timeout", "600s")
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
SSLSessionContext context = sslService.sslContext().getServerSessionContext();
|
SSLSessionContext context = sslService.sslContext().getServerSessionContext();
|
||||||
assertThat(context.getSessionCacheSize(), equalTo(300));
|
assertThat(context.getSessionCacheSize(), equalTo(300));
|
||||||
assertThat(context.getSessionTimeout(), equalTo(600));
|
assertThat(context.getSessionTimeout(), equalTo(600));
|
||||||
|
@ -132,7 +139,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
@Test(expected = ShieldSettingsException.class)
|
@Test(expected = ShieldSettingsException.class)
|
||||||
public void testThatCreateSSLEngineWithoutAnySettingsDoesNotWork() throws Exception {
|
public void testThatCreateSSLEngineWithoutAnySettingsDoesNotWork() throws Exception {
|
||||||
ServerSSLService sslService = new ServerSSLService(ImmutableSettings.EMPTY);
|
ServerSSLService sslService = new ServerSSLService(ImmutableSettings.EMPTY, settingsFilter);
|
||||||
sslService.createSSLEngine();
|
sslService.createSSLEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +148,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.truststore.path", testnodeStore)
|
.put("shield.ssl.truststore.path", testnodeStore)
|
||||||
.put("shield.ssl.truststore.password", "testnode")
|
.put("shield.ssl.truststore.password", "testnode")
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
SSLEngine sslEngine = sslService.createSSLEngine();
|
SSLEngine sslEngine = sslService.createSSLEngine();
|
||||||
assertThat(sslEngine, notNullValue());
|
assertThat(sslEngine, notNullValue());
|
||||||
}
|
}
|
||||||
|
@ -152,7 +159,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.put("shield.ssl.truststore.path", testnodeStore)
|
.put("shield.ssl.truststore.path", testnodeStore)
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
sslService.sslContext();
|
sslService.sslContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,7 +167,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
public void testThatKeystorePasswordIsRequired() throws Exception {
|
public void testThatKeystorePasswordIsRequired() throws Exception {
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
sslService.sslContext();
|
sslService.sslContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +180,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.putArray("shield.ssl.ciphers", ciphers.toArray(new String[ciphers.size()]))
|
.putArray("shield.ssl.ciphers", ciphers.toArray(new String[ciphers.size()]))
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
SSLEngine engine = sslService.createSSLEngine();
|
SSLEngine engine = sslService.createSSLEngine();
|
||||||
assertThat(engine, is(notNullValue()));
|
assertThat(engine, is(notNullValue()));
|
||||||
String[] enabledCiphers = engine.getEnabledCipherSuites();
|
String[] enabledCiphers = engine.getEnabledCipherSuites();
|
||||||
|
@ -186,7 +193,7 @@ public class ServerSSLServiceTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.putArray("shield.ssl.ciphers", new String[] { "foo", "bar" })
|
.putArray("shield.ssl.ciphers", new String[] { "foo", "bar" })
|
||||||
.build());
|
.build(), settingsFilter);
|
||||||
sslService.createSSLEngine();
|
sslService.createSSLEngine();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,10 @@ import org.elasticsearch.common.netty.channel.*;
|
||||||
import org.elasticsearch.common.netty.channel.socket.nio.NioClientSocketChannelFactory;
|
import org.elasticsearch.common.netty.channel.socket.nio.NioClientSocketChannelFactory;
|
||||||
import org.elasticsearch.common.netty.channel.socket.nio.NioServerSocketChannelFactory;
|
import org.elasticsearch.common.netty.channel.socket.nio.NioServerSocketChannelFactory;
|
||||||
import org.elasticsearch.common.netty.handler.ssl.SslHandler;
|
import org.elasticsearch.common.netty.handler.ssl.SslHandler;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.settings.SettingsFilter;
|
||||||
import org.elasticsearch.shield.ShieldException;
|
import org.elasticsearch.shield.ShieldException;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.ssl.ServerSSLService;
|
import org.elasticsearch.shield.ssl.ServerSSLService;
|
||||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
@ -62,10 +65,13 @@ public class HandshakeWaitingHandlerTests extends ElasticsearchTestCase {
|
||||||
randomPort = randomIntBetween(49000, 65500);
|
randomPort = randomIntBetween(49000, 65500);
|
||||||
iterations = randomIntBetween(10, 100);
|
iterations = randomIntBetween(10, 100);
|
||||||
|
|
||||||
ServerSSLService sslService = new ServerSSLService(settingsBuilder()
|
Settings settings = settingsBuilder()
|
||||||
.put("shield.ssl.keystore.path", Paths.get(HandshakeWaitingHandlerTests.class.getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testnode.jks").toURI()))
|
.put("shield.ssl.keystore.path", Paths.get(HandshakeWaitingHandlerTests.class.getResource("/org/elasticsearch/shield/transport/ssl/certs/simple/testnode.jks").toURI()))
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build());
|
.build();
|
||||||
|
|
||||||
|
ShieldSettingsFilter settingsFilter = new ShieldSettingsFilter(settings, new SettingsFilter(settings));
|
||||||
|
ServerSSLService sslService = new ServerSSLService(settings, settingsFilter);
|
||||||
|
|
||||||
sslContext = sslService.sslContext();
|
sslContext = sslService.sslContext();
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,9 @@ import org.elasticsearch.common.netty.handler.ssl.SslHandler;
|
||||||
import org.elasticsearch.common.network.NetworkService;
|
import org.elasticsearch.common.network.NetworkService;
|
||||||
import org.elasticsearch.common.settings.ImmutableSettings;
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.common.settings.SettingsFilter;
|
||||||
import org.elasticsearch.common.util.BigArrays;
|
import org.elasticsearch.common.util.BigArrays;
|
||||||
|
import org.elasticsearch.shield.ShieldSettingsFilter;
|
||||||
import org.elasticsearch.shield.ssl.ClientSSLService;
|
import org.elasticsearch.shield.ssl.ClientSSLService;
|
||||||
import org.elasticsearch.shield.ssl.ServerSSLService;
|
import org.elasticsearch.shield.ssl.ServerSSLService;
|
||||||
import org.elasticsearch.test.ElasticsearchTestCase;
|
import org.elasticsearch.test.ElasticsearchTestCase;
|
||||||
|
@ -33,6 +35,7 @@ public class ShieldNettyTransportTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
private ServerSSLService serverSSLService;
|
private ServerSSLService serverSSLService;
|
||||||
private ClientSSLService clientSSLService;
|
private ClientSSLService clientSSLService;
|
||||||
|
private ShieldSettingsFilter settingsFilter;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void createSSLService() throws Exception {
|
public void createSSLService() throws Exception {
|
||||||
|
@ -41,14 +44,15 @@ public class ShieldNettyTransportTests extends ElasticsearchTestCase {
|
||||||
.put("shield.ssl.keystore.path", testnodeStore)
|
.put("shield.ssl.keystore.path", testnodeStore)
|
||||||
.put("shield.ssl.keystore.password", "testnode")
|
.put("shield.ssl.keystore.password", "testnode")
|
||||||
.build();
|
.build();
|
||||||
serverSSLService = new ServerSSLService(settings);
|
settingsFilter = new ShieldSettingsFilter(settings, new SettingsFilter(settings));
|
||||||
|
serverSSLService = new ServerSSLService(settings, settingsFilter);
|
||||||
clientSSLService = new ClientSSLService(settings);
|
clientSSLService = new ClientSSLService(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testThatSSLCanBeDisabledByProfile() throws Exception {
|
public void testThatSSLCanBeDisabledByProfile() throws Exception {
|
||||||
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", true).build();
|
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", true).build();
|
||||||
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService);
|
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService, settingsFilter);
|
||||||
setOpenChannelsHandlerToMock(transport);
|
setOpenChannelsHandlerToMock(transport);
|
||||||
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.builder().put("shield.ssl", false).build());
|
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.builder().put("shield.ssl", false).build());
|
||||||
assertThat(factory.getPipeline().get(SslHandler.class), nullValue());
|
assertThat(factory.getPipeline().get(SslHandler.class), nullValue());
|
||||||
|
@ -57,7 +61,7 @@ public class ShieldNettyTransportTests extends ElasticsearchTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void testThatSSLCanBeEnabledByProfile() throws Exception {
|
public void testThatSSLCanBeEnabledByProfile() throws Exception {
|
||||||
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", false).build();
|
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", false).build();
|
||||||
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService);
|
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService, settingsFilter);
|
||||||
setOpenChannelsHandlerToMock(transport);
|
setOpenChannelsHandlerToMock(transport);
|
||||||
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.builder().put("shield.ssl", true).build());
|
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.builder().put("shield.ssl", true).build());
|
||||||
assertThat(factory.getPipeline().get(SslHandler.class), notNullValue());
|
assertThat(factory.getPipeline().get(SslHandler.class), notNullValue());
|
||||||
|
@ -66,7 +70,7 @@ public class ShieldNettyTransportTests extends ElasticsearchTestCase {
|
||||||
@Test
|
@Test
|
||||||
public void testThatProfileTakesDefaultSSLSetting() throws Exception {
|
public void testThatProfileTakesDefaultSSLSetting() throws Exception {
|
||||||
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", true).build();
|
Settings settings = ImmutableSettings.builder().put("shield.transport.ssl", true).build();
|
||||||
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService);
|
ShieldNettyTransport transport = new ShieldNettyTransport(settings, mock(ThreadPool.class), mock(NetworkService.class), mock(BigArrays.class), Version.CURRENT, null, serverSSLService, clientSSLService, settingsFilter);
|
||||||
setOpenChannelsHandlerToMock(transport);
|
setOpenChannelsHandlerToMock(transport);
|
||||||
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.EMPTY);
|
ChannelPipelineFactory factory = transport.configureServerChannelPipelineFactory("client", ImmutableSettings.EMPTY);
|
||||||
assertThat(factory.getPipeline().get(SslHandler.class), notNullValue());
|
assertThat(factory.getPipeline().get(SslHandler.class), notNullValue());
|
||||||
|
|
Loading…
Reference in New Issue