보안 관리 · 점검핵심 · 14분 읽기

취약점 점검 자동화: 수집·판정·증적·오류 처리

SSH 공통 연결·항목별 판정·Windows 보안 템플릿을 통해, 현재 설정을 수집하고 판정 근거를 남기는 자동화 구조를 설명합니다.

개념부터 찾아보기

정의·역할·동작 원리를 독립 페이지에서 확인하세요. 본문의 밑줄 용어에도 설명이 있습니다.

이 노트에서 설명할 수 있게 되는 것

  1. 수집기·판정기·결과 저장의 역할을 나눈다.
  2. Windows 보안 템플릿과 SID를 점검 근거로 읽는다.
  3. 수집 오류와 판정 상태를 분리해 재현 가능한 결과를 남긴다.

01점검 자동화의 목표와 모듈 구조

  • 원본 과제는 항목의 현재 값을 조회하고 기준에 따라 평가하여 결과를 DB나 보고서로 저장하는 프로그램이었다.
    • 팀별로 서버·네트워크·보안 장비 등을 나누고 공통 실행부가 연결 정보를 넘겨 항목별 class 또는 function을 실행하는 구조를 논의했다.
  • 공통 connector가 SSH 연결·명령 실행·타임아웃·종료를 맡고 collector가 관찰값을 수집하며 evaluator가 기준을 적용하고 reporter가 결과를 저장하도록 역할을 나눌 수 있다.
    • 모듈 이름과 JSON 키는 구현 예시다.
    • 점검 기준의 과 프로그램 내부 설계 규칙을 구분한다.
  • 연결을 항목마다 새로 맺지 않고 재사용하면 로그인 비용을 줄일 수 있지만 연결이 끊겼을 때 재시도·세션 상태·권한 전환을 처리해야 한다.
    • 한 자산의 실패가 전체 점검을 중단하지 않게 하고, 성공한 항목과 수집하지 못한 항목을 함께 기록한다.

02자동 점검의 수집·판정·보고 단계

  1. 자산 ID, 접속 방법, 점검 항목과 기준 판본을 읽는다.
  2. 공통 Connector가 연결을 준비한다. 실패한 자산과 오류를 남기고 다른 대상 처리를 계속할 정책을 적용한다.
  3. 허용된 조회를 실행하고 stdout·stderr·종료 코드·시간 초과를 구분해 수집한다.
  4. 수집값에 적용 조건·예외·양호/취약 기준을 적용한다. 빈 출력과 수집 실패를 정상 상태로 바꾸지 않는다.
  5. 자산·항목·판정 이유·관찰값·시각·수집기와 규칙 버전을 저장한다.
  6. 불명확한 항목은 수동 검토하고 승인된 조치는 별도 변경 과정으로 수행한다. 조치 후 재점검 결과를 연결한다.

03읽기 전용 점검과 자원 사용 한도

  • 진단은 현재 상태를 읽는 작업이다.
    • 취약점이 발견되었다고 설정 파일 수정·패키지 설치·서비스 재시작을 자동으로 섞지 않는다.
    • 보안 정책을 바꾸는 remediation은 승인된 변경 계획과 복구 절차 아래 별도 실행한다.
  • 조회 명령도 큰 디렉터리 순회나 대량 로그 읽기로 I/O를 소모한다.
    • 대상 경로, 출력 크기, 동시 접속 수, 실행 시간을 제한하고 취소·오류 처리 경로를 만든다.
    • 결과를 저장하기 위한 파일 쓰기는 필요할 수 있지만 시스템의 보안 설정 변경과 구분하고 결과 경로의 접근 권한을 제한한다.
  • 모든 오류를 2>/dev/null로 없애면 오판을 만들 수 있다.
    • stdout과 stderr, 종료 코드, timeout을 분리 수집하되 공개 보고서에는 필요한 부분만 담는다.
    • “출력이 비어 있음”이 값이 없다는 뜻인지 읽기 실패인지 판단할 근거를 남긴다.

04Windows secedit 내보내기와 실제 정책 범위

  • secedit /export는 보안 템플릿과 연결된 보안 데이터베이스의 설정을 내보낸다.
    • 원본은 /db test.sdb 지정 시 오류가 나고 해당 옵션을 뺐을 때 동작한 기록을 남겼다.
    • 임의로 적은 DB 파일명과 시스템의 실제 보안 데이터베이스를 혼동한 사례로 읽으며 export 실패를 점검 양호로 처리하지 않는다.
  • 도메인·로컬 정책의 병합을 고려할 때 /mergedpolicy 옵션과 적용 대상 영역을 확인한다.
    • 하나의 INF가 모든 레지스트리·모든 GPO·서비스별 보안 설정을 완전히 대표하는 것은 아니므로 대상 항목에 맞는 추가 조회가 필요하다.
    • /import는 DB로 들여오는 동작이고 /configure는 적용 작업이므로 진단 단계에 넣지 않는다.
  • UNC 공유 경로로 내보내기는 결과 전송 방식의 예다.
    • 공유 접근권한·네트워크 보호·수신 폴더 권한·자격 증명 취급을 검토해야 하며 남의 서버에 무단으로 저장하거나 누구나 읽는 공유에 결과를 두는 방식으로 일반화하지 않는다.
command
secedit /export /mergedpolicy /cfg C:\Audit\security.inf /log C:\Audit\export.log

기존 C:\Audit 폴더에 결과 파일을 생성하는 구조 예제다. 필요한 권한과 보관 위치를 먼저 준비하고, 실행 성공·오류를 확인한 뒤 파싱한다.

수업 원본 자료

원본 로컬 보안 정책 화면을 점검 근거로 읽기

Windows 로컬 보안 정책의 보안 옵션에서 Administrator 계정 이름 바꾸기 설정이 선택되어 있다원본 크기로 보기 ↗
11월 20일 수업의 원본 화면. 정책 이름과 표시 값을 볼 수 있지만 이 한 장이 전체 Windows 보안 기준의 충족을 뜻하지는 않는다.

이 자료에서 읽어낼 것

  1. 선택된 항목은 Administrator 계정 이름 바꾸기이며 오른쪽 표시 값도 Administrator이다. 변경이 완료된 결과 화면이라고 주장하지 않는다.
  2. 계정 상태, 이름 변경, 원격 접속 권한, 암호 정책은 별도 조건이다. 표시 이름 하나만 바꾸어 모든 관리자 보안이 강화되었다고 평가하지 않는다.
  3. 정의되지 않음과 해당 없음이 섞여 있다. 도메인 정책과 실제 적용 상태를 확인하지 않고 모든 항목을 일괄 양호로 판정하지 않는다.
  4. 전체 화면은 로컬 정책 관측 시점의 증거다. 자산 식별·수집 시각·기준 판본 및 다른 수집 결과와 연결하여 보고서에 사용한다.

05SID·표시 이름·유효 권한을 구분하기

  • 는 보안 주체를 SID로 식별한다.
    • 내장 Administrator 계정의 RID는 500이고, S-1-5-32-544는 Administrators 그룹, S-1-5-32-551은 Backup Operators 그룹이다.
    • SID와 UID는 다른 식별 체계이며 개인 계정과 그룹도 구분한다.
  • SeBackupPrivilege에 나열된 SID는 해당 사용자 권한의 할당 대상을 가리킨다.
    • 계정의 표시 이름이 바뀌어도 SID가 함께 새로 생기는 것은 아니다.
    • 이름 문자열만 비교하면 이름 변경·언어 차이·그룹 중첩 때문에 잘못된 결과를 낼 수 있다.
  • 계정 잠금·활성 상태, 암호 정책, 원격 로그온 권한, 그룹 소속, 서비스 설정과 접근 경로를 기준에 맞춰 나눠 점검한다.
    • 관리자 이름 변경 화면 하나를 시스템 관리자 권한의 전체 검증으로 대신하지 않는다.

06Linux·네트워크 장비의 유효 설정 수집

  • 서비스는 기본 파일, Include, 배포판 도구와 runtime 상태가 겹친다.
    • SSH는 Match 조건과 유효 설정, PAM은 실제 인증 스택, 는 로드한 규칙과 출력 대상까지 봐야 한다.
    • 파일이 있다는 사실과 기능이 실제 활성화된 것은 다르다.
  • 원본 로그 실습은 *.alert의 콘솔 출력과 journald ForwardToWall 설정을 바꾸어 경보가 보이는지 비교했다.
    • 콘솔 표시, 사용자 터미널로 wall 전송, 파일 보존과 중앙 수집은 서로 다른 목적이다.
    • 콘솔에서 한 줄 보였다는 결과만으로 로그 보존·무결성·전송 기준을 모두 충족했다고 판정하지 않는다.
  • 네트워크 장비의 show running-config를 수집할 때 pagination, 권한 수준, 출력 생략, 비밀 포함 여부와 소프트웨어 버전을 고려한다.
    • show 명령 이름에 해당한다고 무조건 모든 장비에서 같은 필드가 나온다고 기대하지 않는다.
    • 진단 대상과 파서 버전을 결과에 함께 기록한다.

07판정 결과 스키마와 오류의 표현

  • 한 항목 결과에는 자산 ID, 기준 이름·판본, 항목 코드, 상태, 관찰값, 판정 이유, 수집 시각, collector·rule 버전과 오류 정보를 둔다.
    • 여러 팀이 같은 규칙으로 출력해야 DB 적재와 보고서 집계가 가능하다.
    • 다음 키는 학습용 설계 예이며 공식 필수 양식이라는 뜻이 아니다.
  • 는 적용 대상이 아니라는 확인된 근거가 있을 때 사용한다.
    • 권한 부족과 명령 실패는 또는 별도 수집 상태로 남기고 평가되지 않은 항목 수에 포함한다.
    • 수동 검토는 누구에게 어떤 정보가 더 필요한지 적어야 검토 대기 상태가 영구적인 면제가 되지 않는다.
json
{
  "asset_id": "LAB-WIN-01",
  "baseline": "course-lab-v1",
  "check_id": "LAB-ADMIN-01",
  "status": "REVIEW",
  "observed": "로컬 정책 화면과 내보내기 결과 확보",
  "reason": "도메인 적용 정책과 유효 원격 권한 추가 확인 필요",
  "evidence_id": "E-001",
  "collector_version": "1.0",
  "collection_error": null
}

교육용 결과 객체다. 공식 점검 코드를 임의로 붙이지 않았고 실장비에서 실행한 결과가 아니다.

원리 심화

08점검 엔진을 재현 가능한 데이터 처리로 설계하기

  • stdout·stderr·종료 코드·시각·수집기 버전을 원본 레코드로 저장한다. 판정 규칙을 바꿀 때 원본 수집 기록을 덮어쓰지 않고 새 판정 결과와 연결한다.
  • run_id, asset_id, check_id, scope, baseline_version을 조합해 어느 실행의 어떤 관찰인지 식별한다. IP·항목 이름만으로 덮어쓰면 재시험 이력이 사라진다.
  • 판정기는 이미 수집된 입력과 기준으로 결과를 계산하게 분리한다. 같은 입력·규칙에서 같은 판정이 나오는지 원격 접속 없이 회귀 시험할 수 있다.
  • 문자열 "false"를 참인 값으로 처리하거나 빈 문자열을 0으로 바꾸지 않는다. 형식 오류·관측 불가·기능 미사용을 명시적인 상태로 구분한다.
  • 연결 단절 같은 일시 실패만 정해진 횟수·간격·전체 시간 안에서 재시도한다. 권한 거부나 지원하지 않는 출력 형식은 반복 호출보다 원인 검토가 필요하다.
  • 자산별 연결 수·전체 동시 작업 수를 제한한다. 보고서 생성 전에 완료·실패·취소 대상의 수가 예정 대상 수와 맞는지 확인한다.

09판정기를 시험하고 팀 결과를 통합하기

  • 정상·취약·해당 없음·누락·권한 실패·알 수 없는 버전의 입력 표본으로 판정기를 시험한다.
    • 수집기의 명령 성공만 시험하면 evaluator가 잘못된 기준을 적용해도 발견하기 어렵다.
    • 원문과 기대 판정을 한 세트로 보관하고 기준 개정 때 회귀 비교한다.
  • 파일 인코딩, 줄바꿈, 로케일, 빈 값·중복 값, 네트워크 장비의 더 보기 프롬프트도 파싱 결과를 바꾼다.
    • 비밀과 개인정보를 제거한 fixture를 사용하고 테스트용 기대 값을 실제 고객 점검 결과처럼 보고하지 않는다.
    • 점검 코드 변경 이력과 기준 변경 이력을 함께 관리한다.
  • 팀 통합에서는 자산 ID와 항목 ID의 유일성, 중복 결과 처리, 재실행 시각, 일부 실패 때의 집계 정책을 합의한다.
    • 취업용 설명에서는 자신이 작성한 수집·판정·저장·검증 부분과 공동 실행부의 경계를 구체적으로 말하고, 실제 운영 환경 적용 여부를 구분한다.
예제로 추적

10100개 결과를 정상률과 점검 범위로 따로 집계하기

  1. 60, 20, 10, 5, REVIEW 5인 100개 항목을 가정한다. 상태의 의미와 계산식은 이 교육 예제에서 정한 집계 계약이다.
  2. 근거가 있는 10개를 제외하면 적용 대상은 90개다. 와 REVIEW는 기준 충족이 확인되지 않았으므로 적용 대상에서 임의로 지우지 않는다.
  3. 판정을 마친 +은 80개다. 완료율은 80/90≈88.9%이며 나머지 10개는 미완료 이유를 별도로 표시한다.
  4. 완료된 결과 중 비율은 60/80=75%다. 이것을 전체 적용 대상이 75% 안전하다는 뜻으로 확대하지 않는다.
  5. 수집 성공 → 형식 검증 → 적용 조건 확인 → 기준 비교 순서로 처리한다. 수집 명령이 실패했는데 stdout이 빈 값이라는 이유로 를 내지 않는다.
  6. 다음 실행에서 대상·기준 판본이 바뀌면 숫자 차이만으로 개선을 주장하지 않는다. 공통 대상의 상태 전환과 새로 추가·제외된 항목을 분리한다.
지표분자/분모예제 결과
적용 대상100− 1090개
판정 완료율( 60+ 20)/90약 88.9%
판정 중 양호 비율 60/판정 완료 8075%
미완료 적용 항목 5+REVIEW 510개
취약 발견20개
검증·예외

11자동 점검의 거짓 양호와 불완전한 보고서를 찾기

  • 원격 세션 종료나 출력 길이 제한으로 결과가 잘릴 수 있다. 종료 상태·완료 표식·예상 구조를 확인하며 문자열 일부가 보인다는 이유만으로 완전한 수집으로 판단하지 않는다.
  • 로케일·제품 버전·열 순서 변화로 다른 값을 읽을 수 있다. 정상·취약뿐 아니라 빈 값·중복 값·잘린 출력·권한 거부를 표본으로 둔다.
  • 캐시된 출력이나 이전 실행의 결과를 현재 결과에 섞지 않는다. 수집 시각과 실행 식별자를 검사하고 너무 오래된 자료는 유효성 정책에 따라 재수집한다.
  • 동일 키 중복, 대상 목록에 없는 결과, 예정했으나 결과가 없는 항목을 각각 보고한다. 데이터베이스에 저장됐다는 사실이 전체 작업의 완결성을 보장하지는 않는다.
  • 원문 증적은 제한된 저장소에 두고 보고서에는 필요한 부분만 표시한다. HTML·CSV로 내보낼 때 수집된 문자열이 실행 구문이나 수식으로 처리되지 않도록 출력 형식에 맞게 다룬다.
  • 판정 결과를 받은 후 설정을 자동으로 바꾸는 기능은 별도 승인·복구·검증 흐름으로 설계한다. 읽기 전용 수집 실패를 해결하려고 권한이나 정책을 임의 변경하지 않는다.
READ · OBSERVE · CONNECT

함께 보는 학습 자료

아래 공식 자료를 본문의 개념·예제와 함께 읽어 보세요. 자료별로 확인할 위치와 관찰할 내용을 적었습니다.

공식 가이드

NIST SP 800-53A — 통제 평가 절차와 평가 계획

문서 PDF 22쪽의 examine·interview·test 설명을 먼저 읽는다. 이어 관심 통제의 평가표에서 대상·방법·판정 근거가 어떻게 연결되는지 확인한다.

읽으면서 확인할 것
  • 문서 확인, 관계자 설명, 실제 시험처럼 서로 다른 근거가 필요한 이유를 본문의 자동 수집 범위와 비교한다.
  • 수집 성공만으로 통제 효과를 확정할 수 없는 항목 하나를 골라 수동 확인 질문과 추가 시험을 적는다.
학습 확인

이해했는지 확인하기

  • 오류 출력을 버리고 빈 값을 양호로 판정하면 왜 위험한가?
  • 정책 표시 이름과 SID를 구분해야 하는 이유는?
  • 새 OS 버전과 권한 부족 입력을 어떻게 시험할 것인가?

함께 확인할 공식 자료