web-dev-qa-db-ja.com

OpenShift環境でシークレットJavaキーストアをデプロイするための良い方法は何ですか?

Java Webアプリケーションは、通常のデプロイメントモデル(サーバーへのインストール)からOpenShift環境(Dockerコンテナーとしてのデプロイメント)に移動することになっています。現在、このアプリケーションは、 JavaサードパーティのWebインターフェースと通信するためのクライアント証明書のキーストア(.jksファイル)。インターフェースごとに1つのキーストアがあります。

これらのjksファイルは、運用マシンに手動でデプロイされ、サードパーティの証明書を更新する必要がある場合に時々更新されます。私たちのアプリケーションには、キーストアファイルへのパスが設定されており、起動時にそれらから証明書を読み取り、それらを使用してサードパーティのシステムと通信します。

OpenShiftデプロイメントに移行すると、すべての環境(開発、テスト、本番)で使用されるアプリケーションを含む1つのDockerイメージがあります。すべての設定は環境変数として与えられます。ただし、環境変数としてjksファイルを指定することはできません。これらは、Dockerコンテナーのファイルシステムにマウントする必要があります。

これらの証明書は秘密であるため、イメージに焼き付けたくありません。私はOpenShiftのドキュメントをスキャンして、これにアプローチする方法についての手がかりをいくつか探し、基本的に2つのオプションを見つけました:シークレットを使用するか、永続的なボリュームの要求(PVC)をマウントします。

シークレットは、ファイルとしてマウントしたり、環境変数として渡したりできるキーと値のペアにすぎないため、機能しないようです。また、サイズ制限もあります。 PVCを使用することは理論的には機能しますが、最初にJKSファイルをそのボリュームに入れるための何らかの方法が必要です。単純な方法は、PVCをマウントしてシェルコンテナーを開始し、OpenShiftコマンドラインツールを使用して手動でファイルをコピーすることですが、私は少し手動の解決策を望んでいました。

この問題の巧妙な解決策、またはファイルをコンテナーに入れる必要がある同様の問題を見つけましたか?

9
Jan Thomä

秘密がどのように機能するかを誤解していることがわかりました。これらは確かにファイルとしてマウントできるキーと値のペアです。ただし、値は、ファイルのコンテンツとしてマップされる、base64でエンコードされたバイナリにすることができます。したがって、解決策は、まずJKSファイルのコンテンツをbase64にエンコードすることです。

cat keystore.jks| base64

次に、これを秘密の定義に含めることができます。

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: my-namespace
data:
  keystore.jks: "<base 64 from previous command here>"

最後に、デプロイ構成で参照することにより、これをdockerコンテナーにマウントできます。

apiVersion: v1
kind: DeploymentConfig
spec:
  ...
  template:
    spec:
      ...
      container:
       - name: "my-container"
         ...
         volumeMounts:
            - name: secrets
              mountPath: /mnt/secrets
              readOnly: true

     volumes:
        - name: secrets
          secret:
            secretName: "my-secret"
            items:
              - key: keystore.jks
                path: keystore.jks

これにより、シークレットボリュームsecrets/mnt/secretsにマウントされ、keystore.jksという名前のエントリがkeystore.jksの下のファイル/mnt/secretsとして利用できるようになります。

これが本当に良い方法であるかどうかはわかりませんが、少なくともここでは機能しています。

10
Jan Thomä

JanThomäが述べたように、シークレットを追加してマウントすることができますが、ocコマンドラインツールを使用すると、次のように簡単になります。

./oc create secret generic crnews-keystore --from-file=keystore.jks=$HOME/git/crnews-service/src/main/resources/keystore.jks --from-file=truststore.jks=$HOME/git/crnews-service/src/main/resources/truststore.jks --type=opaque

これは、UIを介して追加できます。Applications-> Deployments->->「Add config files」で、マウントするシークレットを選択できます。

Name = valueのペア(truststore.jks =など)は、filename = base64decoded-Contentのように使用されることに注意してください。

6
Frischling

@Frischlingと@Jan-Thomäの両方の発言に基づいて構築し、フリッシュリングとの合意により、キーストアをApplications->Deployments->[your deployments name]環境リンクをクリックして、次のシステムプロパティを追加します。
名前: Java_OPTS_APPENDおよび
-Djavax.net.ssl.keyStorePassword=changeme -Djavax.net.ssl.keyStore=/mnt/keystores/your_cert_key_store.jks -Djavax.net.ssl.trustStorePassword=changeme -Djavax.net.ssl.trustStore=/mnt/keystores/your_ca_key_store.jks

これにより、示されているように、キーストアファイルのパスとパスワードがJavaオプション(JBoss/WildFlyやTomcatなど)によって使用されるオプション)に追加されます。

0
JGlass