=====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: * Store stoppen * Basis Security Configuration anlegen java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar securityconfig security-> config create -pwdmgr pwdfile -root /opt/oracle/kvdata/NODE01/KVStore Enter a password for the Java KeyStore: Re-enter the KeyStore password for verification: Created files /opt/oracle/kvdata/NODE01/KVStore/security/store.trust /opt/oracle/kvdata/NODE01/KVStore/security/client.trust /opt/oracle/kvdata/NODE01/KVStore/security/security.xml /opt/oracle/kvdata/NODE01/KVStore/security/store.passwd /opt/oracle/kvdata/NODE01/KVStore/security/client.security /opt/oracle/kvdata/NODE01/KVStore/security/store.keys * Verzeichnis security auf alle KVRROOT's und Knoten verteilen cd /opt/oracle/kvdata/NODE01/KVStore/ cp -r security /opt/oracle/kvdata/NODE02/KVStore/ cp -r security /opt/oracle/kvdata/NODE03/KVStore/ * Security Information in jeder config.xml auf allen Knoten hinzufügen security-> config add-security -root /opt/oracle/kvdata/NODE01/KVStore -secdir security -config config.xml Configuration updated. security-> config add-security -root /opt/oracle/kvdata/NODE02/KVStore -secdir security -config config.xml Configuration updated. security-> config add-security -root /opt/oracle/kvdata/NODE03/KVStore -secdir security -config config.xml Configuration updated. * Store wieder starten * Am Store as Admin im Security Mode anmelden java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar runadmin -port 5100 -host myserver -security $KVROOT/security/client.security Logged in admin as anonymous kv-> * Admin User anlegen kv-> plan create-user -name root -admin -wait Enter the new password: Re-enter the new password: Executed plan 15, waiting for completion... Plan 15 ended successfully show user -name root user: id=u1 name=root enabled=true type=LOCAL retain-passwd=inactive granted-roles=[public, sysadmin] * testen mit java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar runadmin -port 5100 -host myserver -security $KVROOT/security/client.security -username root * Pwd File für diesen User anlegen java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar securityconfig pwdfile create -file $KVROOT/security/root.pwd java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar securityconfig pwdfile secret -file $KVROOT/security/root.pwd -set -alias root -secret MyRootPWD * Security Config anlegen cd $KVROOT/security # use this as template cp client.security root_user.security #edit the entries vi root_user.security oracle.kv.ssl.trustStore=client.trust oracle.kv.transport=ssl oracle.kv.ssl.protocols=TLSv1.2,TLSv1.1,TLSv1 oracle.kv.ssl.hostnameVerifier=dnmatch(CN\=NoSQL) oracle.kv.auth.pwdfile.file=root.pwd oracle.kv.auth.username=root * testen java -Xmx256m -Xms256m -jar $KVHOME/lib/kvstore.jar runadmin -port 5100 -host myserver -security /u00/app/oracle/kvdata/NODE01/KVStore/security/root_user.security * Datei root.pwd und root_user.security auf alle Knoten verteilen cd /opt/oracle/kvdata/NODE01/KVStore/security cp root.pwd root_user.security /opt/oracle/kvdata/NODE02/KVStore/security cp root.pwd root_user.security /opt/oracle/kvdata/NODE03/KVStore/security === 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 ===== * http://docs.oracle.com/cd/NOSQL/html/SecurityGuide/index.html