非公開 GitHub リポジトリへのアクセス

このチュートリアルでは、暗号化されたシークレットCloud Key Management Service(Cloud KMS)を使用して限定公開 GitHub リポジトリを操作する方法を説明します。

手動ビルドを実行する場合にのみ、限定公開 GitHub リポジトリに接続するための暗号化されたシークレットが必要となります。Cloud Build トリガーを使用してビルドを実行すると、暗号化されたシークレットなしで所有する限定公開リポジトリに自動的に接続できます。トリガーの作成方法については、トリガーでビルドを自動化するをご覧ください。

目標

  • GitHub SSH 認証鍵を設定する。
  • SSH 認証鍵を非公開リポジトリのデプロイ鍵に追加する。
  • Cloud KMS を使用して SSH 認証鍵を暗号化する。
  • 鍵を復号するビルドを送信し、それを使用して非公開リポジトリにアクセスする。

料金

このチュートリアルでは、Google Cloud Platform の課金対象となる以下のコンポーネントを使用します。

  • Cloud KMS
  • Cloud Build

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。

GCP を初めてご利用の場合には、無料トライアルをご利用いただけます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud KMS必要な を有効にします。

    を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. GitHub 用の SSH 認証鍵を作成します
  7. 限定公開リポジトリにデプロイ鍵を追加します

Cloud KMS クイックスタートも、このプロダクトに慣れるのに役立ちます。

Cloud KMS キーリングおよび暗号鍵の作成

Cloud Build で SSH 認証鍵を使用するには、Cloud KMS CryptoKey を使用して鍵を暗号化、復号する必要があります。CryptoKey は KeyRing オブジェクトに格納されます。

KeyRing と CryptoKey を作成するには、gcloud kms keyrings create および gcloud kms keys create コマンドを使用します。

KeyRing を作成するには、shell またはターミナル ウィンドウで次のコマンドを実行します。このチュートリアルでは、KeyRing my-keyring に名前を付けます。

gcloud kms keyrings create my-keyring --location=global

次に、github-key という CryptoKey を作成します。このコマンドは、my-keyring KeyRing に github-key CryptoKey を作成します。

gcloud kms keys create github-key \
--location=global --keyring=my-keyring \
--purpose=encryption

--location=global フラグは、Cloud KMS が複数の地理的ロケーションからの読み書きオペレーションを処理することを示します。

SSH 認証鍵の暗号化

SSH 認証鍵を作成すると、環境内に id_rsa 鍵ファイルが作成されます。誰でもこのファイルを使用してアカウントに対して認証を行うことができるため、ファイルをビルドで使用する前に暗号化する必要があります。

リソースを暗号化するには、gcloud kms encrypt コマンドを使用します。

SSH 認証鍵を暗号化するには、次のコマンドを実行します。正しいパスを指定してください。

gcloud kms encrypt --plaintext-file=/path/to/sshkey/id_rsa \
--ciphertext-file=/path/to/save/encryptedkey/id_rsa.enc \
--location=global --keyring=my-keyring --key=github-key

このコマンドは id_rsa.enc ファイルを作成します。このファイルは、id_rsa の暗号化されたコピーです。

Cloud Build サービス アカウントへの復号権限の付与

ビルド中に暗号鍵にアクセスして復号するための権限を Cloud Build サービス アカウントに付与する必要があります。

サービス アカウントに復号権限を付与する方法については、暗号化されたリソースの使用をご覧ください。

known_hosts ファイルを作成または更新します。

github.com 用の rsa 鍵を含む known_hosts ファイルを作成する必要があります。

known_hosts ファイルを作成するには、次のコマンドを実行します。

ssh-keyscan -t rsa github.com > known_hosts

ビルドを構成する

ビルドを構成するには:

  1. cloudbuild.yaml という名前のビルド構成ファイルを作成するためのステップは 3 つです。まず、gcloud ステップで、SSH 鍵を復号し、復号された鍵をsshという名前のボリュームに保存します。ボリュームは、ビルドステップ全体でファイルを永続化するために使用されます。次に、git ステップで git を構成し、known_hosts ファイルに SSH 鍵を追加することで SSH 鍵を使用します。最後に、git ステップで known_hosts の鍵を使用し、git@github.com:[GIT-USERNAME]/[REPOSITORY] のリポジトリに接続します。

    # Decrypt the file containing the key
    steps:
    - name: 'gcr.io/cloud-builders/gcloud'
      args:
      - kms
      - decrypt
      - --ciphertext-file=id_rsa.enc
      - --plaintext-file=/root/.ssh/id_rsa
      - --location=global
      - --keyring=my-keyring
      - --key=github-key
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Set up git with key and domain
    - name: 'gcr.io/cloud-builders/git'
      entrypoint: 'bash'
      args:
      - '-c'
      - |
        chmod 600 /root/.ssh/id_rsa
        cat <<EOF >/root/.ssh/config
        Hostname github.com
        IdentityFile /root/.ssh/id_rsa
        EOF
        mv known_hosts /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Connect to the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - git@github.com:[GIT-USERNAME]/[REPOSITORY]
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
  2. 環境内に次のファイルを含む新しいディレクトリを作成します。

    1. id_rsa.enc ファイル
    2. known_hosts ファイル
    3. ビルド構成 YAML ファイル

ビルドの送信

ビルドを送信するには、id_rsa.encknown_hostscloudbuild.yaml ファイルを含むディレクトリから次のコマンドを実行します。

gcloud builds submit --config=cloudbuild.yaml .

出力は次のようになります。

Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/gcr/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"

FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][  3.9 KiB/  3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                              IMAGES  STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487  XXXX-XX-XXT17:57:21+00:00  13S       gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz  -                                 SUCCESS

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントへの課金が発生しないようにする手順は次のとおりです。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. GCP Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ