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

このチュートリアルでは、Cloud Build で シークレット マネージャーを使用して限定公開の GitHub リポジトリを操作する方法を説明します。 シークレット マネージャーは、API キー、パスワード、その他の機密データを安全に保存する Google Cloud サービスです。

目標

  • GitHub SSH 認証鍵を設定する。
  • 公開 SSH 認証鍵を限定公開リポジトリのデプロイキーに追加します。
  • シークレット マネージャーに秘密 SSH 認証鍵を保存します。
  • シークレット マネージャーからキーにアクセスし、それを使用して非公開リポジトリにアクセスするビルドを送信します。

費用

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

  • シークレット マネージャー
  • Cloud Build

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

新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

  4. Cloud Build and Secret Manager API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

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

  8. Cloud Build and Secret Manager API を有効にします。

    API を有効にする

  9. Cloud SDK をインストールして初期化します。
  10. 省略可。シークレット マネージャー クイックスタートを完了して、このサービスに習熟してください。

SSH 認証鍵を作成する

  1. ターミナル ウィンドウを開きます。

  2. workingdir という名前で新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir workingdir
    cd workingdir
    
  3. 新しい GitHub SSH キーを作成します。github-email は GitHub のメールアドレスです。

    ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
    

    このコマンドは、パスフレーズなしで新しい SSH 認証鍵 workingdir/id_github を作成します。SSH 認証鍵がパスフレーズで保護されている場合、Cloud Build はその鍵を使用できません。

シークレット マネージャーに秘密 SSH 認証鍵を保存する

SSH 認証鍵を作成すると、環境内に id_github ファイルが作成されます。誰でもこのファイルでアカウントを認証できるため、ビルドで使用する前にファイルをシークレット マネージャーに保存する必要があります。

  1. シークレット マネージャーに SSH 認証鍵を保存するには:

    1. Cloud Console の [シークレット マネージャー] ページに移動します。

      シークレット マネージャー ページに移動

    2. [Secret Manager] ページで、[シークレットを作成] をクリックします。

    3. [シークレットの作成] ページの [名前] に「secret-name」と入力します。

    4. [シークレット値] フィールドで [アップロード] をクリックし、workingdir/id_github ファイルをアップロードします。

    5. [リージョン] セクションは変更しません。

    6. [シークレットを作成] ボタンをクリックします。

これにより、id_github ファイルがシークレット マネージャーにアップロードされます。

公開 SSH 認証鍵を非公開リポジトリのデプロイキーに追加する

  1. GitHub にログインします。

  2. 右上にあるプロフィール写真をクリックし、[プロフィール] をクリックします。

  3. プロフィールページで [リポジトリ] をクリックし、リポジトリの名前をクリックします。

  4. リポジトリで [設定] をクリックします。

  5. サイドバーで [Deploy Keys] をクリックし、[Add deploy key] をクリックします。

  6. タイトルを入力し、workingdir/id_github.pub の公開 SSH 認証鍵を貼り付けます。

  7. このキーにリポジトリへの書き込みアクセス権を付与する場合は、[Allow write access] を選択します。書き込みアクセス権を持つデプロイ鍵を使用すると、デプロイからリポジトリに push できます。

  8. [キーを追加] をクリックします。

  9. ディスクから SSH 認証鍵を削除します。

    rm id_github*
    

権限を付与

Cloud Build サービス アカウントに、ビルド中にシークレット マネージャーにアクセスする権限を付与する必要があります。

  1. Cloud Console で IAM ページを開きます。

    [IAM] ページを開く

  2. プロジェクトを選択し、[開く] をクリックします。

  3. 権限の表で、末尾が @cloudbuild.gserviceaccount.com のメールアドレスを見つけて、鉛筆アイコンをクリックします。

  4. Secret Manager Secret Accessor ロールを追加します。

  5. [保存] をクリックします。

公開 SSH 認証鍵を既知のホストに追加する

ほとんどのマシンには、リモートホスト用の既知のキーを含む known_hosts という名前のファイルがあります。多くの場合、このキーは初めてリモートホストに接続するときに回収されますが、手動で追加することもできます。このファイルのキーは、リモートホストの ID を確認し、なりすましから保護するために使用されます。

Cloud Build が GitHub に接続するには、Cloud Build のビルド環境の known_hosts ファイルに公開 SSH 認証鍵を追加する必要があります。これを行うには、キーを一時的な known_hosts.github ファイルに追加し、known_hosts.github の内容を Cloud Build のビルド環境の known_hosts ファイルにコピーします。

workingdir ディレクトリに known_hosts.github という名前のファイルを作成し、このファイルに公開 SSH 認証鍵を追加します。

ssh-keyscan -t rsa github.com > known_hosts.github

ビルドを構成する次のセクションで、known_hosts.github の内容を Cloud Build のビルド環境の known_hosts ファイルにコピーする手順を Cloud Build 構成ファイルに追加します。

ビルドを構成する

ビルドを構成するには:

  1. cloudbuild.yaml という名前のビルド構成ファイルを 2 つのステップで作成します。最初のgcloud ステップで、Secret Manager の SSH 認証鍵にアクセスし、ssh というボリュームに id_rsa として known_hosts.github のコピーとともに保存します。ボリュームは、ビルドステップ全体でファイルを永続化するために使用されます。2 番目の git ステップで id_rsa の鍵を使用し、git@github.com:git-username/git-repository のリポジトリに接続します。

    # Access the id_github file from Secret Manager, and setup SSH
    steps:
    - name: 'gcr.io/cloud-builders/git'
      secretEnv: ['SSH_KEY']
      entrypoint: 'bash'
      args:
      - -c
      - |
        echo "$$SSH_KEY" >> /root/.ssh/id_rsa
        chmod 400 /root/.ssh/id_rsa
        cp known_hosts.github /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Clone the repository
    - name: 'gcr.io/cloud-builders/git'
      args:
      - clone
      - --recurse-submodules
      - git@github.com:GIT_USERNAME/GIT_REPOSITORY
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/secret-name/versions/latest
        env: 'SSH_KEY'
    

上記のコマンドのプレースホルダ値を次のように置き換えます。

  • PROJECT_ID: シークレットを保存している Cloud プロジェクトの ID。
  • GIT_USERNAME: リポジトリ オーナーの GitHub ユーザー名。
  • GIT_REPOSITORY: アクセスしたい GitHub リポジトリの名前。

上記のスニペットで使用されている YAML の複数行文字列については、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/cloud-build/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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

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

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

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

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

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

リポジトリからデプロイ鍵を削除する

  1. GitHub で、リポジトリのメインページに移動します。

  2. リポジトリ名の下にある [設定] をクリックします。

  3. 左側のサイドバーで [キーをデプロイ] をクリックします。

  4. [キーをデプロイ] ページで、リポジトリに関連付けられているデプロイキーを探し、[削除] をクリックします。

次のステップ