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

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

目標

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

費用

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

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

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

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

始める前に

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

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

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

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

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

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

    API を有効にする

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

SSH 認証鍵を作成する

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

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

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

    ssh-keygen -t rsa -b 4096 -C github-email
    
  4. キーの保存先ファイルの入力を求められたら、「id_github」と入力します。これによって、新しい SSH 認証鍵 workingdir/id_github が作成されます。

  5. パスフレーズを入力するよう求められたら、空のままにして Enter キーを押します。これにより、SSH 認証鍵のパスフレーズは設定されません。パスフレーズで保護されていると Cloud Build が SSH 認証鍵を使用できなくなります。

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

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

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

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

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

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

    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 という名前のビルド構成ファイルを 3 つのステップで作成します。最初のgcloud ステップで、シークレット マネージャーの SSH 認証鍵にアクセスし、ssh というボリュームに保存します。ボリュームは、ビルドステップ全体でファイルを永続化するために使用されます。2 番目の git ステップでは、known_hosts.github から known_hosts に鍵をコピーして SSH 認証鍵を使用するように git を構成します。最後に、git ステップで known_hosts の鍵を使用し、git@github.com:git-username/git-repository のリポジトリに接続します。

    # Access the id_github file from Secret Manager
    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', 'gcloud secrets versions access latest --secret=secret-name > /root/.ssh/id_github' ]
      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_github
        cat <<EOF >/root/.ssh/config
        Hostname github.com
        IdentityFile /root/.ssh/id_github
        EOF
        ssh-keyscan -t rsa github.com > /root/.ssh/known_hosts
      volumes:
      - name: 'ssh'
        path: /root/.ssh
    
    # Connect to 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
    

ここで

  • 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/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. Cloud Console で [リソースの管理] ページに移動します。

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

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

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

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

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

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

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

次のステップ