6.6. File Integrity Operator 이해
File Integrity Operator는 클러스터 노드에서 파일 무결성 검사를 지속적으로 실행하는 OpenShift Container Platform Operator입니다. 이 Operator는 각 노드에서 권한 있는 AIDE(고급 침입 탐지 환경) 컨테이너를 초기화 및 실행하는 데몬 세트를 배포하여 데몬 세트 Pod 초기 실행 중 수정된 파일의 로그를 상태 오브젝트에 제공합니다.
현재는 RHCOS(Red Hat Enterprise Linux CoreOS) 노드만 지원됩니다.
6.6.1. FileIntegrity 사용자 정의 리소스 생성
FileIntegrity
사용자 정의 리소스(CR) 인스턴스는 하나 이상의 노드에 대한 연속적인 파일 무결성 검사 세트를 나타냅니다.
각 FileIntegrity
CR은 FileIntegrity
CR 사양과 일치하는 노드에서 AIDE를 실행하는 데몬 세트에서 지원합니다.
프로세스
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
- 사용자 정의 테인트가 있는 노드에 예약할
tolerations
를 지정합니다. 지정하지 않으면 기본 및 인프라 노드에서 실행되도록 허용하는 기본 허용 오차가 적용됩니다. - 3
- 사용할 AIDE 구성이 포함된
ConfigMap
을 정의합니다. - 4
- AIDE 무결성 검사 사이에 일시 중지하는 시간(초)입니다. 노드에 대한 빈번한 AIDE 검사는 리소스 집약적일 수 있으므로 간격을 더 길게 지정하는 것이 유용할 수 있습니다. 기본값은 900초(15분)입니다.
- 5
- 노드에 유지할 최대 AIDE 데이터베이스 및 로그 백업(초기 프로세스에서 왼쪽) 수입니다. 이 번호를 초과하는 이전 백업은 데몬에 의해 자동으로 정리됩니다. 기본값은 5로 설정됩니다.
- 6
- 첫 번째 AIDE 무결성 검사를 시작하기 전에 대기하는 시간(초)입니다. 기본값은 0입니다.
- 7
FileIntegrity
인스턴스의 실행 상태입니다. 상태가초기화
됨,보류 중
또는활성 상태입니다
.
초기화
FileIntegrity
오브젝트는 현재 AIDE 데이터베이스를 초기화하거나 다시 초기화하고 있습니다.보류 중
FileIntegrity
배포가 계속 생성되고 있습니다.활성 상태
검사가 활성 상태이며 진행 중입니다.
YAML 파일을
openshift-file-integrity
네임스페이스에 적용합니다.$ oc apply -f worker-fileintegrity.yaml -n openshift-file-integrity
검증
다음 명령을 실행하여
FileIntegrity
오브젝트가 성공적으로 생성되었는지 확인합니다.$ oc get fileintegrities -n openshift-file-integrity
출력 예
NAME AGE worker-fileintegrity 14s
6.6.2. FileIntegrity 사용자 정의 리소스 상태 확인
FileIntegrity
사용자 정의 리소스(CR)는 .status.phase
하위 리소스를 통해 해당 상태를 보고합니다.
프로세스
FileIntegrity
CR 상태를 쿼리하려면 다음을 실행합니다.$ oc get fileintegrities/worker-fileintegrity -o jsonpath="{ .status.phase }"
출력 예
Active
6.6.3. FileIntegrity 사용자 정의 리소스 단계
-
Pending
- 사용자 정의 리소스(CR)가 생성된 후 단계입니다. -
Active
- 백업 데몬 세트가 설정되어 실행되는 단계입니다. -
Initializing
- AIDE 데이터베이스가 다시 초기화되는 단계입니다.
6.6.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.6.5. FileIntegrityNodeStatus CR 상태 유형
이러한 조건은 해당 FileIntegrityNodeStatus
CR 상태의 결과 배열에 보고됩니다.
-
Succeeded
- 무결성 검사를 통과했습니다. 데이터베이스가 마지막으로 초기화된 이후 AIDE 검사에 포함된 파일과 디렉터리가 수정되지 않았습니다. -
Failed
- 무결성 검사에 실패했습니다. 데이터베이스가 마지막으로 초기화된 이후 AIDE 검사에 포함된 일부 파일 또는 디렉터리가 수정되었습니다. -
Errored
- AIDE 스캐너에 내부 오류가 발생했습니다.
6.6.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.6.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 아카이브로 추가됩니다. 다음 명령을 사용하여 로그를 추출합니다.
$ oc get cm <failure-cm-name> -o json | jq -r '.data.integritylog' | base64 -d | gunzip
압축 로그는 구성 맵에 file-integrity.openshift.io/compressed
주석 키가 있는 것으로 표시됩니다.
6.6.6. 이벤트 이해
FileIntegrity
및 FileIntegrityNodeStatus
오브젝트의 상태의 전환은 이벤트에서 기록됩니다. 이벤트 생성 시간은 Active
로 Initializing
과 같은 최신 전환을 반영하며 반드시 최신 검사 결과가 반영되는 것은 아닙니다. 그러나 최신 이벤트는 항상 최근 상태를 반영합니다.
$ 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