2.2. File Integrity Operator 이해

File Integrity Operator는 클러스터 노드에서 파일 무결성 검사를 지속적으로 실행하는 OpenShift Container Platform Operator입니다. 이 Operator는 각 노드에서 권한 있는 AIDE(고급 침입 탐지 환경) 컨테이너를 초기화 및 실행하는 데몬 세트를 배포하여 데몬 세트 Pod 초기 실행 중 수정된 파일의 로그를 상태 오브젝트에 제공합니다.

중요

현재는 RHCOS(Red Hat Enterprise Linux CoreOS) 노드만 지원됩니다.

2.2.1. FileIntegrity 사용자 정의 리소스 이해

FileIntegrity 사용자 정의 리소스(CR) 인스턴스는 하나 이상의 노드에 대한 연속적인 파일 무결성 검사 세트를 나타냅니다.

FileIntegrity CR은 FileIntegrity CR 사양과 일치하는 노드에서 AIDE를 실행하는 데몬 세트에서 지원합니다.

다음 예제 FileIntegrity CR에서는 작업자 노드에서만 검사를 활성화하지만 기타 노드에서는 기본값을 사용합니다.

FileIntegrity CR의 예

apiVersion: fileintegrity.openshift.io/v1alpha1
kind: FileIntegrity
metadata:
  name: worker-fileintegrity
  namespace: openshift-file-integrity
spec:
  nodeSelector:
      node-role.kubernetes.io/worker: ""
  config: {}

2.2.2. FileIntegrity 사용자 정의 리소스 상태 확인

FileIntegrity 사용자 정의 리소스(CR)는 .status.phase 하위 리소스를 통해 해당 상태를 보고합니다.

프로세스

  • FileIntegrity CR 상태를 쿼리하려면 다음을 실행합니다.

    $ oc get fileintegrities/worker-fileintegrity  -o jsonpath="{ .status.phase }"

    출력 예

    Active

2.2.3. FileIntegrity 사용자 정의 리소스 단계

  • Pending - 사용자 정의 리소스(CR)가 생성된 후 단계입니다.
  • Active - 백업 데몬 세트가 설정되어 실행되는 단계입니다.
  • Initializing - AIDE 데이터베이스가 다시 초기화되는 단계입니다.

2.2.4. FileIntegrityNodeStatuses 오브젝트 이해

FileIntegrity CR의 검사 결과는 FileIntegrityNodeStatuses라는 다른 오브젝트에 보고됩니다.

$ oc get fileintegritynodestatuses

출력 예

NAME                                                AGE
worker-fileintegrity-ip-10-0-130-192.ec2.internal   101s
worker-fileintegrity-ip-10-0-147-133.ec2.internal   109s
worker-fileintegrity-ip-10-0-165-160.ec2.internal   102s

참고

FileIntegrityNodeStatus 오브젝트는 스캐너의 두 번째 실행이 완료될 때까지 생성되지 않을 수 있습니다. 기간은 구성 가능합니다.

노드당 하나의 결과 오브젝트가 있습니다. 각 FileIntegrityNodeStatus 오브젝트의 nodeName 특성은 검사 중인 노드에 해당합니다. 파일 무결성 검사의 상태는 results 배열에 표시되며 여기에는 검사 조건이 포함됩니다.

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io -ojsonpath='{.items[*].results}' | jq

fileintegritynodestatus 오브젝트는 AIDE 실행의 최신 상태를 보고하고 상태 필드에 상태를 Failed, Succeed 또는 Errored 로 노출합니다.

$ oc get fileintegritynodestatuses -w

출력 예

NAME                                                               NODE                                         STATUS
example-fileintegrity-ip-10-0-134-186.us-east-2.compute.internal   ip-10-0-134-186.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-150-230.us-east-2.compute.internal   ip-10-0-150-230.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-169-137.us-east-2.compute.internal   ip-10-0-169-137.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-180-200.us-east-2.compute.internal   ip-10-0-180-200.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-194-66.us-east-2.compute.internal    ip-10-0-194-66.us-east-2.compute.internal    Failed
example-fileintegrity-ip-10-0-222-188.us-east-2.compute.internal   ip-10-0-222-188.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-134-186.us-east-2.compute.internal   ip-10-0-134-186.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-222-188.us-east-2.compute.internal   ip-10-0-222-188.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-194-66.us-east-2.compute.internal    ip-10-0-194-66.us-east-2.compute.internal    Failed
example-fileintegrity-ip-10-0-150-230.us-east-2.compute.internal   ip-10-0-150-230.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-180-200.us-east-2.compute.internal   ip-10-0-180-200.us-east-2.compute.internal   Succeeded

2.2.5. FileIntegrityNodeStatus CR 상태 유형

이러한 조건은 해당 FileIntegrityNodeStatus CR 상태의 결과 배열에 보고됩니다.

  • Succeeded - 무결성 검사를 통과했습니다. 데이터베이스가 마지막으로 초기화된 이후 AIDE 검사에 포함된 파일과 디렉터리가 수정되지 않았습니다.
  • Failed - 무결성 검사에 실패했습니다. 데이터베이스가 마지막으로 초기화된 이후 AIDE 검사에 포함된 일부 파일 또는 디렉터리가 수정되었습니다.
  • 오류 - AIDE 스캐너에 내부 오류가 발생했습니다.

2.2.5.1. FileIntegrityNodeStatus CR 성공 예

성공 상태가 있는 조건의 출력 예

[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:45:57Z"
  }
]
[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:46:03Z"
  }
]
[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:45:48Z"
  }
]

이 경우 세 가지 검사가 모두 성공했으며 지금까지 다른 조건이 없습니다.

2.2.5.2. FileIntegrityNodeStatus CR 실패 상태의 예

실패 조건을 시뮬레이션하려면 AIDE가 추적하는 파일 중 하나를 수정하십시오. 예를 들어 작업자 노드 중 하나에서 /etc/resolv.conf를 수정합니다.

$ oc debug node/ip-10-0-130-192.ec2.internal

출력 예

Creating debug namespace/openshift-debug-node-ldfbj ...
Starting pod/ip-10-0-130-192ec2internal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.130.192
If you don't see a command prompt, try pressing enter.
sh-4.2# echo "# integrity test" >> /host/etc/resolv.conf
sh-4.2# exit

Removing debug pod ...
Removing debug namespace/openshift-debug-node-ldfbj ...

잠시 후 해당 FileIntegrityNodeStatus 오브젝트의 결과 배열에 Failed 조건이 보고됩니다. 이전의 Succeeded 조건이 유지되므로 검사가 실패한 시간을 정확히 찾을 수 있습니다.

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io/worker-fileintegrity-ip-10-0-130-192.ec2.internal -ojsonpath='{.results}' | jq -r

또는 오브젝트 이름을 언급하지 않는 경우 다음을 실행합니다.

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io -ojsonpath='{.items[*].results}' | jq

출력 예

[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:54:14Z"
  },
  {
    "condition": "Failed",
    "filesChanged": 1,
    "lastProbeTime": "2020-09-15T12:57:20Z",
    "resultConfigMapName": "aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed",
    "resultConfigMapNamespace": "openshift-file-integrity"
  }
]

Failed 조건은 정확히 무엇이 실패하고 왜 실패했는지에 대한 자세한 정보를 제공하는 구성 맵을 가리킵니다.

$ oc describe cm aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed

출력 예

Name:         aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed
Namespace:    openshift-file-integrity
Labels:       file-integrity.openshift.io/node=ip-10-0-130-192.ec2.internal
              file-integrity.openshift.io/owner=worker-fileintegrity
              file-integrity.openshift.io/result-log=
Annotations:  file-integrity.openshift.io/files-added: 0
              file-integrity.openshift.io/files-changed: 1
              file-integrity.openshift.io/files-removed: 0

Data

integritylog:
------
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2020-09-15 12:58:15

Summary:
  Total number of files:  31553
  Added files:                0
  Removed files:            0
  Changed files:            1


---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /hostroot/etc/resolv.conf

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------


File: /hostroot/etc/resolv.conf
 SHA512   : sTQYpB/AL7FeoGtu/1g7opv6C+KT1CBJ , qAeM+a8yTgHPnIHMaRlS+so61EN8VOpg

Events:  <none>

구성 맵 데이터 크기 제한으로 인해 1MB 이상의 AIDE 로그가 실패 구성 맵에 base64로 인코딩된 gzip 아카이브로 추가됩니다. 이 경우 위 명령의 출력을 base64 --decode | zip 으로 전달하려고 합니다. 압축 로그는 구성 맵의 file-integrity.openshift.io/compressed 주석 키가 있는 것으로 표시됩니다.