Inhaltsverzeichnis

Sicherheitsfeature in der Oracle NoSQL V3 - Protokoll Verschlüsselung und User Login

Ab der Version 3 der Oracle NoSQL Datenbank sind erste Sicherheitsfeatures integriert.

Die Kommunikation zwischen dem Client und der Datenbank lässt sich mit SSL verschlüsseln, ein User Login kann eingerichtet werden.

Allerdings ist ein echtes Schema Konzept, wie in der Oracle RDBMS noch nicht umgesetzt.

Vorbereitung

Für das Einrichten des Stores muss das Java Werkzeug „keytool“ im Pfad liegen!

Auf allen Knoten bei Bedarf entsprechend verlinken!

#als root
ln -s /usr/java/jdk1.8.0_05/bin/keytool /usr/bin/keytool

Netzwerk Verschlüsselung

SSL Verschlüsselung über das Netzwerk kann aktiviert werden.

User Login

In der EE Edition kann eine Oracle Wallet für das Passwort verwendet werden.

Nachträglich eine Security Konfiguration hinzufügen in einer CE Edition

Ablauf:

Nach dem Einrichten des Root Users keine Daten mehr sichtbar!

Per Default erhält der User die Rollen :

kv-> show user -name root
user: id=u1 name=root enabled=true type=LOCAL retain-passwd=inactive granted-roles=[public, sysadmin]

Damit kann der User „Root“ zwar den Store verwalten aber keine Daten sehen!

Role je nach Bedarf hinzufügen ( http://docs.oracle.com/cd/NOSQL/html/SecurityGuide/role_management.html#roles ):

plan grant -role readwrite -user root -wait

Nun kann der User root wieder alle Einträge im Store sehen!

Auditieren

In den Logfiles unter $KVSTORE/KVStore/log nach dem Key „KVAuditInfo“ greppen:

cd $KVSTORE/KVStore/log
 
grep KVAuditInfo  *

JMX Console verbinden

Der Truststore muss dazu angeben werden:

C:\Program Files (x86)\Java\jdk1.7.0_45\bin\jconsole -J-Djavax.net.ssl.trustStore="D:\\security\\client.trust"  myserver:5100

Logging Properies für die Fehlersuche „-J-Djava.util.logging.config.file=d:\log.properties“ verwenden

Wird der Pfad zum Zertifikat nicht hinterleg, erhält man den folgenden aussagekräftigen Fehler:

 Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint] Cause: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]
java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]
        at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:338)
        at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248)

Mit dem Store in Java verbinden

Vorbereitung: Security Verzeichnis auf den Client kopieren

Normale Anmeldung an den Store mit Username/Password und Trust File für die SSL Verschlüsselung:

//Call back Handler für die erneute Authentifizierung
public static  ReauthenticateHandler reauthHandler;
 
......
 
// get the host to connect as first parameter
String host = "localhost:5000";
 
// get the store Name
String store = "KVStore";
 
// get the root user name
String username = "username";
 
// get the user password
String userpwd = "MyPWD";
 
// get the path to the trust file
String trustFile = "D:\\security\\client.trust";
 
 
......
 
 
try {
 
    KVStoreConfig kvconfig = new KVStoreConfig(store, host);
 
    /* Set the required security properties */
    Properties secProps = new Properties();
    secProps.setProperty(KVSecurityConstants.TRANSPORT_PROPERTY, KVSecurityConstants.SSL_TRANSPORT_NAME);
    secProps.setProperty(KVSecurityConstants.SSL_TRUSTSTORE_FILE_PROPERTY, trustFile);
 
    kvconfig.setSecurityProperties(secProps);
 
 
    // Store Zugriff
    kvstore =   KVStoreFactory.getStore(kvconfig, new PasswordCredentials(username, password.toCharArray()), reauthHandler);
 
} catch (AuthenticationFailureException afe) {    
    System.out.println("authentication failed!");
}

Über einen User Trust file mit „System.setProperty(„oracle.kv.security“, trustFile)„:

......
 
// get the host and port
String host = "localhost";
int port=5000;
 
// get the store Name
String store = "KVStore";
 
// get the path to the trust file
String trustFile = "D:\\security\\root_user.security";
 
......
 
 
....
    public CountRecords(String host, int port, String store, String trustFile) {
 
       #Trust file eines Users einbinden:
 
        System.setProperty("oracle.kv.security", trustFile);
 
        try {
            KVStoreConfig kvconfig = new KVStoreConfig(store, host + ":" + port);
 
           // Store Zugriff
            kvstore = KVStoreFactory.getStore(kvconfig);
        } catch (AuthenticationFailureException afe) {
           System.out.println("authentication failed!");
        }
    }
...

Security wieder auf NONE setzen

Um die Sicherheitseinstellungen wieder auszuschalten, muss die config.xml pro Knoten angepasst werden und ein Neustart des Stores ist notwendig.

Store zuvor stoppen!

Store Security wieder entfernen:

java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar securityconfig 
 
security->config remove-security -root /opt/oracle/kvdata/NODE01/KVStore
security->config remove-security -root /opt/oracle/kvdata/NODE02/KVStore
security->config remove-security -root /opt/oracle/kvdata/NODE03/KVStore

Und wieder starten

Zum erneuten Einschalten

Store stoppen.

Wieder erneut einbinden:

java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar securityconfig 
 
config add-security -root /opt/oracle/kvdata/NODE01/KVStore
config add-security -root /opt/oracle/kvdata/NODE02/KVStore
config add-security -root /opt/oracle/kvdata/NODE03/KVStore

Store erneut wieder starten.

Quellen