# GCP 雲端技術實作班 Question 5 - 於 Project_A 中,建立一台 e2-micro 的 VM ( vm_pa_1),相關條件如下 - Zone : asia-east1-b - OS 與 Boot Disk 為預設 (Debian / 10G) - Firewall 請允許 HTTP/HTTPS/Load Balancer Health Checks - 選擇使用 vpc-a,並建立一個 static external ip address (EIP_1) 給這台VM - 幫這台VM,新增一個label, Key 為 project_a,Value 為 vm_pa_1 - 幫這台VM,新增一個network tag : asia-east1 - 新增 metadata : key = startup-script-url , value = gs://cloud-training/gcpnet/httplb/startup.sh - 其他都使用預設條件 - (4x)到 vpc-a 中,查看現在有哪些 firewall rule - (4x)vm_pa_1 的 network-tags有哪些 ? - (4x)如何查看單一一台VM(例如 vm_pa_1) 的NIC,有套用到那些 firewall rule? - (1t)新增一對 ssh 的公私鑰,額外透過 Project 層級的 Compute Engine Metadata,允許使用這把私鑰,透過 ssh 程式(例如 putty ),登入 vm_pa_1,登入的帳號請取名為 projectlogin - (1t)幫這一台 vm_pa_1,啟用 OS Login功能 (不用使用2FA) - 使用 cloud_identity_B ,透過 OS Login 登入 vm_pa_1[截圖] - (yc)[提示] 使用 gcloud sdk (gcloud 指令來做 os login) - https://cloud.google.com/sdk/docs/install-sdk?hl=zh-cn - (80)[提示] 在 Project_A 的 專案層級通常要提供那些角色給 cloud_identity_B 才能使用 OS Login 登入 - (80)[問題] 基於最小權限原則,如何才能限縮 cloud_identity_B 的權限 - (kw)[問題] 如果是沒有external IP 的主機,要如何登入 - (kw)[問題] cloud_identity_b 能夠 sudo 嗎? - (kw)啟用 OS Login後,本來的 projectlogin 帳號還能透過本來的 sshkey 登入嗎? ## 4X part ### 到 vpc-a 中,查看現在有哪些 firewall rule 開啟 "VPC " ![image](https://hackmd.io/_uploads/SkzdSi8Ip.png) 選擇 "vpc-a" ![image](https://hackmd.io/_uploads/HkM1UsU8a.png) 點開自己命名的防火牆規則 ![image](https://hackmd.io/_uploads/B137IjL8a.png) 大概說明一下 防火牆規則輸入和輸出要分開寫 前兩項是內部網路的規則 後4項是 blcok 一些高風險國家、惡意 IP、 tor ### vm_pa_1 的 network-tags有哪些 ? 點開 "computer engine" ![image](https://hackmd.io/_uploads/HyviOjUIa.png) 點開 "vm_pa_1" ![image](https://hackmd.io/_uploads/BJgeYsLLp.png) 可以看到剛剛設定的 tag ,"asia-east1"、"lb-health-check" ### 如何查看單一一台VM(例如 vm_pa_1) 的NIC,有套用到那些 firewall rule? 點開網路介面 ![image](https://hackmd.io/_uploads/BJLyhhULa.png) 點開 "nic0" ![image](https://hackmd.io/_uploads/Sklf3nIUa.png) 就可以看到防火牆資料 "a" ## 1t part ### 新增一對 ssh 的公私鑰,額外透過 Project 層級的 Compute Engine Metadata,允許使用這把私鑰,透過 ssh 程式(例如 putty ),登入 vm_pa_1,登入的帳號請取名為 projectlogin 1. 新增一對 ssh 公私鑰 > -C is comment. Please read below portion to understand significance of comment. > ssh-keygen will by default write keys in an OpenSSH-specific format. This format is preferred as it offers better protection for keys at rest as well as allowing storage of key comments within the private key file itself. The key comment may be useful to help identify the key. The comment is initialized to “user@host” when the key is created, but can be changed using the -c option. ``` ssh-keygen -t rsa -f ~/.ssh/test-gcp-ssh-key -C projectlogin ``` ``` cat ~/.ssh/test-gcp-ssh-key.pub ``` output: ``` ssh-rsa AAAAB3NzaC1yc2EAAAADA...1NSZKPTKkfSM= projectlogin ``` 選擇 SSH KEYS,加上面的 public key 貼上 ![image](https://hackmd.io/_uploads/S1-a4oHL6.png) ![image](https://hackmd.io/_uploads/r1PoPsHLT.png) ``` ssh -i ~/.ssh/test-gcp-ssh-key projectlogin@[IP] ``` ![image](https://hackmd.io/_uploads/Bk1vHjB8p.png) ### 幫這一台 vm_pa_1,啟用 OS Login功能 (不用使用2FA) ![image](https://hackmd.io/_uploads/SkP5XsrIT.png) metadata 加 enable-oslogin: True ![image](https://hackmd.io/_uploads/Hy-GIiSIp.png) > 之後可以直接利用這個進行開關 官方網站:https://cloud.google.com/compute/docs/oslogin ## YC part ### 事前準備 * GCP 帳號 * GCP Project , Project 需啟用 billing ### 安裝 gcloud CLI 目前支援 Linux 、Debian/Ubuntu 、Red Hat/Fedora/CentOS、macOS、Windows、Chromebook 以上作業系統安裝 以下以 Windows 為例 1. 下載 Google Cloud CLI installer (https://cloud.google.com/sdk/docs/install-sdk?hl=zh-cn#installing_the_latest_version) 2. 啟動 installer 來安裝 ![image](https://hackmd.io/_uploads/rJX6Z4tU6.png) ### gcloud CLI 初始設定 如果使用 installer 安裝,則在最後的畫面(上個步驟的最後一張圖)可以勾選直接啟動 Google Cloud SDK Shell 並執行 gcloud init 來執行初始設定 ![image](https://hackmd.io/_uploads/SkqV2VY8T.png =50%x) 按下 finish 之後就會出現CMD,並詢問是否要登入(必須登入才能做後續的動作) ![image](https://hackmd.io/_uploads/rkFgpNYUT.png) 回復 'Y' 後就會跳出瀏覽器要求登入並授權 ![image](https://hackmd.io/_uploads/SylNa4KLp.png) 在完成登入後就可以開始 (1) 選擇 cli 要使用的 project ![image](https://hackmd.io/_uploads/SJfYp4FIp.png =75%x) (2) 是否要指定 Google Compute Engine zone ![image](https://hackmd.io/_uploads/ByTr0VKUp.png =120%x) 最後就設定完成可以用了! ![image](https://hackmd.io/_uploads/HJWiRNYLp.png) 可以透過 `gcloud config list` 來看目前的設定 ![image](https://hackmd.io/_uploads/H1_q1SK8p.png =75%x) ### 使用 gcloud CLI 來管理資源 所有 command 可參考: https://cloud.google.com/sdk/gcloud/reference #### command的組成: ![image](https://hackmd.io/_uploads/HkbUBSKI6.png) * GROUP : 管理的資源,每個大項資源下都有小資源,有種階層的感覺 * ![image](https://hackmd.io/_uploads/Syy0APtUp.png) * COMMAD : 要對該資源做的動作 * 後面接一堆 flag 來做更詳細的設定 #### 以創建 instance 為例 ##### command 組成 `gcloud compute instances create INSTANCE_NAMES [FLAG …]` * GROUP: 要操作的資源是 instance ,而 instance 是 compute 底下的資源,因此 GROUP 從左到右為 compute instance * COMMAND: 要操作的動作是創建,所以是 create * FLAG 有這麼多: ![image](https://hackmd.io/_uploads/S1qiCUYI6.png =75%x) 可自行參考 (https://cloud.google.com/sdk/gcloud/reference/compute/instances/create)` * INSTANCE_NAMES 就是 instance 的名字 ##### Flag 的選擇 以下會提到基本的 flag 來創建 instance **A. --image / --image-family** * 選擇 instance 要使用的映像檔 * 可透過 `gcloud compute images list` 來查看有哪些映像檔可使用 * ![image](https://hackmd.io/_uploads/SJbN4PFUT.png =75%x) **B. --image-project** * image 所在的 project,通常與 --image/--image-family 一起指定 * 依樣透過 `gcloud compute images list` 可查看 **C. --machine-type** * 若用 UI 啟動 instance 的話,--machine-type 會在以下畫面選擇 ![image](https://hackmd.io/_uploads/H1cVrwFLp.png =75%x) * 可透過 `gcloud compute machine-types list `查看有哪些機客類別能用 * 加 `--zones=aisa-east1-b` 這個 flag 可以指定列出某區域可用的機器類別 * ![image](https://hackmd.io/_uploads/BkqNwPFL6.png =75%x) **D. --metadata** * 讓instance VM 的 guest OS 可以使用 metadata * 例如 若要啟用 OS login 則需要 enable-oslogin=TRUE 這個 metadata **E. --metadata-from-file** * 以 file 的方式 assign metadata * 使用場景 ex: 加入 public key **F. --labels** * key :開頭只能是小寫英文字 ,內容只能是 小寫英字, - , _ , 數字 * values: 內容只能是 小寫英字, - , _ , 數字 **G. --tags** * 可以讓網路防火牆規則與路由 assign 給指定的 instance * EX: * 在用 UI 創建 instance 的時候可以直接在防火牆的欄位勾選允許HTTP/HTTPS流量 * ![image](https://hackmd.io/_uploads/SyUN3RKIp.png) * 若要用 cli 創建 instance 也希望有那三個的設定時,可以加上以下幾個tag: * http-server 、 https-server 、lb-health-check **H. --boot-disk-size** * 指定開機磁碟的大小 * 單位為 KB , GB , TB **I. --network** * 指定使用的VPC **J. --subnet** * 如果有指定VPC就要用這個指定subnet * UI 有寫指定VPC有甚麼subnet * ![image](https://hackmd.io/_uploads/BJGyyttU6.png) ##### 最終的 command public key 的位置換上自己的即可 ``` gcloud compute instances create vm-pa-1 --image-family=debian-12 --image-project=debian-cloud --machine-type=e2-micro --metadata enable-oslogin=TRUE,startup-script-url=gs://cloud-training/gcpnet/httplb/startup.sh --labels project_a=vm_pa_1 --tags=asia-east1,http-server,https-server,lb-health-check --boot-disk-size=10GB --network=vpc-a --subnet=subnet-a ``` 執行後 CLI: ![image](https://hackmd.io/_uploads/B1gbRwKUa.png) UI: ![image](https://hackmd.io/_uploads/BJduTvFUa.png) #### firewall * --target-tags=要應用在哪個instance上 gcloud compute firewall-rules create allow-http-https --allow tcp:80,tcp:443 --target-tags=asia-east1 #### OS login 1. 在 gcloudinit 的時候以cloud_identity_B登入 * `gcloud auth login [ACCOUNT]` 2. 以 OS login 登入: * command: `gcloud compute ssh --project=PROJECT_ID VM_NAME` * ssh 密鑰不用自行產生即可以ssh連線:![image](https://hackmd.io/_uploads/r1qPwRFLp.png) ## 80 Part ### [提示] 在 Project_A 的 專案層級通常要提供那些角色給 cloud_identity_B 才能使用 OS Login 登入![image](https://hackmd.io/_uploads/B1TBDmuIT.png) - 在 IAM&Admin 中的 IAM 裡,Grant Permission(Compute OS Login) 給 cloud_identity_B![image](https://hackmd.io/_uploads/rkbPI7O8T.png) - 在 IAM&Admin 中的 Service Account 裡,Grant vm_pa_1 的 service account 給 cloud_identity_B![image](https://hackmd.io/_uploads/HJO08X_Ia.png) - pricing - ![image](https://hackmd.io/_uploads/r1cZumdLT.png) ### [問題] 基於最小權限原則,如何才能限縮 cloud_identity_B 的權限 - Grant "Compute OS Login Admin" Role to cloud_identity_B 的話,OS Login 進入 VM 之後會有 sudo 權限, "Compute OS Login" 則不會有。 - 看 Document 說若 user 有 compute.project.get 權限也可以使用 ![image](https://hackmd.io/_uploads/SkeifIdUa.png) - 但好像不只要這個 - ![image](https://hackmd.io/_uploads/B1_lYuKIa.png) ## Kiwi part >> 我的 project id 有點特殊 ![image](https://hackmd.io/_uploads/SyMSQ368a.png) ### [問題] 如果是沒有external IP 的主機,要如何登入 TL;DR https://cloud.google.com/compute/docs/connect/ssh-internal-ip 如果 GCP 沒有 external IP 的主機, Cloud SDK 會自動為您建立一個 TCP 通道,並使用您的 Cloud IAP 憑證進行身份驗證。您可以使用這個 TCP 通道來連接到您的 VM。 ![auto-create-iap-tunnel](https://hackmd.io/_uploads/BJlcjjT8a.png) #### step1. Close external IP by gcloud https://cloud.google.com/sdk/gcloud/reference/compute/instances/delete-access-config 1. 先用 gcloud 查看目前的 `networkInterfaces.accessConfig` ```bash! gcloud compute instances describe vm-pa-1 ``` ![check-accessconfig-enable](https://hackmd.io/_uploads/ByUZ3oTIa.png) 2. 關閉 external IP (或稱 acceeConfig) > 如果你查看的 access config 不是`external-nat`,需要特別加 `--access-config-name` ```bash! gcloud compute instances delete-access-config vm-pa-1 --access-config-name="External NAT" ``` ![disable-accessconfig](https://hackmd.io/_uploads/r11ihj6L6.png) 3. 查看目前的 `networkInterfaces.accessConfig` ![check-accessconfig-disable](https://hackmd.io/_uploads/SyzjjjpU6.png) #### Step2. Setting IAM 0. 遇到 permission denied ```bash! # login permission denied gcloud compute ssh vm-pa-1 --project=esun-user44-pa-1205 --zone=asia-east1-b --tunnel-through-iap # troubleshoot gcloud compute ssh vm-pa-1 --project=esun-user44-pa-1205 --zone=asia-east1-b --tunnel-through-iap ``` ![permission-denied](https://hackmd.io/_uploads/SkjLGna86.png) 1. 需要額外開權限 `Network Management Viewer` ![image](https://hackmd.io/_uploads/Bke9-Gh686.png) #### Step2. ssh using iap https://cloud.google.com/compute/docs/connect/ssh-using-iap 通過 IAP TCP 轉發 1. 建立加密隧道 2. 通過該隧道可以將 SSH 連接轉發到 instnace 3. 連接到使用 IAP 的 VM 時,IAP 會先將 SSH 連接包裝在 HTTPS 中 4. 將連接轉發到 VM 3. IAP 會檢查您是否具有所需的 IAM 許可權,如果具有,則授予對 VM 的訪問許可權。 強制使用 iap ```bash! gcloud compute ssh vm-pa-1 --tunnel-through-iap ``` ![user44-login-user14](https://hackmd.io/_uploads/HyMkXnaU6.png) #### 注意項目 - Compute Engine 上提供的所有公共 Linux 映像都支援這些連接方法。但針對 Fedora CoreOS image,你必須先設定 [fedora SSH-access](https://docs.fedoraproject.org/en-US/fedora-coreos/tutorial-containers/) 才能使用 - 若無法使用 iap 的話,請查看[Connection options for internal-only VMs.](https://cloud.google.com/compute/docs/connect/ssh-internal-ip) - 需要確定 firewall 有開啟 - 需要確定你具備身份,能通過 Google Cloud services 和 APIs ### [問題] cloud_identity_b 能夠 sudo 嗎? Grant “Compute OS Login Admin” Role to cloud_identity_B 的話,OS Login 進入 VM 之後會有 sudo 權限, “Compute OS Login” 則不會有。 ![image](https://hackmd.io/_uploads/Syfzr3pIp.png) #### Role: `Compute OS Login` not sudo user ![non-sudo-user](https://hackmd.io/_uploads/Sy4_Q3TIT.png) #### Role: `Compute OS Admin Login` ![sudo-user](https://hackmd.io/_uploads/SyK9r3aLa.png) ### 啟用 OS Login後,本來的 projectlogin 帳號還能透過本來的 sshkey 登入嗎? 不行 #### OSLogin = True 設定 `metadata=enable-oslogin=TRUE` ```bash! gcloud compute instances add-metadata vm_pa_1 --metadata=enable-oslogin=TRUE ``` ![metadata-enable-oslogin](https://hackmd.io/_uploads/S1X6bcAUp.png) 嘗試用 ssh 連接,無法登入 ![ssh-cannot-connect](https://hackmd.io/_uploads/SJFaZc08T.png) #### OSLogin = False 1. 設定 `metadata=enable-oslogin=FALSE` ```bash! gcloud compute instances add-metadata vm_pa_1 --metadata=enable-oslogin=FALSE ``` 3. 嘗試用 ssh 連接(external ip),可以登入 ![image](https://hackmd.io/_uploads/SynffqR8a.png) 4. 用 gcloud compute ssh 登入 (external IP enabled) ![image](https://hackmd.io/_uploads/BkKLFiCUa.png) ![image](https://hackmd.io/_uploads/SkBPKoRLT.png) 4. 用 gcloud compute ssh 登入 (external IP disable) ![image](https://hackmd.io/_uploads/BkY0ciCU6.png) Additional: what happend if dont grant serviceaccountuser to cloud_identity_b ![cloud-userb-dont-have-sa-user](https://hackmd.io/_uploads/BkhOYyJvp.png)