

FARO는 조직 내 문서에서 민감한 정보를 탐지하는 도구입니다. 복잡한 데이터 보호 도구를 구성하는 데 많은 시간과 비용을 들일 수 없지만 조직 내 민감 문서를 추적하려는 중소기업 및 개인을 대상으로 합니다.
FARO는 문서에서 민감도 지표(예: 문서 ID, 금액, 개인 이메일)를 추출하고, 문서 내 지표의 빈도와 유형을 사용하여 문서에 민감도 점수(낮음에서 높음)를 부여합니다.
현재 이 도구의 모든 기능은 스페인어로 작성된 문서를 대상으로 하지만, 더 많은 언어를 지원하도록 쉽게 업그레이드할 수 있습니다.
이 도구는 TEGRA R&D Cybersecurity Center에서 개발했습니다.
프로젝트에는 다음 폴더가 포함되어 있습니다:
faro/: FARO의 주요 기능이 있는 모듈입니다.config/: YAML 구성 파일이 위치합니다. 언어별로 하나의 yaml 파일(감지되지 않은 언어에 기본 기능을 제공하는 nolanguage.yaml 파일 포함)과 모든 언어에 공통된 구성 파일 config/commons.yaml이 있습니다.models/: FARO 모델을 배치하는 폴더입니다.faro_detection.py: 단일 파일에 대해 독립 실행 모드로 FARO를 실행하는 런처입니다.faro_spider.sh: 일괄 처리를 위한 스크립트입니다.docker_build_faro.sh: Linux 및 Mac OS에서 FARO Docker 이미지를 빌드하기 위한 스크립트입니다.docker_build_faro.bat: Windows에서 FARO Docker 이미지를 빌드하기 위한 스크립트입니다.docker_run_faro.sh: Linux 및 Mac OS에서 FARO 컨테이너를 실행하기 위한 스크립트입니다.docker_run_faro.bat: Windows에서 FARO 컨테이너를 실행하기 위한 스크립트입니다.CHANGELOG: FARO 변경 로그입니다.FARO는 Docker를 사용하여 독립 실행형 컨테이너로 실행할 수 있습니다. 이미지를 직접 빌드하거나 Docker Hub 저장소에서 가져올 수 있습니다.
시스템에 Docker가 설치되어 실행 중인 경우 다음 명령을 실행하여 Docker Hub에서 최신 FARO 이미지를 가져옵니다.
docker pull gradiant/faro
Docker 이미지를 실행하려면 docker_run_faro.sh (Linux/Mac OS) 또는 docker_run_faro.bat (Windows) 스크립트를 사용하십시오. 프로젝트 루트 또는 최신 릴리스에서 찾을 수 있습니다.
시스템에 Docker가 설치되어 실행 중인 경우 다음을 수행하여 FARO 이미지를 빌드합니다.
Linux 및 Mac OS
./docker_build_faro.sh
Windows
docker_build_faro.bat
FARO 컨테이너를 실행하기 위해 프로젝트 루트에 몇 가지 스크립트가 제공됩니다. 편의를 위해 해당 스크립트를 다른 곳에 복사하여 사용할 수 있습니다. 현재 디렉터리 아래에 "output" 폴더가 생성됩니다.
Linux 및 Mac OS
./docker_run_faro.sh <파일이 있는 폴더>
Windows
docker_run_faro.bat <파일이 있는 폴더>
Tika에 tesseract 통합을 통해 OCR 지원을 추가했습니다. OCR 프로세스의 일부 사용자 정의는 env 파일을 사용하여 조정할 수 있으며, 해당 경로를 스크립트의 두 번째 인수로 제공해야 합니다. 템플릿으로 사용할 주석 처리된 예제가 여기에 제공되어 있습니다.
./docker_run_faro.sh <파일이 있는 폴더> <env 파일 경로>
예:
./docker_run_faro.sh ../data docker_faro_env_example.list
FARO는 현재 폴더 안에 "output" 폴더를 만들고 실행 결과를 두 개의 파일에 저장합니다:
output/scan.$CURRENT_TIME.csv: 문서에 부여된 점수와 각 파일의 지표 빈도를 포함하는 CSV 파일입니다.filepath,score,person_position_organization,monetary_quantity,signature,personal_email,mobile_phone_number,financial_data,document_id,custom_words,meta:content-type,meta:author,meta:pages,meta:lang,meta:date,meta:filesize,meta:num_words,meta:num_chars,meta:ocr
/Users/test/code/FARO_datasets/quick_test_data/Factura_NRU_0_1_001.pdf,high,0,0,0,0,0,0,1,4,application/pdf,Powered By Crystal,1,es,,85739,219,1185,False
/Users/test/code/FARO_datasets/quick_test_data/Factura_Plancha.pdf,high,0,6,0,0,0,0,2,8,application/pdf,Python PDF Library - http://pybrary.net/pyPdf/,1,es,,77171,259,1524,True
/Users/test/code/FARO_datasets/quick_test_data/20190912-FS2019.pdf,high,0,3,0,0,0,0,1,2,application/pdf,FPDF 1.6,1,es,2019-09-12T20:08:19Z,1545,62,648,False
output/scan.$CURRENT_TIME.entity: 파일에서 추출된 지표(세분화) 목록이 포함된 JSON입니다. 예:{"filepath": "/Users/test/code/FARO_datasets/quick_test_data/Factura_NRU_0_1_001.pdf", "entities": {"custom_words": {"facturar": 3, "total": 1}, "prob_currency": {"12,0021": 1, "12,00": 1, "9,92": 1, "3,9921": 1, "3,99": 1, "3,30": 1, "15,99": 1, "13,21": 1, "1.106.166": 1, "1,00": 1, "99,00": 1}, "document_id": {"89821284M": 1}}, "datetime": "2019-12-11 14:19:17"}
{"filepath": "/Users/test/code/FARO_datasets/quick_test_data/Factura_Plancha.pdf", "entities": {"document_id": {"H82547761": 1, "21809943D": 2}, "custom_words": {"factura": 2, "facturar": 2, "total": 2, "importe": 2}, "monetary_quantity": {"156,20": 4, "2,84": 2, "0,00": 2, "159,04": 2, "32,80": 4, "191,84": 2}, "prob_currency": {"1,00": 6, "189,00": 2}}, "datetime": "2019-12-11 14:19:27"}
{"filepath": "/Users/test/code/FARO_datasets/quick_test_data/20190912-FS2019.pdf", "entities": {"document_id": {"C-01107564": 1}, "custom_words": {"factura": 1, "total": 1}, "monetary_quantity": {"3,06": 1, "0,64": 1, "3,70": 1}}, "datetime": "2019-12-11 14:19:33"}
참고: LINUX 및 MAC OS X만 지원
이 모드는 올바르게 작동하기 위해 일부 운영 체제와 라이브러리가 필요합니다.
별도의 가상 환경을 사용하는 것이 좋습니다. virtualenv로 가상 환경을 생성하려면:
virtualenv -p `which python3` <환경 이름>
터미널에서 가상 환경을 활성화하려면 다음을 입력하십시오:
source <환경 이름>/bin/activate
시스템을 실행하는 가장 쉬운 방법은 다음과 같이 의존성을 설치하는 것입니다:
pip install -r requirements.txt
의존성 목록은 다음과 같습니다:
다음은 테스트에 사용되는 의존성입니다:
FARO는 작동을 위해 여러 ML 모델에 의존합니다.
detection:
nlp_model : es_core_news_sm
crf_ner_list: models/crf_professions_v1.joblib
personal_email_detection: models/email_detector.joblib
target_list: models/legal.txt
crf_ner_classic: models/crf_classic_step1.joblib,models/crf_classic_step2.joblib,models/crf_classic_step3.joblib,models/crf_classic_step4.joblib,models/crf_classic_step5.joblib
corp_mail_list: models/corp_mail_list.txt
저장소에서는 모델 크기 때문에 Git LFS를 통해 모델을 관리하고 있습니다. git-lfs가 설치되어 있으면 저장소를 처음 클론할 때 자동으로 모델이 다운로드되어야 합니다.
모델을 수동으로 다운로드하려면 프로젝트 루트에서 다음 명령을 실행하십시오.
git lfs pull
config/es.yml 파일 내의 아래 표시된 경로가 모델을 가리키는지 확인하십시오.
스파이더는 폴더 내의 문서를 재귀적으로 분석하고 결과를 파일에 저장하는 스크립트입니다.
./faro_spider.sh <파일이 있는 폴더>
OCR 추가 후 FARO 실행을 위해 환경 변수를 통해 사용자 정의할 수 있는 몇 가지 구성이 있습니다:
FARO_DISABLE_OCR: 이 변수가 설정되면 (값에 관계없이) FARO는 문서에 OCR을 실행하지 않습니다.FARO_REQUESTS_TIMEOUT: Tika 서버가 응답하지 않을 경우 FARO가 타임아웃될 때까지의 시간(초) (기본값: 60)FARO_PDF_OCR_RATIO: 혼합 PDF 문서(텍스트 및 이미지)에서 OCR을 강제하는 데 사용되는 바이트당 문자 수 (기본값: 150 bytes/char)로깅 구성도 환경 변수를 통해 설정할 수 있습니다:
FARO_LOG_LEVEL: FARO 로깅 수준 (기본값: INFO)FARO_LOG_FILE: FARO 로깅 파일 (기본값: None). Docker 사용 시 호스트 시스템에 지속되도록 output 폴더 내에 설정해야 합니다.faro_detection.py 스크립트를 사용하여 단일 파일에 대해 FARO 탐지를 실행할 수 있습니다:
./faro_detection.py -i <파일 경로>
다음 두 개의 출력 파일이 생성됩니다: <파일 경로>.entity 및 <파일 경로>.score.
a) <파일 경로>.entity: 유형별로 정렬되고 출현 횟수가 포함된 엔터티 목록의 JSON (엔터티 탐지기 모듈의 출력):
{"LOC": {"Pontevedra": 1}, "MONEY": {"1.000 euros": 2}, "PER": {"Betty Corti\u00f1as": 1, "Eva Expósito": 1, "Belén Portela": 1, "Marta Rivadulla": 1, "Miguel Rivas": 1}, "PROF": {"el tutor": 1}, "ORG": {"Centro de Recursos Educativos": 1}}
b) <파일 경로>.score: 엔터티 유형과 해당 유형이 텍스트에 나타난 횟수가 포함된 JSON입니다. 이 JSON에는 "score" 속성에 민감도 점수("low", "medium", "high")도 포함되어 있습니다.
{"score": "high", "summary": {"monetary_quantity": 1, "person_position": 1, "mobile_phone_number": 1, "personal_email": 1, "credit_account_number": 2}}
탐지 스크립트에 전달할 수 있는 추가 인수에 대한 자세한 내용은 여기를 참조하십시오.
FARO 엔터티 탐지기는 두 단계를 수행합니다:
지표 목록은 다음과 같습니다:
person_position_organization: 문서에서 추출되어 연결된 엔터티 그룹(사람, 직업-직위, 조직)입니다.
monetary_quantity: 금액(현재 유로와 달러만 지원).
signature: 문서에 서명한 사람을 출력합니다.
personal_email: 기업 이메일이 아닌 이메일(예: info@, rrhh@ 제외).
mobile_phone_number: 휴대폰 번호(일반 전화는 필터링).
financial_data: 신용카드 및 IBAN 계좌 번호.
document_id: 스페인 NIF 및 CIF.
이러한 문장의 고유 개수는 JSON 객체에 수집되어 다음 단계의 입력으로 전달됩니다.
다음 규칙이 적용됩니다:
각 민감도 수준은 민감도 지표에 대한 임계값을 설정합니다. 문서는 해당 점수를 얻기 위해 최소 하나의 임계값(최소 및 최대)을 충족해야 합니다.
문서에서 서로 다른 민감도 임계값이 나타나면(현재 세 개로 구성됨), 문서는 수준의 모든 임계값을 충족하지 않더라도 민감도 점수가 상향됩니다.
"low" 점수는 민감도 지표가 발견되지 않은 문서에도 할당됩니다.
기능 구성을 위해 YAML 파일 세트를 사용합니다(YAML 파일은 "config" 폴더에 위치).
common.yaml: 모든 언어에 공통된 기능을 포함합니다.
.yaml: 언어별 특정 구성을 포함합니다(현재 스페인어만 지원: "es" 코드). 또한 ML 모델의 위치를 나타냅니다(예: 기본적으로 "models" 폴더 내).
설정 파일의 사양에 따라 점수를 선택하는 조건 모음입니다. 수준은 sensitivity_list에 강도 순으로 정렬됩니다(덜 민감한 것부터 더 민감한 것까지). sensitivity 딕셔너리에는 엔터티 유형별로 조건(min, max)이 포함되어 있습니다. 시스템은 문서를 특정 민감도 수준으로 표시하기 위해 해당 수준의 조건 중 하나만 충족하면 됩니다. 또한 sensitivity_multiple_kpis 매개변수로 표시된 대로 문서에서 특정 수준의 여러 KPI가 발견되면 시스템은 민감도 수준을 높입니다(예: 중간에서 높음).
sensitivity_list:
- low
- medium
- high
sensitivity_multiple_kpis: 3
sensitivity:
low:
person_position:
min: 1
max: 5
monetary_quantity:
min: 1
max: 5
signature:
min: 0
max: 0
personal_email:
min: 0
max: 0
....
sensitivity_list는 강도 순으로 정렬된 다양한 민감도 점수 목록입니다.
sensitivity_multiple_kpis 이 숫자는 민감도 점수를 상향시키기 전에 한 수준에서 허용되는 동시 점수 수를 나타냅니다.
sensitivity는 민감도 수준에 도달하기 위해 충족되어야 하는 민감도 조건을 포함하는 딕셔너리입니다.
FARO 응용 프로그램은 문서 처리를 위해 Tika를 사용합니다. 따라서 Tika가 처리할 수 있는 모든 형식을 입력으로 사용할 수 있습니다. 그러나 일괄 처리를 위한 faro_spider.sh/faro_spider.bat 스크립트는 다음 확장자로 제한됩니다: .doc, .docx, .pptx, .ppt, .xls, .pdf, .odt, .ods, .odp, .txt 및 .rtf.
FARO는 고전적인 엔터티(사람, 조직 및 위치)와 직업/직위를 추출하기 위해 NER(CRF로 구축)를 사용합니다.
다른 지표는 RegExp(문서 ID, 전화번호 및 신용카드 번호 등)로 추출됩니다.
이메일은 RegExp로 추출됩니다. ML 분류기와 휴리스틱을 사용하여 기업 이메일과 개인 이메일을 구분합니다.
FARO에는 시스템 기능을 확인하기 위한 여러 테스트가 있습니다(현재 테스트는 정규식만 다룹니다). 테스트는 다음 명령으로 실행할 수 있습니다:
python test_suite.py
--dump: 시스템은 <파일 경로>.score의 정보를 csv 형식으로 stdout에 덤프합니다. 출력 예:
id_file,score,person_jobposition_organization,monetary_quantity,sign,personal_email,mobile_phone_number,credit_account_number,id_document
data/test/test2.pdf,medium,3,0,1,0,0,0,0
출력 파일의 경로는 명령줄에서 --output_entity_file 및 --output_score_file을 사용하여 명시적으로 설정할 수 있습니다.
python faro_detection.py --input_file <파일 경로> --output_entity_file <출력 경로> --output_score_file <출력 경로>
탐지 스크립트의 기본 동작은 민감도 점수에 직접 영향을 미치는 엔터티 유형만 표시하는 것입니다. 탐지된 모든 엔터티를 표시하려면 --verbose 매개변수를 사용하십시오.
추가 매개변수(--split_lines)는 문서의 각 줄이 문장(또는 단락)인 문서와 함께 사용해야 합니다. 기본적으로 FARO는 문서의 줄을 결합하려고 시도합니다. 많은 경우 다른 줄이 다른 문장을 의미하지 않기 때문입니다(예: PDF).
git-lfs (GIT Large File Storage) 설치 지침은 운영 체제에 따라 다릅니다.
https://git-lfs.github.com/ 에서 패키지를 다운로드하고 설치 지침을 따르십시오.
Windows에 "git bash"를 설치하고(이 링크의 Windows 섹션 확인 https://git-scm.com/downloads) 이후 https://git-lfs.github.com/을 방문하여 설치 지침을 따르십시오.
brew install git-lfs
git lfs install
모든 모델이 포함된 models 폴더가 생성됩니다.
전체 기능은 스페인어 문서에서만 작동하지만, 새로운 언어로 쉽게 확장할 수 있습니다(특히 문장과 문서를 처리하는 NLP 도구인 SpaCy에서 지원되는 경우).
시스템은 구문 분석 및 품사 문장 전처리를 위해 SpaCy를 사용합니다. SpaCy는 고전적인 엔터티에 대해 훈련된 NER 시스템을 제공하지만, 고전적인 엔터티(사람, 조직, 위치) 및 직업/직위 추출에는 사용자 정의 NER이 사용됩니다.
TEGRA는 스페인 갈리시아에 위치한 R&D 사이버 보안 센터입니다. 선도적인 국제 통신 회사인 Telefónica가 글로벌 사이버 보안 단위인 ElevenPaths를 통해, 그리고 연결성, 보안 및 인텔리전스 분야에서 100명 이상의 전문가가 근무하는 ICT R&D 센터인 Gradiant와 협력하여 사이버 보안 분야의 혁신적인 제품과 서비스를 창출하는 공동 노력입니다.
TEGRA의 작업은 사이버 보안 환경 내 두 가지 영역인 데이터 보안 및 보안 분석에 중점을 두고 있습니다. 우리는 최첨단 기술을 개발하여 이를 제품에 영양분을 공급하고 차별화된 가치를 제공하는 데 전념하고 있습니다.
CONTRIBUTORS 파일을 참조하십시오.