대상과 리디렉션 제한하기

사이버 보안Beginner
지금 연습하기

소개

새 환경에서 같은 이미지 가져오기 기능을 관리합니다. 현재 정책은 모든 URL을 허용하고 HTTP 클라이언트는 리디렉션을 따릅니다. 이미지와 애플리케이션의 정상 재고 이용 기능을 유지하면서 이 업무 기능을 고정 카탈로그 엔드포인트 하나로 제한해야 합니다.

설명을 따라 짧은 Python 수정을 합니다. Workstation은 클라이언트 요청을 보내고 App Policy는 App이 실제로 불러오는 파일을 편집합니다. Python 경험은 필요하지 않습니다. 준비된 데이터는 통제된 이름과 격리 네트워크를 사용합니다. 이 정책은 해당 엔드포인트에 한정되며 보편적 SSRF 방지를 뜻하지 않습니다.

승인된 대상만 허용하기

이 단계에서는 적용 중인 정책을 상점이 승인한 엔드포인트로 제한합니다. 허용 목록은 허용할 입력을 정확히 정의하며 일치하지 않는 입력은 거부합니다. 업무 규칙은 다음과 같습니다.

이 단계를 시작하려면 실습 인터페이스에서 Workstation 탭을 선택합니다.

스킴 호스트 이름 포트 용도
http catalog.test 8000 상품 이미지

Workstation 탭으로 전환합니다. 파싱된 URL을 살펴봅니다. 파싱은 주소를 필드로 나눌 뿐 해당 필드가 안전한지 결정하지 않습니다.

다음 명령을 실행하기 전에 Workstation 탭으로 전환합니다.

python3 imagectl.py parse http://catalog.test:8000/leaf.png

scheme: http, hostname: catalog.test, port: 8000이 나와야 합니다. HTTP 포트를 생략하면 80을 사용하며 승인된 포트가 아닙니다. 현재의 위험한 동작을 시험하세요.

python3 imagectl.py probe http://internal.test:8000/status

probe는 가져오기와 같은 실제 외부 요청을 보내지만 가져오기 기록을 저장하지 않습니다. 수정 전에는 HTTP 200이 나옵니다.

policy.py가 있는 호스트 작업 공간을 여는 App Policy 탭으로 전환합니다. App은 이 디렉터리를 마운트하고 요청마다 도우미를 다시 불러옵니다. 터미널 편집기로 파일을 엽니다.

다음 명령을 실행하기 전에 App Policy 탭으로 전환합니다.

nano policy.py

우선 FOLLOW_REDIRECTS = True는 유지하세요. return True 줄만 다음으로 바꾸세요.

    return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)

앞의 공백 네 개를 유지하세요. Python은 들여쓰기로 문장을 함수 안에 둡니다. p = urlsplit(url)은 분석된 필드를 만듭니다. 소괄호는 값 세 개를 튜플로 묶고 ==는 전체 튜플을 비교합니다. 식은 불리언 True 또는 False를 반환합니다. p.port or 80은 포트가 없으면 일반 HTTP 포트를 제공합니다. 따옴표 안은 문자열이고 8000은 숫자입니다.

Ctrl+O, Enter로 저장하고 Ctrl+X로 종료합니다. Workstation 탭으로 돌아갑니다. 실행합니다.

다음 명령을 실행하기 전에 Workstation 탭으로 전환합니다.

python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status

이미지는 HTTP 200, Internal은 destination denied와 HTTP 403을 반환해야 합니다. 502는 대개 편집 오류로 가져오기에 실패했다는 뜻이며 유효한 정책 거부가 아닙니다. App Policy 탭으로 전환하여 nano policy.py를 다시 열고 철자와 들여쓰기를 수정한 후 저장합니다. 재시험 전에 Workstation 탭으로 돌아갑니다. 요청마다 저장된 정책을 불러오므로 재시작은 없습니다.

리디렉션을 막고 양쪽 확인하기

이 단계에서는 남은 리디렉션 경로를 막고 정상 기능이 유지되는지 테스트합니다. Workstation 탭으로 전환합니다. 목적지 수정 후 Catalog 리디렉션을 시도합니다.

이 단계를 시작하려면 실습 인터페이스에서 Workstation 탭을 선택합니다.

다음 명령을 실행하기 전에 Workstation 탭으로 전환합니다.

python3 imagectl.py probe http://catalog.test:8000/redirect

HTTP 클라이언트가 최초 정책 검사 후 리디렉션을 따르므로 여전히 Internal의 JSON을 반환합니다. 상점은 직접 이미지 URL만 허용하므로 모든 리디렉션을 거부하기로 합니다.

App Policy 탭으로 전환합니다. 같은 활성 파일을 엽니다.

다음 명령을 실행하기 전에 App Policy 탭으로 전환합니다.

nano policy.py

FOLLOW_REDIRECTS = True를 FOLLOW_REDIRECTS = False로 바꾸세요. 이 변수는 리디렉션 요청을 거부하는 준비된 HTTP 처리기를 선택합니다. 대상 검사는 유지하세요. Ctrl+O, Enter로 저장하고 Ctrl+X로 나가세요.

Workstation 탭으로 돌아갑니다. 금지 사례를 하나씩 테스트합니다.

다음 명령을 실행하기 전에 Workstation 탭으로 전환합니다.

python3 imagectl.py probe http://catalog.test:8000/redirect
python3 imagectl.py probe https://catalog.test:8000/leaf.png
python3 imagectl.py probe http://catalog.test:8001/leaf.png

리디렉션은 HTTP 422와 redirect denied, 잘못된 엔드포인트 두 개는 HTTP 403을 반환해야 합니다. https는 다른 프로토콜이며 포트만 바꿔도 엔드포인트가 달라집니다. 연결 오류나 502는 의도한 거부가 아닙니다.

마지막으로 정상 이미지를 가져오고 독립된 재고 이용 기능을 확인하세요.

python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health

둘 다 HTTP 200을 반환하고 상태에는 inventory: synthetic-ready가 포함되어야 합니다. Image Importer 탭으로 전환하고 새로 고쳐 녹색 그림을 확인합니다. 모든 요청을 막거나 Internal을 중지하거나 사용하지 않는 사본을 편집하면 목표를 충족하지 못합니다. 이미지가 실패하면 App Policy 탭으로 전환하여 승인된 튜플을 복원하고 Workstation 탭으로 돌아가 승인된 가져오기를 반복합니다. 상태가 실패하면 App의 내부 연결을 보존합니다. 수정은 이 기능의 고정 목적지와 리디렉션 동작을 통제하며 정상 재고 소비자의 네트워크 접근을 없애지 않습니다.

목적지와 리디렉션 제한 후에도 승인된 이미지를 유지하는 Image Importer

나중에 엔드포인트 두 개를 허용하려면 in으로 튜플과 집합을 비교할 수 있습니다. 예: (p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}. 중괄호 안에는 완전한 대안 두 개가 들어갑니다. 명시된 조합만 허용하고 호스트/포트를 교차한 조합은 거부합니다. 다음 챌린지는 별도 표를 제공합니다.

요약

전체 대상 튜플을 비교하고 리디렉션을 비활성화했으며 금지 요청과 이미지/재고 기능 유지를 모두 시험했습니다. 이 통제는 고정되고 관리되는 서비스 식별자를 대상으로 합니다.