6.4. File Integrity Operator 이해

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

중요

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

6.4.1. FileIntegrity 사용자 정의 리소스 생성

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

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

절차

  1. 작업자 노드에서 검사를 활성화하려면 worker-fileintegrity.yaml 이라는 다음 예제 FileIntegrity CR을 생성합니다.

    FileIntegrity CR의 예

    apiVersion: fileintegrity.openshift.io/v1alpha1
    kind: FileIntegrity
    metadata:
      name: worker-fileintegrity
      namespace: openshift-file-integrity
    spec:
      nodeSelector: 1
          node-role.kubernetes.io/worker: ""
      tolerations: 2
      - key: "myNode"
        operator: "Exists"
        effect: "NoSchedule"
      config: 3
        name: "myconfig"
        namespace: "openshift-file-integrity"
        key: "config"
        gracePeriod: 20 4
        maxBackups: 5 5
        initialDelay: 60 6
      debug: false
    status:
      phase: Active 7

    1
    노드 검사를 예약하기 위한 선택기를 정의합니다.
    2
    사용자 정의 테인트 가 있는 노드에 예약할 허용 오차 를 지정합니다. 지정하지 않으면 기본 및 인프라 노드에서 실행할 수 있는 기본 허용 오차가 적용됩니다.
    3
    사용할 AIDE 구성이 포함된 ConfigMap 을 정의합니다.
    4
    AIDE 무결성 검사 사이에 일시 중지하는 시간(초)입니다. 노드에 대한 빈번한 AIDE 검사는 리소스 집약적일 수 있으므로 간격을 길게 지정하는 것이 유용할 수 있습니다. 기본값은 900초(15분)입니다.
    5
    노드에 유지할 최대 AIDE 데이터베이스 및 로그 백업(재초 프로세스에서 왼쪽) 수입니다. 이 수를 초과하는 이전 백업은 데몬에서 자동으로 정리합니다. 기본값은 5로 설정됩니다.
    6
    첫 번째 AIDE 무결성 검사를 시작하기 전에 대기하는 시간(초)입니다. 기본값은 0으로 설정됩니다.
    7
    FileIntegrity 인스턴스의 실행 상태입니다. 상태는 Initializing,Pending 또는 Active 입니다.

    초기화

    FileIntegrity 오브젝트는 현재 AIDE 데이터베이스를 초기화하거나 다시 초기화하고 있습니다.

    보류

    FileIntegrity 배포가 계속 생성되고 있습니다.

    활성 상태

    스캔은 활성 및 진행 중입니다.

  2. openshift-file-integrity 네임스페이스에 YAML 파일을 적용합니다.

    $ oc apply -f worker-fileintegrity.yaml -n openshift-file-integrity

검증

  • 다음 명령을 실행하여 FileIntegrity 오브젝트가 성공적으로 생성되었는지 확인합니다.

    $ oc get fileintegrities -n openshift-file-integrity

    출력 예

    NAME                   AGE
    worker-fileintegrity   14s

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

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

절차

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

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

    출력 예

    Active

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

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

6.4.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 실행의 최신 상태를 보고하고 status 필드에 Failed, Succeeded, 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

6.4.5. FileIntegrityNodeStatus CR 상태 유형

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

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

6.4.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"
  }
]

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

6.4.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 | gunzip 으로 연결하려고 합니다. 압축 로그는 구성 맵에 file-integrity.openshift.io/compressed 주석 키가 있는 것으로 표시됩니다.

6.4.6. 이벤트 이해

FileIntegrityFileIntegrityNodeStatus 오브젝트의 상태의 전환은 이벤트에서 기록됩니다. 이벤트 생성 시간은 ActiveInitializing과 같은 최신 전환을 반영하며 반드시 최신 검사 결과가 반영되는 것은 아닙니다. 그러나 최신 이벤트는 항상 최근 상태를 반영합니다.

$ oc get events --field-selector reason=FileIntegrityStatus

출력 예

LAST SEEN   TYPE     REASON                OBJECT                                MESSAGE
97s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Pending
67s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Initializing
37s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Active

노드 검사에 실패하면 add/changed/removed 및 config map 정보를 사용하여 이벤트가 생성됩니다.

$ oc get events --field-selector reason=NodeIntegrityStatus

출력 예

LAST SEEN   TYPE      REASON                OBJECT                                MESSAGE
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-134-173.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-168-238.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-169-175.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-152-92.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-158-144.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-131-30.ec2.internal
87m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:1,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed

추가, 변경 또는 제거된 파일의 수를 변경하면 노드 상태가 전환되지 않은 경우에도 새 이벤트가 생성됩니다.

$ oc get events --field-selector reason=NodeIntegrityStatus

출력 예

LAST SEEN   TYPE      REASON                OBJECT                                MESSAGE
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-134-173.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-168-238.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-169-175.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-152-92.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-158-144.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-131-30.ec2.internal
87m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:1,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed
40m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:3,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed