存取私人的 GitHub 存放區

本教學課程示範如何使用經加密的密鑰Cloud Key Management Service (KMS) 與私人 GitHub 存放區互動。

課程目標

  • 設定 GitHub 安全殼層 (SSH) 金鑰組。
  • 將安全殼層 (SSH) 金鑰組新增至私人存放區的部署金鑰。
  • 使用 Cloud KMS 加密安全殼層 (SSH) 金鑰組。
  • 提交建構以解密金鑰,並使用該金鑰存取私人存放區。

費用

本教學課程使用的 Cloud Platform 可計費元件包括:

  • Cloud KMS
  • Cloud Build

使用 Pricing Calculator 可根據您的預測使用量來產生預估費用。

新加入 Cloud Platform 的使用者可能符合免費試用的資格。

事前準備

  1. 登入您的 Google 帳戶。

    如果您沒有帳戶,請申請新帳戶

  2. 選取或建立 Google Cloud Platform 專案。

    前往「Manage resources」(管理資源) 頁面

  3. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

  4. 啟用 Cloud KMS API。

    啟用 API

  5. 安裝並初始化 Cloud SDK
  6. 為 GitHub 建立安全殼層 (SSH) 金鑰組
  7. 將部署金鑰新增至私人存放區

另外建議您完成 Cloud KMS 快速入門導覽課程,熟悉一下本產品。

建立 Cloud KMS 金鑰環與加密編譯金鑰

如要將安全殼層 (SSH) 金鑰組與 Cloud Build 搭配使用,您必須使用 Cloud KMS 加密編譯金鑰加密及解密金鑰。加密編譯金鑰儲存於金鑰環物件中。

您可以使用 gcloud kms keyrings creategcloud kms keys create 指令建立金鑰環與加密編譯金鑰。

如要建立金鑰環,請在殼層或終端機視窗中執行以下指令。為達到本教學課程的目的,請將金鑰環命名為 my-keyring

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

接下來,建立名為 github-key 的加密編譯金鑰。下列指令會在 my-keyring 金鑰環中建立 github-key 加密編譯金鑰:

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 檔案

您提供的 known_hosts 檔案必須包含 github.com 適用的 rsa 金鑰。

如要建立 known_hosts 檔案,請執行下列指令:

ssh-keyscan -t rsa github.com > known_hosts

準備建構

如要準備建構,請在您的環境中建立包含下列內容的新目錄:

  • id_rsa.enc 檔案
  • known_hosts 檔案
  • 建構要求 YAML 檔案

下列建構會解密安全殼層 (SSH) 金鑰組、將 git 設定為使用安全殼層 (SSH) 金鑰組,並在 git@github.com:[GIT-USERNAME]/[REPOSITORY] 複製存放區。

變更存放區預留位置值後,將下列範例建構儲存為 cloudbuild.yaml

cloudbuild.yaml

# 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

# Use git clone.
- name: 'gcr.io/cloud-builders/git'
  args:
  - clone
  - git@github.com:[GIT-USERNAME]/[REPOSITORY]
  volumes:
  - name: 'ssh'
    path: /root/.ssh

提交建構

如要提交建構,請從包含 id_rsa.enc 檔案、known_hosts 檔案與 cloudbuild.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 主控台的「Projects」(專案) 頁面。

    前往專案頁面

  2. 在專案清單中選取要刪除的專案,然後按一下 [Delete] (刪除)
  3. 在對話方塊中輸入專案 ID,按一下 [Shut down] (關閉) 即可刪除專案。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Build Documentation