보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

SecurityCenter2를 이용한 보안 프로그램 상태 점검방안

2022.12.13

1,768

01. 개요

백신 프로그램(AntiVirus), PMS, DLP 등 엔드포인트에서 사용하는 보안 프로그램은 보안 강화 목적으로 사용되는 관리 소프트웨어의 상당수는 별도의 관리환경(중앙관리 및 관리자 페이지 등)에서 보안설정 현황을 파악할 수 있지만, 별도의 관리 환경이 존재하지 않는 환경이나 클라이언트 환경에서 보안 관련 프로그램의 상태를 확인하는 방법은 상당히 제한적이다. ‘과학기술정보통신부고시 제2021-103호’에 의거하여 KISA에서 발간한 ‘주요정보통신기반시설 기술적 취약점 분석·평가 상세가이드(2021)’에 따르면 ‘W-33. 백신 프로그램 업데이트’, ‘W-36. 백신 프로그램 설치’ 항목을 통해 백신 프로그램의 상태 확인 필요성에 대해 명시하고 있다.

중앙관리가 되지 않는 경우에 대해 관리 및 점검을 해야 한다면, GUI 환경에서 직접 확인하는 방법도 있지만 자산이 많을 경우 수동으로 확인하는 것은 무리가 있다. 이러한 상황일 때 SecurityCenter2를 이용해 자동으로 상태 정보를 확인한다면 비용 측면에서 유리할 것이다. SecurityCenter2란 백신, 방화벽 등 엔드포인트 보안 프로그램의 전반적인 상태를 실시간으로 확인할 수 있는 네임스페이스이다. 윈도우 관리 정보를 제공하는 WMI(Windows Management Instrumentation)에서 SecurityCenter2 네임스페이스를 이용해 보안 프로그램 설치 유무와 업데이트 상태를 알 수 있다.

[그림 1] SecurityCenter2 GUI

[그림 1]과 같이 Windows 바이러스 및 위협 방지에서도 SecurityCenter2를 확인할 수 있다. SecurityCenter2 네임스페이스는 Windows Vista SP1 이상에서 사용할 수 있으며, Windows 서버 운영체제에서는 사용할 수 없다. SecurityCenter2를 사용해 자동으로 점검하는 방법과 SecurityCenter2를 사용할 수 없는 환경에서 점검할 수 있는 방법을 기술해 보고자 한다.

[그림 2] 보안 프로그램 상태 정보 업데이트 흐름도

Win32 API는 Windows에서 사용하는 C언어 기반의 API로, 사용자는 SecurityCenter2의 상태 정보를 조회할 때 Win32 WscAPI를 사용한다. 보안 프로그램의 최신 버전이 배포될 경우 업데이트를 위해 SecurityCenter2의 상태 정보를 변경한다. 실시간으로 상태 정보가 변경되기 때문에 GUI 상에서도 즉각 확인이 가능하지만 상태 정보의 표시 기준을 Class 에 정의된 정보만 제공하고 있으므로 사용자가 원하는 추가적인 정보(검사 예약, 검사 주기 등)는 제공하기 어렵다. SecurityCenter2는 wscsvc 서비스로 실행되며 보안 프로그램에게 수정 권한을 제공한다. 추가적으로 업데이트 일자 및 검사 기록 같은 경우 Windows Defender는 이벤트 로그에 해당 기록들이 상세하게 남지만 3rd Party 보안 프로그램의 경우 대부분 이벤트 로그에 남지 않고 자체적인 로깅을 한다.

[그림 3] Windows Defender 업데이트 로그(Event ID 2000)

[그림 3]은 Windows Defender의 업데이트 로그로 이벤트 뷰어에서 ‘응용 프로그램 및 서비스 로그 → Microsoft → Windows → Windows Defender → Operational’ 경로에서 확인할 수 있으며, 이벤트ID 2000으로 로깅이 남게 된다. Windows Defender의 ‘검사 시작’기능을 사용하는 경우에는 이벤트ID가 1000으로 남게 된다. SecurityCenter2의 기능을 상세하게 알아보기 위해 먼저 SecurityCenter2 네임스페이스의 Class List에 대해서 알아보자.

02. SecurityCenter2 출력 정보

WMI는 컴퓨터 시스템, 네트워크, 엔터프라이즈에서 관리 데이터를 가져오는 모든 로컬, 원격 애플리케이션에 대한 인터페이스를 제공한다. WMI 네임스페이스는 [표 1]와 같이 크게 네 종류의 Class로 구성되어 있다.

[표 1] WMI Class 설명 및 포맷유형
[그림 4] SecurityCenter2 Class List 예시

SecurityCenter2의 Class List에서 보안 프로그램을 확인할 수 있는 Class는 세 가지(AntiVirusProduct, AntiSpywareProduct, FirewallProduct)가 존재한다. 엔드포인트 보안 프로그램이 SecurityCenter2에 등록되어야 WMI를 사용해 시스템에 존재하는 보안 프로그램의 상태 정보를 확인할 수 있다. AntiSpywareProduct는 스파이웨어 보안 프로그램이 포함되어 있는 제품을 출력해 주는 Class로 Windows10 버전 1607 이전의 운영체제에서만 사용할 수 있어 현재 Class는 존재하나 출력 결과를 보증할 수 없다. FirewallProduct는 방화벽 보안 프로그램이 포함되어 있는 제품을 출력해 주는 Class로 AntiVirus 프로그램 내에 애드온(Add-On) 형식으로 방화벽이 존재해 사용자가 방화벽 활성화 여부를 선택할 수 있을 때 출력된다.

AntiVirusProduct는 시스템에 설치된 보안 프로그램을 출력하는 Class이다. SecurityCenter2의 규격과 맞는 제품만 출력되며 AntiVirus 프로그램 내에 애드온 형식의 보안 프로그램(ex: 방화벽)이 존재할 경우 해당 AntiVirus 프로그램과 이름은 같지만 인스턴스 ID가 다르게 출력된다. 세 개의 Class는 같은 구조를 가지고 있으며, 상태 정보를 확인하는 productState의 형식 또한 같다. 해당 Class들이 가지고 있는 인스턴스는 다음과 같다.

[그림 5] SecurityCenter2 내 AntiVirusProduct 의 Class 내용 출력

SecurityCenter2 보안 프로그램 Class의 구조는 [그림 5]와 같은 형태를 가지고 있으며, 개별 값이 의미하는 바는 ‘[표4-2] AntiVirusProduct Class Method 필드별 기능 설명’과 같다.

[표 2] AntiVirusProduct Class Method 필드별 기능 설명

[표 2]를 보면 AntiVirusProduct Class의 productState 값의 의미를 알 수 있다. productState는 보안 프로그램의 상태 정보를 확인할 수 있는 값으로 [그림 5]에 존재하는 productState 값(393472)을 보면 현재 정수형으로 출력되어 있지만 바이너리 타입으로 변환하면 값을 올바르게 측정할 수 있다.

또한, productState 값은 사용자가 기능을 임의로 제어할 수 있을 경우와 제어가 불가능한 경우 상태 값의 출력이 다르게 나타난다. 기능 제어가 가능한 경우 상태 값이 기능을 포함하지 않은 상태로 나타나게 되므로 해당 기능을 사용할 수 있는 Class의 값을 확인해야 한다. 예를 들어, 안티바이러스 제품에서 방화벽 기능 제어가 가능한 상태(애드온 상태) 라면 AntiVirusProduct, FirewallProduct 두 가지 Class의 productState 값을 확인해야 되지만, 반대로 기능 제어가 불가능한 상태(임베디드 상태) 라면 AntiVirusProduct Class에서 방화벽 기능이 포함된 productState 값이 출력된다.

03. AntiVirusProduct 및 FirewallProduct 필드 상세 정보

1) productState 필드 값 의미

[그림 6] Windows Defender의 productState

[그림 7]은 [그림 6]의 productState 값(393472)을 바이너리 값으로 변환한 결과이다. 24개의 bit로 이루어져 있으며, byte 한 개와 nibble 4개로 나누어져 있다.

[그림 7] Windows Defender의 productState Binary 값
[그림 8] _WSC_SECURITY_PROVIDER 구조체

주황색 필드는 마이크로소프트 Win32 API 개발 가이드에 존재하는 WSC_SECURITY_PROVIDER를 의미한다.

WSC_SECURITY_PROVIDER란 Windows Security Center(WSC)에서 모니터링하는 모든 서비스를 정의하는 구조체이다. 크기는 1byte로 첫 번째 필드에 구성되어 있고, 사용자가 제어할 수 없는 보안 프로그램의 기능이 존재할 경우 해당 값이 포함되어 출력된다.

WSC_SECURITY_PROVIDER_FIREWALL의 값(0001)으로 방화벽의 존재 유무를 확인한다. 보안 프로그램의 방화벽이 임베디드 형식으로 존재하고 있다면 AntiVirusProduct Class productState 값이 첫 번째 필드에 안티 바이러스의 상태 값(0100)과 방화벽의 상태 값(0001)이 합산되어 출력된다. 사용자가 제어할 수 있는 애드온 형식의 방화벽이 포함되어 있는 보안 프로그램일 경우 AntiVirusProduct Class productState 첫 번째 1byte 필드 값에 포함되는 것이 아니라 다른 Class인 FirewallProduct Class에서 productState 값이 출력된다.

SecurityCenter2는 안티 바이러스의 상태 측정을 위해 만들어진 네임스페이스이기 때문에 모든 추가 기능을 안티 바이러스에서 제어하는 것으로 판단해 FirewallProduct Class의 productState 값은 0100+α의 형태로 출력된다. 따라서 애드온 형식의 방화벽이 포함되어 있는 보안 프로그램이라면 AntiVirusProduct Class, FirewallProduct Class 두 개의 Class를 출력해 안티바이러스, 방화벽의 활성화 여부 및 버전 상태를 확인해야 한다.

[그림 9] WSC_SECURITY_PRODUCT_STATE 구조체

연두색 필드는 마이크로소프트 Win32 API 개발 가이드에 존재하는 WSC_SECURITY_PRODUCT_STATE를 의미한다.

WSC_SECURITY_PRODUCT_STATE란 Windows Security Center(WSC)에서 사용할 수 있는 보안 제품의 현재 상태를 정의하는 구조체이다. 해당 필드는 nibble로 이루어져 있으며 보안 프로그램의 실시간 활성화 여부를 확인할 수 있다. WSC_SECURITY_PRODUCT_STATE_SNOOZED는 보안 프로그램의 프로세스가 동작하고 있지만 실시간 감시를 임의로 중지시킨 경우 출력되는 값이다.

보라색 필드는 nibble로 이루어져 있고 마이크로소프트에서 제공하는 보안 프로그램일 경우 0001을 출력하고, 아닐 경우에는 0000의 값을 출력한다.

보안 프로그램은 대부분 3rd Party 프로그램을 사용하므로 0000이 출력된다.

파란색 필드는 nibble로 이루어져 있고 현재 보안 프로그램의 버전이 최신 버전일 경우 0000을 출력하고, 최신 버전이 아닐 경우에는 0001의 값을 출력한다.

애플리케이션의 버전을 의미하는 것이 아니라 보안 프로그램의 DB 엔진 업데이트 여부를 확인하는 것이다.

2) productState 샘플 테스트

안티바이러스 제품들을 비교해 주는 AV-TEST의 2022년 인증 평가에서 종합 점수 만점을 받은 백신들 중 임의로 한 개의 제품을 선정해 SecurityCenter2 클래스를 출력해 봤다.

[그림 9] WSC_SECURITY_PRODUCT_STATE 구조체
[그림 11] FriewallProduct productState

보안 프로그램은 안티 바이러스와 방화벽 기능을 제공하고 있으며, 사용자가 임의로 각 기능을 제어할 수 있다. [그림 10]에 존재하는 보안 프로그램 AntiVirusProduct Class의 productState 값(266240)을 바이너리 형태로 변환하면 ‘0000 0100 0001 0000 0000 0000’이다. 현재 보안 프로그램 상태는 활성화되어 있고 최신 버전을 사용하고 있다. Windows Defender의 값(393472)을 바이너리 형태로 변환하면 ‘0000 0110 0000 0010 0000 0000’이고, Windows Defender가 비활성화 상태인 것을 확인할 수 있다. 3rd Party 제품의 보안 프로그램을 사용하면 Windows Defender는 자동적으로 비활성화된다.

[그림 11]에 존재하는 보안 프로그램 FirewallProduct의 productState 값(262144)을 바이너리 형태로 변환하면 ‘0000 0100 0000 0000 0000 0000’이고, 보안 프로그램의 방화벽 상태는 비활성화되어 있다. 사용자가 기능 제어를 할 수 있는 보안 프로그램은 두 개의 productState가 다른 값을 나타내고 있으므로 AntiVirusProduct, FirewallProduct 두 개의 클래스에서 productState를 확인해야 한다.

자동 업데이트와 방화벽 기능이 임베디드 형식으로 존재하는 보안 프로그램을 추가적으로 선정해 테스트 및 분석한 결과이다.

[그림 12] AntiVirusProduct productState
[그림 13] FriewallProduct State

해당 제품은 안티바이러스, 방화벽, 자동 업데이트 세 가지 기능을 제공하고 있으며, 사용자가 임의로 각 기능들을 제어할 수 없다. 보안 프로그램의 AntiVirusProduct Class의 productState 값(462848)을 바이너리 형태로 변환하면 ‘0000 0111 0001 0000 0000 0000’이다. 현재 보안 프로그램의 상태는 보안 프로그램 활성화 및 최신 버전을 사용하고 있다. 보안 프로그램이 활성화되어 있으므로 Windows Defender의 상태는 비활성화된다. FirewallProduct Class가 출력되지 않는 이유는 사용자가 기능 제어를 할 수 없기 때문이다. 하지만 AntiVirusProduct Class productState의 첫 번째 비트 값이 7이므로 임베디드 형식의 자동 업데이트 및 방화벽이 존재하고 있다는 것을 알 수 있다.

04. SecurityCenter2 미존재 시 보안프로그램 상태 점검

SecurityCenter2가 존재하지 않는 환경에서 보안 프로그램의 상태를 점검할 수 있는 방법에 대해 알아보자.

[그림 14] WEBTEST에서 프로세스 실행 경로 확인

[그림 14]는 WMI 쿼리도구인 wbemtest로 Win32_Process Class를 조회하여 MOF를 출력한 결과이다. 조회한 프로세스의 실행 경로는 ExecutablePath 메소드에 저장되어 있는 것을 확인할 수 있다.

[그림 15] 정의된 프로그램 점검 예시

첫 번째 방법으로 업데이트 날짜를 확인할 수 있는 파일을 제공하거나, 레지스트리에 남는 경우 미리 경로를 정의해 두어 정적으로 업데이트 여부를 확인할 수 있다.

두 번째 방법과 세 번째 방법은 미리 정의되지 않은 경우에 문자열을 탐지해 동적으로 업데이트를 확인하는 방법으로 정확도가 높다고 할 수 없지만 수동 점검을 하기 전 마지막 방법으로 동작 상태를 확인할 목적으로도 사용할 수 있는 방법이다. 먼저, 보안 프로그램의 프로세스가 동작하고 있을 때 WIn32_Process Class에서 해당 프로그램의 실행 경로를 파악한다. 파악된 경로에서 하위 경로까지 모두 최근에 수정된 파일이 존재하는지 확인하여 보안 프로그램 업데이트 여부를 확인할 수 있다.

[그림 16] 백신프로그램 업데이트 마지막 수정 일자 확인 예시

forfiles 명령어는 파일 또는 폴더를 일정 조건으로 조회하는 명령어로 /D 옵션을 사용해 설정한 시간보다 수정 시간이 크거나 작은 파일들의 집합을 출력할 수 있다. [그림 16]은 두 번째 방법으로 forfiles 명령을 실행하고 ‘%date%’ 변수 위치에 기준일을 설정하면 설정한 날짜부터 현재까지의 수정 이력이 있는 모든 파일들을 출력해 업데이트 날짜를 확인한다.

[그림 17] 메타데이터($UsnJrnl:$J)을 통한 백신 프로그램 업데이트 여부 확인

마지막으로 $UsnJrnl:$J에서 파일의 생성, 변경, 추가 등을 확인할 수 있으므로 첫 번째의 경우와 마찬가지로 프로세스의 실행 경로를 확인하여 하위 파일들의 수정 날짜를 $UsnJrnl:$J을 파싱 하여 확인할 수 있는 방법이 존재한다. ExecutablePath로 실행 경로에 존재하는 파일 목록을 리스트 형태로 저장 후 저널 파일에서 해당 파일 목록을 탐색해 수정 시간을 확인할 수 있다.

05. 보안 프로그램 상태 점검을 위한 자동화 방안

1) 보안 프로그램 상태 정보 점검 구성도

지금까지의 점검 방법을 토대로 다이어그램을 그려보면 [그림 18] 같이 정리된다. 해당 논리 로직으로 자동 점검 스크립트를 작성할 수 있다.

[그림 18] 보안 프로그램 상태 정보 점검 다이어그램

2) 보안 프로그램 자동화 점검 스크립트

[그림 19] 자동화 점검 스크립트 일부

[그림 18]의 다이어그램을 토대로 제작한 [그림 19] 스크립트에서 각 로직 부분을 스크립트와 번호로 매칭했다. SecurityCenter2를 사용해 보안 프로그램의 상태 정보 및 최신 버전을 확인하기 위해서는 3가지 조건을 충족 시켜야 한다.

첫 번째 조건은 현재 사용하는 시스템이 Workstation Edition 이어야 한다. [그림 19]의 10,11번 라인을 보면 WMI 네임스페이스 중 cimv2의 Win32_OperatingSystem Class의 Caption 메소드를 이용하고 12번 라인의 조건문을 이용해 시스템의 OS가 Workstation Edition을 사용 중인지 확인한다.

두 번째 조건은 SecurityCenter2 네임스페이스가 존재해야 한다. [그림 19]의 16~20라인과 같이 Python에서 wmi 모듈을 사용해 네임스페이스를 호출했을 때 네임스페이스가 존재하지 않으면 에러를 출력하므로 try-except 구문을 통해 조건 참 여부를 확인할 수 있다.

마지막 조건은 AntiVirusProduct Class로 SELECT 쿼리를 보냈을 때 결과가 존재해야 한다. [그림 19]의 23~26번 라인과 같이 쿼리 결과가 존재하지 않을 때 False를 리턴하므로 조건 만족 여부가 확인 가능하다. 3가지 조건이 모두 충족한다면 productState를 24bit로 패딩 후 이진 문자열로 변환하면 6 bit에 AntiVirus 존재 여부, 8 bit에 방화벽 존재 여부를 판단할 수 있다. 예를 들어 ‘00000101’을 판별할 경우 AntiVirus와 임베디드 형식의 Firewall가 존재하므로 AntiVirusProduct Class만 점검하게 된다. 애드온 형식의 보안 프로그램일 경우 FirewallProduct Class를 조회해 결과가 존재할 경우 애드온 형식의 방화벽이 동작 중인 것으로 판단하고 AntiVirusProduct, FirewallProduct 두 개의 Class를 점검한다. 만약 FirewallProduct 조회 시 결과가 존재하지 않으면 방화벽 기능이 존재하지 않는 것으로 판단하여 AntiVirusProduct Class만 점검하게 된다.

만약 3가지 조건 중 하나라도 충족하지 못한다면 [그림 18]의 ⑥ 과정으로 넘어가 진단하게 된다. 이경우 동적 점검을 위해 [그림 19]의 81번 라인과 같이 WMI 네임스페이스 중 cimv2의 Win32_Process Class에서 미리 정의해둔 보안 프로그램의 이름을 조회하여 실행 경로(ExecutablePath)를 AV_Path에 저장한다.

실행 중인 보안 프로그램(AV_Name)이 점검 방법을 미리 정의해둔 프로그램일 경우 [그림 19]의 90번 라인에 존재하는 definedCheck 함수를 호출해 각 보안 프로그램별 점검 방법 로직을 동작 시킨다. 예를 들어 A보안 프로그램의 경우 특정 레지스트리 경로에 최근 업데이트 날짜가 저장된 Value가 존재할 경우 해당 레지스트리 값을 통해 점검할 수 있도록 정의한다. 만약 정의해두지 않은 프로그램일 경우 AV_Path에서 forfiles 명령어로 현재, 하위 경로 모두를 탐색해 최근 수정된 파일의 존재 여부를 확인하게 된다. 그리고 AV_Path 하위에 존재하는 exe 파일들의 FullName을 $UsnJrnl:$J에서 조회하여 최근 수정시간을 확인한다. 위 과정을 전부 진행하고 보안 프로그램이 실행 중이나 의미 있는 결과가 도출되지 않을 경우 해당 프로그램의 GUI 상에서 데이터를 확인하도록 유도한다.

[그림 20] 보안 프로그램 자동화 스크립트 출력 결과 예시 1 (SecurityCenter2가 존재하는 경우)

[그림 20]은 SecurityCenter2가 존재하는 경우 출력되는 형태로 AntiVirus 외에 추가 기능이 존재하는 경우 에드온 및 임베디드 형식의 추가 기능 적용 여부를 확인할 수 있다.

[그림 21] 보안 프로그램 자동화 스크립트 출력 결과 예시 2 (SecurityCenter2가 존재하지 않는 경우)

[그림 21]은 SecurityCenter2가 존재하지 않아 동적 점검의 출력 결과로 CheckFile key에서 판단에 영향을 준 파일의 이름 및 수정 시간을 확인할 수 있다. 또한 Type key에서 동적 점검 시 어떤 Case에 의해 출력된 결과인지 확인이 가능하다.

06. 결론

지금까지 보안 프로그램의 활성화 유무 및 최신 업데이트 적용 여부를 점검하는 방법에 대해 알아보았다. SecurityCenter2를 사용할 수 없어 동적 점검을 진행할 경우 부정확한 결과가 나올 수 있어 최대한 많은 프로그램에 대한 데이터를 정의해두는 것이 중요하다. 상단 네트워크 장비 로그에서 업데이트 서버와 통신하는 이력을 확인하는 방법도 있겠지만 현재 문서는 엔드포인트만을 상정하였으므로 따로 서술하지 않았다. 자동 점검을 할 수 없는 환경이라면 사용자에게 직접 사용 실태를 확인하여 보안 프로그램의 검사 주기, 실시간 감시 여부, 업데이트 관리 방법, 예외 사항 등에 대한 사항을 꼼꼼하게 답변 받고 판단을 내려야 한다.

악성 프로그램으로 인해 보안 프로그램이 비활성화되는 위협이 존재해 주기적으로 검사를 시행해서 악성 프로그램 탐지 가능 여부를 확인해야 한다. ‘행정안전부(사업자의 개인정보 보호조치 기준 제13조)와 방송통신위원회(개인정보의 기술적·관리적 보호 조치 기준 제7조)’가 고시한 사업자의 개인 정보 보호조치 기준에 따르면 보안 프로그램의 자동 업데이트 사용 또는 엔전 업데이트 여부를 최소 일 1회 이상 확인할 것을 규정하고 있다. 또, 악성 프로그램 관련 경보 발생 시 사용 중인 소프트웨어의 업데이트가 존재할 경우 엔진 업데이트 및 패치를 설치할 것을 규정하고 있다. 개인정보 보호법에서도 보안 프로그램을 설치 및 주기적 갱신, 점검 조치를 규정하고 있으므로 보안 프로그램 상태 점검은 선택이 아닌 필수이다. 따라서 이와 같은 보안 지침 및 가이드를 토대로 보안 프로그램에 대한 주기적인 보안점검을 수행하여 안전한 환경을 조성할 수 있기를 기대한다.

07. 참고 자료

[1] Microsoft Docs 'WMI Class'
https://docs.microsoft.com/ko-kr/windows/win32/wmisdk/wmi-classes
[2] WMI Classes Querying Windows endpoints with WMI
https://orbital.amp.cisco.com/help/wmi-classes/
[3] Microsoft Docs 'WSC_SECURITY_PROVIDER' enumeration
https://docs.microsoft.com/en-ie/windows/win32/api/Wscapi/ne-wscapi-wsc_security_provider
[4] Microsoft Docs 'WSC_SECURITY_PRODUCT_STATE‘ enumeration
https://docs.microsoft.com/en-us/windows/win32/api/iwscapi/ne-iwscapi-wsc_security_product_state
[5] AV-TEST The best Windows antivirus software for home users
https://www.av-test.org/en/antivirus/home-windows/
[6] 개인정보 보호법 시행령
https://www.law.go.kr/%EB%B2%95%EB%A0%B9/%EA%B0%9C%
EC%9D%B8%EC%A0%95%EB%B3%B4%20%EB%B3%B4%ED%98%B8%EB%B2%95%20%EC%8B%9C%ED%96%89%EB%A0%B9
[7] 사업자의 개인정보 보호조치 기준
https://www.law.go.kr/LSW/admRulLsInfoP.do?admRulSeq=2000000055139
[8] 개인정보의 기술적 관리적 보호조치 기준 해설서
https://kcc.go.kr/user.do?mode=view&page=A02031100&dc=K02031100&boardId=1148&cp=1&searchKey=ALL&searchVal=%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4&boardSeq=47654