개인정보 노출 점검을 수동으로 진행하고 있어 보안 업무 효율화했던 내용을 공유해 보려고 합니다.
대상 URL 목록은 200개이상
노출 점검시간은 2시간
반자동화하여 2시간의 점검 시간을 1분으로 줄였습니다.
1. 배경
- 주민번호, 휴대폰 번호, 계좌번호 등 개인정보를 포함한 웹페이지가 검색엔진에 수집될 경우 사이트에서 해당 웹 페이지의 개인정보를 삭제 조치하더라도, 크롤러가 개인 정보가 삭제 조치된 웹 페이지를 재 수집하지 않는 동안 개인정보가 여전히 검색 엔진에 검색될 수 있다. 홈페이지에 개인정보가 잠시다로 업로드된 경우에는 반드시 해당 노출 내용이 검색엔진의 의해 수집되었는 지를 확인하고 검색엔진에 남아 있는 개인정보를 삭제 조치 되어야 한다.
2. 점검 프로세스
- 사용하는 사이트 URL 목록을 선정하여 주기적으로 개인정보가 검색엔진에 노출되는 지 확인하고 노출되었을 경우 담당자에게 알람(문자/이메일)을 통해 사실을 인지하고, 검색 엔진 사이트에 삭제 요청을 한다.
초기 버전
대상 URL 목록 선정 -> 개인정보 검색엔진 노출 확인(구글) -> 확인 결과 -> txt 파일 저장
- 대상이 되는 URL 목록을 sites.txt 파일에 입력하고 점검 python 스크립트를 실행하여 노출 확인
2차 버전
대상 URL 목록 선정 -> 개인정보 검색엔진 노출 확인(구글, 빙, 네이버등) -> 확인 결과 및 이력
- 주기적으로 개인정보노출 점검하고 이력을 관리할 수 있음
- 웹 점검 시스템으로 만들어 점검 URL목록을 웹페이지에 입력 및 점검 스케쥴링을 이력
최종 버전
대상 URL 목록 선정 -> 개인정보 검색엔진 노출 확인(구글, 빙, 네이버등) -> 확인 결과 및 이력 -> 알람 -> 검색 엔진 삭제 요청
- 2차버전에서 대상 검색엔진을 다양하게 지원하도록 하며, 노출되었을 경우 알람(이메일,문자등)
- 노출된 사이트엔진에 삭제 요청할 수 있도록 export 기능 제공
3. 효과
- 기업 및 정보 노출 피해 예방
- 중요 기업 정보 보호 및 경쟁력 보호
- 개인정보보호 관련 법규 준수
- 기관의 안전하며 활발한 경영환경 구축
4. 점검 모듈 개발
1) 구글 조건 검색
- 특정 사이트 내 검색
site:domain
ex) site:naver.com
- 포함된 단어 검색
site:domain intext:한단어 or alltext: 휴대폰 주소
ex) site:naver.com intext: 휴대폰
ex) site:naver.com intext: 휴대폰 주소
- 특정 확장자 검색
site:domain filetype: txt or xml 등
ex) site:naver.com filetype: xml
2) 구글 조건 검색으로 대상 목록 생성
site:"doamin" intext:핸드폰번호
site:"doamin" inurl:/admin
site:"domain" typefile:pdf
site:"domain" typefile:txt
3) google custom search api
- custom search api 환경 세팅
http://egloos.zum.com/dir2000/v/7515674
- 사용모듈 설치
pip install google-api-python-client
4) 소스 파일
- site.txt 파일 읽어 온다.
- 개인정보 검색엔진 노출 조회(구글) 한다.
- 조회 결과값이 1개 이상인 경우 사이트 목록을 출력한다.
#-*- coding: utf-8 -*-
from googleapiclient.discovery import build
google_api_key = ""
google_cse_id = ""
service = build("customsearch", "v1", developerKey=google_api_key)
with open("./sites.txt", "r", encoding='UTF8') as file:
sites = file.read().splitlines()
def go_search(sites):
for i in range(len(sites)):
results = service.cse().list(q=sites[i], cx=google_cse_id, num=1).execute()
total_results = int(results['searchInformation']['totalResults'])
if total_results > 0:
print(sites[i])
else:
pass
if __name__ == '__main__':
go_search(sites)
5. 참고 문서
- [국감] 개인정보노출, 3년 새 40% 급증...허은아 "인증보급·관리교육 필요"
- 홈페이지 개인정보 노출방지 안내서
개인정보보호 포털 - https://www.privacy.go.kr