A fürt feldolgozó csomópontjai közötti forgalom titkosítása

Fontos

A cikkben hivatkozott init példaszkript a megosztott titkosítási titkos kódját a DBFS-ben tárolt kulcstár kivonatából nyeri ki. Ha a kulcstárfájl dbFS-ben való frissítésével elforgatja a titkos kulcsot, az összes futó fürtöt újra kell indítani. Ellenkező esetben előfordulhat, hogy a Spark-feldolgozók nem hitelesíthetők a Spark-illesztőprogrammal a megosztott titkos kód inkonzisztens működése miatt, ami a feladatok lelassulását okozza. Továbbá, mivel a megosztott titkos kód a DBFS-ben van tárolva, minden dbFS-hozzáféréssel rendelkező felhasználó lekérheti a titkos kulcsot egy jegyzetfüzet használatával.

Követelmények

  • Ehhez a funkcióhoz prémium csomag szükséges. További információért forduljon a Databricks-fiók csapatához.

Az init szkript működése

Fontos

A cikkben hivatkozott init példaszkript a megosztott titkosítási titkos kódját a DBFS-ben tárolt kulcstár kivonatából nyeri ki. Ha a kulcstárfájl dbFS-ben való frissítésével elforgatja a titkos kulcsot, az összes futó fürtöt újra kell indítani. Ellenkező esetben előfordulhat, hogy a Spark-feldolgozók nem hitelesíthetők a Spark-illesztőprogrammal a megosztott titkos kód inkonzisztens működése miatt, ami a feladatok lelassulását okozza. Továbbá, mivel a megosztott titkos kód a DBFS-ben van tárolva, minden dbFS-hozzáféréssel rendelkező felhasználó lekérheti a titkos kulcsot egy jegyzetfüzet használatával.

A felhasználói lekérdezések és átalakítások általában titkosított csatornán keresztül érkeznek a fürtökre. Alapértelmezés szerint azonban a fürtön belül a munkáscsomópontok között kicserélt adatok nem titkosítottak. Ha a környezet megköveteli, hogy az adatok mindig titkosítva legyenek, akár inaktív állapotban, akár átvitel közben, létrehozhat egy init szkriptet, amely konfigurálja a fürtöket a feldolgozó csomópontok közötti forgalom titkosítására AES 256 bites titkosítással egy TLS 1.3-kapcsolaton keresztül.

Feljegyzés

Bár az AES lehetővé teszi a titkosítási rutinok számára, hogy kihasználják a hardveres gyorsítás előnyeit, teljesítménybeli büntetés jár a titkosítatlan forgalomhoz képest. Ez a büntetés azt eredményezheti, hogy a lekérdezések a csomópontok közötti adatelkülönítés mennyiségétől függően hosszabb ideig tartanak egy titkosított fürtön.

A feldolgozó csomópontok közötti forgalom titkosításának engedélyezéséhez a Spark konfigurációs paramétereit init-szkripten keresztül kell beállítani. Használhat fürthatókörű init-szkriptet egyetlen fürthöz, vagy hozzáadhat egy fürthatókörű init-szkriptet a fürtszabályzatokhoz, ha azt szeretné, hogy a munkaterület összes fürtje feldolgozó–feldolgozó titkosítást használjon.

Egyszer másolja a kulcstárfájlt egy könyvtárba a DBFS-ben. Ezután hozza létre a titkosítási beállításokat alkalmazó init-szkriptet.

Az init szkriptnek a következő feladatokat kell elvégeznie:

  1. Kérje le a JKS-kulcstárfájlt és -jelszót.
  2. Állítsa be a Spark-végrehajtó konfigurációját.
  3. Állítsa be a Spark-illesztőprogram konfigurációját.

Feljegyzés

Az SSL/HTTPS engedélyezéséhez használt JKS-kulcstárfájl dinamikusan jön létre minden munkaterülethez. A JKS-kulcstárfájl jelszava kódolt, és nem a kulcstár titkosságának védelmére szolgál.

Az alábbiakban egy init-példaszkript látható, amely implementálja ezt a három feladatot a fürttitkosítási konfiguráció létrehozásához.

Példa init szkript

#!/bin/bash

set -euo pipefail

keystore_dbfs_file="/dbfs/<keystore-directory>/jetty_ssl_driver_keystore.jks"

## Wait till keystore file is available via Fuse

max_attempts=30
while [ ! -f ${keystore_dbfs_file} ];
do
  if [ "$max_attempts" == 0 ]; then
    echo "ERROR: Unable to find the file : $keystore_dbfs_file .Failing the script."
    exit 1
  fi
  sleep 2s
  ((max_attempts--))
done
## Derive shared internode encryption secret from the hash of the keystore file
sasl_secret=$(sha256sum $keystore_dbfs_file | cut -d' ' -f1)

if [ -z "${sasl_secret}" ]; then
  echo "ERROR: Unable to derive the secret.Failing the script."
  exit 1
fi

# The JKS keystore file used for enabling SSL/HTTPS
local_keystore_file="$DB_HOME/keys/jetty_ssl_driver_keystore.jks"
# Password of the JKS keystore file. This jks password is hardcoded and is not intended to protect the confidentiality
# of the keystore. Do not assume the keystore file itself is protected.
local_keystore_password="gb1gQqZ9ZIHS"

## Updating spark-branch.conf is only needed for driver

if [[ $DB_IS_DRIVER = "TRUE" ]]; then
  driver_conf=${DB_HOME}/driver/conf/spark-branch.conf
  echo "Configuring driver conf at $driver_conf"

  if [ ! -e $driver_conf ] ; then
    touch $driver_conf
  fi

cat << EOF >>  $driver_conf
  [driver] {
    // Configure inter-node authentication
  "spark.authenticate" = true
  "spark.authenticate.secret" = "$sasl_secret"
  // Configure AES encryption
  "spark.network.crypto.enabled" = true
  "spark.network.crypto.saslFallback" = false
  // Configure SSL
  "spark.ssl.enabled" = true
  "spark.ssl.keyPassword" = "$local_keystore_password"
  "spark.ssl.keyStore" = "$local_keystore_file"
  "spark.ssl.keyStorePassword" = "$local_keystore_password"
  "spark.ssl.protocol" ="TLSv1.3"
  "spark.ssl.standalone.enabled" = true
  "spark.ssl.ui.enabled" = true
  }
EOF
  echo "Successfully configured driver conf at $driver_conf"
fi

# Setting configs in spark-defaults.conf for the spark master and worker

spark_defaults_conf="$DB_HOME/spark/conf/spark-defaults.conf"
echo "Configuring spark defaults conf at $spark_defaults_conf"
if [ ! -e $spark_defaults_conf ] ; then
  touch $spark_defaults_conf
fi

cat << EOF >>  $spark_defaults_conf
spark.authenticate true
spark.authenticate.secret $sasl_secret
spark.network.crypto.enabled true
spark.network.crypto.saslFallback false

spark.ssl.enabled true
spark.ssl.keyPassword $local_keystore_password
spark.ssl.keyStore $local_keystore_file
spark.ssl.keyStorePassword $local_keystore_password
spark.ssl.protocol TLSv1.3
spark.ssl.standalone.enabled true
spark.ssl.ui.enabled true
EOF

echo "Successfully configured spark defaults conf at $spark_defaults_conf"

Miután az illesztőprogram és a feldolgozó csomópont inicializálása befejeződött, a rendszer a kulcstárfájl használatával titkosítja a csomópontok közötti összes forgalmat.

Példa jegyzetfüzetre: Titkosítási init-szkript telepítése

Ez a következő jegyzetfüzet átmásolja a kulcstárfájlt, és létrehozza az init szkriptet a DBFS-ben. Az init szkripttel új fürtöket hozhat létre, amelyeken engedélyezve van a titkosítás.

Titkosítási init szkriptjegyzetfüzet telepítése

Jegyzetfüzet beszerzése

A feldolgozó csomópontok közötti titkosítás letiltása

A feldolgozó csomópontok közötti titkosítás letiltásához távolítsa el az init szkriptet a fürt konfigurációjából, majd indítsa újra a fürtöt.