=====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