パイプラインで複数の SSH キーを使用する
Bitbucket Pipelines では、リポジトリごとに 1 つの SSH キーがサポートされます。ただし、パイプラインで複数のキーを使用したい場合、それらをセキュアな変数として追加し、bitbucket-pipelines.yml ファイルから参照できます。パイプラインで複数の SSH キーを設定して使用するには、次の手順に従います。
(必要に応じて) SSH キーを生成する
パスフレーズを持たないキー ペアを生成します。Linux または OS X の場合、ターミナルで次の操作を実行します。
ssh-keygen -t rsa -b 4096 -N '' -f my_ssh_key非公開キーをエンコードする
Pipelies では、現時点では環境変数での改行がサポートされません。このため、次の操作を実行して非公開キーを base-64 エンコードします。
Linux
base64 -w 0 < my_ssh_keyMac OS X
base64 < my_ssh_keyWindows
[convert]::ToBase64String((Get-Content -path "~/.ssh/my_ssh_key" -Encoding byte))キーをセキュアな変数として追加する
非公開キーをリポジトリ変数として受け渡す場合、次のようなセキュリティ上のリスクがあります。
パイプラインのビルドが子プロセスを生成する場合、それらにリポジトリ変数がコピーされる。
セキュアな環境変数は、リポジトリへの書き込みアクセスを持つすべてのユーザーが取得できる。
個人の SSH キーをリポジトリ変数として渡すのではなく、セキュリティ侵害があった場合に簡単に無効化できるよう、Pipelines 用に新しい SSH キー ペアを生成することをおすすめします。デプロイメント権限と組み合わせてアクセスを制御できるデプロイメント変数を使用することもご検討ください。
暗号化されたキーをターミナルからコピーし、リポジトリのセキュアな Bitbucket Pipelines 環境変数として次のように追加します。
Bitbucket リポジトリで、[リポジトリ設定] を選択し、[Pipelines] の下で [リポジトリ変数] を選択します。
ターミナルで、base64 エンコード済みの非公開キーをコピーします。
エンコード済みのキーを環境変数の値としてペーストします。[セキュア] が選択されていることを確認します。
公開キーをリモート ホストにインストールする
Pipelines がホストを認証する前に、リモート ホストに公開キーをインストールする必要があります。Pipelines ビルドにほかの Bitbucket リポジトリへのアクセス権を与えたい場合、公開キーをそのリポジトリに追加する必要があります。
リモート ホスト
サーバーへの SSH アクセスが可能な場合は、ssh-copy-id コマンドを使用できます。通常、このコマンドはリモート ホストの ~/.ssh/authorized_keys ファイルにキーを追加します。
ssh-copy-id -i my_ssh_key username@remote_hostサーバへの SSH アクセスをテストします。
ssh -i ~/.ssh/my_ssh_key user@host.ssh ファイルを変更するのではなく作成する場合、権限の変更が必要となる場合があります。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
他の Bitbucket Cloud リポジトリ
Pipelines ビルドにほかの Bitbucket リポジトリ (ビルドの実行元とは異なるリポジトリ) へのアクセス権を与えたい場合、次の手順を実行します。
前述のステップ 1 の説明に従い、ビルドが実行されるリポジトリの設定で SSH キーを追加します (Bitbucket Pipelines で新しいキーを作成することも、既存のキーを使用することもできます)。
Add the public key from that SSH key pair directly to settings for the other Bitbucket repo (i.e. the repo that your builds need to have access to).
See Access keys for details on how to add a public key to a Bitbucket repo.
my_known_hosts ファイルを作成してリポジトリに追加する
known_hosts ファイルには、ユーザーがアクセスする SSH サーバの DSA ホスト キーが格納されます。適切なリモート ホストに接続していることを確認することが重要です。Bitbucket Pipelines では、Bitbucket と GitHub サイトのフィンガープリントがすべてのパイプラインに自動的に追加されています。
Create the
my_known_hostsfile that includes the public SSH key of the remote host. You can do this by executing the ssh-keyscan command:$ ssh-keyscan -t rsa server.example.com > my_known_hostsmy_known_hostsファイルを、パイプラインからアクセス可能なリポジトリにコミットします。
過去に SSH 経由でリモート ホストにアクセスしたユーザーの ~/.ssh ディレクトリから既存の known_hosts ファイルをコピーすることもできます。無関係なすべての行を削除します。
bitbucket-pipelines.yml ファイルですべての情報を関連付ける
Pipelines では、ビルドごとに新しい Docker コンテナ環境が作成されます。bitbucket-pipelines.yml ファイル内で SSH キーを参照することで、SSH キーを使用できます。
パイプラインを実行する Docker コンテナ用に SSH キーを参照するには、次のコマンドを実行します。
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 を使用したりするように設定することもできます。
この内容はお役に立ちましたか?