Identity-Aware Proxy (IAP) 支援 Non-web Client/Server 應用程式

Nick Cheng
8 min readFeb 14, 2023

--

Background

企業導入零信任存取控制,應用程式端除了常見網頁應用程式以外,仍有許多Client/Server 使用情境,例如使用者需要使用SQL Client 連接後臺DB或是使用SSH/RDP 連到VM。

BeyondCorp Enterprise 除了支援網頁應用程式以外,也可以支援Client/Server 的應用程式,以下說明對應架構及設定步驟。

架構圖

  1. 透過Site to Site VPN或專線連接GCP 雲端及地端
  2. 用戶端(Client) 使用TCP Tunnel 連接到Identity-Aware Proxy (IAP)
  3. IAP 驗證使用者帳戶及存取權限
  4. 通過驗證後允許用戶存取應用程式
IAP Architecture for Client/Server Applications

設定步驟

  1. 建立混合雲網路連接 (S2S VPN / Interconnect)
    透過Cloud VPN或專線連接GCP 和地端 (混合雲)或是GCP和其他雲平台(多雲)。記得在GCP 設定BGP 路由時,將IAP使用的網段(35.235.240.0/20) advertise 到地端或其他雲端
  2. 建立Destination Group (將應用程式以Destination Group 進行定義,每一個Destination Group 代表一個應用程式)
gcloud iap tcp dest-groups create <DEST_GROUP_NAME> \
--region=asia-east1 \
--ip-range-list=<IP_RANGE_LIST> \
--fqdn-list=<FQDN_LIST>
  • region 選擇最接近地端的GCP 機房,例如地端在台灣,region 就選擇GCP 台灣機房 (asia-east1)
  • IP _RANGE_LIST: 使用CIDR 格式(e.g. 10.1.2.0/24),如有多個CIDR,以逗點分隔
  • FQDN_LIST: 支援wildcard 格式 (e.g. *.internal.company.com),如有多個FQDN domain,以逗點分隔

3. (Optional) 列出已經建立的Destination Group

gcloud iap tcp dest-groups list \
--region=asia-east1

3. 授予使用者使用IAP Tunnel 的權限

授權使用者群組 (建議作法)

gcloud iap tcp dest-groups add-iam-policy-binding \
--member='group:<Group-Email-Account>' \
--role=roles/iap.tunnelResourceAccessor \
--dest-group=<GROUP_NAME> \
--region=asia-east1
  • GROUP-NAME: 授權使用者可以存取的Destination Group
  • Group-Email-Account: 要授權可以存取指定Destination Group 的使用者群組帳號

授權單一使用者

gcloud iap tcp dest-groups add-iam-policy-binding \
--member='user:<User-Email-Account>' \
--role=roles/iap.tunnelResourceAccessor \
--dest-group=<GROUP_NAME> \
--region=asia-east1

(Optional) 列出指定Destination Group 已經授權哪些使用者存取

gcloud iap tcp dest-groups get-iam-policy-binding \
--dest-group=<GROUP_NAME> \
--region=asia-east1

(Optional) 移除使用者權限

gcloud iap tcp dest-groups remove-iam-policy-binding \
--member='group:<Group-Email-Account>' \
--role=roles/iap.tunnelResourceAccessor \
--dest-group=<GROUP_NAME> \
--region=asia-east1

(Optional)使用 — condition 指定使用者的存取條件 (e.g. 時間、來源IP、來源國家)

condition 規則參考文件:https://cloud.google.com/iam/docs/conditions-overview#request_attributes

  • Tunnel 使用權限在指定時間後到期
gcloud iap tcp dest-groups add-iam-policy-binding \
--member='group:<Group-Email-Account>' \
--role=roles/iap.tunnelResourceAccessor \
--dest-group=<GROUP_NAME> \
--region=asia-east1 \
--condition='expression=request.time < timestamp("2023-03-01T00:00:00Z"),title=expires_end_of_Feb_2023'
  • 使用者必須來自公司IP才能建立Tunnel
gcloud iap tcp dest-groups add-iam-policy-binding \
--member='group:<Group-Email-Account>' \
--role=roles/iap.tunnelResourceAccessor \
--dest-group=<GROUP_NAME> \
--region=asia-east1 \
--condition='expression="accessPolicies/xxxxxx/accessLevels/Come-from-Company-Network" in request.auth.access_levels,title=allow_access_from_company_network'

access policy 的建立可以參考這個文件,Access Policy的完整路徑可以透過這個網址取得 (https://console.cloud.google.com/security/access-level?authuser=1&organizationId=xxx),請將xxx改成你的組織ID

4. 建立IAP Tunnel

本機端Listen 8022 port,並建立Tunnel 透過GCP連到地端的VM (10.100.1.4)的22 port

gcloud compute start-iap-tunnel 10.100.1.4 22 \
--local-host-port=localhost:8022 \
--region=asia-east1 \
--dest-group=<DEST-GROUP> \
--network=<VPC-NAME>
  • <DEST-GROUP>: 要連接的Destination Group
  • <VPC-NAME>: 和地端連接VPC 的名稱
成功建立IAP Tunnel Screenshot
當使用者不符合存取條件時,無法成功建立Tunnel

5. 連接應用程式

以SSH為例

ssh -i <private-key-path> -p 8022 acct@localhost
SSH Connection Screenshot

--

--

Nick Cheng

Customer Solutions Architect, Google Cloud. All views and opinions are my own. 所有文章是作者的個人觀點,並不代表 Google