예상 소요 시간: 1일
작동 가능한 구성요소 소유자: VULN
기술 프로필: 배포 엔지니어
최종 업데이트: 2025년 8월 18일
Nessus는 Google Distributed Cloud (GDC) 에어 갭의 지원 및 운영 시스템을 위한 보안 스캐너입니다. 운영 센터 팀이 하드웨어 및 소프트웨어의 보안 취약점을 모니터링하고 대응하는 데 도움이 됩니다.
이 문서에서는 Nessus 배포 단계를 설명하며, 이 문서를 따르는 운영자가 PowerShell과 WSL을 모두 사용할 수 있는 OC 워크스테이션에서 단계를 수행한다고 가정합니다.
33.1. 시작하기 전에
액세스 권한 필요
- IAM-R0005를 따릅니다.
- 루트 관리자 클러스터에서
clusterrole/tenable-nessus-admin-root클러스터 역할을 획득합니다. - 루트 관리자 클러스터의
gpc-system네임스페이스에서role/system-artifact-management-admin역할을 획득합니다.
- 루트 관리자 클러스터에서
- IAM-R0005를 따릅니다.
필요한 도구
- kubectl
- gdcloud
- helm
- yq
- docker
라이선스
- Nessus 라이선스 1개
- NES-G0004 - Nessus 라이선스 사전 활성화 실행 방법에 따라 'GDCH 1' 사전 활성화 번들을 준비합니다.
- Nessus 라이선스 1개
33.1.1. 권장사항
33.1.1.1. 업그레이드
1.14 이전 버전에서 업그레이드하는 경우 설치를 실행하기 전에 이 가이드의 각 주요 섹션에 있는 '선택사항: 제거'를 따르세요.
다시 설치하는 경우 이 가이드의 각 주요 섹션에 있는 '선택사항: 제거' 부분을 따르세요.
33.1.1.2. 조직과 영역 간 버전 차이 처리
조직과 영역 간의 버전 차이로 인해 문제가 발생해서는 안 됩니다. 조직의 버전을 고려하여 조직별 단계를 따르세요. 그러면 각 배포가 영역별로 독립적이 됩니다.
33.1.2. Tenablesc 라이선스
Tenablesc는 라이선스 파일이 있어야 작동하는 라이선스가 부여된 서드 파티 소프트웨어입니다. 계속하기 전에 SBOM에 따라 Tenable 라이선스를 획득해야 합니다. 특별한 경우 라이선스를 제공할 수 있습니다.
라이선스 파일의 이름은 SecurityCenter-<version>-1000IPs-<uid>.key와 같아야 합니다. 이 파일을 찾아 나중에 사용할 수 있도록 기록해 둡니다. Tenablesc UI에 직접 업로드해야 하기 때문입니다.
요구사항:
- IP 한도가 1,000 이상이고 호스트 이름이
tenablesc-as1인 Tenablesc 라이선스 파일 1개
33.2. Nessus 배포 파일 찾기
Nessus를 배포하기 전에 Windows PowerShell을 사용하여 다음 단계를 실행하여 Nessus 설치 파일을 찾습니다.
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나중에 사용할 수 있도록 다음 파일을 로컬 워크스테이션으로 이동합니다.
# 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 - Nessus 라이선스 사전 활성화 방법에 따라 'GDCH 1' 사전 활성화 번들을 준비하세요.
인터넷에 연결된 머신에서 직접 또는 Google 엔지니어링 POC를 통해
nessus-preact-gdch1.tar.gz를 획득합니다.이 파일을 워크스테이션으로 전송하고
$env:USERPROFILE\tenable-nessus아래에 배치합니다.$env:USERPROFILE\tenable-nessus디렉터리에는 사전 활성화 번들이 포함되어야 합니다.$env:USERPROFILE\tenable-nessus ├── nessus-preact-gdch1.tar.gz # GDCH Nessus Preactivation File
33.4. WSL 열기
페이지의 나머지 단계에서는 달리 명시되지 않는 한 모든 명령어에 WSL이 필요합니다.
선택사항: sudo가 필요합니다. sudo 사용자 비밀번호를 모르는 경우 다음 명령어를 실행하여 WSL sudo 사용자
oc-it비밀번호를 설정합니다./mnt/c/Windows/System32/wsl.exe --distribution "${WSL_DISTRO_NAME}" --user root --exec passwd oc-it
33.5. 환경 변수 설정하기
다음 단계에 따라 필요한 환경 변수를 설정합니다.
현재 터미널에서 나중에 사용할 환경 변수
ROOT_ADMIN_CLUSTER_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 관리자 클러스터 kubeconfig의 절대 경로여야 합니다.ROOT_ADMIN_CLUSTER_KUBECONFIG=현재 터미널에서 선택한 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kra='kubectl --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}'USERPROFILE변수를 설정합니다.export USERPROFILE=$(wslpath $(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null))이제
$USERPROFILE이$env:USERPROFILE과 동일한 위치를 가리킵니다.
33.5.1. v1 조직의 환경 변수 설정
현재 터미널에서 나중에 사용할 환경 변수
ORG_ADMIN_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 선택한 조직 관리자 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_ADMIN_KUBECONFIG=현재 터미널에서 선택한 조직 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kna='kubectl --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}'현재 터미널에서 나중에 사용할 환경 변수
ORG_SYSTEM_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 선택한 시스템 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_SYSTEM_KUBECONFIG=현재 터미널에서 선택한 시스템 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias knu='kubectl --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}'
33.5.2. v2 조직의 환경 변수 설정
현재 터미널에서 나중에 사용할 환경 변수
ORG_MGMT_KUBECONFIG를 정의합니다. 이는 선택한 v2 조직의 관리 플레인 API 서버 kubeconfig의 절대 경로여야 합니다(기본 요건으로 생성됨).ORG_MGMT_KUBECONFIG=현재 터미널에서 선택한 조직 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kna='kubectl --kubeconfig ${ORG_MGMT_KUBECONFIG:?}'현재 터미널에서 나중에 사용할 환경 변수
ORG_INFRA_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 선택한 v2 조직의 컨트롤 플레인 API 서버 kubeconfig의 절대 경로여야 합니다.ORG_INFRA_KUBECONFIG=현재 터미널에서 선택한 시스템 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias knu='kubectl --kubeconfig ${ORG_INFRA_KUBECONFIG:?}'
33.6. 사전 활성화 번들 업로드
다음 단계에 따라 아티팩트 Harbor 레지스트리를 업로드합니다.
번들을 적절한 메타데이터를 사용하여 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"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사전 활성화 번들을 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 설치
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설치가 완료될 때까지 약 1시간 30분 정도 기다립니다.
33.7.1. 선택사항: Nessus 제거
이 섹션에는 필요한 모든 클러스터에서 Nessus 배포를 삭제하는 명령어가 포함되어 있습니다.
루트 관리자 클러스터에서 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:?}조직 아키텍처 v1:
조직 관리자 클러스터에서 Nessus를 제거합니다.
helm list -n tenable-nessus-system -q --kubeconfig ${ORG_ADMIN_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}조직 시스템 클러스터에서 Nessus를 제거합니다.
helm list -n tenable-nessus-system -q --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}
조직 아키텍처 v2의 경우:
조직 관리 클러스터에서 Nessus를 제거합니다.
helm list -n tenable-nessus-system -q --kubeconfig ${ORG_MGMT_KUBECONFIG:?} | xargs helm uninstall -n tenable-nessus-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}조직 인프라 클러스터에서 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 확인
키와 인증서가 게시되었는지 확인합니다.
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')"상위 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이전 명령어의 출력이 false인 경우와 같이 상위 Nessus Manager가 비정상으로 보고되면 다음 명령어를 사용하여 상위 Nessus Manager를 다시 시작합니다.
kra rollout restart deployment vuln-parent-nessus-backend-app -n tenable-nessus-system1시간 30분 정도 기다린 후 상태를 다시 확인합니다.
1시간 30분이 지나도 상위 Nessus Manager가 비정상으로 보고되면 당직자에게 문제를 에스컬레이션합니다.
Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}상위 Nessus Manager 구성을 포함합니다.
kra get pnm -A -o yaml
하위 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하위 Nessus Manager가 비정상으로 보고되면 다음 명령어로 하위 Nessus Manager를 다시 시작하고 20분 동안 기다린 후 상태를 다시 확인합니다.
kra rollout restart deployment vuln-managed-nessus-backend-app -n tenable-nessus-system20분이 지나도 하위 Nessus 관리자가 비정상으로 보고되면 문제를 에스컬레이션하고 Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}하위 Nessus Manager 구성을 포함합니다.
kra get cnm -A -o yaml
비정상 에이전트가 없는지 확인합니다.
echo "Nodes with unhealthy agents:"\ $(kra get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')비정상 목록에 나열된 모든 에이전트에 대해 변수
NESSUS_AGENT_NAME를 설정하고 다음 명령어를 모두 실행합니다.NESSUS_AGENT_NAME= kra delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 각 에이전트에 대해 다음 단계를 따르세요.
Grafana에서 포드
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 저장소 conf를 효과적으로 삭제).
20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 문제를 에스컬레이션하고 Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}Nessus 에이전트 상태를 포함합니다.
kra get nessusagent/${NESSUS_AGENT_NAME} -n tenable-nessus-system -o yamlNessus 에이전트 구성을 포함합니다.
kra get nessusagentconfig/nessus-agent-config -n tenable-nessus-system -o yaml
33.8. Nessus Manager - 조직 확인
이 섹션에서는 Distributed Cloud 조직 내에서 Nessus를 확인하는 데 필요한 단계를 설명합니다.
Nessus 인증을 성공적으로 완료하려면 Operations Center IT 조직 클러스터를 비롯한 Distributed Cloud의 각 조직 클러스터에 대해 이 절차를 실행하세요.
사용 가능한 조직을 나열합니다.
kra get -n gpc-system organization
이미 다룬 root 조직을 제외한 각 조직에 대해 다음 단계를 진행합니다.
33.8.1. 기본 요건
v1 조직에 필요한 액세스 권한
- 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를 생성합니다.
- IAM-R0005를 따릅니다.
v2 조직에 필요한 액세스 권한
- 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클러스터 역할을 가져옵니다.
- 타겟 인프라 컨트롤 플레인 kube API 서버에서
- IAM-R0004를 따릅니다.
- 인프라 클러스터의 cp KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
환경 변수 설정에 따라 조직 클러스터에 대한 액세스를 설정하고 kna 및 knu 명령줄 별칭을 정의합니다.
33.8.2. v1 조직의 조직 관리자 클러스터와 v2 조직의 인프라 관리 플레인 kube API 서버에서 Nessus 확인
비정상 에이전트가 없는지 확인합니다.
echo "Nodes with unhealthy agents:"\ $(kna get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')비정상 목록에 나열된 모든 에이전트에 대해 변수
NESSUS_AGENT_NAME를 설정하고 다음 명령어를 모두 실행합니다.NESSUS_AGENT_NAME= kna delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 각 에이전트에 대해 다음 단계를 따르세요.
Grafana에서 포드
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 저장소 conf를 효과적으로 삭제).
20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 문제를 에스컬레이션하고 Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}
33.8.3. v1 조직의 시스템 클러스터와 v2 조직의 인프라 컨트롤 플레인 kube API 서버에서 Nessus 확인
하위 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하위 Nessus Manager가 비정상으로 보고되면 다음 명령어로 하위 Nessus Manager를 다시 시작하고 20분 동안 기다린 후 상태를 다시 확인합니다.
knu rollout restart deployment vuln-managed-nessus-backend-app -n tenable-nessus-system20분이 지나도 하위 Nessus 관리자가 비정상으로 보고되면 문제를 에스컬레이션하고 Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}하위 Nessus Manager 구성을 포함합니다.
knu get cnm -A -o yaml
비정상 에이전트가 없는지 확인합니다.
echo "Nodes with unhealthy agents:"\ $(knu get nessusagent -A -o yaml | yq '.items[] | select(.status.conditions[] | select(.type == "Heartbeat" and .status == "False")) | .spec.nodeRef')비정상 목록에 나열된 모든 에이전트에 대해 변수
NESSUS_AGENT_NAME를 설정하고 다음 명령어를 모두 실행합니다.NESSUS_AGENT_NAME= knu delete nessusagent ${NESSUS_AGENT_NAME} -n tenable-nessus-system20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 각 에이전트에 대해 다음 단계를 따르세요.
Grafana에서 포드
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 저장소 conf를 효과적으로 삭제).
20분이 지나도 비정상 에이전트가 목록에 계속 표시되면 문제를 에스컬레이션하고 Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
Grafana UI에서 지정된 쿼리를 실행한 후 다음 정보를 포함합니다.
{pod="<pod_name>"}Nessus 에이전트 상태를 포함합니다.
knu get nessusagent/${NESSUS_AGENT_NAME} -n tenable-nessus-system -o yamlNessus 에이전트 구성을 포함합니다.
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클러스터 역할을 획득합니다.
- gdchservices 관리 클러스터에서
- IAM-R0004를 따릅니다.
- gdchservices 관리자 클러스터의 KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
- gdchservices 시스템 클러스터에서
clusterrole/tenable-nessus-admin-system-legacy클러스터 역할을 획득합니다.
- gdchservices 시스템 클러스터에서
- IAM-R0004를 따릅니다.
- gdchservices 시스템 클러스터의 KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
- 조직 아키텍처 v2의 경우:
- IAM-R0005를 따릅니다.
- 루트 관리자 클러스터에서
clusterrole/tenable-nessus-admin-root클러스터 역할을 획득합니다.
- 루트 관리자 클러스터에서
- IAM-R0004를 따릅니다.
- 루트 관리자 클러스터의 KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
- gdchservices-management 클러스터에서
clusterrole/tenable-nessus-admin-infra-mp클러스터 역할을 획득합니다.
- gdchservices-management 클러스터에서
- IAM-R0004를 따릅니다.
- gdchservices-management 클러스터의 KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
- gdchservices-infra 클러스터에서
clusterrole/tenable-nessus-admin-infra-cp클러스터 역할을 획득합니다.
- gdchservices-infra 클러스터에서
- IAM-R0004를 따릅니다.
- gdchservices-infra 클러스터의 KUBECONFIG를 생성합니다.
- IAM-R0005를 따릅니다.
- 조직 아키텍처 v1:
33.9.2. 환경 변수 설정하기
다음 단계에 따라 필요한 환경 변수를 설정합니다.
현재 터미널에서 나중에 사용할 환경 변수
ROOT_ADMIN_CLUSTER_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 관리자 클러스터 kubeconfig의 절대 경로여야 합니다.ROOT_ADMIN_CLUSTER_KUBECONFIG=현재 터미널에서 루트 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kra='kubectl --kubeconfig ${ROOT_ADMIN_CLUSTER_KUBECONFIG:?}'gdchservices 조직의 관리 평면 kubeconfig에 대한 환경 변수를 정의합니다.
조직 아키텍처 v1: 현재 터미널에서 나중에 사용할 환경 변수
ORG_ADMIN_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 gdchservices 관리자 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_ADMIN_KUBECONFIG=조직 아키텍처 v2: 현재 터미널에서 나중에 사용할 환경 변수
ORG_MGMT_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 gdchservices 관리 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_MGMT_KUBECONFIG=
위의 kubeconfig를 사용하여 kubectl 명령어의 별칭을 만듭니다.
조직 아키텍처 v1의 경우: 현재 터미널에서 gdchservices 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kna='kubectl --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}'조직 아키텍처 v2: 현재 터미널에서 gdchservices 관리자 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias kna='kubectl --kubeconfig ${ORG_MGMT_KUBECONFIG:?}'
gdchservices 조직의 컨트롤 플레인 kubeconfig에 대한 환경 변수를 정의합니다.
조직 아키텍처 v1: 현재 터미널에서 나중에 사용할 환경 변수
ORG_SYSTEM_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 gdchservices 시스템 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_SYSTEM_KUBECONFIG=조직 아키텍처 v2: 현재 터미널에서 나중에 사용할 환경 변수
ORG_INFRA_KUBECONFIG를 정의합니다. 이는 필수 요건으로 생성된 gdchservices 인프라 클러스터 kubeconfig의 절대 경로여야 합니다.ORG_INFRA_KUBECONFIG=
위의 kubeconfig를 사용하여 kubectl 명령어의 별칭을 만듭니다.
조직 아키텍처 v1: 현재 터미널에서 gdchservices 시스템 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias knu='kubectl --kubeconfig ${ORG_SYSTEM_KUBECONFIG:?}'조직 아키텍처 v2: 현재 터미널에서 gdchservices 인프라 클러스터 kubectl 명령어의 별칭을 정의합니다.
alias knu='kubectl --kubeconfig ${ORG_INFRA_KUBECONFIG:?}'
USERPROFILE변수를 설정합니다.export USERPROFILE=$(wslpath $(cmd.exe /c "<nul set /p=%UserProfile%" 2>/dev/null))이제
$USERPROFILE이$env:USERPROFILE과 동일한 위치를 가리킵니다.Tenablesc가 배포된 조직의 이름을 정의합니다.
ORG=gdchservices
33.9.3. 설치 준비
다음 단계를 따라 조직을 준비합니다.
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" EOF2분 후 조직 관리자 및 시스템 클러스터에 네임스페이스가 있는지 확인합니다.
kna get namespace tenablesc-system -o yaml knu get namespace tenablesc-system -o yamlresourcemanager.gdc.goog/attach-all-user-clusters: "true"프로젝트 라벨로 인해 조직의 모든 사용자 클러스터에도 네임스페이스가 생성됩니다.Tenable.sc 관리자 및 관리자 사용자 인증 정보를 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. 관리자 차트 설치
설치를 준비하려면 다음 환경 변수를 설정하세요.
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관리자 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:?}조직 아키텍처 v2의 경우:
OCIT_NESSUS_MANAGER_PREFIXES를"{dc1-nessus1,dc1-nessus2}"와 같은 쉼표로 구분된 목록으로 설정하여 OCIT VM 접두사를 나타냅니다.OCIT VM 접미사를 나타내는
OCIT_NESSUS_URL_SUFFIX을 설정합니다.관리 플레인에 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 EOFDNS 등록을 만듭니다.
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 EOF5분간 기다린 후 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:?}"'"}]'
배포를 확인합니다.
다음 명령어의 출력을 검토하여
tenablesc-admin배포가 성공했는지 확인합니다.조직 아키텍처 v1:
helm ls --namespace tenablesc-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}조직 아키텍처 v2의 경우:
helm ls --namespace tenablesc-system --kubeconfig ${ORG_MGMT_KUBECONFIG:?}
가상 서비스가 있는지 확인합니다.
조직 아키텍처 v1:
kna get virtualservice -n tenablesc-system조직 아키텍처 v2의 경우:
knu get virtualservice -n tenablesc-system
DNS 항목이 있는지 확인합니다.
echo $(kna get dnsregistrations.network.private.gdc.goog -n tenablesc-system tenablesc -o jsonpath='{.status.fqdn}')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' EOF5분이 지나면 출력은 다음과 비슷합니다.
{ "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분이 지난 후에도 상태 출력이 올바르지 않으면 관측 가능성 플랫폼이 비정상일 수 있습니다. 디버깅에 도움이 되도록 사용 가능한 상태 정보가 포함된 메타 버그를 엽니다.
33.9.5. 설치된 VM 차트
설치를 준비하려면 다음 환경 변수를 설정하세요.
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 }')조직 아키텍처 v2의 경우:
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 }')
가상 머신 유형을 설정합니다.
모든 가상 머신 유형의 이름을 가져옵니다.
kna get virtualmachinetypes.virtualmachine.gdc.goog -n vm-systemSupported필드가true인 가상 머신 유형을 선택하고 환경 변수에 저장합니다. 선호:n2-standard-4-gdc및n3-standard-4-gdcVIRTUAL_MACHINE_TYPE=
Tenable.sc 로그가
infra-obsLoki 인스턴스로 전송되려면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 EOFVM 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:?}조직 아키텍처 v2의 경우:
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 차트를 적용할 때 다음과 같은 문제가 발생할 수 있습니다.
웹훅 실패:
connect: connection refusedError: 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 명령어를 다시 실행합니다.
배포를 확인합니다. 다음 명령어의 출력을 검토하여
tenablesc-vm배포가 성공했는지 확인합니다.helm ls --namespace tenablesc-system --kubeconfig ${ORG_ADMIN_KUBECONFIG:?}Tenablesc가 실행될 때까지 기다립니다.
가상 머신 상태를 확인합니다.
kna get virtualmachines.virtualmachine.gdc.goog -n tenablesc-systemVM이 아직 프로비저닝 중임을 나타내는 출력 예시:
NAME STATUS AGE tenablesc-as1 Pending 55sVM이 실행 중임을 나타내는 출력 예시:
NAME STATUS AGE tenablesc-as1 Running 8m25s60분이 지나도 VM이 실행되지 않으면 네임스페이스 이벤트에서 눈에 띄는 오류를 검토하세요.
knu get -n tenablesc-system events -o wide주목할 만한 경고와 오류를 수집하고 메타버그와 함께 보고합니다.
Tenable.sc UI에 액세스하려면
VirtualService및DestinationRule가 필요합니다.조직 아키텍처 v1: 변경이 필요하지 않습니다.
조직 아키텍처 v2의 경우:
나중에 사용할 수 있도록 서비스 이름을 환경 변수로 설정합니다.
TENABLE_SC_SERVICE=$(knu get service -n tenablesc-system | awk '($1 ~ /^g-svc-/) && ($0 ~ /443/) {print $1}'s)VirtualService및DestinationRuleCR을 수정합니다.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"}}'
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:?}서비스가 DNS를 통해 확인되는지 확인합니다.
예상되는 결과는 200 응답 코드와 일부 HTML 출력입니다.
curl -kv https://${TENABLE_SC_HOST:?}
33.9.6. Tenablesc VM SSH 사용자 인증 정보 준비
다음 단계에 따라 Tenable VM에 액세스할 수 있도록 SSH를 준비합니다.
SSH 키를 생성합니다.
이 SSH 키는 VM에 액세스하는 데 일시적으로만 사용됩니다.
rm /tmp/tenablesc ssh-keygen -t rsa -b 4096 -f /tmp/tenablesc -N ""다음 환경 변수를 설정합니다.
export VM_PUBLIC_KEY=$(cat /tmp/tenablesc.pub) export VM_NAME=tenablesc-as1임시 (24시간)
VirtualMachineRequest를 만듭니다.VirtualMachineRequest는 생성된 SSH 인증서를 VM에 설치하는 데 사용됩니다.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:?} EOFVM SSH IP를 로컬 환경 변수로 내보냅니다.
INGRESS_IP=$(kna get vmexternalaccess tenablesc-as1 -n tenablesc-system -o jsonpath='{.status.ingressIP}') echo "VM SSH IP: ${INGRESS_IP:?}"SSH 연결이 작동하는지 테스트합니다.
ssh -i /tmp/tenablesc -o "StrictHostKeyChecking no" alice@${INGRESS_IP:?} whoami예상되는 출력은 SSH 사용자 이름인
alice입니다.SSH 연결이 타임아웃되면 인그레스 정책이 누락된 것입니다. 다음 명령어를 사용하여 인그레스 정책을 만들고 다시 시도하세요.
인그레스 정책을 만듭니다.
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 EOFtenablesc-system네임스페이스에iotools포드를 프로비저닝합니다.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비공개 키를
iotools포드로 전송합니다.비공개 키를
iotools포드로 전송합니다.knu -n tenablesc-system cp /tmp/tenablesc iotools:/tmp/tenablesc
33.9.7. 웹 서비스 인증서 설치
다음 단계에 따라 Tenablesc 웹 서비스 인증서를 설치합니다.
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:?}"웹 서버 인증서와 키를 준비합니다.
다음 명령어는 Tenable UI를 제공하는 데 사용되는 TLS 인증서와 키를 설치합니다.
TLS 인증서 이름 설정
TLS_SECRET_NAME=nessus-tlsnessus-tls인증서를 로컬에 저장합니다.knu get secret ${TLS_SECRET_NAME:?} -n tenable-nessus-system -o yaml > nessus-tls.yamlnessus-tls인증서를iotools포드에 복사합니다.knu -n tenablesc-system cp nessus-tls.yaml iotools:/tmp/nessus-tls.yamlTLS 인증서를 스테이징합니다.
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\""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\""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\""
인증서 설치 스크립트를 준비합니다.
다음 코드를
/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스크립트를
iotools포드로 복사합니다.knu -n tenablesc-system cp /tmp/tenable-sc-install-web-tls.sh iotools:/tmp/tenable-sc-install-web-tls.sh웹 서버 인증서와 키를 설치합니다.
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에서 로그 전달 사용 설정
NES-R0002에 따라 Tenablesc UI에 로그인합니다.
탐색 메뉴에서 시스템 > 구성으로 이동합니다.
구성 페이지에서 기타를 클릭합니다.
Syslog 섹션으로 이동합니다.
- 전달 사용 설정을 사용 설정합니다.
- Facility를 user로 설정합니다.
- 심각도에서 모두 선택을 선택합니다.
제출을 클릭하여 구성을 저장합니다.
33.9.9. OIC에서 GDC 네트워크 연결 사용 설정
nessus1 및 nessus2 VM에 대해 다음 단계를 완료합니다.
다음 환경 변수를 설정합니다.
SITE_ID= OIC_DNS_SUFFIX= NESSUS_SUFFIX= GDC_SERVICES_ORG_URL_SUFFIX=$(kna get configmap dnssuffix -n gpc-system -o jsonpath='{.data.dnsSuffix}')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구성을 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. 라이선스 활성화
이 섹션에서는 Tenablesc 라이선스를 적용하는 방법을 자세히 설명합니다.
다음 URL을 사용하여 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:?}"라이선스가 적용되기 전에는 UI에 설정 마법사가 표시됩니다.
UI에 로그인 메시지가 표시되면 라이선스가 이미 적용된 것이므로 이 섹션의 나머지 단계를 건너뛰어야 합니다.
다음을 클릭합니다.
Tenable.sc 라이선스 파일
SecurityCenter-<version>-<number>IPs-<uid>.key을 업로드합니다.잠재적인 문제:
Error Activating License File. License Is Invalid. No Valid License Found.:이 오류는 제공된 라이선스 파일이 잘못되었음을 의미합니다. 다음과 같은 잠재적 원인을 해결하세요.
잘못된 호스트 이름
이 라이선스의 Tenabe.com 제품 페이지에 잘못된 호스트 이름이 설정되어 있습니다. Tenable.com 제품 페이지의 라이선스 호스트 이름이
tenablesc-as1인지 확인합니다. 호스트 이름이 일치하지 않는 경우: 호스트 이름을tenablesc-as1로 설정하고 새 라이선스를 다운로드한 후 새 라이선스 파일을 대신 사용합니다.잘못된 형식의 파일
전송 중에 라이선스 파일이 수정되었을 수 있습니다. Nessus 사전 활성화 파일과 마찬가지로 이 라이선스 파일은 전송 중에 수정할 수 없습니다. Tenable.com 제품 페이지에서 다운로드한 정확한 파일을 Tenable UI에 업로드해야 합니다. 전송 전후의 파일 SHA를 비교하여 파일이 수정되었는지 다시 확인할 수 있습니다.
잘못된 라이선스 파일
Tenable.com 제품 페이지에서 획득한
Tenable.sc라이선스 파일을 사용하고 있는지 확인합니다. 파일의 콘텐츠는 PEM 키와 유사해야 합니다.
그래도 라이선스가 작동하지 않으면 VULN팀에 메타버그를 열고 지금까지 시도한 문제 해결 단계를 포함하세요.
페이지를 새로고침합니다. 로그인 화면이 표시되면 라이선스가 성공적으로 적용된 것입니다.
이제 Tenablesc가 완전히 부트스트랩되었습니다. Tenablesc를 구성하고 사용하는 추가 단계는 작업자 매뉴얼에 나와 있으며, 부트스트랩 후 완료해야 합니다.
33.9.12. 선택사항: 제거
이 섹션에는 Tenable.sc 배포를 삭제하는 명령어가 포함되어 있습니다.
다음 단계에 따라 클러스터에서 Helm 차트를 제거합니다.
조직 인프라 클러스터에서 Helm 차트를 제거합니다.
helm uninstall --namespace tenablesc-system tenablesc-system --kubeconfig ${ORG_INFRA_KUBECONFIG:?}관리 API 서버에서 Helm 차트를 제거합니다.
helm uninstall --namespace tenablesc-system tenablesc-admin --kubeconfig ${ORG_MGMT_KUBECONFIG:?}관리 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 UI를 사용하는 것입니다. UI에서 Nessus 하위 요소는 에이전트 클러스터링 기본 클러스터 그룹에 나열되어야 하고 모든 Nessus 에이전트는 기본 에이전트 그룹에 나열되어야 합니다.
기본 Nessus Manager UI의 DNS를 가져옵니다.
echo Nessus Manager UI: https://$(kra get dnsregistration \ -n tenable-nessus-system nessus -o jsonpath='{.status.fqdn}')인터넷 브라우저를 열고 이전 단계의 링크로 이동합니다. 그러면 기본 Nessus Manager UI로 이동합니다.
사용자 이름
admin및 기본 비밀번호admin로 Nessus Manager UI에 로그인합니다.로그인하는 동안 인증 문제가 발생하면 NES-T0004에 따라 Nessus 사용자 인증 정보를 순환하고 로그인을 다시 시도하세요.
페이지 상단에 있는 설정을 클릭합니다.
설정 페이지에서 플러그인 정보를 검토합니다. 플러그인 세트 값이 정의되지 않은 경우 NES-T0001에 따라 최신 플러그인 세트를 기본 Nessus Manager에 다시 적용합니다.
페이지 상단에서 센서를 클릭한 다음 에이전트 클러스터링을 클릭합니다.
Default Agent Group을 클릭하여 등록된 모든 노드를 확인합니다.
그룹이 비어 있거나 조직의 노드 (하위 Nessus 인스턴스)가 누락된 경우 하위 Nessus 인스턴스를 다시 등록해야 합니다.