web-dev-qa-db-ja.com

Git用のSSHキーを使用し、Dockerで実行するSpring Cloud Config Server

これをすべてまとめる前に、多くの質問とチュートリアルを見つけました。他の誰かがフラストレーションの多くの時間を節約できるようにそれを文書化したかった。

私はBitBucketのプライベートgitリポジトリを取得して、Deployキーを使用してSpring Boot Config Serverで動作させ、Dockerで実行しようとしています。私は多くの問題に直面しています。

  1. Application.ymlファイルを使用して実際に設定する方法。

SSH情報をどこに置くべきかわかりません。すべてのチュートリアルはhttpsのようです。

  1. 構成に秘密鍵を提供する方法。開発者にとって、YMLのインラインの構文は苦痛です。本番環境では、環境変数を介して提供する必要がありますが、これは別の構文作業です。

秘密鍵が無効であるというエラーが引き続き表示されます。

  1. 厄介な「この男を信頼しますか」というプロンプトを出さずに、Dockerコンテナーにホストキーを信頼させる方法。

この作業を行う方法はいくつかありますが、私にとっては1つの方法しかありませんでした。

8
Wpigott

最初の部分は構成です。標準の秘密キーを無視し、環境変数として提供されたものを使用します。 (SSH_KEY)。また、gitリポジトリはEV(GIT_URL)ですが、必要に応じてハードコーディングできます。

spring:
  cloud:
    config:
      server:
        git:
          uri:  ${GIT_URL}
          ignore-local-ssh-settings: true
          private-key: ${SSH_KEY}

パート2はトリッキーです。 Devの場合、キーをインラインにする必要があるため、パイプを使用してYAMLのブロックにプレフィックスを付ける必要があります。 (このキーは生成したばかりで、今は破棄されているため、このキーは破棄されます)

private-key: |
                    -----BEGIN RSA PRIVATE KEY-----
                    MIIEpAIBAAKCAQEAszmCR06LVHk/kNYV6LoYgEfHlK4rp75sCsRJ7rdAbWNED+yB
                    bneOm5gue0LGIhT7iTP9D7aN6bKVHv1SBconCA7Pa2NMA9epcMT5ecJc8ndpZOFn
                    iqM77jmMMPvj8EIC06w5oK5zoYwpGotYQFHllf8M+20HtW2fZdPYAYwLcVdmc5tI
                    vLoS+10qw5D3X9zrwk2Cbt37Iqnz1cHOQq+g7sxgVgt18aIKKeg0JslaGqSlWMoT
                    ICUMHj89E4BMHj8ND8otSXHL+VhN+ghd7w1MpckxLWBsNs1+G1FuiJEVAtRq/j+8
                    SOilxgifvI1LqpZ5kO01XFlmkcuN4NMT03qpcwIDAQABAoIBAB5oQGk2sz7mv1kk
                    aV0tzaBeDUd1cWSpUw1UljKRFrY4ZEDLYH5MfH57iE9TWehIZRC3KFU1JMikitZS
                    JktjK9IbKSfQFgKE4XOHh8gXqMteZRw/feCwpydYzic1ZUvK903QZ4qSbn3XGNYv
                    FA79lhUny50Qt4EZkzSkh35js0FMSR9VmyXENxN6IgXUZyoaNAATr44Vkd488BY2
                    7PvdOniemo8/8p4Ij0Aq9Q7rOtm77ZXjyFRX5mDTi2ndSllMEhVcWXHSii+ukbvF
                    117Ns+8M7VWroNfRzI+Ilm/Xz/ePOLlNoYcY0h5+QM9vMPTX9Cpl5WofgOMK1sKd
                    mSdI4ukCgYEA12kcu0aDyIrEPHcyaT9izSFply0Uon2QKS9EQn6cr83vaEGViamh
                    f5q1coYouGnsLfbgKolEMKsYtbmJvInPFDCdc2x0Fmc207Wp1OECsN+HwElEXkrs
                    uPDpGQgs5odjN5Grue9837920oG3UBBdVDAKly2dTOcvoWW+88seFSUCgYEA1P7f
                    p78HDMQ8zTy5+3Rd4+lmJjPsY618XxSQ80j8Elrhi/DyTMA0XGc5c3cKRPmSj+JD
                    GN34WQbw7JO2mKM7YJs+tkSBeTKce8F3cZQy1jy3LNHCtfXylOxmxOFKynV5h2b/
                    jno+pGdmAPK5yvnGASd2eujtzt+AL07XiD2LnLcCgYEAsFRz131WfP/SuShdlLf1
                    WbODKuQVIxojuwLdHo1kF6k805v0G/dGoxzycOgPRz41vj57q3Yn4qr8FC3n6PTq
                    FT3idUyPDpO41r67Ye469KxWBHo1Q/aTJqTWOs5tatvixOcyqoa3MrUZQCI8+4YZ
                    z8Nvt+b3/66zV6vhDtHzMx0CgYAvWW2M0+mUS/ecRHivzqGkrdkYewh87C8uz9qd
                    SsdGqU9kla63oy7Ar+3Unkz5ImYTeGAkIgw4dlOOtBOugPMNOdXKHRaPQ9IHrO2J
                    oUFf4OVzoDnhy4ge1SLPd6nxsgXPNPVwzfopABdr9Ima9sWusgAjuK5NA+ByI9vE
                    HLJxpwKBgQCTM938cdx457ag1hS6EaEKyqljS1/B8ozptB4cy3h0hzw0crNmW84/
                    1Lt9MJmeR4FrWitQkkVLZL3SrYzrP2i+uDd4wVVD5epvnGP/Bk6g05/eB9LgDRx/
                    EeBgS282jUBkXZ6WpzqHCcku3Avs3ajzsC1WaEYx0tCiBxSkiJlaLQ==
                    -----END RSA PRIVATE KEY-----

実稼働環境では、コンテナを実行するDockerコマンドに渡す前に、コマンドプロンプトでbash変数を使用してキーを保存する必要があります。例:

$ pem=$( cat path_to_key )
$ docker run -e "SSH_KEY=$pem" configserver

この時点で、アプリケーションの面倒を見る必要があります。必要なのは、ssh Host not trusted問題を乗り越えることだけです。このため、これらの行をDockerfileに追加します。 「bitbucket.org」を任意のホストに置き換えます。これらのコマンドは、ssh configディレクトリーを作成し、許可を修正してから、knownhostsファイルを作成して取り込みます。

RUN mkdir -p /root/.ssh
RUN chmod 700 /root/.ssh
RUN ssh-keyscan bitbucket.org > /root/.ssh/known_hosts
16
Wpigott

私はこれにさらにひねりを加えたかったので、YAMLファイル(またはenv変数)のSSHキー(通常は悪いアイデア)をいじる必要がなくなることを願っています。

これはSSH構成ファイルを中心に展開するため、アプリがアクセスできない場合、または変更できない場合、これは機能しません(ただし、クラウド展開を含む、これが適用される実際の状況は考えられません) :AWS Cloudformationテンプレート、またはKubernetes ConfigMapsが有用な回避策を提供します)。

この問題は、(大部分)Spring Configアプリケーションプロパティで秘密キーファイルを指定できないという(やや不可解な)制限を中心に展開されます。

あなたの~/.ssh/configファイルには、次を追加できます。

Host git-config
    HostName github.myserver.example.com
    User someone
    IdentityFile /path/to/private_key

(プライベートGitHub Enterpriseサーバーに接続する必要があり、SSHキーに関連付けられているユーザーは、アプリケーションサーバーが実行されているのと同じではありません。これは正常に機能します。そうでない場合は、単にgithub.comHostNameを表し、Userは省略します)

次に、実際のGitHub URIを使用する代わりに、次のようにします。

[email protected]:my-team/config-properties-demo.git

git-configホストの場合:

spring:
  cloud:
    config:
      server:
        git:
          uri: git@git-config:my-team/config-properties-demo.git
          strictHostKeyChecking: false

確かに少し面倒ですが、自動化は比較的簡単です。非常に望ましいオプションは、Spring Configが秘密鍵の素材を指す別のオプションを追加することです。

spring:
  cloud:
    config:
      server:
        git:
          uri: [email protected]:my-team/config-properties-demo.git
          user: someone
          private_key_file: /path/to/private_key
          strictHostKeyChecking: false

これは「拡張リクエスト」セクションの1つだと思います...

4
Marco

ネクロはご容赦ください。ただし、これは、構成ファイルサーバーが一時ファイルシステムを使用する環境にデプロイされている場合、Gitリポジトリを使用してSSH認証を行う方法を検索したときのGoogleの(SOからの)第1位の結果です。まさにそれを行う方法。以下は、クライアントのためにそれを実現するために私が現在行っていることの要点です。

https://Gist.github.com/hanserya/43b00162741fa3022481301db60e8acd

それは間違いなくいアヒルの子ですが、機能的であり、それを必要とする誰にとっても堅実な足場として役立つはずです。この実装を使用すると、構成サーバーを実行しているコンテナーにボリュームをマウントできます。次に、環境を設定して、最適なメディア(env変数、bootstrap.ymlなど)を介して、spring.cloud.config.server.git.sshLocation構成キーを使用して、SSHディレクトリとしてボリュームを使用します。

ハッピーコーディング!

0
Ryan Hansen