Identity-Aware Proxy (IAP) 支援 Non-web Client/Server 應用程式
Background
企業導入零信任存取控制,應用程式端除了常見網頁應用程式以外,仍有許多Client/Server 使用情境,例如使用者需要使用SQL Client 連接後臺DB或是使用SSH/RDP 連到VM。
BeyondCorp Enterprise 除了支援網頁應用程式以外,也可以支援Client/Server 的應用程式,以下說明對應架構及設定步驟。
架構圖
- 透過Site to Site VPN或專線連接GCP 雲端及地端
- 用戶端(Client) 使用TCP Tunnel 連接到Identity-Aware Proxy (IAP)
- IAP 驗證使用者帳戶及存取權限
- 通過驗證後允許用戶存取應用程式
設定步驟
- 建立混合雲網路連接 (S2S VPN / Interconnect)
透過Cloud VPN或專線連接GCP 和地端 (混合雲)或是GCP和其他雲平台(多雲)。記得在GCP 設定BGP 路由時,將IAP使用的網段(35.235.240.0/20) advertise 到地端或其他雲端。 - 建立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 的名稱
5. 連接應用程式
以SSH為例
ssh -i <private-key-path> -p 8022 acct@localhost