소개
새 DeskLite 서비스 버전에 임시 디버그 설정이 다시 들어왔습니다. 요청은 여전히 성공하지만 이제 운영 로그에 가짜 자격 증명이 포함됩니다. 기능 성공 검사만으로는 이 회귀를 잡아내지 못했습니다.
실제 요청 증거를 따라가고, 새로운 유출을 중지하며, 노출된 자격 증명을 교체하고, 실제로 유출하는 후보 버전을 차단하는 단언을 추가합니다. 과거 로그는 증거로 유지하며 조사 문서는 필요하지 않습니다. 로컬 발급자, 클라이언트, 서비스, 비교 대조군, 산출물 도우미가 준비되어 있습니다.
실제 사고 이벤트 찾기
이 단계에서는 요청을 현재 로그 기록 버전 및 설정과 연결합니다.
cd /srv/ticket-regression
tail -n 5는 마지막 다섯 줄을 읽어 표시 범위를 작게 유지합니다. 준비된 서비스 로그를 허가된 관리자 읽기 권한으로 읽으세요.
sudo tail -n 5 /opt/labex-ticket-regression/requests.log
request_id=initial-001, version=logging-v2, path=/tickets, status=200을 찾으세요. 이 과거 요청은 성공했지만 같은 줄에 Authorization과 이전 가상 토큰이 포함되어 있습니다. 모든 값은 이 격리된 실습에서만 사용됩니다.
grep은 제공된 텍스트 패턴이 포함된 줄을 출력합니다. 작은따옴표는 이 리터럴 패턴을 하나로 묶습니다.
sudo grep 'request_id=initial-001' /opt/labex-ticket-regression/requests.log
cat logging.conf
include_authorization = true가 민감한 필드를 설명합니다. 이벤트의 시간, 요청 ID, 버전, 상태는 관찰된 동작을 활성 설정과 연결합니다. 원본 로그를 유지하세요. 지우면 향후 유출을 방지하는 대신 증거가 사라집니다.
새 이벤트에서 민감한 필드 제외하기
이 단계에서는 유용한 감사 필드를 유지하면서 로그 정책을 변경합니다.
nano logging.conf
다음 내용을 사용하세요.
[logging]
include_authorization = false
Ctrl+O, Enter, Ctrl+X로 저장하세요. 준비된 재시작 진입점으로 저장된 설정을 적용하세요.
bash restart.sh
새 상태 확인 요청에 알려진 ID를 부여하세요. X-Request-ID는 새 이벤트를 연결하는 데 사용하는 요청 헤더입니다.
curl -H 'X-Request-ID: after-policy-fix' http://127.0.0.1:8080/health
sudo grep 'request_id=after-policy-fix' /opt/labex-ticket-regression/requests.log
시간, 버전, ID, 경로, status=200이 있고 Authorization 필드는 없어야 합니다. 이전 initial-001 이벤트는 유지됩니다. 모든 과거 줄에 비밀 정보가 없어야 한다고 요구하는 대신 새 이벤트를 각자의 ID로 판단하세요.
노출된 자격 증명 폐기하고 교체하기
이 단계에서는 이미 배운 발급자 작업 흐름으로 이전 토큰의 권한을 제거합니다.
로그 정책을 바꿔도 노출된 값이 무효화되지는 않습니다. 관리 ID를 폐기하세요.
course-token revoke legacy
curl -i -H 'Authorization: Bearer labex_012345abcdefghijklmnopqrstuvwxyz' http://127.0.0.1:8080/tickets
401이 예상됩니다. 이제 값을 출력하지 않고 대체 자격 증명을 발급하세요.
course-token issue /srv/ticket-regression/api.token
권한 및 토큰 실습에서 배운 관리자/클라이언트 그룹 패턴으로 보호하세요.
sudo chown root:deskclient api.token
sudo chmod 640 api.token
값은 발급자가 생성했으며 여기서는 접근 권한만 설정했습니다. 테스트 소스, 클라이언트 스크립트, 작성하는 보고서에 복사하지 마세요.
파일을 읽는 클라이언트 복구하기
이 단계에서는 기존 클라이언트가 보호된 대체 자격 증명을 사용하도록 합니다.
nano sender.sh
앞서 배운 것과 같은 파일 읽기 형식을 저장하세요.
#!/bin/bash
exec sudo -u deskclient /usr/bin/python3 /opt/labex-ticket-regression/send.py --token-file /srv/ticket-regression/api.token
Ctrl+O, Enter, Ctrl+X를 사용하세요.
bash sender.sh
HTTP 200과 원래 Printer offline 티켓이 예상됩니다. 최근 운영 이벤트를 읽으세요.
sudo tail -n 5 /opt/labex-ticket-regression/requests.log
새 성공 요청은 자격 증명 값 없이 감사 필드를 유지합니다. 권한이 제거된 이전 유출 값은 보존된 사고 이력에 남아 있을 수 있습니다. 이를 구분하면 증거를 삭제하지 않으면서도 과거 노출을 계속 성공하는 인증 경로로 취급하지 않을 수 있습니다.
기존 테스트가 유출을 놓친 이유 확인하기
이 단계에서는 새 요구 사항을 추가하기 전에 작은 테스트 템플릿을 확인합니다.
cat test_security.py
정상 요청 테스트는 테스트 작성 실습의 요청 템플릿을 사용합니다. 준비된 api 도우미는 대상의 자격 증명 출처에서 token을 제공하고 실제 HTTP 상태, 본문, 해당 요청의 실제 로그 이벤트를 반환합니다. "Bearer " + token은 문자열 두 개를 헤더 값으로 연결합니다. 값이 소스에 복사되지는 않습니다.
별개의 두 대조군은 공개된 가짜 테스트 토큰을 사용합니다. good은 민감한 로그 필드를 생략하고 logging-regression은 테스트 토큰을 의도적으로 기록합니다. 새 운영용 대체 자격 증명을 사용하거나 노출하지 않습니다.
course-regression-tests good
course-regression-tests logging-regression
현재 둘 다 test_valid_token을 통과합니다. 어느 구현에서든 상태와 업무 데이터는 올바르기 때문입니다. 빠진 요구 사항은 response["log"]의 실제 이벤트에 관한 것입니다. 도우미의 각 요청은 고유 ID를 사용하므로 반환된 로그는 관련 없는 과거 이벤트가 아니라 해당 새 요청에 속합니다.
실제 로그 민감 정보 제거 단언 추가하기
이 단계에서는 새 이벤트에 있어서는 안 되는 내용과 있어야 하는 내용의 요구 사항을 모두 테스트에 추가합니다.
Python의 in은 한 문자열이 다른 문자열 안에 있는지 확인합니다. not in은 없어야 한다고 요구합니다. 이는 수동으로 제공한 증거 파일이 아니라 실제 반환된 로그 텍스트에 대한 단언입니다.
nano test_security.py
정상 요청 테스트를 유지하고 다음 전체 파일을 사용하세요.
from api import request, token
def test_valid_token():
response = request("/tickets", {"Authorization": "Bearer " + token})
assert response["status"] == 200
assert response["body"] == {"tickets": [{"id": 1, "title": "Printer offline"}]}
def test_log_is_redacted():
response = request("/tickets", {"Authorization": "Bearer " + token})
assert response["status"] == 200
assert "Authorization" not in response["log"]
assert token not in response["log"]
assert "request_id=" in response["log"]
assert "path=/tickets" in response["log"]
assert "status=200" in response["log"]
Ctrl+O, Enter, Ctrl+X로 저장하세요. 새 테스트는 민감한 필드와 자격 증명 값을 거부하면서 요청 ID, 업무 경로, 성공 상태를 요구합니다. 로그를 비우면 이러한 존재 요구 사항에 실패합니다.
도우미는 대상에 맞는 토큰을 내부적으로 제공합니다. 일반 서비스 테스트는 보호된 대체 자격 증명을 읽고 비교 대조군은 공개된 가짜 테스트 값을 사용합니다. 어느 값도 이 테스트 파일에 들어가면 안 됩니다.
테스트가 알려진 회귀를 탐지함을 입증하기
이 단계에서는 안전한 동작과 의도적으로 유출하는 동작에 새 단언을 검증합니다.
course-regression-tests good
두 테스트가 모두 통과해야 합니다.
course-regression-tests logging-regression
test_log_is_redacted만 AssertionError로 실패하고 종료 코드 1을 반환해야 합니다. 이는 의도적인 탐지이며 단언을 약화하라는 요청이 아닙니다. 정상 업무 테스트는 계속 통과해야 합니다.
course-regression-tests live
실제로 수정한 서비스에서 둘 다 통과해야 합니다. 이 테스트들은 각자의 새 요청 이벤트만 확인하며 원래 유출된 과거 이벤트는 의도적으로 유지합니다. 구문 오류, 연결 오류, 무조건적인 실패로는 효과적인 로그 민감 정보 제거 테스트 범위를 입증할 수 없습니다.
새 테스트를 후보 버전 전달에 연결하기
이 단계에서는 새 단언이 실패할 때 향후 후보 버전이 전달되지 않도록 합니다.
준비된 관문은 이전 관문 실습과 같은 검사/빌드/테스트/배포 구조를 사용합니다. build.sh는 원래 서버와 현재 로그 정책을 패키징하고 별도의 로컬 포트에서 해당 실제 후보 버전을 시작합니다. 기존 test.sh는 유효한 토큰/토큰 누락/잘못된 토큰 동작을 확인하지만 로그는 확인하지 않습니다.
nano gate.sh
빌드 뒤와 기존 기능 테스트 앞에 회귀 호출을 추가하세요. 다음 내용을 사용하세요.
#!/bin/bash
bash checks.sh
status=$?
if [ "$status" -eq 1 ]; then
exit 1
fi
if [ "$status" -ne 0 ]; then
exit 2
fi
bash build.sh || exit 2
bash regression.sh candidate || exit 2
bash test.sh || exit 2
bash deploy.sh
Ctrl+O, Enter, Ctrl+X로 저장하세요. candidate는 방금 빌드한 실제 애플리케이션을 선택하므로 추가된 단언은 배포 직전의 산출물을 보호합니다. || exit 2는 테스트가 실패하면 전달을 중지합니다.
bash gate.sh
자격 증명 사전 검사, 실제 후보 버전 빌드, 새 회귀 테스트 통과, 기능 테스트 통과, 해당 후보 버전의 운영용 로컬 포트 배포가 예상됩니다. 사용하지 않는 테스트 파일만 남겨 두는 것으로는 이러한 예방이 이루어지지 않습니다.
새 이벤트와 유지된 이력 확인하기
이 단계에서는 보고서 파일을 작성하지 않고 전달된 동작을 검증하고 증거를 되짚어 봅니다.
bash sender.sh
sudo tail -n 5 /opt/labex-ticket-regression/requests.log
새 운영 이벤트는 자격 증명 없이 시간, 실제 전달된 버전, 요청 ID, 경로, 상태를 유지해야 합니다. 전달된 버전은 이제 원래 logging-v2 레이블이 아니라 산출물 해시입니다.
sudo grep 'request_id=initial-001' /opt/labex-ticket-regression/requests.log
원래 사고 이벤트는 여전히 존재합니다. 이전 토큰은 폐기되었고 보호된 대체 자격 증명은 동작합니다. 별도의 의도적인 회귀 대조군은 교육용 비교 대상이며 배포된 서비스가 아닙니다.
스스로 설명해 보세요. 어떤 이벤트가 문제를 드러냈는지, 어떤 설정이 원인이었는지, 정책 수정만으로는 왜 충분하지 않았는지, 새 후보 버전 단언이 재발을 어떻게 막는지 생각해 보세요. 교육 과정의 검증은 실제로 회귀가 있는 후보 버전을 실행하고, 관문이 이를 차단하는지 확인하며, 이전의 안전한 실행 산출물이 유지되는지 검증합니다. 정해진 형식의 조사 문서는 필요하지 않습니다.
요약
실제 사고 이벤트를 로그 정책과 연결하고, 새로운 유출을 중지했으며, 노출된 자격 증명을 폐기하고 교체하면서 과거 증거를 유지했습니다. 새 단언은 의도적인 회귀를 탐지하고 전달 관문 안에서 실제 후보 버전에 실행됩니다. 따라서 향후 후보 버전이 실패하더라도 안전하게 실행 중인 동작이 유지됩니다.



