文章段落
上一回教大家使用 Cloud Armor 阻擋 DDoS攻擊,已經可以成功阻擋來自奇奇怪怪國家的駭客,這一次要分享更猛的應用 Cloud IAP。
Cloud IAP 是在 BeyondCorp 框架底下的一個重要實做 (BeyondCorp介紹),它可以做到連線到網站時就有身分驗證,接下來會確認使用者的情境,例如從哪一個IP連線、從哪一個國家、手機有沒有設密碼等等,最後再放行到應用程式。它真的管到海邊,如果公司連裝置都納入管理 (Google Workspace/Cloud Identity的裝置管理),那就是所有 BeyondCorp 的功能都實現了。

等於光是簡單造訪一個網站就會碰到重重關卡,把DDoS攻擊遠遠拋開,真的是非常強悍的功能!
我們現在就來按照步驟來設定吧!我是參考這份文件來做的:https://cloud.google.com/iap/docs/tutorial-gce
建立新的 VPC 網路 (Virtual Private Cloud Network)
先建立一個 VPC 網路 ,為什麼呢?因為它會影響到原有的主機網路環境,所以把你的測試環境獨立出來,才不會互相影響。

建立執行個體範本 (Instance Template)
因為要有一個測試網頁,所以要先把程式放在範本的 startup scripts裡面,這樣它開機時會自動把網頁寫好:

設定存取權限

接下來要貼上範例程式碼到 startup scripts (程式碼也是來自同一份文件)

都做完後按下「建立」。
建立執行個體群組 (Instance Group)
接下來建立執行個體群組,就是用那範本來開機器的意思。

設定 AutoScale,本範例最小開3台,最多開10台。

設定網域取得憑證
接下來比較麻煩,要設定網域去拿到憑證,我們要先開一台機器去取得憑證:
照文件說明,選 Debian 9 ,其他規格任選:

OK的話按下建立。
記下Certbot的IP位址:(該IP已釋放掉, 機器也刪了,所以大家經看不到網站了 XD)

我目前的網域是在 Godaddy 代管,去設定一下(我是用子網域):

接下來 SSH 進去那台機器,輸入以下指令
mkdir web
cd web
echo “Hello” > index.html
sudo busybox httpd -v -f

確認一下網頁是否正常

開始建立憑證,在VM輸入以下指令:
sudo pkill busybox
sudo apt-get install -y certbot
sudo certbot certonly –standalone -d iap.yourdomain.com
安裝畫面:

建立憑證(輸入網域):

恭喜完成!

加入憑證,輸入以下指令:
sudo su
cd /etc/letsencrypt/live/iap.yourdomain.com
gcloud compute ssl-certificates create my-cert –certificate=fullchain.pem –private-key=privkey.pem
真的有這目錄好神奇:

建立成功:

建立負載平衡 HTTP(S) Load Balancer
選HTTP(S) Load Balancer,接收 internet 進來的流量:

接收 internet 進來的流量到Load Balancer

接下來建立後端服務,讓Load Balancer導流量到VM

如果你是照 Google 提供的文件操作,Backend Name 不能亂打,會錯,要打 my-backend-service:

設定 Health Check

Host and path rules 保持預設

再來前端保留一個靜態 IP

確認前端設定

確認一下,無誤就按下 Create

等2分鐘 Load Balancer 建立後,把 LB 的 IP 位址複製起來:

改到原本 DNS 設的 IP:

需要等個幾分鐘,讓 DNS 同步出來。
接下來開瀏覽器連線一下,這樣算成功!(不要懷疑)

根據 Google 的文件是這樣說的:

好,即將要設 Cloud IAP 本人了,要先重開 instance group:

選 Restart,這樣它會把整個 instance group 所有機器重開。

設定允許 Cloud IAP 的防火牆規則
設定 IAP 之前,要先設定允許 IAP IP 位址的防火牆規則,提供最重要的 IP 範圍如下:

設定 Cloud IAP
前面設了一大堆,終於進入 IAP 的設定頁面了!

在 HTTPS RESOURCES 底下看到一個 my-backend-service ,就是我們在設定 Load Balance 後端服務時所設定的名稱。
啟動 IAP,把這個開關打開:

IAP 啟動確認畫面

看到 Warning 點進去,查看 IAP 建立的警告訊息:

它有說這條規則會繞過 Cloud IAP, 所以要移除是對的,因為之前是要先確認 80 port 能看得到網頁,現在移除是沒問題的因為之後就從 IAP 進去VM。(所以最前面才強調你要用不同的 VPC,因為 Allow HTTP的規則一刪,如果沒有 IAP 的VM 完全不能存取了)
現在就刪除防牆規則

打開 Show Info Panel設定 Cloud IAP 使用者權限:

授權能造訪網頁的使用者,提供 IAP-secured Web App User。

設定存取層級 (Access Level)
選好之後還有 Access Level

可以先到這裡設定

各位可以看到,我有一個 “test” 的 Access Level,是只允許單一IP連線;而”test2″則是允許來自台灣的IP都可以連線:

再回來 IAP 授權可存取的User,這裡指的是有 Google Workspace / Cloud Identity 的使用者 (也能用 Gmail 帳號),如果使用者太多,不方便一個一個授權的話,也可以用群組來授權。
還可以發通知信給 User,好貼心!

這是信件內容,代表使用者可以造訪這個網站了

當我在瀏覽器輸入 iap.yourdomain.com ,會看到:

如果我的帳號有啟用兩步驟驗證 (Google Workspace管理員可以強制啟用喔),會看到像這樣,完全不用擔心帳號被盜用:

驗證成功會看到網頁,代表 Cloud IAP 設定成功。

終於完成了,步驟真的有點多啊~但是只要設定好,之後就不怕網路上各種奇怪的流量了!