# 技術班課後作業 HW 1 繳交期限 12/18 ## 作業內容 ### 1. 成員資源: * cloud_identity_A(user數字小的) 與cloud_identity_B(user數字大的) 兩 個Google Account * 一個組織下的 Folder * 一個Billing Account 的 User ### 2. 賦予權限: * 使用cloud_identity_A,在自己的folder (名稱為 lab-20231205-esun-userXX)給予cloud_identity_B相關IAM權限 * 給予IAM權限為Folder Viewer & Project Creator * 到cloud_identity_B介面查看是否有該folder ### 3. 專案建立與Billing Account設定(建議使用不同瀏覽器的隱私權視窗操作) * 使用cloud_identity_A 建立一個專案(Project_A) * 專案名稱和專案ID請使用[cloud_identity_a]-pa-[mmdd] * 例如如果你的cloud_identity_a 是demo@example.com,專案請 命名為demo-pa-1205 * 放在指定的Folder 內 * Link 到指定的Billing Account * 使用cloud_identity_B 建立一個專案(Project_B) * 專案名稱和專案ID請使用[cloud_identity_b]-pa-[mmdd] * 例如如果你的cloud_identity_b 是demo2@example.com,專案 請命名為demo2-pa-1205 * 放在指定的Folder 內 * Link 到指定的Billing Account #### [問題] 1. Project_A 和Project_B的project number、project name、 project Id 各是什麼? 哪些可以自訂? | | project name | project id | project number | | -------- | -------- | -------- | -------- | | project A |esun-user10-pa-1211 | esun-user10-pa-1211 |474717663154 | | project B | esun-user40-pa-1211 | esun-user40-pa-1211 |1041788131944 | | 自訂義 |可自訂 | 可自訂 | 不可自訂 | | 命名規則 | 可以包含各種字符,通常是描述性名稱 | 需要是全局唯一的,通常是小寫字母、數字和連字符(-)的組合,長度必須在 6 到 30 個字符之間 | 系統配置 | | 用途 | 人類可讀的項目名稱,用於更清晰地標識項目 | GCP 中每個項目的唯一標識符 | GCP 中項目的唯一數字標識符,用於在 GCP 內部跟蹤和管理項目 | ### 4. 專案VPC 設置 * 如果專案內有default vpc * 查看default vpc 有多少subnet: 39 個 ![image](https://hackmd.io/_uploads/r10b6HoIT.png) * 查看default vpc 有哪些firewall rule ![image](https://hackmd.io/_uploads/ByhI6SjIT.png) * 刪除default vpc * 於Project_A 內,建立一個新的custome vpc (vpc-a),選擇手動建立 subnet模式,其他條件都使用預設條件 * 在vpc-a 中,於asia-east1 建立一個/20 的subnet (建議選擇 10.40.0.0/20) * 在vpc-a 中,於asia-east2 建立一個/20 的subnet (建議選擇 10.50.0.0/20) * 在vpc-a 中,於asia-souteast1 建立一個/20 的subnet (建議選擇 10.60.0.0/20) * 勾選啟用預設的SSH Port 22 的firewall rule * 其他條件都使用預設條件 * 選擇剛剛創建的vpc-a * 查看相關的subnet 設定 ![image](https://hackmd.io/_uploads/BJHKkLiUT.png) * 查看有開啟了那些firewall Rule ![image](https://hackmd.io/_uploads/S1HokUiUp.png) ### 5. 設定IAM 與建立VM * 於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 * 其他都使用預設條件 * 到vpc-a 中,查看現在有哪些firewall rule ![image](https://hackmd.io/_uploads/rypYEUoL6.png) * vm_pa_1 的network-tags有哪些? ![image](https://hackmd.io/_uploads/S1fL4Li8a.png) * 如何查看單一一台VM(例如vm_pa_1) 的NIC,有套用到那些firewall rule ? ![image](https://hackmd.io/_uploads/Sk7fNUoLp.png) * 新增一對ssh 的公私鑰,額外透過Project 層級的Compute Engine metadata,允許使用這把私鑰,透過ssh 程式(例如putty ),登入vm_pa_1 ,登入的帳號請取名為projectlogin 教學參考: https://medium.com/@kellenjohn175/explanation-gcp-%E6%96%B0%E6%89%8B%E6%9D%91-firewall-39cd71353b1 ``` # 打開 cloud shell ssh-keygen -t rsa -C projectlogin -b 4096 # 將公鑰 id_rsa.pu 放到 metadata > ssh keys # 連線: ssh -i ~/.ssh/id_rsa projectlogin@34.80.183.179 ``` * 幫這一台vm_pa_1,啟用OS Login功能(不用使用2FA) step: 1. 授予 Compute Engine default service account 權限:roles/compute.osLogin, roles/compute.osAdmin ![image](https://hackmd.io/_uploads/H1cOdvaIp.png) 2. vm-pa-1 新增 metadata: enable-oslogin: TRUE 3. login ``` gcloud config set auth/disable_credentials false gcloud compute ssh vm-pa-1 \ --project=esun-user10-pa-1211 \ --zone=asia-east1-b \ --impersonate-service-account=474717663154-compute@developer.gserviceaccount.com (不太清楚到底要不要加這個>< 沒加好像可以) ``` * 使用cloud_identity_B ,透過OS Login 登入vm_pa_1 [截圖] * [提示] 使用gcloud sdk (gcloud 指令來做os login) * [提示] 在Project_A 的專案層級通常要提供那些角色給 cloud_identity_B 才能使用OS Login 登入: compute_os_login, service_account_user * [問題] 基於最小權限原則,如何才能限縮cloud_identity_B 的權限 沒有給 compute_os_admin 就可以讓它沒有 sudo 權限 * [問題] 如果是沒有external IP 的主機,要如何登入 * [問題] cloud_identity_b 能夠sudo 嗎? ``` # 沒有 sudo 權限 esun_user40_demo_wsp_standard_re@vm-pa-1:~$ sudo -v Sorry, user esun_user40_demo_wsp_standard_re may not run sudo on vm-pa-1. ``` * 啟用OS Login後,本來的projectlogin 帳號還能透過本來的 sshkey 登入嗎? ``` # 不行用 本來的projectlogin 登入了! esun_user10@cloudshell:~ (esun-user10-pa-1211)$ ssh -i ~/.ssh/id_rsa projectlogin@34.80.183.179 projectlogin@34.80.183.179: Permission denied (publickey). ``` ### 6. 設定防火牆 * 調整防火牆設置,讓vm_pa_1 的80 與443 Port,僅能允許自己的外網IP 以及雲動力的IP 114.35.183.168 可以連線 step: vpc networks > fire wall > 選 vpa-a-allow-http, vpa-a-allow-https edit ![image](https://hackmd.io/_uploads/S1ynEHT8T.png) * 調整防火牆設置,讓vm_pa_1 的80與443 port,禁止所有10.80.0.0/20 的IP 連線過來 step: Firewall policies > create firewall rule > edit vm: vm_pa_1 加上 deny-http, deny-https network tag ![image](https://hackmd.io/_uploads/HyKOzB6UT.png) * 確認http://EIP_1 可以看到相關頁面。[截圖] ![image](https://hackmd.io/_uploads/By0N4STU6.png) ### 7. 創建Image 、Snapshot、開關機排程 * 幫vm_pa_1 建立Snapshot schedules * 週一~週五晚上10:00~11:00建立Snapshot * 超過7天自動刪除快照 參考:[備份 GCP 上 VM 的資料](https://blog.cloud-ace.tw/infrastructure/data-backup/how-to-backup-your-gcp-vm-easily-and-automatically-with-snapshot-schedule/) * 幫vm_pa_1 建立自動開關機的排程 * 週一~週五18:00以後自動關機 * 週一~週五09:00以後自動開機 * 週六與週日不自動開關機 ![image](https://hackmd.io/_uploads/BJvuUs2Ia.png) * 幫vm_pa_1 建立一個image,命名為image-vm-pa-1 * 區域選擇為multi regional Asia * 加上Label : Key 為project_a,Value 為image-vm-pa-1 ![image](https://hackmd.io/_uploads/HyulFohU6.png) * [問題] image, snapshot 的使用場景? ### 8. VPC Peering * 於Project_A 內,建立一個新的custom vpc,vpc-b,選擇手動建立 subnet模式,其他條件都使用預設條件 * 在vpc-b 中,於asia-southeast1 建立一個/20 的subnet (建議選 擇10.80.0.0/20) [截圖] ![image](https://hackmd.io/_uploads/HyDCYih8T.png) * 在vpc-a 與vpc-b中建立vpc peering,命名自訂外,選項都使用預設。[截 圖] ![image](https://hackmd.io/_uploads/SJchoo3U6.png) a->b, b->a 都要開唷!! ![image](https://hackmd.io/_uploads/SkfssYpI6.png) * 於vpc-b 中,建立一台e2-micro 的VM ( vm_pa_2),相關條件如下 * Zone : asia-southeast1-b * OS 與Boot Disk 為預設(Debian / 10G) * Firewall 請允許HTTP/HTTPS/Load Balancer Health Checks * 選擇使用vpc-b,並建立一個static external ip address ( EIP_2) 給這台VM * 幫這台VM,新增一個label, Key 為project_a,Value 為vm_pa_2 * 幫這台VM,新增一個network tag : asia-southeast1 * 新增metadata : key = startup-script-url , value = gs://cloud-training/gcpnet/httplb/startup.sh * 其他都使用預設條件 * 使用cloud_identity_B ,透過OS Login 登入vm_pa_2 [截圖] ![image](https://hackmd.io/_uploads/HyMVDdT8p.png) * 測試vm_pa_2 是否能ssh 到vm_pa_1 的internal_ip * 如果不行的話, * 測試vm_pa_2 能否curl 到vm_pa_1 的http://EIP_1 不行 * 測試vm_pa_2 能否curl 到vm_pa_1 的http://internal_ip/ 不行(因題六的fw要求被阻擋,加完fw後可curl 到10.40.0.2 LB http page) ![curl-http-from-vm-pa-2](https://hackmd.io/_uploads/BJ6AFqpLp.jpg) * 設置防火牆,讓vm_pa_2 無法存取到vm_pa_1 的22 port