Cassandra SSL avec sa propre autorité de certification


Je veux configurer ma propre autorité de certification pour une utilisation avec un cluster cassandra afin de ne pas avoir à copier tous les certificats à chaque fois que j'ajoute un nouveau nœud. J'ai lu quelques tutoriels pour Cassandra et SSL, mais ils fonctionnent tous avec la copie de certificats. Je suis un peu perdu dans le processus CA

C'est ce que je pense que je dois faire

  • Créer CA une fois
  • Créez un CSR par nœud, puis signez chacun avec mon CA (-> enregistrer sous nodeX.crt)
  • importez le node0.crt à mon cassandra node0 fichier de clés, node1.crt à node1 keystore etc

Maintenant:

  • Dois-je ajouter quelque chose au truststore?
  • Dois-je faire quelque chose avec le fichier CA? Copiez - le sur chaque client / serveur de nœud?
  • Quel fichier dois-je fournir à mon client java? le client de cqlsh?

Avantage: Plus de copie de certificats ssl entre les nœuds. Juste un pour chaque nœud et vous êtes défini.

Modifier:

Ok voici comment je l'ai fait. Si j'ai fait tout les erreurs, s'il vous plaît laissez-moi savoir. J'ai laissé de côté des choses comme les fichiers JCE et cassandra appropriée.yaml config. Ceux-ci doivent être présents sur le serveur!

openssl genrsa -out clusterCA.key 2048
openssl req -x509 -new -key clusterCA.key -days <DAYS> -out clusterCA.pem

keytool -importcert -alias clusterCA -file clusterCA.pem -keystore clustertruststore -storepass <PASS>

#on each cassandra host for clients. for client replace nodename with clientname
keytool -genkeypair -alias <NODENAME> -keyalg RSA -keysize 2048 -dname "CN=<NODENAME>,OU=<UNITNAME>,O=<ORGANISATION>" -keypass <PASS> -keystore <NODENAME>.keystore -storepass <PASS> -validity <DAYS>

keytool -keystore <NODENAME>.keystore -alias <NODENAME> -certreq -file <NODENAME>.cert -storepass <PASS> -keypass <PASS>


# sign it with CA

openssl x509 -req -CA clusterCA.pem -CAkey clusterCa.key -in <NODENAME>.cert -out <NODENAME>.signed -days <DAYS> -CAcreateserial

# add rootCA to host

keytool -keystore <NODENAME>.keystore -storepass <PASS> -alias clusterCA -import -file clusterCA.pem -noprompt

keytool -keystore <NODENAME>.keystore -storepass <PASS> -alias <NODENAME> -import -file <NODENAME>.signed -keypass <PASS>

## use <NODENAME>.keystore as truststore and keystore for cassandra node / client trust/keystore
## No need to copy keystores around. You only need it on your host


## create CQLSH pem
keytool -importkeystore -srckeystore <NODENAME>.keystore -destkeystore <NODENAME>_user1.p12 -deststoretype PKCS12
openssl pkcs12 -in <NODENAME>_user1.p12 -out <NODENAME>_user1.pem -nodes

##  use <NODENAME>_user1.pem as certfile for cqlsh
Author: elmalto, 2015-05-27

1 answers

Votre stratégie est très solide et c'est comme ça que je le ferais. Vous souhaitez avoir votre propre autorité de certification, puis créer un CSR pour chaque nœud. C'est beaucoup plus facile à gérer que de faire confiance aux certificats de nœud individuellement.

  • Chaque nœud aura son propre magasin de clés stockant son certificat.
  • Vous voudrez que chaque nœud ait le certificat public CAs dans son truststore. C'est seulement si vous avez require_client_auth' définie sur true. Je recommanderais de le faire car ce n'est pas trop difficile à mettre en place et ajoute une couche supplémentaire d'identification qui devrait être considérée comme importante.

Il est également important de différencier le chiffrement entre nœudset le chiffrement client. Cassandra a des paramètres différents pour chacun (documentés dans les liens ci-dessus). Si vous utilisez le chiffrement client à nœud, vous voudrez également disposer d'un magasin de confiance pour les certificats clients. Vous pouvez utiliser le même magasin de confiance et également émettre des certificats aux clients.

Sur le côté client à nœud voici un exemple du pilote java teste comment configurer votre SSLContext à l'aide de votre clé et de vos truststores:

/**
 * @param keyStorePath Path to keystore, if absent is not used.
 * @param trustStorePath Path to truststore, if absent is not used.
 * @return {@link com.datastax.driver.core.SSLOptions} with the given keystore and truststore path's for
 * server certificate validation and client certificate authentication.
 */
public SSLOptions getSSLOptions(Optional<String> keyStorePath, Optional<String> trustStorePath) throws Exception {

    TrustManagerFactory tmf = null;
    if(trustStorePath.isPresent()) {
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(this.getClass().getResourceAsStream(trustStorePath.get()), DEFAULT_CLIENT_TRUSTSTORE_PASSWORD.toCharArray());

        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
    }

    KeyManagerFactory kmf = null;
    if(keyStorePath.isPresent()) {
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(this.getClass().getResourceAsStream(keyStorePath.get()), DEFAULT_CLIENT_KEYSTORE_PASSWORD.toCharArray());

        kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, DEFAULT_CLIENT_KEYSTORE_PASSWORD.toCharArray());
    }

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(kmf != null ? kmf.getKeyManagers() : null, tmf != null ? tmf.getTrustManagers() : null, new SecureRandom());

    return new SSLOptions(sslContext, SSLOptions.DEFAULT_SSL_CIPHER_SUITES);
}

Une fois que vous avez un objet SSLOptions, vous pouvez simplement le passer dans votre générateur de cluster, c'est-à-dire:

cluster = Cluster.builder()
    .addContactPoint(host)
    .withSSL(sslOptions))
    .build();

CQLSH prend en charge SSL via le fichier cqlshrc. Vous pouvez trouver un exemple de la façon de configurer cela ici.

 5
Author: Andy Tolbert, 2015-09-01 10:13:49