Bitbucket Pipelines で SSH キーを使用する

robotsnoindex

次のような場合、Bitbucket Pipelines で SSH キーをセットアップすることができます。

  • ビルドで Bitbucket やその他のホスティング サービスとの認証を行い、非公開の依存関係を取得する必要がある
  • デプロイで、アーティファクトをアップロードする前にリモート ホストまたはサービスとの認証を行う必要がある
  • ビルドで SSH、SFTP、または SCP などのツールを使用したい

Bitbucket Cloud のリポジトリに SSH の公開キーと非公開キーのペアを追加し、公開キーをリモート サービスまたはマシンに追加する必要があります。

Bitbucket のリポジトリに SSH キーを追加すると、そのリポジトリへの書き込みアクセス権を持つすべてのユーザーがリモート ホストへのアクセス権を持ちます。 

Bitbucket Cloud リポジトリへのプッシュやプルを問題なく実行できるはずです。ただし、SSH を使用する必要がある場合 (bot アカウントを使用する場合など) やブランチ権限が有効になっている場合は、「SSH キーのセットアップ」を参照してください。

Bitbucket リポジトリでの SSH の使用については次のページをご参照ください。

すべての利用可能な Docker イメージに SSH がデフォルトでインストールされているわけではありません。デフォルトのパイプライン イメージを使用している場合は問題は起こりませんが、独自のイメージを指定する必要がある場合、SSH がすでにインストールされていることを確認するか、スクリプトを使用してインストールするようにします。

たとえば、イメージに応じて、スクリプトに以下を含めます。

apt-get update -y
apt-get install -y ssh

ステップ 1: Bitbucket に SSH キーを追加する

新しい SSH キー ペアを生成することをおすすめしますが、キーの要件が Bitbucket の 2048 ビットの RSA キーとは異なる場合は既存のキー ペアを使用することもできます。いずれの方法で SSH キーを追加する場合も、非公開キーはビルドのパイプラインに追加 SSH キーとして自動的に追加され、bitbucket-pipelines.yml ファイルで指定する必要はありません。

ビルドのパイプラインが利用できる SSH キーが Docker イメージにすでに含まれていて、この手順で SSH キーを追加する必要がない場合、ステップ 2 に進んでください。

Pipelines で使用する SSH キーにはパスフレーズを含めないでください

Bitbucket Pipelines では、リポジトリについて 1 つの SSH キーがサポートされます。複数のキーを使用したい場合、Bitbucket Pipelines のセキュアな環境変数として追加し、bitbucket-pipelines.yml ファイルから参照することができます。後述の「複数の SSH キーの使用」をご参照ください。

新しい SSH キー ペアの生成方法 (推奨):

  1. リポジトリの [設定] で、[Pipelines] の [SSH キー] に移動します。
  2. [キーの生成] をクリックして新しい SSH キー ペアを作成します。

後述のステップ 2 に進みます。

既存のキー ペアを追加する方法:

キーの要件が Bitbucket の 2048 ビットの RSA キーとは異なる場合は、既存のキー ペアを使用することもできます。

セキュリティ上の理由により、個人の SSH キーを追加することは推奨されません。既存の bot のキーを使用することをおすすめします。

既存のキーを追加する方法の詳細についてはこちらをクリックしてください
  1. リポジトリの [設定] で、[SSH キー] に移動します。 
  2. フィールドに公開および非公開キーを追加して、[キー ペアを保存] をクリックします:

ステップ 2: 既知のホストを更新する

Pipelines では、リモート ホストのフィンガープリントやホスト アドレスを保存したり調査したりすることができます。これにより、リモート ホストが提供した公開キーがそのホストの ID に一致するかどうかを視覚的に確認して、なりすましや中間者攻撃を検出することができます。また、そのホストとの以降の通信を自動的に検証済みにすることができます

リポジトリの [設定] で [SSH キー] に移動し、既知のホストのアドレスを追加します。ホストのフィンガープリントを表示するには、[フェッチ] をクリックします。

Bitbucket Pipelines では、Bitbucket と GitHub サイトのフィンガープリントがすべてのパイプラインに自動的に追加されています (ただし、前述のユーザー インターフェイスには表示されません)。


ステップ 3: リモート ホストに公開キーを追加する

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

リモート ホスト

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

$ ssh-copy-id -i my_ssh_key user@host

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

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 リポジトリに公開キーを追加する方法の詳細については、「アクセス キー」をご参照ください。

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

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

複数の SSH キーを使用する方法についての詳細はこちらをクリックしてください

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

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

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

2: 非公開キーを暗号化する

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

Linux
$ base64 -w 0 < my_ssh_key
Mac OS X
$ base64 < my_ssh_key

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

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

  • パイプラインのビルドが子プロセスを生成する場合、それらにリポジトリ変数がコピーされる。
  • セキュアな環境変数は、リポジトリへの書き込みアクセスを持つすべてのユーザーが取得できる。

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

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

  1. Bitbucket のリポジトリで、[設定] > [リポジトリ変数] の順に選択します。
  2. ターミナルで、base64 エンコード済みの非公開キーをコピーします。
  3. エンコード済みのキーを環境変数の値としてペーストします。[セキュア] が選択されていることを確認します。

    詳細については、Bitbucket Pipelines の「パイプラインの変数」を参照してください。 

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

前述のステップ 3 の説明に従い、リモート ホストに公開キーを追加します。

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

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

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

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

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

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

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

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

bitbucket-pipelines.yml
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 オプションを使用します。

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

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

最終更新日 2020 年 6 月 24 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.