익명 다운로드 차단

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

소개

작은 지원팀이 공개 도움말과 고객 명세서를 같은 버킷에 저장합니다. 포털은 보통 명세서 읽기 요청에 서명하고 방문자는 도움말만 읽어야 합니다. 잘못된 정책 때문에 내부 문서를 익명으로 받을 수 있게 되었습니다. 업무 데이터를 삭제하지 않고 접근 범위를 줄이겠습니다.

이 실습에서는 Storage Admin을 사용합니다. Document Portal은 준비된 애플리케이션이며 Portal App은 별도의 로컬 계정입니다. 모든 문서와 자격 증명은 합성 데이터입니다. VersityGW 1.10.0은 내장 사용자 이름을 주체로 사용하는 로컬 S3 호환 게이트웨이입니다. 이 실습은 AWS IAM이나 계정 수준 Public Access Block을 재현하지 않습니다. 기본적인 터미널 사용 능력이면 충분하며 클라우드 계정은 필요 없습니다.

정상적인 공개 문서 다운로드

이 단계에서는 방문자에게 공개하도록 의도된 도움말 문서를 가져옵니다.

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

버킷은 이름이 있는 객체 모음입니다. 객체 키는 저장된 이름입니다. public/help.txt는 일반 디렉터리 권한 대신 접두사 public/를 사용합니다. 여기서 버킷 이름은 documents입니다. 엔드포인트 http://127.0.0.1:7070은 이 VM의 스토리지 서비스입니다.

curl은 HTTP 요청을 보냅니다. 자격 증명을 제공하지 않으면 익명 방문자를 나타냅니다. Storage Admin에서 실행합니다.

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

curl -sS http://127.0.0.1:7070/documents/public/help.txt

-sS는 진행률을 숨기지만 연결 오류는 표시합니다. Synthetic help: contact support through the portal.이 나와야 합니다. 출력 파일 이름을 지정하는 -o로 유용한 로컬 사본을 저장합니다.

curl -sS -o help.txt http://127.0.0.1:7070/documents/public/help.txt

cat으로 로컬 문서를 읽습니다.

cat help.txt

같은 도움말이 나와야 합니다. 이것이 정상적인 공개 접근입니다. Document Portal 탭으로 전환하고 Open assigned document를 클릭합니다. 서명 요청을 보내는 포털 애플리케이션도 합성 명세서를 읽을 수 있습니다. 다음 단계에서 이 정상적인 사용과 익명 노출을 구분합니다.

애플리케이션 ID로 할당된 명세서를 여는 Document Portal

익명 접근 정책 범위 축소

이 단계에서는 공개 도움말을 유지하면서 내부 문서의 익명 읽기를 없앱니다.

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

먼저 명세서를 익명으로 요청합니다. -w는 HTTP 응답 코드를 덧붙이고 \n은 줄바꿈을 넣습니다. 200은 요청 성공입니다. 실제 권한 거부는 403과 AccessDenied입니다. 404나 연결 오류만으로는 보호를 입증할 수 없습니다.

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

curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:7070/documents/portal/statement.txt

명세서와 HTTP 200이 보이면 유출이 확인됩니다. 삭제하지 마세요. 포털은 여전히 이 문서가 필요합니다.

AWS CLI는 S3 호환 API를 호출할 수 있습니다. source는 준비된 관리자 자격 증명을 현재 터미널로 불러옵니다. 이 교육 VM에만 적용되며 새 Storage Admin 세션을 열면 다시 실행해야 합니다.

source admin.env

실행 중인 서비스의 실제 적용 정책을 읽습니다. s3api는 객체 스토리지 작업을 선택하고 --endpoint-url은 AWS 대신 로컬 게이트웨이를 지정합니다. --query Policy --output text는 JSON 정책 문자열을 표시합니다.

aws --endpoint-url http://127.0.0.1:7070 s3api get-bucket-policy --bucket documents --query Policy --output text

JSON 정책에는 Statement 목록이 있습니다. Effect: Allow는 작업을 허용하고 Principal은 허용 대상, Action은 작업, Resource는 객체를 지정합니다. s3:GetObject는 객체 읽기입니다. Principal: "*"는 익명 방문자도 포함합니다. 리소스 arn:aws:s3:::documents/*는 모든 키를 포함하며 끝의 *는 모든 접미사와 일치합니다. 다른 문은 portal-reader에 portal/* 접근 권한을 별도로 부여합니다.

nano로 준비된 사본을 편집합니다.

nano policy.json

익명 문의 Resource만 arn:aws:s3:::documents/*에서 arn:aws:s3:::documents/public/*로 바꿉니다. 포털 이름을 지정한 문은 유지합니다. JSON 문자열은 큰따옴표로 감싸고 필드 사이에는 쉼표가 필요합니다. Ctrl+O, Enter로 저장한 다음 Ctrl+X로 종료합니다.

로컬 파일을 편집하는 것만으로는 접근이 바뀌지 않습니다. 적용하세요. file://는 CLI가 해당 파일에서 정책을 읽도록 지정합니다.

aws --endpoint-url http://127.0.0.1:7070 s3api put-bucket-policy --bucket documents --policy file://policy.json

성공하면 출력이 없습니다. JSON이 잘못되면 편집기를 다시 열어 따옴표나 쉼표를 수정한 후 재적용합니다. 위의 익명 명세서 요청을 반복하면 AccessDenied와 HTTP 403이 나와야 합니다. 적용 가능한 허용 규칙이 없는 요청은 기본적으로 거부됩니다. 모두에 대한 일괄 거부는 정상적인 포털도 차단합니다.

포털과 공개 도움말 유지

이 단계에서는 수정 후에도 필요한 읽기가 가능하고 문서가 그대로임을 입증합니다.

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

1단계의 익명 명령으로 공개 도움말을 다시 테스트합니다. 원래 텍스트가 나와야 합니다. Document Portal 탭으로 전환합니다. Open assigned document를 다시 엽니다. 명세서와 Identity: portal-reader가 나와야 합니다.

지정 ID를 직접 테스트하려면 이 명령에만 자격 증명을 설정합니다. 명령 앞의 변수 대입은 해당 명령에만 적용되므로 터미널의 관리자 환경은 이후에도 유지됩니다. get-object는 키를 명령 끝에 지정한 로컬 파일로 다운로드합니다.

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

AWS_ACCESS_KEY_ID=portal-reader AWS_SECRET_ACCESS_KEY=portal-reader-secret aws --endpoint-url http://127.0.0.1:7070 s3api get-object --bucket documents --key portal/statement.txt statement.txt

CLI는 객체 메타데이터를 표시합니다. 실제 다운로드한 문서를 읽습니다.

cat statement.txt

Synthetic statement: account 1042, balance 75 credits.가 나와야 합니다. 같은 저장 명세서를 이제 지정 ID 요청으로 읽을 수 있고 익명 요청은 거부됩니다. 포털이 실패하면 적용 정책을 다시 확인합니다. 포털의 지정 ID 허용은 유지하고 익명 허용은 public/*로 끝나야 합니다. 정책을 복구해 재적용하세요. 객체 삭제나 스토리지 중지로는 두 요구사항을 모두 만족할 수 없습니다.

요약

익명 요청과 서명된 포털 요청을 구분하고 실제 버킷 정책의 범위를 줄였으며 공개 도움말과 고객 명세서를 유지했습니다. 성공적인 수정에는 노출 차단과 정상적인 업무 경로 유지가 모두 필요합니다.