パイプラインで複数の SSH キーを使用する

Bitbucket Pipelines では、リポジトリごとに 1 つの SSH キーがサポートされます。ただし、パイプラインで複数のキーを使用したい場合、それらをセキュアな変数として追加し、bitbucket-pipelines.yml ファイルから参照できます。パイプラインで複数の SSH キーを設定して使用するには、次の手順に従います。

(必要に応じて) SSH キーを生成する 

パスフレーズを持たないキー ペアを生成します。Linux または OS X の場合、ターミナルで次の操作を実行します。

1 ssh-keygen -t rsa -b 4096 -N '' -f my_ssh_key

非公開キーをエンコードする

Pipelies では、現時点では環境変数での改行がサポートされません。このため、次の操作を実行して非公開キーを base-64 エンコードします。

Linux

1 base64 -w 0 < my_ssh_key

Mac OS X

1 base64 < my_ssh_key

Windows

1 [convert]::ToBase64String((Get-Content -path "~/.ssh/my_ssh_key" -Encoding byte))

キーをセキュアな変数として追加する

非公開キーをリポジトリ変数として受け渡す場合、次のようなセキュリティ上のリスクがあります。

  • パイプラインのビルドが子プロセスを生成する場合、それらにリポジトリ変数がコピーされる。

  • セキュアな環境変数は、リポジトリへの書き込みアクセスを持つすべてのユーザーが取得できる。

個人の SSH キーをリポジトリ変数として渡すのではなく、セキュリティ侵害があった場合に簡単に無効化できるよう、Pipelines 用に新しい SSH キー ペアを生成することをおすすめします。デプロイメント権限と組み合わせてアクセスを制御できるデプロイメント変数を使用することもご検討ください。

暗号化されたキーをターミナルからコピーし、リポジトリのセキュアな Bitbucket Pipelines 環境変数として次のように追加します。

  1. Bitbucket リポジトリで、[リポジトリ設定] を選択し、[Pipelines] の下で [リポジトリ変数] を選択します。

  2. ターミナルで、base64 エンコード済みの非公開キーをコピーします。

  3. エンコード済みのキーを環境変数の値としてペーストします。[セキュア] が選択されていることを確認します。

ボックスにチェックが入って強調表示され保護された

公開キーをリモート ホストにインストールする

Pipelines がホストを認証する前に、リモート ホストに公開キーをインストールする必要があります。Pipelines ビルドにほかの Bitbucket リポジトリへのアクセス権を与えたい場合、公開キーをそのリポジトリに追加する必要があります。

リモート ホスト

サーバーへの SSH アクセスが可能な場合は、ssh-copy-id コマンドを使用できます。通常、このコマンドはリモート ホストの ~/.ssh/authorized_keys ファイルにキーを追加します。

1 ssh-copy-id -i my_ssh_key username@remote_host

サーバへの SSH アクセスをテストします。

1 ssh -i ~/.ssh/my_ssh_key user@host

.ssh ファイルを変更するのではなく作成する場合、権限の変更が必要となる場合があります。

  • chmod 700 ~/.ssh

  • chmod 600 ~/.ssh/authorized_keys

他の Bitbucket Cloud リポジトリ

Pipelines ビルドにほかの Bitbucket リポジトリ (ビルドの実行元とは異なるリポジトリ) へのアクセス権を与えたい場合、次の手順を実行します。

  1. 前述のステップ 1 の説明に従い、ビルドが実行されるリポジトリの設定で SSH キーを追加します (Bitbucket Pipelines で新しいキーを作成することも、既存のキーを使用することもできます)。

  2. 他の Bitbucket リポジトリ (ビルドにアクセス権を与えるリポジトリ) の設定に、SSH キー ペアの公開キーを直接追加します。
    Bitbucket リポジトリに公開キーを追加する方法の詳細については、「アクセス キー」をご参照ください。

my_known_hosts ファイルを作成してリポジトリに追加する

known_hosts ファイルには、ユーザーがアクセスする SSH サーバの DSA ホスト キーが格納されます。適切なリモート ホストに接続していることを確認することが重要です。Bitbucket Pipelines では、Bitbucket と GitHub サイトのフィンガープリントがすべてのパイプラインに自動的に追加されています。

  1. リモート ホストの公開 SSH キーを含む my_known_hosts ファイルを作成します。これを行うには、ssh-keyscan コマンドを実行します。

    1 $ ssh-keyscan -t rsa server.example.com > my_known_hosts
  2. my_known_hosts ファイルを、パイプラインからアクセス可能なリポジトリにコミットします。

過去に SSH 経由でリモート ホストにアクセスしたユーザーの ~/.ssh ディレクトリから既存の known_hosts ファイルをコピーすることもできます。無関係なすべての行を削除します。

bitbucket-pipelines.yml ファイルですべての情報を関連付ける

Pipelines では、ビルドごとに新しい Docker コンテナ環境が作成されます。bitbucket-pipelines.yml ファイル内で SSH キーを参照することで、SSH キーを使用できます。 

パイプラインを実行する Docker コンテナ用に SSH キーを参照するには、次のコマンドを実行します。

1 2 3 4 5 6 7 8 9 image: node:6 # specify your Docker image here pipelines: default: - step: script: - mkdir -p ~/.ssh - cat my_known_hosts >> ~/.ssh/known_hosts - (umask 077 ; echo $MY_SSH_KEY | base64 --decode > ~/.ssh/id_rsa) - ssh <user>@<host> 'echo "connected to `host` as $USER"'

前述の例では、ホストに接続し、echo コマンドで「connected to 'host' as <user>」を指定しています。

最終行の ssh コマンドは、既定の SSH 情報が使用されることにご注意ください。異なるキーを指定するには、次のように -i オプションを使用します。

1 ssh -i ~/.ssh/my_other_ssh_key <user>@<host>

最終行を編集して、ファイルの転送に scp を使用したり、リモート サーバから SSH 経由でファイルをクローンするために git を使用したりするように設定することもできます。

その他のヘルプ