API Security: 민감 데이터를 Grafana 시각화로 보안 강화

API Security는 디지털 환경에서 필수적인 요소로, 특히 민감 데이터(Sensitive Data)가 포함된 API 엔드포인트의 보호가 중요합니다. 이를 위해 데이터 모니터링과 시각화 기술을 결합하여 보안 위협을 효과적으로 관리할 수 있는 Grafana 시각화 방법을 소개합니다.

이 포스트에서는 Grafana table panel을 사용하여 데이터베이스의 데이터를 시각화하는 방법에 대해 설명합니다.

목차

1. 목표
2. 전제 조건
3. API Security를 위한 데이터 구조
4. Grafana와 Table Panel
5. API Discovery와 API Security 시각화의 장점
6. Grafana Table Panel 쿼리
7. 시각화 결과
8. 결론

1. 목표

  • 데이터베이스 테이블에서 민감한 데이터가 포함된 API 호출을 추출합니다.
  • 민감한 정보 유형(Sensitive Information Type), 경로(Path), 메서드(Method)를 Grafana Table Panel로 시각화합니다.

2. 전제 조건

  • Grafana: 최신 버전의 Grafana가 설치되어 있으며, 데이터 소스(예: PostgreSQL, MySQL 또는 F5 LADT의 데이터베이스와 연결된 소스)와 연결됨.
  • 데이터 소스: 민감한 정보 등이 포함된 데이터베이스.

이 포스트에서는 Clickhouse Database를 사용합니다.

3. API Security를 위한 데이터 구조

사용되는 데이터베이스 테이블은 다음과 같은 핵심 필드로 구성됩니다:

  • Timestamp: 이벤트 발생 시간
  • path: API 엔드포인트 경로
  • host: 호스트 정보
  • method: HTTP 메소드 (예: GET, POST)
  • ssn_seen, dob_seen, creditcard_seen, email_seen: SSN, DOB, 신용카드, 이메일 데이터 탐지 수

이러한 필드는 민감 데이터 노출 여부를 추적하여 보안 분석에 유용합니다.

4. Grafana Table Panel

Grafana는 다양한 데이터 소스를 통합하고 시각화하는 오픈소스 플랫폼으로, API Security 모니터링에 최적화되어 있습니다. 그중 Table Panel은 행과 열로 구성된 표 형태로 데이터를 표시하며, 필터링, 정렬, 색상 코딩을 지원합니다. 본 사례에서는 민감 데이터가 포함된 API를 붉은 색으로 강조하여 보안 경고를 직관적으로 전달합니다. 이는 실시간으로 업데이트되어 최신 보안 상태를 반영합니다.

5. API Discovery와 API Security 시각화의 장점

API Discovery는 네트워크 내 API를 자동으로 식별하고 매핑하는 프로세스로, API Security의 핵심입니다. Grafana Table Panel과 결합하면 다음과 같은 이점을 제공합니다:

  • 종합적인 가시성: 모든 API 엔드포인트와 민감 데이터 노출을 한눈에 확인.
  • 실시간 탐지: 지속적인 데이터 업데이트로 즉각적인 대응 가능.
  • 위험 최소화: 비정상적인 패턴을 신속히 식별하여 보안 위협 완화.

6. Grafana Table Panel 쿼리

3섹션에서 설명한 데이터는 아래와 같습니다.

SELECT
    Timestamp,
    host,
    path,
    method,
    ssn_seen,
    dob_seen,
    creditcard_seen,
    email_seen
FROM table

위 테이블의 데이터를 기준으로 Grafana Dashboard를 생성합니다.

1. 사용할 data source를 선택합니다.

2. SQL Editor의 쿼리 입력란에 쿼리를 작성합니다.

이 포스트에서는 아래와 같은 쿼리를 사용합니다.

SELECT
    host,
    method,
    path,
    arrayStringConcat(
        arrayDistinct(
            arrayFlatten(
                groupArray(
                    [
                        CASE WHEN ssn_seen > 0 THEN 'SSN' ELSE '' END,
                        CASE WHEN dob_seen > 0 THEN 'DOB' ELSE '' END,
                        CASE WHEN creditcard_seen > 0 THEN 'CreditCard' ELSE '' END,
                        CASE WHEN email_seen > 0 THEN 'Email' ELSE '' END
                    ]
                )
            )
        ),
        ', '
    ) AS sensitive_data
FROM
    {table_name}
WHERE
    Timestamp >= now() - INTERVAL 1 MINUTE
    AND (ssn_seen > 0 OR dob_seen > 0 OR creditcard_seen > 0 OR email_seen > 0)
GROUP BY
    host,
    method,
    path
ORDER BY
    max(Timestamp) DESC

쿼리 입력 후 Run Query 버튼을 클릭합니다.

3. 그라파나 우측 상단 검색란에 table을 입력하여 Table panel을 선택합니다.

4. 아래와 같이 데이터를 기반한 테이블이 생성됩니다.

5. 테이블은 작성한 쿼리를 기준으로 생성되며 이 포스트에서 사용된 쿼리 내용은 다음과 같습니다.

-- host, method, path, 감지된 민감정보 유형 목록을 추출하는 쿼리
SELECT
    host,                           -- 요청이 감지된 호스트명
    method,                         -- HTTP 요청 메서드 (GET, POST 등)
    path,                           -- 요청 경로

    -- 민감 정보 유형을 문자열로 결합하여 나타냄 (중복 제거 및 빈 문자열 제거 포함)
    arrayStringConcat(
        arrayDistinct(             -- 중복 제거 (SSN, DOB, 등)
            arrayFlatten(          -- 배열을 1차원 배열로 평탄화
                groupArray(        -- 그룹별로 배열을 수집함
                    [              -- 민감 정보가 감지되었는지 조건 검사
                        CASE WHEN ssn_seen > 0 THEN 'SSN' ELSE '' END,             -- 주민등록번호가 감지되었는지
                        CASE WHEN dob_seen > 0 THEN 'DOB' ELSE '' END,             -- 생년월일이 감지되었는지
                        CASE WHEN creditcard_seen > 0 THEN 'CreditCard' ELSE '' END, -- 신용카드 번호가 감지되었는지
                        CASE WHEN email_seen > 0 THEN 'Email' ELSE '' END          -- 이메일이 감지되었는지
                    ]
                )
            )
        ),
        ', '                      -- 최종적으로 감지된 민감 정보들을 콤마(,)로 구분된 문자열로 변환
    ) AS sensitive_data           -- 감지된 민감정보 종류를 하나의 문자열로 출력

FROM
    api_detection.detected_api_endpoints -- 민감 정보 탐지 결과가 저장된 테이블

WHERE
    Timestamp >= now() - INTERVAL 1 MINUTE -- 최근 1분 이내의 데이터만 조회
    AND (ssn_seen > 0 OR dob_seen > 0 OR creditcard_seen > 0 OR email_seen > 0) 
    -- 민감 정보가 하나라도 감지된 요청만 필터링

GROUP BY
    host,                         -- 호스트별 그룹화
    method,                       -- HTTP 메서드별 그룹화
    path                          -- 경로별 그룹화

ORDER BY
    max(Timestamp) DESC           -- 가장 최근 요청 순으로 정렬

7. 시각화 결과

참고 이미지에 나타난 Table Panel은 다음과 같은 데이터를 보여줍니다:

  • host: 192.168.40.131, 192.168.40.132
  • method: 주로 GET
  • path: /api/, /api/a, /api/b
  • sensitive_data: SSN, DOB, CreditCard, Email

추가적으로 그라파나 대시보드 설정을 민감 데이터 노출의 심각성 등을 강조하여 시각화할 수 있습니다.

8. 결론

Grafana Table Panel을 활용한 이 솔루션은 API Security를 위한 강력한 도구입니다. Sensitive Data 시각화를 통해 위협을 대응할 수 있습니다. 이 방법은 보안 팀이 데이터 유출을 방지하고 네트워크를 안전하게 유지하는 데 핵심적인 역할을 하고 있습니다.

Grafana의 기술 지원이 필요하시다면, NGINX STORE에 연락하여 논의하십시오.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required