33. 部署 Nessus 元件

預計完成時間:1 天

可操作的元件擁有者:VULN

技能設定檔:部署工程師

上次更新時間:2025 年 8 月 18 日

Nessus 是 Google Distributed Cloud (GDC) 實體隔離環境支援和作業系統的安全掃描器。有助於營運中心團隊監控及因應硬體和軟體中的安全漏洞。

本文說明部署 Nessus 的步驟,並假設操作人員是從 OC 工作站執行步驟,且該工作站同時提供 PowerShell 和 WSL。

33.1. 事前準備

  • 需要存取權

    • 請按照 IAM-R0005 中的步驟操作:
      • 在根管理員叢集中取得 clusterrole/tenable-nessus-admin-root 叢集角色。
      • 在根管理員叢集的 gpc-system 命名空間中取得 role/system-artifact-management-admin 角色。
  • 所需工具

    • kubectl
    • gdcloud
    • helm
    • yq
    • docker
  • 授權

33.1.1. 最佳做法

33.1.1.1. 升級

如要從 1.14 之前的版本升級,請先按照本指南各主要章節的「選用:解除安裝」部分操作,再執行任何安裝作業。

如有任何重新安裝作業,請按照本指南各主要章節的「選用:解除安裝」部分操作。

33.1.1.2. 處理機構和區域之間的版本差異

機構和區域之間的版本差異不應造成任何問題。請根據貴機構的版本,按照特定步驟操作。每個部署作業都會獨立運作,不受可用區限制。

33.1.2. Tenablesc 授權

Tenable.sc 是需要授權檔案才能運作的授權第三方軟體。請先根據 SBOM 取得 Tenable 授權,再繼續操作。在特殊情況下,我們或許可以提供授權。

授權檔案的名稱應類似 SecurityCenter-<version>-1000IPs-<uid>.key。找出這個檔案並記下,因為您需要直接將檔案上傳至 Tenablesc UI。

需求條件:

  • 一個 Tenablesc 授權檔案,至少有 1000 個 IP 限制和主機名稱 tenablesc-as1

33.2. 找出 Nessus 部署檔案

部署 Nessus 前,請先使用 Windows PowerShell 完成下列步驟,找出 Nessus 安裝檔案:

  1. 存取 Nessus Helm 資訊圖表和虛擬機器 (VM) 映像檔:

    在 OC 中,這些項目可透過 \\<dc-prefix>-hyperv1\OpsCenter\tenable-nessus 存取

    ./operations_center/tenable-nessus/
    ├── rhel-8.6-x86_64-kvm-tenablesc.qcow2    # Tenable.sc server image
    ├── tenablesc-automation-bundle-v6n.tar    # Tenable.sc automation bundle
    ├── tenablesc-admin.tgz                    # Ops admin Tenable.sc Helm chart
    └── tenablesc-vms.tgz                      # Ops admin Tenable.sc Helm chart for VM
    
  2. 將這些檔案移至本機工作站,以供日後使用:

    # Eg "\\dc1-hyperv1\OpsCenter\tenable-nessus\*"
    $OPS_TENABLE_RESOURCES = ""
    
    mkdir $env:USERPROFILE\tenable-nessus
    Copy-Item ${OPS_TENABLE_RESOURCES} $env:USERPROFILE\tenable-nessus
    

33.3. 找出 Nessus 預先啟用套件

Nessus 預先啟動套件專屬於每個 Nessus 安裝項目,因此無法納入營運中心套件。請按照 Nessus 指南 NES-G0004 - How to perform Nessus license preactivation 的說明,準備「GDCH 1」預先啟用套件,再繼續操作。

  1. 在連上網際網路的電腦上,自行或透過 Google 工程 POC 取得 nessus-preact-gdch1.tar.gz

  2. 將這個檔案轉移到工作站,並放在 $env:USERPROFILE\tenable-nessus 下方

  3. 目錄 $env:USERPROFILE\tenable-nessus 必須包含預先啟動套件:

    $env:USERPROFILE\tenable-nessus
    ├── nessus-preact-gdch1.tar.gz             # GDCH Nessus Preactivation File
    

33.4. 開啟 WSL

除非另有說明,否則頁面其餘步驟的所有指令都必須使用 WSL。

  1. 選用:需要使用 Sudo。如果您不知道 sudo 使用者密碼,請執行下列指令來設定 WSL sudo 使用者 oc-it 密碼:

    /mnt/c/Windows/System32/wsl.exe --distribution "${WSL_DISTRO_NAME}" --user root --exec passwd oc-it
    

33.5. 設定環境變數

請按照下列步驟設定必要環境變數:

  1. 定義環境變數 ROOT_ADMIN_CLUSTER_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是管理員叢集 kubeconfig 的絕對路徑,該路徑是先決條件:

    ROOT_ADMIN_CLUSTER_KUBECONFIG=
    
  2. 在目前的終端機中,為所選管理員叢集 kubectl 指令定義別名:

    alias kra='kubectl --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}'
    
  3. 設定 USERPROFILE 變數:

    export USERPROFILE=$(wslpath $(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null))
    

    $USERPROFILE 現在指向與 $env:USERPROFILE 相同的位置。

33.5.1. 為第 1 版機構設定環境變數

  1. 定義環境變數 ORG_ADMIN_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是所選機構管理員叢集 kubeconfig 的絕對路徑,該 kubeconfig 是做為必要條件產生:

    ORG_ADMIN_KUBECONFIG=
    
  2. 在目前的終端機中,為所選機構管理員叢集 kubectl 指令定義別名:

    alias kna='kubectl --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}'
    
  3. 定義環境變數 ORG_SYSTEM_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是所選系統叢集 kubeconfig 的絕對路徑,該路徑是做為必要條件產生:

    ORG_SYSTEM_KUBECONFIG=
    
  4. 在目前的終端機中,為所選系統叢集 kubectl 指令定義別名:

    alias knu='kubectl --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}'
    

33.5.2. 為第 2 版機構設定環境變數

  1. 定義環境變數 ORG_MGMT_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是所選 v2 機構管理平面 API 伺服器 kubeconfig 的絕對路徑,該 kubeconfig 是做為必要條件產生:

    ORG_MGMT_KUBECONFIG=
    
  2. 在目前的終端機中,為所選機構管理員叢集 kubectl 指令定義別名:

    alias kna='kubectl --kubeconfig ${ORG_MGMT_KUBECONFIG:?}'
    
  3. 定義環境變數 ORG_INFRA_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是所選 v2 機構控制層 API 伺服器 kubeconfig 的絕對路徑,該 kubeconfig 是做為必要條件產生:

    ORG_INFRA_KUBECONFIG=
    
  4. 在目前的終端機中,為所選系統叢集 kubectl 指令定義別名:

    alias knu='kubectl --kubeconfig ${ORG_INFRA_KUBECONFIG:?}'
    

33.6. 上傳預先啟動套件

請按照下列步驟上傳構件 Harbor 登錄檔。

  1. 使用適當的中繼資料,將套件轉換為 OCI 格式:

    BUNDLE_PATH=${USERPROFILE:?}/tenable-nessus/nessus-preact-gdch1.tar.gz
    BUNDLE_OCI_PATH=${USERPROFILE:?}/tenable-nessus/nessus-preact-gdch1-oci
    BUNDLE_TAG=$(date '+%Y%m%d%H%M%S')
    gdcloud artifacts oci build-from-tar ${BUNDLE_PATH:?} ${BUNDLE_OCI_PATH:?} \
        --version "${BUNDLE_TAG:?}" \
        --index-annotations "org.google.gpc.harbor.tag=${BUNDLE_TAG:?},com.gpc.oci.image.flat=true" \
        --manifest-annotations "org.google.gpc.harbor.project=gpc-system-nessus-updates,org.google.gpc.harbor.repo=nessus-preactivation,com.gpc.oci.image.flat=true" \
        --layer-media-type="application/vnd.unknown.layer.v1.tar"
    
  2. 安裝 Harbor CA 憑證:

    HARBOR_URL=$(kra get harborcluster harbor -n harbor-system -o=jsonpath='{.spec.externalURL}')
    
    HARBOR_IP=${HARBOR_URL#https://}
    
    sudo mkdir -p /etc/docker/certs.d/${HARBOR_IP:?}
    CA_CRT=$(kra get secret trust-store-internal-only -n anthos-creds -o jsonpath='{.data.ca\.crt}')
    
    sudo sh -c "echo ${CA_CRT} | openssl base64 -A -d > /etc/docker/certs.d/${HARBOR_IP:?}/ca.crt"
    

    找出作業系統:

    sudo sh -c "hostnamectl"
    

    如為 Rocky Linux 作業系統,請執行:

    sudo update-ca-trust extract
    

    如為 Ubuntu 作業系統,請執行下列指令:

    sudo update-ca-certificates
    
  3. 將預先啟動套件上傳至 Harbor:

    • 理想方法:使用 gdcloud auth login 驗證。

      INFRA_CONSOLE_URL="https://$(kra get dnsregistrations.network.private.gdc.goog -n gpc-system infra-console -o jsonpath='{.status.fqdn}')"
      
      gdcloud config set core/organization_console_url ${INFRA_CONSOLE_URL:?}
      gdcloud auth login
      gdcloud auth configure-docker
      
      gdcloud system container-registry load-oci ${BUNDLE_OCI_PATH:?} --create-release-metadata=false --skip-failover-registry
      
    • 備份方法:使用 kubeconfig

      gdcloud system container-registry load-oci ${BUNDLE_OCI_PATH:?} --create-release-metadata=false --use-ip-port=true  --skip-failover-registry --kubeconfig=${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}
      

33.7. 安裝 Nessus

  1. 觸發安裝 Nessus:

    cat <<EOF | kra apply -f -
    apiVersion: vulnerabilitymanagement.private.gdc.goog/v1alpha1
    kind: ParentNessusManagerConfig
    metadata:
        name: parent-nessus-manager-config
        namespace: tenable-nessus-system
    spec:
        preactivationUrlBundleTag: "${BUNDLE_TAG:?}"
        installedAt: "$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
    EOF
    
  2. 等待約 1.5 小時,讓安裝作業完成。

33.7.1. 選用:解除安裝 Nessus

本節包含從所有必要叢集中移除 Nessus 部署作業的指令。

  1. 從根管理員叢集解除安裝 Nessus:

    helm list -n tenable-nessus-system -q --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}
    
  2. 適用於機構架構 v1:

    1. 從機構管理員叢集解除安裝 Nessus:

      helm list -n tenable-nessus-system -q --kubeconfig ${ORG_ADMIN_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}
      
    2. 從機構系統叢集解除安裝 Nessus:

      helm list -n tenable-nessus-system -q --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}
      
  3. 適用於機構架構第 2 版:

    1. 從機構管理叢集解除安裝 Nessus:

      helm list -n tenable-nessus-system -q --kubeconfig ${ORG_MGMT_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
      
    2. 從機構基礎架構叢集中解除安裝 Nessus:

      helm list -n tenable-nessus-system -q --kubeconfig ${ORG_INFRA_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_INFRA_KUBECONFIG:?}
      

33.7.2. 在根管理員叢集中驗證 Nessus

  1. 確認金鑰和憑證已發布:

    echo "Child linking key published: $(kra get pnm -A -o yaml | yq e '.items[0].status.conditions[] | select(.type == "ChildLinkingKeyPublished") | .status')"
    
    echo "Agent linking key published: $(kra get pnm -A -o yaml | yq e '.items[0].status.conditions[] | select(.type == "AgentLinkingKeyPublished") | .status')"
    
    echo "Nessus TLS Crt published: $(kra get pnm -A -o yaml | yq e '.items[0].status.conditions[] | select(.type == "NessusTlsCrtPublished") | .status')"
    
  2. 確認父項 Nessus Manager 處於正常狀態:

    POD_NAME=$(kra get pod -n tenable-nessus-system | grep vuln-parent-nessus-backend-app | awk '{print $1}')
    
    if kra exec -n tenable-nessus-system -c manager ${POD_NAME:?} -- /bin/bash -c "/opt/nessus/sbin/nessuscli node status" | grep -Fq "Agents linked"; then
        echo "Manager node is healthy"
    else
        echo "Manager node is unhealthy"
    fi
    
  3. 如果系統回報父項 Nessus Manager 狀態不佳 (例如先前任一指令的輸出為 false),請使用下列指令重新啟動父項 Nessus Manager:

    kra rollout restart deployment vuln-parent-nessus-backend-app -n tenable-nessus-system
    
  4. 請等待約 1.5 小時,然後再次查看狀態。

  5. 如果 1.5 小時後,系統仍回報父項 Nessus Manager 狀態不佳,請將問題提報給隨時待命的團隊。

    1. 從 Grafana UI 執行指定查詢後,請提供下列資訊:

      {pod="<pod_name>"}
      
    2. 加入父項 Nessus Manager 設定:

      kra get pnm -A -o yaml
      
  6. 確認子項 Nessus Manager 處於正常狀態:

    POD_NAME=$(kra get pod -n tenable-nessus-system | grep vuln-managed-nessus-backend-app | awk '{print $1}')
    
    if kra exec -n tenable-nessus-system -c manager ${POD_NAME:?} -- /bin/bash -c "/opt/nessus/sbin/nessuscli node status" | grep -Fq "Agents linked"; then
        echo "Manager node is healthy"
    else
        echo "Manager node is unhealthy"
    fi
    
  7. 如果系統回報子項 Nessus Manager 狀態不佳,請使用下列指令重新啟動子項 Nessus Manager,等待 20 分鐘後再次檢查狀態:

    kra rollout restart deployment vuln-managed-nessus-backend-app -n tenable-nessus-system
    
  8. 如果 20 分鐘後,系統仍回報子項 Nessus 管理工具狀態異常,請提報問題,並在 Grafana 使用者介面執行指定查詢後,附上下列資訊。

    1. 從 Grafana UI 執行指定查詢後,請提供下列資訊:

      {pod="<pod_name>"}
      
    2. 加入子項 Nessus Manager 設定:

      kra get cnm -A -o yaml
      
  9. 確認沒有狀況不佳的代理程式:

    echo "Nodes with unhealthy agents:"\
    $(kra get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')
    
  10. 針對不正常的清單中列出的所有代理程式,請設定 NESSUS_AGENT_NAME 變數,然後對所有代理程式執行下列指令:

    NESSUS_AGENT_NAME=
    kra delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system
    
  11. 如果 20 分鐘後,清單中仍有不正常的代理程式,請針對每個代理程式執行下列操作:

    • 在 Grafana 中檢查 Pod install-<node_name> 的記錄檔,如果出現錯誤記錄 ansible-playbook error: one or more host failed,請使用 PLATAUTH-G0001 建立與裸機節點的 SSH 連線。

    • 建立與裸機節點的 SSH 連線後,請將 /etc/yum.repos.d 移至 /etc/ yum.repos.d.back (有效刪除 yum repos conf)。

  12. 如果 20 分鐘後,清單中仍有不正常的代理程式,請提報問題,並在 Grafana UI 中執行指定查詢後,附上下列資訊。

    1. 從 Grafana UI 執行指定查詢後,請提供下列資訊。

      {pod="<pod_name>"}
      
    2. 包含 Nessus 代理程式狀態:

      kra get nessusagent/${NESSUS_AGENT_NAME} -n tenable-nessus-system -o yaml
      
    3. 加入 Nessus 代理程式設定:

      kra get nessusagentconfig/nessus-agent-config -n tenable-nessus-system -o yaml
      

33.8. Nessus Manager - 機構驗證

本節說明在 Distributed Cloud 機構中驗證 Nessus 的步驟。

為確保順利完成 Nessus 驗證,請為 Distributed Cloud 的每個機構叢集 (包括 Operations Center IT 機構叢集) 執行這項程序。

列出可用的機構:

kra get -n gpc-system organization

針對 root 機構以外的每個機構,完成下列步驟。

33.8.1. 必要條件

  • 第 1 版機構必須具備存取權

    • 請按照 IAM-R0005 中的步驟操作:
      • 在根管理員叢集中取得 clusterrole/tenable-nessus-admin-root 叢集角色。
    • 請按照 IAM-R0004 執行下列步驟:

      • 產生根管理員叢集的 KUBECONFIG。
    • 請按照 IAM-R0005 執行下列操作:

      • 在目標機構管理員叢集中取得 clusterrole/tenable-nessus-admin-org-legacy 叢集角色。
    • 請按照 IAM-R0004 執行下列步驟:

      • 為目標機構管理員叢集產生 KUBECONFIG。
    • 請按照 IAM-R0005 執行下列操作:

      • 在目標系統叢集中取得 clusterrole/tenable-nessus-admin-system-legacy 叢集角色。
    • 請按照 IAM-R0004 執行下列步驟:

      • 為目標系統叢集產生 KUBECONFIG。
  • 第 2 版機構必須具備存取權

    • 請按照 IAM-R0005 中的步驟操作:
      • 在根管理員叢集中取得 clusterrole/tenable-nessus-admin-root 叢集角色。
    • 請按照 IAM-R0004 進行操作:
      • 產生根管理員叢集的 KUBECONFIG。
    • 請按照 IAM-R0005 中的步驟操作:
      • 在目標叢集中取得 clusterrole/tenable-nessus-admin-infra-mp 叢集角色。
    • 請按照 IAM-R0004 進行操作:
      • 為目標基礎架構叢集產生 mp KUBECONFIG。
    • 請按照 IAM-R0005 中的步驟操作:
      • 在目標基礎架構控制層 kube API 伺服器中取得 clusterrole/tenable-nessus-admin-infra-cp 叢集角色。
    • 請按照 IAM-R0004 進行操作:
      • 為基礎架構叢集產生 cp KUBECONFIG。

按照「設定環境變數」一文的說明,設定機構叢集的存取權,並定義 knaknu 指令列別名。

33.8.2. 在第 1 版機構中驗證 Nessus,並在第 2 版機構中驗證基礎架構管理平台 kube API 伺服器

  1. 確認沒有狀況不佳的代理程式:

    echo "Nodes with unhealthy agents:"\
    $(kna get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')
    
  2. 針對不正常清單中列出的所有代理程式,設定 NESSUS_AGENT_NAME 變數,並為所有代理程式執行下列指令:

    NESSUS_AGENT_NAME=
    kna delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system
    
  3. 如果 20 分鐘後,清單中仍有不正常的代理程式,請針對每個代理程式執行下列操作:

    • 在 Grafana 中檢查 Pod install-<node_name> 的記錄檔,如果出現錯誤記錄 ansible-playbook error: one or more host failed,請使用 PLATAUTH-G0001 建立與裸機節點的 SSH 連線。

    • 建立與裸機節點的 SSH 連線後,請將 /etc/yum.repos.d 移至 /etc/ yum.repos.d.back (有效刪除 yum repos conf)。

  4. 如果 20 分鐘後,清單中仍有不正常的代理程式,請回報問題,並在 Grafana UI 中執行指定查詢後,附上下列資訊。

    {pod="<pod_name>"}
    

33.8.3. 在第 1 版機構的系統叢集中驗證 Nessus,以及在第 2 版機構的基礎架構控制層 Kube API 伺服器中驗證 Nessus

  1. 確認子項 Nessus Manager 處於正常狀態:

    POD_NAME=$(knu get pod -n tenable-nessus-system | grep vuln-managed-nessus-backend-app | awk '{print $1}')
    
    if knu exec -n tenable-nessus-system -c manager ${POD_NAME:?} -- /bin/bash -c "/opt/nessus/sbin/nessuscli node status" | grep -Fq "Agents linked"; then
        echo "Manager node is healthy"
    else
        echo "Manager node is unhealthy"
    fi
    
  2. 如果系統回報子項 Nessus Manager 狀態不佳,請使用下列指令重新啟動子項 Nessus Manager,等待 20 分鐘後再次檢查狀態:

    knu rollout restart deployment vuln-managed-nessus-backend-app -n tenable-nessus-system
    
  3. 如果 20 分鐘後,系統仍回報子項 Nessus 管理員狀態異常,請提報問題,並在 Grafana UI 執行指定查詢後,附上下列資訊。

    1. 從 Grafana UI 執行指定查詢後,請一併提供下列資訊。

      {pod="<pod_name>"}
      
    2. 包含子項 Nessus Manager 設定。

      knu get cnm -A -o yaml
      
  4. 確認沒有狀況不佳的代理程式:

    echo "Nodes with unhealthy agents:"\
    $(knu get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')
    
  5. 針對不正常的清單中列出的所有代理程式,請設定 NESSUS_AGENT_NAME 變數,然後對所有代理程式執行下列指令:

    NESSUS_AGENT_NAME=
    knu delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system
    
  6. 如果 20 分鐘後,清單中仍有不正常的代理程式,請針對每個代理程式執行下列操作:

    • 在 Grafana 中檢查 Pod install-<node_name> 的記錄檔,如果出現錯誤記錄 ansible-playbook error: one or more host failed,請使用 PLATAUTH-G0001 建立與裸機節點的 SSH 連線。

    • 建立與裸機節點的 SSH 連線後,請將 /etc/yum.repos.d 移至 /etc/ yum.repos.d.back (有效刪除 yum repos conf)。

  7. 如果 20 分鐘後,清單中仍有不正常的代理程式,請提報問題,並在 Grafana UI 中執行指定查詢後,附上下列資訊。

    1. 從 Grafana UI 執行指定查詢後,請提供下列資訊:

      {pod="<pod_name>"}
      
    2. 包含 Nessus 代理程式狀態:

      knu get nessusagent/${NESSUS_AGENT_NAME} -n tenable-nessus-system -o yaml
      
    3. 加入 Nessus 代理程式設定:

      knu get nessusagentconfig/nessus-agent-config -n tenable-nessus-system -o yaml
      

33.9. 安裝 Tenable.sc

本節說明如何在 Operations Center IT 機構中安裝或升級現有的 Tenable.sc VM。

33.9.1. 必要條件

  • 需要存取權

    • 適用於機構架構 v1:
      • 請按照 IAM-R0005 中的步驟操作:
        • 在根管理員叢集中取得 clusterrole/tenable-nessus-admin-root 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 產生根管理員叢集的 KUBECONFIG。
      • 請按照 IAM-R0005 中的步驟操作:
        • 在 gdchservices 管理員叢集中取得 clusterrole/tenable-nessus-admin-org-legacy 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 產生 gdchservices 管理員叢集的 KUBECONFIG。
      • 請按照 IAM-R0005 中的步驟操作:
        • 在 gdchservices 系統叢集中取得 clusterrole/tenable-nessus-admin-system-legacy 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 產生 gdchservices 系統叢集的 KUBECONFIG。
    • 適用於機構架構第 2 版:
      • 請按照 IAM-R0005 中的步驟操作:
        • 在根管理員叢集中取得 clusterrole/tenable-nessus-admin-root 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 產生根管理員叢集的 KUBECONFIG。
      • 請按照 IAM-R0005 中的步驟操作:
        • 在 gdchservices-management 叢集中取得 clusterrole/tenable-nessus-admin-infra-mp 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 產生 gdchservices-management 叢集的 KUBECONFIG。
      • 請按照 IAM-R0005 中的步驟操作:
        • 在 gdchservices-infra 叢集中取得 clusterrole/tenable-nessus-admin-infra-cp 叢集角色。
      • 請按照 IAM-R0004 進行操作:
        • 為 gdchservices-infra 叢集產生 KUBECONFIG。

33.9.2. 設定環境變數

請按照下列步驟設定必要環境變數:

  1. 定義環境變數 ROOT_ADMIN_CLUSTER_KUBECONFIG,以便在目前的終端機中稍後使用。這必須是管理員叢集 kubeconfig 的絕對路徑,該路徑是先決條件:

    ROOT_ADMIN_CLUSTER_KUBECONFIG=
    
  2. 在目前的終端機中,為根管理員叢集 kubectl 指令定義別名:

    alias kra='kubectl --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}'
    
  3. 定義 gdchservices 機構管理平面 kubeconfig 的環境變數:

    • 適用於機構架構第 1 版: 定義環境變數 ORG_ADMIN_KUBECONFIG,以供目前終端機稍後使用。這必須是 gdchservices 管理員叢集 kubeconfig 的絕對路徑,該叢集是做為必要條件而產生:

      ORG_ADMIN_KUBECONFIG=
      
    • 適用於第 2 版機構架構: 定義環境變數 ORG_MGMT_KUBECONFIG,以供目前終端機稍後使用。這必須是 gdchservices 管理叢集 kubeconfig 的絕對路徑,該檔案是先決條件:

      ORG_MGMT_KUBECONFIG=
      
  4. 使用上述 kubeconfig 為 kubectl 指令建立別名:

    • 適用於機構架構第 1 版: 在目前的終端機中,為 gdchservices 管理員叢集 kubectl 指令定義別名:

      alias kna='kubectl --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}'
      
    • 適用於機構架構第 2 版: 在目前的終端機中,為 gdchservices 管理員叢集 kubectl 指令定義別名:

      alias kna='kubectl --kubeconfig ${ORG_MGMT_KUBECONFIG:?}'
      
  5. 定義 gdchservices 機構控制層 kubeconfig 的環境變數:

    • 適用於機構架構第 1 版: 定義環境變數 ORG_SYSTEM_KUBECONFIG,以供目前終端機稍後使用。這必須是 gdchservices 系統叢集 kubeconfig 的絕對路徑,該路徑是先決條件:

      ORG_SYSTEM_KUBECONFIG=
      
    • 適用於第 2 版機構架構: 定義環境變數 ORG_INFRA_KUBECONFIG,以供目前終端機稍後使用。這必須是 gdchservices 基礎架構叢集 kubeconfig 的絕對路徑,該叢集是先決條件:

      ORG_INFRA_KUBECONFIG=
      
  6. 使用上述 kubeconfig 為 kubectl 指令建立別名:

    • 適用於機構架構第 1 版: 在目前的終端機中,為 gdchservices 系統叢集 kubectl 指令定義別名:

      alias knu='kubectl --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}'
      
    • 適用於機構架構第 2 版: 在目前的終端機中,為 gdchservices 基礎架構叢集 kubectl 指令定義別名:

      alias knu='kubectl --kubeconfig ${ORG_INFRA_KUBECONFIG:?}'
      
  7. 設定 USERPROFILE 變數:

    export USERPROFILE=$(wslpath $(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null))
    

    $USERPROFILE 現在指向與 $env:USERPROFILE 相同的位置。

  8. 定義部署 Tenable.sc 的機構名稱:

    ORG=gdchservices
    

33.9.3. 準備安裝

請按照下列步驟準備機構。

  1. 建立 tenablesc-system 專案。

    cat <<EOF | kna apply -n gpc-system -f -
    apiVersion: resourcemanager.gdc.goog/v1
    kind: Project
    metadata:
      name: tenablesc-system
      labels:
        istio.io/rev: default
        networking.gdc.goog/enable-default-egress-allow-to-outside-the-org: "true"
        resourcemanager.gdc.goog/attach-all-user-clusters: "true"
    EOF
    
  2. 兩分鐘後,確認機構管理員和系統叢集上都有命名空間。

    kna get namespace tenablesc-system -o yaml
    
    knu get namespace tenablesc-system -o yaml
    

    請注意,resourcemanager.gdc.goog/attach-all-user-clusters: "true" 專案標籤會導致命名空間也建立在機構的所有使用者叢集中。

  3. 產生並儲存 Tenablesc 管理員和管理員使用者憑證,做為 Kubernetes 密鑰。

    cat <<EOF | knu apply -n tenablesc-system  -f -
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
        name: users
    data:
        adminpw: $(</dev/urandom tr -dc 'A-Za-z0-9~!@#$%^*+?' | head -c 25 | base64)
        managerpw: $(</dev/urandom tr -dc 'A-Za-z0-9~!@#$%^*+?' | head -c 25 | base64)
    EOF
    

33.9.4. 安裝管理員圖表

  1. 設定下列環境變數,準備安裝:

    URL_SUFFIX=$(kna get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    ROOT_URL_SUFFIX=$(kra get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
    DEPLOY_NAME=tenablesc
    
  2. 套用管理員 Helm 資訊套件。

    • 適用於機構架構 v1:

      helm upgrade --install \
        tenablesc-admin ${USERPROFILE:?}/tenable-nessus/tenablesc-admin.tgz \
        --namespace tenablesc-system \
        --set urlSuffix=${URL_SUFFIX:?} \
        --set deployName=${DEPLOY_NAME:?} \
        --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}
      
    • 適用於機構架構第 2 版:

      OCIT_NESSUS_MANAGER_PREFIXES 設為以逗號分隔的清單,例如 "{dc1-nessus1,dc1-nessus2}",表示 OCIT VM 前置字元。

      設定 OCIT_NESSUS_URL_SUFFIX,指出 OCIT VM 後置字串。

      套用管理層的 Helm 更新:

      helm upgrade --install \
        tenablesc-admin ${USERPROFILE:?}/tenable-nessus/tenablesc-infra-mp.tgz \
        --namespace tenablesc-system \
        --set urlSuffix=${URL_SUFFIX:?} \
        --set ocitNessusManagerPrefixes=${OCIT_NESSUS_MANAGER_PREFIXES:?} \
        --set deployName=${DEPLOY_NAME:?} \
        --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
      

      為基礎架構層套用 Helm 更新:

      helm upgrade --install \
        tenablesc-admin ${USERPROFILE:?}/tenable-nessus/tenablesc-infra-cp.tgz \
        --namespace tenablesc-system \
        --set urlSuffix=${URL_SUFFIX:?} \
        --set rootUrlSuffix=${ROOT_URL_SUFFIX:?} \
        --set ocitUrlSuffix=${OCIT_NESSUS_URL_SUFFIX:?} \
        --set ocitNessusManagerPrefixes=${OCIT_NESSUS_MANAGER_PREFIXES:?} \
        --set deployName=${DEPLOY_NAME:?} \
        --kubeconfig ${ORG_INFRA_KUBECONFIG:?}
      

      套用 Istio 授權政策:

      cat <<EOF | knu apply -f -
      apiVersion: security.istio.io/v1
      kind: AuthorizationPolicy
      metadata:
        name: allow-nessus-terminated-traffic
        namespace: istio-system
      spec:
        rules:
        - from:
          - source:
              ipBlocks:
              - 0.0.0.0/0
          to:
          - operation:
              hosts:
              - nessus-terminated.${URL_SUFFIX:?}
        selector:
          matchLabels:
            istio: management-ingress-gateway
      EOF
      

      建立服務項目:

      cat <<EOF | knu apply -f -
      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: nessus-svc-entry
        namespace: istio-system
      spec:
        hosts:
        - nessus.${ROOT_URL_SUFFIX:?}
        location: MESH_EXTERNAL
        ports:
        - name: https-port
          number: 443
          protocol: TLS
        resolution: DNS
      EOF
      

      建立 DNS 註冊:

      cat <<EOF | kna apply -n tenablesc-system -f -
      apiVersion: network.private.gdc.goog/v1alpha1
      kind: DNSRegistration
      metadata:
        name: tenablesc-internal
        namespace: tenablesc-system
      spec:
        resolutionConfig:
          exposeToNetwork: VPC
          resolveTo:
            useDefaultIstioGateway:
              owningCluster: InfraCluster
              ingressLabel: infra
          vpcIdentifier: infra
      EOF
      

      等待五分鐘後,將 FQDN 儲存在環境變數中:

      TENABLE_SC_INTERNAL_FQDN=$(kna get dnsregistrations.network.private.gdc.goog -n tenablesc-system tenablesc-internal -o jsonpath='{.status.fqdn}')
      

      修補虛擬服務和閘道,新增 Tenable SC 內部 FQDN:

      knu patch gateway tenablesc-gateway -n istio-system --type='json' \
      -p='[{"op": "add", "path": "/spec/servers/0/hosts/0", "value": "'"${TENABLE_SC_INTERNAL_FQDN:?}"'"}]'
      
      knu patch virtualservice tenablesc-https-ingress-virtualsvc -n tenablesc-system --type='json' \
      -p='[{"op": "add", "path": "/spec/hosts/0", "value": "'"${TENABLE_SC_INTERNAL_FQDN:?}"'"}]'
      

      修補探測器資源,以探測正確的端點:

      kna patch probe tenablesc-probe -n tenablesc-system --type='json' \
      -p='[{"op": "replace", "path": "/spec/probeJobs/0/targets/0", "value": "https://'"${TENABLE_SC_INTERNAL_FQDN:?}"'"}]'
      
  3. 驗證部署作業。

    查看下列指令的輸出內容,確認 tenablesc-admin 部署作業是否成功:

    • 適用於機構架構 v1:

      helm ls --namespace tenablesc-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}
      
    • 適用於機構架構第 2 版:

      helm ls --namespace tenablesc-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
      
  4. 確認虛擬服務是否存在。

    • 適用於機構架構 v1:

      kna get virtualservice -n tenablesc-system
      
    • 適用於機構架構第 2 版:

      knu get virtualservice -n tenablesc-system
      
  5. 確認 DNS 項目是否存在。

    echo $(kna get dnsregistrations.network.private.gdc.goog -n tenablesc-system tenablesc -o jsonpath='{.status.fqdn}')
    
  6. 確認 AuditLoggingTarget 已準備就緒,這項作業預計需要幾分鐘。

    kna get auditloggingtarget/tenablesc-audit-logging-target -n tenablesc-system -o jsonpath='{ .status }' |  jq
    

    • 可能會發生下列錯誤:

      Error: failed to copy secret to project: namespace "tenablesc-system" not found in cluster <user_cluster>

      如果是,則必須在指定叢集中建立 tenablesc-system 命名空間。如要繼續操作,請建立命名空間,然後開啟中繼錯誤,觸發調查作業,瞭解發生這個錯誤的原因。在支援單中加入 tenablesc-system 專案說明輸出內容。

      kna describe project tenablesc-system
      
    • 可能會發生下列錯誤:

      Error from server (NotFound): auditloggingtargets.logging.private.gdc.goog "tenablesc-audit-logging-target" not found

      如果沒有,請手動建立缺少的 AuditLoggingTarget

      cat <<EOF | kna apply -n tenablesc-system -f -
      apiVersion: logging.private.gdc.goog/v1alpha1
      kind: AuditLoggingTarget
      metadata:
          name: "${DEPLOY_NAME:?}-audit-logging-target"
      spec:
          appNameLabel: "${DEPLOY_NAME:?}"
          hostNameLabel: host
          ingressGatewayPort: 0
          logAccessLevel: io
          serviceName: "${DEPLOY_NAME:?}"
          timestampKey: time
          timestampkeyFormat: '%Y-%m-%dT%H:%M:%S'
      EOF
      

      五分鐘後,輸出內容應如下所示:

      {
          "certSecretName": "tenablesc-alog-client-tls",
          "conditions": [
              {
                  "lastTransitionTime": "2023-07-11T15:13:50Z",
                  "message": "",
                  "observedGeneration": 1,
                  "reason": "ReconciliationCompleted",
                  "status": "True",
                  "type": "Ready"
              }
          ],
          "serverCertSecretName": "tenablesc-alog-server-tls",
          "syslogServerName": "tenablesc-alog-system.gdchservices.bert.sesame.street",
          "syslogServerPortNumber": 5140
      }
      

      10 分鐘後,如果狀態輸出內容仍不正確,則 Observability 平台可能運作異常。開啟含有可用狀態資訊的 meta 錯誤,協助進行偵錯。

33.9.5. 安裝 VM 圖表

  1. 設定下列環境變數,準備安裝:

    TENABLESC_IMAGE_URL=$(kna get virtualmachineimages.virtualmachine.gdc.goog -n vm-system -o custom-columns=NAME:.metadata.name | grep nessus-tenable-sc | sort -r -k 1 | head -1)
    TENABLESC_BOOT_SIZE=50G
    
    • 適用於機構架構 v1:

      ALT_NAME=tenablesc-audit-logging-target
      
      ALT_NS=tenablesc-system
      
      ALT_HOSTNAME=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.syslogServerName }')
      
      ALT_PORT=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.syslogServerPortNumber }')
      
      ALT_CERT_SECRET=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.certSecretName }')
      
      ALT_CACERT=$(kna get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.ca\.crt }')
      
      ALT_CERTFILE=$(kna get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.tls\.crt }')
      
      ALT_KEYFILE=$(kna get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.tls\.key }')
      
    • 適用於機構架構第 2 版:

      ALT_NAME=tenablesc-audit-logging-target
      
      ALT_NS=tenablesc-system
      
      ALT_HOSTNAME=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.syslogServerName }')
      
      ALT_PORT=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.syslogServerPortNumber }')
      
      ALT_CERT_SECRET=$(kna get auditloggingtarget/${ALT_NAME:?} -n ${ALT_NS:?} -o jsonpath='{ .status.certSecretName }')
      
      ALT_CACERT=$(knu get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.ca\.crt }')
      
      ALT_CERTFILE=$(knu get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.tls\.crt }')
      
      ALT_KEYFILE=$(knu get secret/${ALT_CERT_SECRET:?} -n ${ALT_NS:?} -o jsonpath='{ .data.tls\.key }')
      
  2. 設定虛擬機器類型:

    1. 取得所有虛擬機器類型的名稱:

      kna get virtualmachinetypes.virtualmachine.gdc.goog -n vm-system
      
    2. 選取具有 Supported 欄位的虛擬機器類型 (true),並儲存在環境變數中。建議:n2-standard-4-gdcn3-standard-4-gdc

      VIRTUAL_MACHINE_TYPE=
      
  3. 如要將 Tenable.sc 記錄檔傳送至 infra-obs Loki 執行個體,必須提供 ProjectNetworkPolicy

    cat <<EOF | kna apply -f -
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      name: allow-tenablesc-system-ingress-traffic
      namespace: obs-system
    spec:
      ingress:
      - from:
        - projects:
            matchNames:
            - tenablesc-system
      policyType: Ingress
      subject:
        subjectType: UserWorkload
    EOF
    
  4. 套用 VM 的 Helm 資訊套件。

    • 適用於機構架構 v1:

      helm upgrade --install \
        tenablesc-vms ${USERPROFILE:?}/tenable-nessus/tenablesc-vms.tgz \
        --namespace tenablesc-system  \
        --set urlSuffix=${URL_SUFFIX:?} \
        --set applicationServer.image=${TENABLESC_IMAGE_URL:?} \
        --set applicationServer.bootSize=${TENABLESC_BOOT_SIZE:?} \
        --set applicationServer.virtualMachineType=${VIRTUAL_MACHINE_TYPE:?} \
        --set syslogaudit.host=${ALT_HOSTNAME:?} \
        --set syslogaudit.port=${ALT_PORT:?} \
        --set syslogaudit.caCert=${ALT_CACERT} \
        --set syslogaudit.certFile=${ALT_CERTFILE} \
        --set syslogaudit.keyFile=${ALT_KEYFILE} \
        --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}
      
    • 適用於機構架構第 2 版:

      helm upgrade --install \
        tenablesc-vms ${USERPROFILE:?}/tenable-nessus/tenablesc-vms.tgz \
        --namespace tenablesc-system  \
        --set urlSuffix=${URL_SUFFIX:?} \
        --set applicationServer.image=${TENABLESC_IMAGE_URL:?} \
        --set applicationServer.bootSize=${TENABLESC_BOOT_SIZE:?} \
        --set applicationServer.virtualMachineType=${VIRTUAL_MACHINE_TYPE:?} \
        --set syslogaudit.host=${ALT_HOSTNAME:?} \
        --set syslogaudit.port=${ALT_PORT:?} \
        --set syslogaudit.caCert=${ALT_CACERT} \
        --set syslogaudit.certFile=${ALT_CERTFILE} \
        --set syslogaudit.keyFile=${ALT_KEYFILE} \
        --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
      

    套用 Helm 資訊套件時,您可能會遇到下列問題:

    • Webhook 失敗:connect: connection refused

      Error: Internal error occurred: failed calling webhook "mvirtualmachines.vm.cluster.gke.io": failed to call webhook: Post "https://vm-manager-webhook.gpc-system.svc:443/mutate-vm-cluster-gke-io-v1alpha1-virtualmachine?timeout=10s": dial tcp 10.1.118.145:443: connect: connection refused
      

      補救措施:再次執行 helm upgrade 指令。

  5. 驗證部署作業。 查看下列指令的輸出內容,確認 tenablesc-vm 部署作業是否成功:

    helm ls --namespace tenablesc-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}
    
  6. 等待 Tenable.sc 開始執行。

    檢查虛擬機器狀態:

    kna get virtualmachines.virtualmachine.gdc.goog -n tenablesc-system
    

    範例輸出內容,指出 VM 仍在佈建中:

    NAME            STATUS    AGE
    tenablesc-as1   Pending   55s
    

    輸出範例,顯示 VM 正在執行:

    NAME            STATUS    AGE
    tenablesc-as1   Running   8m25s
    

    如果 VM 在 60 分鐘後仍未執行,請檢查命名空間事件是否有任何明顯錯誤。

    knu get -n tenablesc-system events -o wide
    

    收集所有重要警告和錯誤,並透過 metabug 回報。

  7. 您必須具備 VirtualServiceDestinationRule,才能存取 Tenable.sc UI。

    • 適用於機構架構第 1 版: 無須變更。

    • 適用於機構架構第 2 版:

      • 將服務名稱設為環境變數,以供日後使用:

        TENABLE_SC_SERVICE=$(knu get service -n tenablesc-system | awk '($1 ~ /^g-svc-/) && ($0 ~ /443/) {print $1}'s)
        
      • 編輯 VirtualServiceDestinationRule CR:

        knu patch virtualservice tenablesc-https-ingress-virtualsvc -n tenablesc-system --type merge --patch '{"spec": {"http": [{"route": [{"destination": {"host":"'"${TENABLE_SC_SERVICE:?}"'.tenablesc-system.svc.cluster.local"}}]}]}}'
        knu patch destinationrule tls-encrypt-tenablesc-https-ingress -n tenablesc-system --type merge --patch '{"spec":{"host":"'"${TENABLE_SC_SERVICE:?}"'.tenablesc-system.svc.cluster.local"}}'
        
  8. 確認 DNS 解析為 IP。

    TENABLE_SC_HOST=$(kna get dnsregistrations.network.private.gdc.goog -n tenablesc-system tenablesc -o jsonpath='{.status.fqdn}')
    
    dig +noall +answer ${TENABLE_SC_HOST:?}
    
  9. 確認服務是否透過 DNS 解析。

    預期結果是 200 回應代碼和一些 HTML 輸出內容。

    curl -kv https://${TENABLE_SC_HOST:?}
    

33.9.6. 準備 Tenablesc VM SSH 憑證

請按照下列步驟準備 SSH,以便存取 Tenable VM。

  1. 產生 SSH 金鑰。

    這組 SSH 金鑰只會暫時用於存取 VM。

    rm /tmp/tenablesc
    ssh-keygen -t rsa -b 4096 -f /tmp/tenablesc -N ""
    
  2. 設定下列環境變數。

    export VM_PUBLIC_KEY=$(cat /tmp/tenablesc.pub)
    
    export VM_NAME=tenablesc-as1
    
  3. 建立臨時 (24 小時) VirtualMachineRequest

    VirtualMachineRequest 用於在 VM 上安裝產生的 SSH 憑證。

    kna delete VirtualMachineAccessRequest ${VM_NAME:?}-ar -n tenablesc-system --ignore-not-found=true
    cat <<EOF | kna apply -n tenablesc-system -f -
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineAccessRequest
    metadata:
      name: ${VM_NAME:?}-ar
    spec:
      ssh:
        key: |
          ${VM_PUBLIC_KEY:?}
        ttl: 24h
      user: alice
      vm: ${VM_NAME:?}
    EOF
    
  4. 將 VM SSH IP 匯出為本機環境變數。

    INGRESS_IP=$(kna get vmexternalaccess tenablesc-as1 -n tenablesc-system -o jsonpath='{.status.ingressIP}')
    
    echo "VM SSH IP: ${INGRESS_IP:?}"
    
  5. 測試 SSH 連線是否正常運作:

    ssh -i /tmp/tenablesc -o "StrictHostKeyChecking no" alice@${INGRESS_IP:?} whoami
    

    預期的輸出內容為 alice,也就是 SSH 使用者名稱。

    如果 SSH 連線逾時,表示缺少輸入政策。使用下列指令建立 Ingress 政策,然後再試一次。

  6. 建立 Ingress 政策:

    kna create -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
        name: allow-external-traffic-vm
        namespace: tenablesc-system
    spec:
        ingress:
        - from:
            - ipBlock:
                cidr: 0.0.0.0/0
        policyType: Ingress
        subject:
            subjectType: UserWorkload
    EOF
    
  7. tenablesc-system 命名空間中佈建 iotools Pod:

    cat << EOF | knu apply -n tenablesc-system -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: iotools
      namespace: tenablesc-system
    spec:
      containers:
      - name: iotools
        image: gcr.io/private-cloud-staging/operation-tools:latest
        command: ["sleep","infinity"]
        volumeMounts:
        - name: log-volume
          mountPath: /var/log
      volumes:
      - name: log-volume
        emptyDir: {}
    EOF
    
  8. 將私密金鑰轉移至 iotools Pod:

  9. 將私密金鑰轉移至 iotools Pod:

    knu -n tenablesc-system cp /tmp/tenablesc iotools:/tmp/tenablesc
    

33.9.7. 安裝網路服務憑證

請按照下列步驟安裝 Tenablesc 網頁服務憑證。

  1. 將 VM SSH IP 位址匯出為本機環境變數:

    INGRESS_IP=$(knu get virtualmachine tenablesc-as1 -n tenablesc-system -o json | jq -r '.status.network.interfaces[0].ipAddresses[0] | split("/")[0]')
    
    echo "VM SSH IP: ${INGRESS_IP:?}"
    
  2. 準備網路伺服器憑證和金鑰。

    下列指令會安裝用於提供 Tenable UI 的 TLS 憑證和金鑰。

    1. 設定 TLS 憑證名稱

      TLS_SECRET_NAME=nessus-tls
      
    2. 在本機儲存 nessus-tls 憑證:

      knu get secret ${TLS_SECRET_NAME:?} -n tenable-nessus-system -o yaml > nessus-tls.yaml
      
    3. nessus-tls 憑證複製到 iotools Pod:

      knu -n tenablesc-system cp nessus-tls.yaml iotools:/tmp/nessus-tls.yaml
      
    4. 準備傳輸層安全標準 (TLS) 憑證。

      knu get -n tenable-nessus-system secret ${TLS_SECRET_NAME:?} -o jsonpath='{ .data.tls\.crt }' | base64 -d | knu -n tenablesc-system exec -i iotools -- /bin/bash -c "ssh -i /tmp/tenablesc -o \"StrictHostKeyChecking no\" \"alice@${INGRESS_IP}\" \"cat - > ~/SecurityCenter.crt\""
      
    5. 準備傳輸層安全標準 (TLS) 私密金鑰。

      knu get -n tenable-nessus-system secret ${TLS_SECRET_NAME:?} -o jsonpath='{ .data.tls\.key }' | base64 -d | knu -n tenablesc-system exec -i iotools -- /bin/bash -c "ssh -i /tmp/tenablesc -o \"StrictHostKeyChecking no\" \"alice@${INGRESS_IP}\" \"cat - > ~/SecurityCenter.key\""
      
    6. 準備傳輸層安全標準 (TLS) CA 憑證。

      knu get -n tenable-nessus-system secret ${TLS_SECRET_NAME:?} -o jsonpath='{ .data.ca\.crt }' | base64 -d | knu -n tenablesc-system exec -i iotools -- /bin/bash -c "ssh -i /tmp/tenablesc -o \"StrictHostKeyChecking no\" \"alice@${INGRESS_IP}\" \"cat - > ~/SecurityCenterCA.crt\""
      
  3. 準備憑證安裝指令碼。

    將下列程式碼儲存至 /tmp/tenable-sc-install-web-tls.sh

    cat >> /tmp/tenable-sc-install-web-tls.sh << EOF
    #!/bin/bash
    # Install server cert
    sudo mv ~/SecurityCenter.crt /opt/sc/support/conf/SecurityCenter.crt
    sudo mv ~/SecurityCenter.key /opt/sc/support/conf/SecurityCenter.key
    sudo chown tns:tns /opt/sc/support/conf/SecurityCenter.crt
    sudo chown tns:tns /opt/sc/support/conf/SecurityCenter.key
    sudo chmod 640 /opt/sc/support/conf/SecurityCenter.crt
    sudo chmod 640 /opt/sc/support/conf/SecurityCenter.key
    
    # Install custom CA cert
    sudo /opt/sc/support/bin/php /opt/sc/src/tools/installCA.php ~/SecurityCenterCA.crt
    
    # append root ext ca to sys log ca
    cat ~/SecurityCenterCA.crt | sudo tee -a /etc/fluent-bit/syslog-ca.crt
    
    # Restart Tenable.sc
    sudo systemctl restart SecurityCenter
    # Restart fluent-bit
    sudo systemctl restart fluent-bit
    EOF
    
  4. 將指令碼複製到 iotools Pod:

    knu -n tenablesc-system cp /tmp/tenable-sc-install-web-tls.sh iotools:/tmp/tenable-sc-install-web-tls.sh
    
  5. 安裝網頁伺服器憑證和金鑰。

    在 Tenable.sc VM 上執行 install-web-tls.sh

    knu -n tenablesc-system exec -i iotools -- /bin/bash -c "ssh -i /tmp/tenablesc alice@${INGRESS_IP:?} 'bash -s' < /tmp/tenable-sc-install-web-tls.sh"
    

    Tenablesc 服務現在會使用適當的 TLS 憑證和金鑰。

33.9.8. 在 Tenable.sc 中啟用記錄轉送功能

  1. 按照 NES-R0002 登入 Tenablesc UI。

  2. 在導覽列中,依序前往「系統」 >「設定」

  3. 在「設定」頁面中,按一下「其他」

  4. 前往「系統記錄」Syslog部分:

    1. 開啟「啟用轉寄」
    2. 將「設施」設為「使用者」
    3. 在「嚴重性」中,選取「全選」
  5. 按一下「提交」儲存設定。

    33.9.9. 啟用 OIC 至 GDC 網路連線

請完成下列 nessus1nessus2 VM 的步驟:

  1. 設定下列環境變數:

    SITE_ID=
    OIC_DNS_SUFFIX=
    NESSUS_SUFFIX=
    GDC_SERVICES_ORG_URL_SUFFIX=$(kna get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')
    
  2. 將設定發布至 GDC 服務管理層:

    cat <<EOF | kubectl --kubeconfig ${ORG_INFRA_KUBECONFIG:?} apply -f -
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: root-infra-ingress-gateway-https-dr-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      host: ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
      trafficPolicy:
        portLevelSettings:
        - port:
            number: 8834
          tls:
            mode: SIMPLE
            sni: ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: infra-egress-gateway-nessus-dr-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      host: infra-egress-gateway.istio-system.svc.cluster.local
      subsets:
      - name: nessus-egress-${SITE_ID:?}-${NESSUS_SUFFIX:?}
        trafficPolicy:
          loadBalancer:
            simple: ROUND_ROBIN
          portLevelSettings:
          - port:
              number: 443
            tls:
              credentialName: nessus-tls
              mode: SIMPLE
              sni: ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: nessus-egress-gateway-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      selector:
        istio: infra-egress-gateway
      servers:
      - hosts:
        - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
        port:
          name: https-port
          number: 443
          protocol: HTTPS
        tls:
          cipherSuites:
          - ECDHE-ECDSA-AES256-GCM-SHA384
          - ECDHE-RSA-AES256-GCM-SHA384
          credentialName: nessus-tls
          mode: SIMPLE
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: Gateway
    metadata:
      name: nessus-terminated-gateway-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      selector:
        istio: management-ingress-gateway
      servers:
      - hosts:
        - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${GDC_SERVICES_ORG_URL_SUFFIX:?}
        port:
          name: https-port
          number: 443
          protocol: HTTPS
        tls:
          cipherSuites:
          - ECDHE-ECDSA-AES256-GCM-SHA384
          - ECDHE-RSA-AES256-GCM-SHA384
          credentialName: nessus-tls
          mode: SIMPLE
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: ServiceEntry
    metadata:
      name: nessus-svc-entry-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      hosts:
      - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
      location: MESH_EXTERNAL
      ports:
      - name: https-port
        number: 8834
        protocol: TLS
      resolution: DNS
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: nessus-admin-virtual-service-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      gateways:
      - istio-system/nessus-terminated-gateway-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      hosts:
      - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${GDC_SERVICES_ORG_URL_SUFFIX:?}
      http:
      - rewrite:
          authority: ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
        route:
        - destination:
            host: infra-egress-gateway.istio-system.svc.cluster.local
            port:
              number: 443
            subset: nessus-egress-${SITE_ID:?}-${NESSUS_SUFFIX:?}
    ---
    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: nessus-egress-virtual-service-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      gateways:
      - istio-system/nessus-egress-gateway-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      hosts:
      - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
      http:
      - match:
        - uri:
            prefix: /
        route:
        - destination:
            host: ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${OIC_DNS_SUFFIX:?}
            port:
              number: 8834
    ---
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: mgmt-infra-egress-access-${SITE_ID:?}-${NESSUS_SUFFIX:?}
      namespace: istio-system
    spec:
      rules:
      - from:
        - source:
            ipBlocks:
            - 0.0.0.0/0
        to:
        - operation:
            hosts:
            - ${SITE_ID:?}-${NESSUS_SUFFIX:?}.${GDC_SERVICES_ORG_URL_SUFFIX:?}
      selector:
        matchLabels:
          istio: management-ingress-gateway
    EOF
    
  3. 將設定發布至 GDC 控制層:

    cat <<EOF | kubectl --kubeconfig ${ORG_MGMT_KUBECONFIG:?} apply -f -
    apiVersion: network.private.gdc.goog/v1alpha1
    kind: DNSRegistration
    metadata:
      name: ${SITE_ID:?}-${NESSUS_SUFFIX:?}-customer-internal
      namespace: tenablesc-system
    spec:
      fqdnPrefix: ${SITE_ID:?}-${NESSUS_SUFFIX:?}
      resolutionConfig:
        exposeToNetwork: VPC
        resolveTo:
          useDefaultIstioGateway:
            ingressLabel: admin
            owningCluster: InfraCluster
        vpcIdentifier: default
    EOF
    

33.9.10. 清除所用資源

刪除暫時的 Nessus 目錄。

rm -rf /tmp/nessus

33.9.11. 啟用授權

本節詳細說明如何套用 Tenable.sc 授權。

  1. 使用下列網址開啟 Tenablesc 網頁版 UI:

    TENABLE_SC_HOST=$(kna get dnsregistrations.network.private.gdc.goog -n tenablesc-system tenablesc -o jsonpath='{.status.fqdn}')
    
    echo "Navigate to https://${TENABLE_SC_HOST:?}"
    
  2. 套用授權前,使用者介面會顯示設定精靈。

    如果 UI 顯示登入提示,表示授權已套用,請略過本節的其餘步驟。

  3. 點選「下一步」

  4. 上傳 Tenablesc 授權檔案 SecurityCenter-<version>-<number>IPs-<uid>.key

    潛在問題:

    • Error Activating License File. License Is Invalid. No Valid License Found.

      這表示提供的授權檔案無效。請逐一排查下列可能原因:

      1. 主機名稱有誤

        這個授權的 Tenabe.com 產品頁面中設定了錯誤的主機名稱。確認 Tenable.com 產品頁面中的授權主機名稱為 tenablesc-as1。如果主機名稱不相符:請將主機名稱設為 tenablesc-as1,然後下載新授權並改用新授權檔案。

      2. 檔案格式有誤

        授權檔案可能在傳輸期間遭到修改:與 Nessus 預先啟用檔案類似,這個授權檔案無法在傳輸期間修改。請務必將從 Tenable.com 產品頁面下載的確切檔案上傳至 Tenable 使用者介面。您可以比較檔案在移轉前後的 SHA,確認檔案是否經過修改。

      3. 授權檔案不正確

        請確認您使用的是從 Tenable.com 產品頁面取得的 Tenable.sc 授權檔案。檔案內容應與 PEM 金鑰類似。

      如果授權仍無法運作,請向 VULN 團隊開啟 metabug,並附上目前為止嘗試的所有疑難排解步驟。

  5. 重新整理頁面。如果系統顯示登入畫面,表示授權已成功套用。

Tenable.sc 現已完全啟動。如要進一步瞭解如何設定及使用 Tenablesc,請參閱操作人員手冊。您應在完成啟動程序後,再進行這些設定。

33.9.12. 選用:解除安裝

本節包含移除 Tenable.sc 部署作業的指令。

請按照下列步驟從叢集解除安裝 Helm 資訊套件:

  1. 從機構基礎架構叢集解除安裝 Helm 資訊套件:

    helm uninstall --namespace tenablesc-system tenablesc-system --kubeconfig ${ORG_INFRA_KUBECONFIG:?}
    
  2. 從管理 API 伺服器解除安裝 Helm 資訊套件:

    helm uninstall --namespace tenablesc-system tenablesc-admin --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
    
  3. 從管理 API 伺服器解除安裝 Tenable SC VM 的 Helm 資訊套件:

    VIRTUAL_MACHINE_NAME=$(knu get virtualmachine -n tenablesc-system -o custom-columns=NAME:.metadata.name | sort -r -k 1 | head -1)
    kna patch virtualmachines.virtualmachine.gdc.goog ${VIRTUAL_MACHINE_NAME:?} -n tenablesc-system --type merge --patch '{"spec":{"runningState":"Stopped"}}'
    helm uninstall tenablesc-vms -n tenablesc-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
    

33.9.13. 設定 Tenable.SC

請按照 NES-G0001 - 設定 Tenable.SC 設定 Tenable.sc。

33.10. 驗證 Nessus 部署作業

本節將詳細說明如何驗證 Nessus 管理員和代理程式是否正常運作並連結在一起,以及如何修正已知的潛在問題。

本節內容應在安裝作業結束時執行,但建議您在執行掃描前,先完成這些驗證步驟。操作手冊中說明瞭如何執行掃描。

開始之前,請按照「設定環境變數」一文的說明,設定根管理員叢集的存取權,並定義 kra 指令列別名。

33.10.1. 驗證叢集

如要確認 Nessus Manager 和代理程式是否已連結,主要方法是透過主要 Nessus Manager 使用者介面。在使用者介面中,Nessus 子項必須列在代理程式叢集預設叢集群組中,所有 Nessus 代理程式則必須列在預設代理程式群組中。

  1. 取得主要 Nessus Manager UI 的 DNS:

    echo Nessus Manager UI: https://$(kra get dnsregistration \
        -n tenable-nessus-system nessus -o jsonpath='{.status.fqdn}')
    
  2. 開啟網際網路瀏覽器,然後前往上一個步驟中的連結。這會將您導向主要的 Nessus Manager UI。

  3. 使用使用者名稱 admin 和預設密碼 admin 登入 Nessus Manager 使用者介面。

    如果登入時發生任何驗證問題,請按照 NES-T0004 輪替 Nessus 憑證,然後重試登入。

  4. 按一下頁面頂端的「設定」

    在「設定」頁面中,查看「外掛程式」資訊。如果未定義「外掛程式集」的值,請按照 NES-T0001 重新將最新外掛程式集套用至主要 Nessus Manager。

  5. 按一下頁面頂端的「感應器」,然後點選「代理程式叢集」

  6. 按一下「Default Agent Group」,查看所有已註冊的節點。

    如果群組為空白,或任何機構的節點 (子項 Nessus 執行個體) 遺失,則必須重新註冊子項 Nessus 執行個體。