Travis-CIの自動デプロイでSSHを実行する方法 [翻訳]


How to Encrypt/Decrypt SSH Keys for Deployment

正しくは、”Travis-CIのデプロイ時に使うSSHキーを暗号化/復号化する方法”です。
Travis-CIでテストをパスしたとき、デプロイとしてSSHでサーバに接続してスクリプトを叩くとか、そんな時に必要なものです。

以下 https://github.com/dwyl/learn-travis/blob/master/encrypted-ssh-keys-deployment.md の翻訳です。

Travis-CIのデプロイ時に使うSSHキーを暗号化/復号化する方法

暗号化された SSHキーをプロジェクトに追加して、Travis-CIがアプリを自動的にデプロイできるようにします。

なぜ?

CIは、プロジェクト/アプリケーションの最新バージョンを特定の環境に展開するプロセスを完全に自動化します。これにより、新しい機能またはバグ修正をデプロイする必要があるたびに手動で実行するステップがないため、チームの時間を大幅に節約でき、特定のインスタンスにどのバージョンが存在するかについての混乱を回避できます。

多くの人は、SSHベースの展開ツール(Edeliverなど )を使用することを好みます。これは、シンプルで高速で、暗号化されたSSH "トンネル"で保護されているためです。

これは何?

Travis-CIであなたのアプリを1つ(あるいは複数)のサーバにSSH経由でデプロイする、”デプロイメント・パイプライン”、をセットアップする為の、セキュアな方法です。

安全ですか?

SSHキーは作成および暗号化され、プレーンテキストで送信されること はありません。Travis-CIのみがキーを復号化できます。

注:有料版のTravis-CIを使用している場合、Web-UIを使用してSSHキーを追加できます。
参照: https://docs.travis-ci.com/user/private-dependencies
via: https://stackoverflow.com/questions/27444891/how-to-add-ssh-key-in-travis-ci

対象

  • Herokuを使っている人で、なおかつ簡単な方法が許されない人
  • デプロイ/プラットフォームを "full control" したい人
  • 「DevOps」に興味がある熱心なEager-beavers

どうやって?

Step 0. 前提条件

このガイドは、AWS、Google Cloud、Digital Ocean、LinodeなどのクラウドサービスにLinux「仮想プライベートサーバー」(VPS)インスタンスが既にあることを前提としています。
※[翻訳者追記] 自前のサーバでも問題なし

以下に説明では、インスタンス(VPS)へのSSHアクセスとIPアドレスのメモが必要になります。
このチュートリアルでは、DigitalOceanで実行されているCentOSインスタンスを使用していますが、AWS、Azure、およびLinodeの両方で実行されているUbuntuインスタンスでもテストしました。

デジタルオーシャンアカウントをまだお持ちでない場合は、次の(「紹介」)リンクを使用して登録してください: https://m.do.co/c/29379863a4f8 クレジット$10がもらえます。

他に必要とする知識はありません。すべてのコマンドは説明しました。しかしもし不明確なものがあれば、いつもの通り、私達は”ここにいるし喜んで助けましょう”; ここでissueを開いてください。: https://github.com/dwyl/learn-travis/issues

Step 1. サーバーインスタンスへのログイン

IPアドレスを使用してSSH経由でサーバーインスタンスにログインします。

例えば:

端末プロンプトが変化するのが確認できるはずです。

Step 2. 新しいSSH Keyを生成する

カレントディレクトリを.sshへ変更して次のコマンドを実行します。

cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "TravisCIDeployKey"

※[翻訳者追記] -bばビット長、-Cはコメントオプション

[Enter]キーを押して、ファイル名のデフォルトを使用し、password 空白のままにします。
次のような出力が端末に表示されます。

2.1 生成したSSHキーをauthorized_keysファイルへ追加

新しいキーをSSHアクセスに使用するにためには、サーバー上のauthorized_keysファイルにそれを含める必要があります。
次のコマンドを実行して、公開鍵を"authorized keys"のリストに追加します。

cat id_rsa.pub >> authorized_keys

これをStep 3.1でテストします。

Step 3. SSHキーを安全にダウンロードする

現在の作業ディレクトリが、SSHキーを追加するプロジェクト/アプリであることを確認します。(したがって、後でキーを移動する必要はありません)

SSHキーをダウンロードする前に、まず.gitignoreに次の行を追加して、秘密鍵を誤って平文でコミットしないようにします。

echo  " deploy_key "  >> .gitignore

それが完了したら、次のコマンドでキーをダウンロードします。

scp [email protected]:/root/.ssh/id_rsa ./deploy_key

例えば:

scp [email protected]:/root/.ssh/id_rsa ./deploy_key

3.1 サーバーにログインできることをテストする

deploy_keyを使ってサーバにログインできることをテストします。

ssh -i /path/to/deploy_key [email protected]

例えば:

ssh -i ./deploy_key [email protected]

Step 4. Travis-CI CLIをインストールする

SSHキーとパスフレーズの両方を暗号化するには、Travis-CI CLIが必要です。
localhost (サーバではなく)にTravis-CIをインストールします:

gem install travis

もしgemが入っていなかったら、まずはrubyをインストールしてやり直してください。

Step 5. 秘密鍵を暗号化する

travisのCLIを使用して、localhostで秘密鍵を暗号化します。

touch .travis.yml && travis encrypt-file ./deploy_key --add

次のようなものが表示されるはずです。

プロジェクトディレクトリの.travis.ymlを見ると、次の行が追加されているのを確認できるはずです。

before_install:
- openssl aes-256-cbc -K $encrypted_77965d5bdd4d_key -iv $encrypted_77965d5bdd4d_iv
  -in deploy_key.enc -out ./deploy_key -d

GitHubにpushする前に、deploy_key.enc.travis.ymlをあなたのプロジェクトにコミットしたことを確認してください。

注:これを行う別の方法があります。暗号化したSSHキーをbase64にエンコードして.travis.ymlに含める方法です。:https://gist.github.com/lukewpatterson/4242707を参照してください。 ただし.travis.ymlにノイズを含むことになります。どちらの方法がいいか、あなたが好むものを自分で決めて構いませんが、プロジェクト全体で一貫性を保つべきです。

5.1 RSAキーをpreferred keyとして.travis.ymlに設定する

Step 5では、暗号化したRSAキーをリポジトリに追加しましたが、これをまた、Travis-CIにpreferred keyとして設定する必要があります。
次を.travis.ymlに加えてください。

- ssh-add ./deploy_key

この行は、キー復号化の行の後にあることを確認してください。例:https://github.com/nelsonic/hello-world-node-http-server/blob/master/.travis.yml#L13

Step 6. Travis-CIでテストする

論より証拠で確認してみます。Travis-CIはあなたのサーバインスタンスでSSHコマンドを実行できるはずです。

次を.travis.ymlに追加します。

- eval "$(ssh-agent -s)"
- chmod 600 ./deploy_key
- echo -e "Host $SERVER_IP_ADDRESS\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
- ssh-add ./deploy_key
- ssh -i ./deploy_key [email protected] pwd

これらの行を見ていきましょう。

  • eval "$(ssh-agent -s)" = ssh-agentをスタートします (sshコマンドを実行できるように)
  • chmod 600 ./deploy_key = warningを避けるため、権限を変更します.
  • echo -e "Host $SERVER_IP_ADDRESS\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config = Travisがホスト(VPS)のIDをチェックするかどうかを尋ねるのを避けます。: https://stackoverflow.com/questions/16638573/auto-authorize-ssh-auth-requests-on-travis-ci
  • ssh-add ./deploy_key = deploy_keyをsshの優先RSAキーとして設定します。
  • ssh -i ./deploy_key [email protected] pwd = deploy_keyを”identity”ファイル(RSAキー)として使用して、サーバーでpwdコマンドを実行します

sshコマンドがTravis-CI上で動くと、次のような出力を確認できるはずです。: https://travis-ci.org/nelsonic/hello-world-node-http-server/builds/385702903#L457

.travis.ymlの完全な例

背景/関連資料