LA FORET ROUGE

n8n으로 KISA 보안 공지 알림 자동화하기

⏱ 4m | Categories: AUTOMATION | Tags: N8N , AUTOMATION , SECURITY , ALERT , SLACK

KISA 보안 공지를 n8n으로 수집하고 AI로 요약한 뒤 Slack과 이메일로 전달하는 자동화 workflow를 구성해보았습니다.


KISA(한국인터넷진흥원)는 국내외에서 발견된 보안 취약점과 관련된 정보를 보안 공지를 통해 안내합니다. 영향을 받는 제품과 취약점의 내용, 보안 업데이트나 대응 방법 등을 확인할 수 있기 때문에 서버와 업무용 소프트웨어를 운영한다면 꾸준히 확인할 필요가 있습니다.

하지만, 매번 직접 웹사이트에 접속해서 새로운 공지가 올라왔는지 확인하는 일은 생각보다 번거롭습니다. 보안 공지가 언제 올라올지 알 수 없기 때문에, 필요한 내용을 놓치지 않으려면 직접 주기적으로 확인해야 합니다.

그래서 보안 공지를 수동으로 확인하는 대신, 홈랩 환경에 구축해둔 n8n을 이용해 KISA 보안 공지가 올라올 때마다 알림을 받을 수 있는 workflow를 만들어봤습니다.

전체 구성

Workflow 구성은 다음과 같습니다.

n8n으로 구성한 KISA 보안 공지 자동화 workflow

RSS Feed Trigger

KISA 보안 공지는 RSS로도 제공되고 있습니다. 이미 RSS가 제공되고 있으므로, 웹사이트에서 새로운 글이 올라왔는지 직접 확인하는 대신 n8n의 RSS Feed Trigger를 사용했습니다.

RSS Feed Trigger에는 RSS를 확인할 주기를 설정할 수 있습니다. 설정한 주기마다 RSS를 확인하고, 이전에 처리한 항목은 다시 전달하지 않고 새로 올라온 공지만 다음 노드로 넘겨주는 방식으로 동작합니다. 덕분에 매번 모든 공지를 다시 처리하지 않아도 됩니다.

실제 RSS에는 공지 제목을 나타내는 title, 원문 페이지 주소인 link, 게시일을 나타내는 pubDate가 포함되어 있습니다. 다만 RSS에는 게시글 본문 전체가 포함되어 있지 않기 때문에, 상세 내용을 확인하려면 link를 이용해 원문 페이지를 다시 요청해야 합니다.

KISA 보안 공지 RSS에 포함된 title, link, pubDate 항목

Loop Over Items

RSS를 확인했을 때 새 공지가 항상 하나만 올라와 있다는 보장은 없습니다. 확인하지 못한 공지가 여러 개 쌓여 있을 수도 있기 때문에, 여러 항목을 하나씩 처리할 수 있도록 Loop Over Items를 사용했습니다.

각 공지마다 원문 페이지를 조회하고 내용을 정리합니다. 모든 항목의 처리가 끝나면 done 경로로 이동합니다.

공지 페이지 HTML 가져오기

앞서 RSS 예시에서 확인한 것처럼 RSS에는 공지 제목과 게시일, 원문 링크 정도의 정보만 포함되어 있고 게시글 본문 전체는 포함되어 있지 않습니다. 따라서 공지의 상세 내용을 확인하기 위해 HTTP Request 노드에서 각 공지의 URL로 GET 요청을 보내 HTML 소스를 가져옵니다.

HTML에서 본문만 추출하기

KISA 보안 공지 웹페이지의 HTML에는 실제 게시글 본문 외에도 상단 내비게이션, 배너, 푸터 등 여러 공통 요소가 포함되어 있습니다. 이 HTML 전체를 그대로 LLM에 전달할 수도 있지만, 본문과 관계없는 내용이 섞이면 요약 결과의 정확도에 영향을 줄 수 있고 불필요한 토큰도 사용하게 됩니다.

그래서 HTML Extract 노드에서 게시글 본문 영역에 해당하는 CSS Selector를 지정하여 본문만 추출했습니다.

KISA 보안 공지 본문 영역을 추출하기 위한 CSS Selector 설정

추출한 본문은 Markdown 형식으로 변환한 뒤 다음 단계로 전달합니다. HTML은 태그와 속성이 많아 실제 내용을 파악하려면 구조를 함께 해석해야 하지만, Markdown은 제목과 목록 등의 구조가 비교적 간결하게 표현되기 때문에 LLM이 본문 내용을 이해하고 정리하기에 더 적합하다고 판단했습니다.

덧붙임: Markdown이 HTML보다 LLM에 항상 더 유리하다고 단정할 수는 없습니다. 모델과 프롬프트, 입력 데이터에 따라 결과가 달라질 수 있기 때문에, 여기서는 이번 workflow에서 Markdown으로 변환해 사용한 경험을 정리했습니다.

CSS Selector를 사용하는 방식의 한계

본문 영역은 CSS Selector로 추출하고 있기 때문에, 나중에 KISA 웹사이트의 페이지 구조가 변경되면 본문을 제대로 가져오지 못할 가능성이 있습니다. 사이트 구조가 변경되면 CSS Selector도 함께 수정해야 합니다.

다만 공공기관 사이트의 게시글 구조가 자주 크게 바뀌지는 않을 것이라고 판단하여, 우선은 본문 영역을 명확하게 지정하는 방식으로 구현했습니다. 이후 본문 추출에 문제가 발생하면 HTML 구조를 다시 확인하고 Selector를 조정할 수 있습니다.

LLM으로 내용 정리하기

본문만 추출하고 Markdown으로 변환한 내용을 AI 모델에 전달하여 공지의 핵심 내용을 정리합니다. 이후 JavaScript 노드에서 AI의 응답과 RSS의 제목, 게시일, 원문 링크 등을 조합하여 Slack에 보낼 메시지 형식으로 만듭니다.

처음에는 ChatGPT 노드를 사용했지만, 최근에는 안 쓰는 상태로 두고 있던 M1 MacBook Pro에 Ollama를 설치하여 로컬 모델을 연결하는 방식으로 업그레이드 했습니다. 기존 버전으로 하더라도 트리거가 자주 발생되는 것이 아니라 ChatGPT 노드의 API 비용 사용량이 크지는 않았으나, Ollama로 바꿈으로써 별도의 API 호출 비용이 발생하지 않게 되었습니다.

프롬프트에서 강조한 점

프롬프트는 단순히 공지를 짧게 줄이는 것보다, 인프라 엔지니어가 실제 대응에 활용할 수 있는 보고서를 만드는 데 초점을 맞췄습니다.

  • 링크, 수치, 버전, 제품명, 고유명사 등 원문의 값은 변경하지 않도록 지정
  • 개요, 위험도와 판단 근거, 영향받는 시스템, 해결 방안으로 출력 형식을 고정
  • 해결 방안은 엔지니어가 바로 실행할 수 있는 패치나 설정 변경 중심으로 1~2개 제시

출력 형식을 고정하니 공지마다 결과의 구조가 크게 달라지지 않고, Slack 메시지를 읽을 때도 필요한 정보를 빠르게 찾을 수 있었습니다.

결과 병합 및 메시지 형식 정리

Loop Over Items에서 모든 항목의 처리가 끝나면 done 경로로 이동합니다. 이때 loop를 돌며 처리한 공지들은 개별 항목이 배열 형태로 전달됩니다.

JavaScript 노드에서는 이 배열을 하나의 알림으로 만들기 위해 각 항목을 병합하고, 제목·게시일·원문 링크·요약 내용 등이 일정한 형식으로 표시되도록 정리했습니다. 이후 정리된 결과를 Slack과 이메일로 각각 전달합니다.

자동화는 한 번 성공하는 것보다 매번 비슷한 결과를 만들어내는 것이 중요하기 때문에, 원문 전체를 무작정 전달하기보다 필요한 본문만 추출하고 메시지 형식도 별도로 정리했습니다.

알림 전송

알림은 Slack과 이메일, 두 가지 경로로 받을 수 있도록 병렬로 구성했습니다. 기본적으로는 Slack에서 확인하고 있지만, 필요하면 이메일로도 같은 내용을 공유할 수 있습니다.

전송 채널이 두 가지이므로 같은 요약 결과를 각각에 맞는 형식으로 변환한 뒤 전달하도록 구성했습니다. Slack은 메시지 내용을 정해진 형식에 맞춰 작성해야 하므로, Slack에서 지원하는 Markdown 문법에 맞춰 메시지를 구성했습니다.

Slack으로 전송된 결과는 다음과 같습니다.

Slack으로 전달된 KISA 보안 공지 요약 알림

반면 이메일의 경우에는 Markdown 텍스트를 따로 렌더링 해주지는 않기 때문에, Markdown을 HTML로 변환하는 노드를 별도로 추가했습니다.

마무리

이번 작업으로 KISA 보안 공지를 직접 확인하는 반복 작업을 줄이고, 새로운 공지가 등록되었을 때 Slack에서 바로 확인할 수 있는 환경을 만들었습니다.

아직은 기본적인 알림 자동화에 가깝지만, 이후에는 중요도나 대상 제품에 따라 메시지를 분류하거나 중복 공지를 걸러내는 기능도 추가해볼 수 있을 것 같습니다. 또한 우리가 관리하는 장비와 소프트웨어 목록을 기준으로 영향 여부를 비교하여, 실제 관리 대상에 해당하는 공지는 Slack에서 별도로 강조하거나 별도 채널로 전달하는 기능도 추가해보고 싶습니다.

작은 자동화지만, 반복해서 확인해야 하는 업무를 줄였다는 점에서 개인적으로 꽤 만족스러운 작업이었습니다.

Comments

Link copied to clipboard!