imok
article thumbnail
728x90

AWS의 Dive into Amazon OpenSearch Service Workshop을 진행하면서 작성한 글입니다.

이번에는 분석을 위해 모든 웹 로그를 수집하는 데이터 파이프라인을 설정해 봅니다.

 

1. Kinesis Data Firehose 생성 > OpenSearch 에 도메인 연결 > 세분화된 엑세스 제어를 사용해 Firehose가 도메인에 데이터를 씀

2. Kinesis Data Generator에 로그인 > 웹 로그 시뮬레이션 템플릿 지정 > Firehose로 데이터 전송

3. OpenSearch에 이상 감지를 설정해 Generator로 생성한 이상 동작을 감지

4. OpenSearch의 세분화된 엑세스 제어를 설정해 특정 문서 및 인덱스에 대한 차등 엑세스 제공


Data Pipeline 설정

Kinesis Data Firehose 설정

많은 collectors는 OpenSearch로 데이터를 보낼 수 있습니다. 그러나 모든 collectors가 OpenSearch로 데이터를 전송하면, 도메인으로 연결 문제가 생길 수 있습니다. 따라서 데이터를 버퍼링하면서 connection을 "funnel in" 할 수 있는 aggregator를 사용해야 합니다. 이를 Firehose로 사용할 수 있습니다.

 

Firehose 설정

  • Source: Direct PUT
  • Destination: Amazon OpenSearch Service
  • Transform records 섹션을 건너뜁니다. -> Kinesis Data Generator에서 JSON을 보내므로 Transform을 활성화할 필요가 없습니다.

  • Destination settings

 

  • Backup Settings

Kinesis Data Firehose 생성 완료!


OpenSearch Permissions 권한설정

Firehose가 데이터를 전송할 수 있도록 Amazon OpenSearch Service의 권한을 업데이트해야 합니다.

 

Kinesis Firehose의 역할 ARN 가져오기

  • web-logs 스트림 클릭 > Configuration 탭 클릭 > IAM role 클릭

 

 

  • IAM Role의 ARN 복사

 

OpenSearch 설정

  • OpenSearch Service 대시보드 탭 > OpenSearch Plugins 섹션의 Security 클릭 > Roles 클릭 > all_access 클릭

  • 상단의 Mapped Users 탭을 클릭하고 Manage Mapping 버튼을 클릭합니다.

  • Backend roles 섹션에 ARN을 붙여넣기 > Map 클릭

 

OpenSearch 클러스터로 데이터를 보낼 수 있는 Firehose 권한 부여 성공!

 


Kinesis Data Generator 설정

https://github.com/awslabs/amazon-kinesis-data-generator

 

GitHub - awslabs/amazon-kinesis-data-generator: A UI that simplifies testing with Amazon Kinesis Streams and Firehose. Create an

A UI that simplifies testing with Amazon Kinesis Streams and Firehose. Create and save record templates, and easily send data to Amazon Kinesis. - GitHub - awslabs/amazon-kinesis-data-generator: A ...

github.com

 

  • CloudFormation 콘솔 > Output 탭 클릭 > KinesisDataGeneratorUrl URL을 새탭에서 열기
    • Username: admin
    • Password: kdg123
{
    "host": "{{internet.domainName}}",
    "ident": "-",
    "auth": "-",
    "@timestamp": "{{date.utc("YYYY-MM-DDTHH:mm:ss")}}",
    "bytes": {{random.number(1000000)}},
    "verb": "{{random.weightedArrayElement(
        {
            "weights": [0.8,0.1,0.1],
            "data": ["GET","PUT","POST"]
        }
    )}}",
    "url": "{{internet.url}}",
    "http": "HTTP/1.1",
    "status": {{random.weightedArrayElement(
        {
            "weights": [0.9,0.05,0.05],
            "data": ["200","404","503"]
        }
    )}},
    "agent": "{{internet.userAgent}}",
    "clientip": "{{internet.ip}}",
    "geo": {
        "src": "{{address.countryCode}}",
        "dest": "{{address.countryCode}}",
        "coordinates": {
            "lat": "{{address.latitude}}",
            "lon": "{{address.longitude}}"
        }
    }
}

이제 데이터 파이프라인 설정을 완료하고, 샘플 웹 로그 데이터를 클러스터로 전송하기 시작했습니다.

 

 


Web Log Data 확인

 

Amazon OpenSearch Service에서 Kinesis Data Generator 데이터를 확인합니다.

 

Index Mapping 생성

 

  • Stack management를 클릭 >Index patterns을 클릭 > Create index pattern를 클릭

  • Time field에서 @timestamp 선택 > Create index pattern

데이터 검사

 

Discover에서 데이터를 확인합니다.

 


이상 감지

Amazon OpenSearch Service를 사용하면 데이터에서 이상 탐지를 수행할 수도 있습니다.

시간이 지남에 따라 데이터 패턴을 '학습'하여 특정 임계값이나 경고를 미리 정의하지 않고도 잠재적으로 비정상적인 상황을 경고할 수 있습니다. 


1. http 상태 코드를 사용하여 먼저 대부분의 200 상태 코드가 있는 데이터 전송
2. 200 절반 5xx/4xx 코드 절반을 전송하도록 템플릿을 변경 
3. OpenSearch는 먼저 일반적인 대다수 200 상태 코드를 학습, 오류 코드를 추가하면 이상 탐지기 트리거가 표시됨

 

Detector 설정

탐지기는 개별 이상 탐지 작업으로, 여러 탐지기를 정의할 수 있으며 모든 탐지기는 서로 다른 소스의 데이터를 각각 분석하여 동시에 실행할 수 있습니다.

 

  • OpenSearch Dashboards 메뉴 >  Anomaly Detection 섹션 클릭 > Create Detector 클릭
  • Name : non-200-frequency
  • Data Source
    • Index: web-logs
    • data filter
      • Field: status
      • Operator: is not
      • Value: 200
  • Timestamp Field: @timestamp

  • Detector Interval : 1 minute


Model 설정

 

feature는 이상 여부를 확인하려는 인덱스의 필드로, 감지기는 하나 이상의 feature에서 이상을 발견할 수 있습니다.

각 feature에 대한 집계 방법(average(), count(), sum(), min() 또는 max())을 선택해야 합니다. 

 

  • Features
    • Feature Name : status-count
    • Aggregation Method : count()
    • Field : status

초기화를 시작한 후, Real-time Results 탭을 클릭해 감지된 이상 피드를 확인합니다.


결과 검토

 


보안과 역할

 

사이트 관리자로서 인증된 사용자만 특정 문서를 볼 수 있도록 RBAC(역할 기반 액세스 제어)를 구현해봅니다.


1. 인덱스 패턴, 신규 사용자 및 커스텀 역할 생성
2. 커스텀 역할에 클러스터 권한, 인덱스 권한, 테넌시 할당
3. 신규 사용자에게 제한된 액세스 권한을 부여하는 커스텀 역할 매핑
4. 사용자에게 다양한 수준의 액세스 제한 적용

 

신규 사용자 생성

  • Opensearch plugins 섹션의 Security 클릭 > Internal users 클릭 > Create internal user 버튼 클릭
  • 사용자 이름 : restricted-user


커스텀 역할 생성

  • Roles 선택 > Create role 버튼 클릭
  • 역할 이름 : restricted-role


사용자를 역할과 매핑

  • restricted-user 사용자를 restricted-role 커스텀 역할에 매핑

  • Users 드롭다운에서 restricted-user를 선택 >  Map 버튼 클릭

  • restricted-user로 로그인 > Dev-tools 클릭

  • 쿼리 실행
GET web-logs/_count
{
  "query": {
    "match_all": {}
  }
}
  • 로그인은 할 수 있지만, Role에 적용된 권한 부여가 없기 때문에 인덱스에 대한 액세스가 거부됨.


권한 추가

restricted-role 커스텀 역할에 권한을 추가해 restricted-user 사용자 계정이 web-logs 색인에 액세스하고 데이터 검색 가능할 수 있습니다.

  • admin 계정에서 > Security > Roles > Edit role 클릭
    • Index : web-log* 입력
    • Index permissions : data-access 권한 그룹 입력

  • restricted-user 계정에서 다시 쿼리 수행

이제 권한이 있어서 문서 수 확인 가능


고급 권한

restricted-user 계정에 web-logs 인덱스 내의 모든 문서를 쿼리할 수 있는 기본 권한 집합을 부여했습니다. 이제 문서 수준 보안필드 수준 보안에 대해 알아봅니다.

 

문서 수준 보안

  • admin 계정에서 >  restricted-role 역할 페이지의 Edit role 버튼 클릭
  • Document level security 섹션에 다음 데이터를 붙여넣음
{
  "bool": {
    "must": [
      {
        "match": {
          "geo.src": "US"
        }
      }
    ]
  }
}
  • geo.src = US인 문서만 표시하도록 이 역할 구성원의 모든 쿼리를 제한

  • restricted-user 계정에서 카운트 쿼리 실행 > 문서 수가 이전보다 훨씩 적은 것 확인

  • 아래 쿼리를 실행하면, 'geo.src = US' 인 문서만 반환된 것을 확인 할 수 있습니다.
GET web-logs/_search
{
  "query": {
    "match_all": {}
  }
}

 

필드 수준 보안

 

  • admin 계정에서 >  restricted-role 역할 페이지의 Edit role 버튼 클릭
  • Field level security 섹션에 geo.src, url, status, clientip 입력
  • Anonymization 섹션에 clientip을 입력한 다음 Update 클릭

  • restricted-user 계정에서 카운트 쿼리 실행 > 문서 수가 이전보다 훨씩 적은 것 확인


감사 로그 모니터링

Amazon OpenSearch 서비스 도메인에 대한 감사 로그를 활성화하여 클러스터의 사용자 활동을 추적할 수 있습니다. 

 

감사 로그 활성화

위에서 만든 opensearch-workshop 도메인 클릭 > Logs 탭 클릭 > Audit Logs 선택 > Enable 클릭


감사 로그 구성

 

감사 로그의 일부로 모니터링할 문서 또는 필드를 지정해야 함

  • Security 클릭 > Audit logs 클릭 audit logging를 Enable > Compliance Settings 섹션에서 Configure 선택
  • Read 섹션 아래의 compliance:read_watched_fields 에 아래 내용 추가
{
  "accounts": [ "ssn" ]
}

  • Write 섹션 아래에서, compliance:write_watched_indices에 accounts 추가 > save

 

읽기/쓰기 이벤트를 기록하도록 Amazon OpenSearch 도메인 구성이 완료되었습니다.


감사 로그 생성

  • Dev Tools를 선택하고 신규 샘플 문서 인덱싱
POST accounts/_doc/sampleuser
{
  "ssn": "123-456-7890",
  "name": "John Doe"
}

  • 방금 작성한 문서 업데이트
PUT accounts/_doc/sampleuser
{
  "ssn": "123-456-7890",
  "name": "Jane Doe"
}

  •  accounts 인덱스에 대한 읽기 요청을 수행
GET accounts/_search


감사 로그 검토

CloudWatch 로그 그룹에서 'opensearch-workshop/audit-logs'를 클릭 > Search log group 버튼 클릭

  • 발생한 작업 : CREATE
  • 어떤 인덱스에서 발생했는지 : accounts
  • 문서를 생성한 사용자의 ID : admin
  • 문서에 할당된 고유 문서 ID : sampleuser

 

  • 업데이트된 문서 ID : sampleuser
  • 업데이트를 수행한 사용자 : admin
  • 문서의 버전 : 1 에서 2로 증가

  • 작업 범주 : COMPLIANCE_DOC_READ
  • 읽은 문서의 문서 ID : sampleuser
  • 읽은 사용자의 사용자 ID : admin
  • 읽기 감사 이벤트를 트리거한 필드 : ssn

 


 

728x90
profile

imok

@imok2

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!