Devin.KR

설정 백업과 변경 비교

100분 안팎

학습 목표

실습 구성·주소표·정책을 백업하고 변경 전후 차이와 체크섬을 확인합니다.

개념

되돌아갈 기준선을 고정합니다

설정 파일이 남아 있다는 사실만으로 백업이 준비된 것은 아닙니다. 학교망 변경 전에는 어떤 시점의 주소표와 정책을 복원할 것인지 함께 정해야 합니다. 학생 웹이 정상이고 게스트 내부 웹은 차단된 기준선에서 주소·포트·경로·정책 파일을 한 묶음으로 보관합니다. 장애가 난 뒤 현재 파일을 백업하면 실패한 상태를 기준선으로 삼게 됩니다. 이번 목표는 파일 집합을 고정하고 변경 내역을 찾아 복구 가능한 사본을 만드는 것입니다.

이번 모듈에서 사용하는 환경

파일 실습은 Python 3 표준 라이브러리와 bash만 사용하며 관리자 권한이 필요하지 않습니다. ZIP은 각각 빈 폴더에 풉니다. network-configuration-diff는 작은 파일 백업 과제이고 network-change-handover-mission은 앞 모듈 solution 전체를 이어받은 최종 과제입니다. 실제 패킷 시험은 앞에서 준비한 Linux VM에서만 실행합니다. 맥에서는 파일과 순수 검사를 수행합니다. external은 실제망 미검증 상태이며 실패나 성공으로 바꾸어 적지 않습니다.

보관할 것과 재생성할 것을 나눕니다

설정 백업에는 addresses.csv, ports.csv, routes.csv, policy.csv, 서비스 JSON과 구성 스크립트를 포함합니다. 최종 미션은 루트 정적 파일을 모두 복사해 앞 모듈의 검사기도 보존합니다. evidence의 패킷 캡처와 monitor.csv는 실행 증거로 따로 보관합니다. .owned.json은 이번 실행이 소유한 네임스페이스를 추적하는 기록이므로 복원 파일에 넣지 않습니다. 과거 소유 기록을 복사하면 새 폴더에서 이미 실습망이 있다고 오인할 수 있습니다.

해시는 바이트에 대한 지문입니다

같은 파일 이름이라도 내용이 바뀔 수 있습니다. backup.py는 파일을 바이트로 읽어 SHA-256을 계산하고 상대 경로와 권한을 manifest.json에 기록합니다. 줄 끝 문자나 마지막 개행의 변화도 바이트 차이입니다. 주소표의 눈에 보이는 글자가 같더라도 편집기가 개행을 바꿨다면 지문은 달라질 수 있습니다. Python hashlib의 hexdigest는 해시를 16진수 문자열로 제공합니다. 계산 결과가 동일한지 비교하고 변경 의미는 별도의 차이 검토에서 판단합니다.

파일 목록도 무결성의 일부입니다

체크섬에 적힌 파일만 확인하면 추가된 방화벽 규칙 파일을 놓칠 수 있습니다. verify는 manifest의 경로 집합과 files의 실제 파일 집합이 같은지 먼저 비교합니다. 목록에 있는 파일이 없거나 목록 밖 파일이 있으면 FILESET으로 거절합니다. 빈 파일도 정상적인 항목으로 보존합니다. 파일명에 공백이나 한글이 들어가도 JSON 키의 상대 경로로 다루므로 셸의 단어 분리에 기대지 않습니다. 폴더 안에 무엇이 들어 있는가까지 검사해야 전체 설정의 기준선을 설명할 수 있습니다.

경로와 권한을 함께 검사합니다

실습 도구는 심볼릭 링크와 상위 경로 이동 표기를 허용하지 않습니다. manifest에 ../가 있으면 PATH, 링크를 만나면 SYMLINK가 표시됩니다. 목적은 작은 교육용 복원 범위를 명확히 하는 것입니다. 실제 백업 도구를 대체하는 범용 프로그램이라고 소개하지 않습니다. POSIX 파일 권한도 저장해 실행 스크립트의 실행 가능 여부가 달라진 것을 찾습니다. 권한 비교는 소유자나 ACL을 복원했다는 뜻이 아니며 그 항목은 이 도구의 범위 밖입니다.

변경 목록과 의미를 구분합니다

diff 명령의 앞 인자는 이전, 뒤 인자는 이후 상태로 놓습니다. backup.py diff는 상대 경로마다 ADD, DELETE, CHANGE를 출력합니다. CHANGE에는 바이트나 권한 차이가 들어가며 내용의 어느 줄이 바뀌었는지는 별도로 diff -u로 봅니다. 게이트웨이가 .2에서 .9로 바뀌었다는 행은 단순한 숫자 수정이 아니라 대체 경로가 없는 주소를 가리킨다는 의미입니다. 주소표의 변경 한 줄을 보고 경로·DHCP·정책으로 영향이 이어지는지 검토해야 합니다.

diff 종료 코드를 읽습니다

일반 diff는 같으면 0, 차이가 있으면 1, 비교 오류가 있으면 2를 반환합니다. set -e 스크립트에서 차이를 찾는 것이 정상인 단계를 그냥 실행하면 변경 발견을 전체 작업 실패로 처리할 수 있습니다. 조건문 안에서 종료 상태를 받고 차이와 오류를 분리합니다. 반대로 모든 실패를 무시하면 파일 없음 같은 환경 오류도 숨깁니다. 이 실습의 backup.py diff는 목록 보고용이며 차이가 있어도 정상 종료하므로 일반 diff의 종료 계약과 혼동하지 않습니다.

새 폴더 복원으로 덮어쓰기를 피합니다

restore는 먼저 백업의 전체 파일 집합과 지문을 검증하고 존재하지 않는 대상 폴더에만 복원합니다. 이미 있는 폴더를 지정하면 TARGET_EXISTS를 표시합니다. 작업 중인 폴더에 바로 덮어쓰면 새로 추가한 파일이 남아 예전 설정과 섞일 수 있습니다. 새 폴더에서 기준선을 재생성한 뒤 필요한 시험을 실행하면 남은 파일의 영향을 줄일 수 있습니다. 복원 폴더의 inventory와 manifest를 다시 비교하므로 복사 명령 성공과 복원 내용 일치를 따로 확인합니다.

시작 코드의 결함을 좁혀 고칩니다

starter의 verify는 파일 목록과 권한을 비교하지만 sha256 차이를 놓칩니다. test_corrupt_bytes_rejected가 실패하면 변조한 주소표를 거절하지 않았다는 뜻입니다. test_bad_backup_never_restored는 같은 결함이 복원 단계로 이어지는 것을 보여 줍니다. backup.py의 verify에서 각 파일 메타데이터 전체를 비교하도록 수정하고 10개 검사를 다시 실행합니다. 테스트를 제거하거나 manifest를 변조한 파일에 맞춰 다시 만들면 실패를 숨기므로 목표를 달성하지 못합니다.

백업의 신뢰와 서비스 상태는 별도입니다

공격자가 파일과 manifest를 함께 바꿀 수 있다면 체크섬 비교만으로 진짜 이전 버전임을 증명할 수 없습니다. 신뢰한 목록을 보호하고 변경 권한과 보관 시점을 관리해야 합니다. 또한 체크섬이 맞아도 단말의 현재 경로와 소켓 상태가 복원되었다고 말할 수 없습니다. 이번 레슨 완료 자료에는 백업 범위, 제외 항목, 변경 목록, 새 폴더 복원 비교 결과를 남깁니다. 일반 diff 옵션과 출력 문법은 더 읽기로 보내고 다음 레슨에서는 이 근거를 승인용 계획에 연결합니다.

기술 확인: Python hashlib 문서에서 SHA-256 생성과 hexdigest의 반환 형식을 확인할 수 있습니다. 예제의 SHA-256 비교 코드는 이번 학교망 자료를 위해 직접 작성했습니다.

따라하기

바이트와 지문을 대조합니다

동일한 주소 문자열도 개행이 바뀌면 지문이 달라지는지 직접 계산합니다.

import hashlib
a=b's1,10.20.10.11/24\n'
b=b's1,10.20.10.11/24\r\n'
print('same_bytes', a == b)
print('same_sha256', hashlib.sha256(a).hexdigest() == hashlib.sha256(b).hexdigest())

실행 결과

same_bytes False
same_sha256 False

설정 묶음을 백업하고 검증합니다

network-configuration-diff solution 예제를 빈 폴더에 푼 루트에서 실행합니다. 같은 이름의 backup-demo가 이미 있으면 새 실습 폴더를 사용합니다. starter는 먼저 실습의 결함을 고칩니다.

python3 backup.py backup demo backup-demo
python3 backup.py verify backup-demo

실행 결과

BACKUP files=3
VERIFIED files=3

후보 설정의 변경 파일을 찾습니다

대체 게이트웨이를 9로 바꾼 사본을 만듭니다. 원본 demo와 백업은 유지하고 파일 변경 목록을 확인합니다.

cp -R demo candidate
python3 -c 'import json; from pathlib import Path; p=Path("candidate/resilience.json"); c=json.loads(p.read_text()); c["backup_gateway_suffix"]=9; p.write_text(json.dumps(c,indent=2)+"\n")'
python3 backup.py diff backup-demo/files candidate

실행 결과

CHANGE resilience.json

새 폴더의 복원 차이를 확인합니다

RESTORED 뒤 diff 출력이 비면 바이트와 권한이 기준선과 같습니다. 아직 통신을 시험한 결과는 아닙니다.

python3 backup.py restore backup-demo restored
python3 backup.py diff backup-demo/files restored

실행 결과

RESTORED

확인 문제

실습

backup.py verify에서 파일 메타데이터의 SHA-256과 권한을 함께 비교합니다. 테스트를 유지하고 bash check.sh로 변조·누락·추가·새 폴더 복원·경로·링크·권한 경계 사례 10건을 통과합니다. demo 백업과 변경 목록, 복원 차이 0건을 제출합니다.

시작 코드·테스트 내려받기

실행 명령

bash check.sh

기대 결과

starter는 변조 탐지 관련 일부 실패, solution은 10개 검사 모두 통과합니다.

모범 답안모범 답안 내려받기

더 읽기

면접 질문

  • 방화벽 정책을 검증하는 실습 방법을 설명합니다.