계정별로 시도 제한하기

HydraBeginner
지금 연습하기

소개

Gearroom은 지역 창작자에게 장비를 빌려줍니다. 회원은 로그인해 자신의 수령, 반납, 포장 정보를 읽습니다. 로그인 제한은 반복된 비밀번호 추측을 잠시 멈추기 위한 것이지만 현재 카운터는 모두가 공유합니다. 한 회원의 실패가 다른 회원의 작업 시작을 막을 수 있습니다.

Hydra로 작고 반복 가능한 테스트를 만들고 카운터를 계정별로 바꾼 뒤 보호와 정상 접근을 모두 입증합니다. 결과물은 실제 인증 및 변하지 않은 대여 기록으로 뒷받침되는 유효한 실행 정책이지 보고서가 아닙니다. 제한해도 되는 대상은 지정된 합성 테스트 회원뿐입니다. 참조 회원은 알려진 올바른 비밀번호로만 사용하고 서버, 계정, 원본 기록을 바꾸지 마세요.

기본 터미널 입력, 경로 인식, 탭 전환을 할 수 있어야 합니다. 필요한 Hydra 옵션, 폼 필드, 셸 따옴표, JSON 정책 구조는 여기서 설명합니다. 준비된 Workstation 터미널과 Equipment Desk 웹사이트는 하나의 격리된 교육 컨테이너에 대한 두 인터페이스입니다. 이 단원은 다른 실습과 독립적으로 시작합니다. 모든 사람, 비밀번호, 기록은 로컬 합성 교육 데이터입니다.

읽기와 일반적인 실수를 포함해 약 55분을 예상하세요. 작성자의 추정치이며 초보자에게 측정한 시간이 아닙니다. 30초 내 실패 세 번과 이후 12초 대기라는 작은 제한값은 교육 계약이지 운영 보안 권장값이 아닙니다.

두 회원의 정상 로그인 확인하기

이 단계에서는 제한을 테스트하기 전에 알려진 두 회원의 기록을 엽니다. 인증 성공은 서버가 특정 신원을 받아들였다는 뜻이며, 그 신원에 따라 볼 수 있는 기록이 정해집니다.

Equipment Desk를 열고 상단 탐색에서 Review brief를 선택합니다. 허용된 테스트 회원은 member, 비밀번호는 Member24입니다. 정상 참조 회원은 reference, 비밀번호는 Reference24입니다. 모두 알려진 자격 증명이며 찾아내야 하는 비밀번호가 아닙니다.

Member ID와 Password 필드가 있는 실제 회원 로그인 폼

레이블이 있는 두 입력란과 Sign in 버튼을 사용합니다. 폼 아래 줄에는 실제 POST 경로와 제출되는 필드 이름이 나옵니다.

Member sign-in을 선택하고 테스트 회원 자격 증명을 입력한 뒤 Sign in을 누릅니다. Signed in as member가 보여야 합니다. Open your record를 선택합니다. 대여 LN-204, Mina Park, Compact projector kit, 수령 Thursday 14:00, 반납 Monday 10:00, HDMI 케이블을 옆 주머니에 넣으라는 메모를 확인합니다. Sign out을 선택합니다.

테스트 회원의 원본 대여 기록과 포장 메모

Member와 Record 필드를 장비, 수령, 반납, 포장 메모와 함께 비교하세요. 로그인 성공만으로 원본 기록이 온전함을 입증하지는 못합니다.

다시 Member sign-in을 선택해 참조 회원 자격 증명을 사용하고 Open your record를 엽니다. LN-119, Theo Bell, Portable audio recorder, 윈드스크린 메모를 확인하고 다시 Sign out을 선택합니다. 서로 다른 두 기록이며 둘 다 보존하는 것이 과제입니다. 브라우저는 보통 로그인 성공 후 서버가 발급한 세션 식별자인 쿠키를 자동으로 저장합니다. 로그아웃하면 그 세션이 끝납니다.

Workstation으로 전환합니다. 설정된 시작 디렉터리는 /home/labex/project/login-limits입니다. pwd는 현재 디렉터리를 출력합니다.

pwd

/home/labex/project/login-limits가 보여야 합니다. 다른 곳으로 이동했다면 cd로 디렉터리를 바꿉니다.

cd /home/labex/project/login-limits

cat은 파일을 표시합니다. 준비된 정책을 읽습니다.

cat policy.json

이것은 JSON으로, 큰따옴표 안의 이름 있는 필드를 사용하는 구조화된 텍스트 형식입니다. 콜론은 이름과 값을 연결하고 쉼표는 필드를 나누며 중괄호는 객체를 둘러쌉니다. 현재 key가 global이므로 같은 카운터에 서로 다른 회원 계정이 포함될 수 있습니다. failed_attempts, window_seconds, cooldown_seconds는 정해진 실패 세 번, 30초 구간, 12초 대기 값입니다. entry_groups는 준비된 로그인 경로를 나열합니다. 이 단원에서는 이 매핑을 유지하세요. 진입점 그룹은 다음 독립 가이드 실습에서 조사합니다.

deskctl은 준비된 제한적 유지 관리 명령입니다. status 동작은 실제 적용 정책을 읽을 뿐 로그인, 카운터 삭제, 서비스 변경을 하지 않습니다.

deskctl status

활성 정책은 파일과 일치해야 합니다. 개정은 현재 사용 중인 정책을 식별합니다. 나중에 파일을 편집해도 명시적으로 적용하기 전에는 실행 정책이 바뀌지 않습니다.

공유 카운터 문제 관찰하기

이 단계에서는 허용된 테스트 회원에 대해 제공된 잘못된 비밀번호만 보내고, 전역 카운터가 참조 회원도 거부하는 것을 관찰합니다.

Workstation에 머무릅니다. 허용된 후보 파일 전체를 읽습니다.

cat wrong-passwords.txt
NotThis11
NotThis22
NotThis33
NotThis44
NotThis55

다섯 개 모두 테스트 계정에 대해 의도적으로 틀린 값입니다. 실제 자격 증명을 추가하거나 다른 계정을 반복 테스트하지 마세요. Hydra는 제한된 시도를 만들며, 이 과제는 속도 경쟁이나 비밀번호 찾기가 아닙니다.

127.0.0.1은 교육 컨테이너의 루프백 주소이고 포트 8080은 외부 사이트가 아닌 준비된 로컬 서비스에 연결됩니다. 주 로그인 폼은 /signin으로 POST 요청을 보냅니다. POST는 본문에 이름 있는 필드를 전달합니다. 여기서는 username과 password를 &로 구분합니다. Hydra의 http-post-form 인수는 콜론으로 나눈 경로, 필드, 응답 조건의 세 부분입니다. ^USER^와 ^PASS^는 Hydra 자리표시자입니다. S=Signed in as는 실제 인증 성공 응답 텍스트를 요구합니다. 제한되거나 거절된 페이지를 유효한 로그인으로 세면 안 됩니다.

Hydra 옵션은 이 작업 공간의 이전 복구 메시지를 무시하는 -I, 사용자 하나를 고정하는 -l member, 제공된 비밀번호 파일을 지정하는 -P, 포트용 -s, 작업자 하나를 쓰는 -t 1입니다. 작업자 하나는 작은 순서를 관찰하기 쉽게 할 뿐 서버 측 제한을 만들지 않습니다. 마지막 작은따옴표 인수는 공백과 &를 포함해도 하나의 인수로 유지됩니다.

다음 블록은 터미널 HTTP 클라이언트 curl도 사용합니다. 브라우저와 별개이며 브라우저 세션을 자동 재사용하지 않습니다. --data는 POST 필드를 제공하고 -s는 진행 표시를 숨기며 -o는 응답 본문을 저장하고 -w는 HTTP 상태를 출력합니다. 따옴표 안의 \n은 상태 출력에 줄바꿈을 넣습니다. 작은따옴표는 &, 공백, %{http_code}를 셸이 해석하지 않고 curl에 전달하도록 보존합니다. 두 진단 로그인은 알려진 올바른 비밀번호를 사용합니다.

먼저 이전 시도가 자연스럽게 만료되기를 기다립니다. deskctl wait는 준비 상태를 관찰할 뿐 카운터를 재설정하거나 시도를 추가하지 않습니다.

deskctl wait

다음 세 명령은 하나의 블록으로 함께 실행하세요. 12초 대기 구간 안에서 두 진단 응답을 수집하므로 명령 사이에서 읽으려고 멈출 필요가 없습니다.

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

모든 후보가 틀렸으므로 Hydra는 0 valid password found를 보고해야 합니다. 두 진단 줄 모두 HTTP 429여야 합니다. 429는 서비스가 시도를 제한한다는 뜻이지 비밀번호가 틀렸다는 뜻이 아닙니다. Curl은 HTTP 거부를 받아도 정상 종료할 수 있으므로 종료 상태를 인증으로 여기지 말고 표시된 상태와 저장된 본문을 읽으세요. 이 장면에서는 세 번째 거절된 시도가 대기를 시작하며 이후 시도는 비밀번호 검사 전에 제한됩니다.

grep은 텍스트를 검색합니다. -o는 주변 HTML 페이지 대신 일치하는 단어만 출력합니다.

grep -o 'Too many attempts' reference-login.html

올바른 참조 비밀번호도 거부되었습니다. 전역 카운터가 다른 회원의 새 로그인까지 멈추는 것이 업무상의 문제입니다.

기존 서버 이벤트를 읽습니다.

deskctl events

member가 /signin에서 rejected, threshold, limited 결과를 보인 뒤 reference 로그인이 limited로 표시되는 것을 찾습니다. 이는 Hydra 출력 해석이 아니라 실제 서버 결정입니다. 이벤트 기록은 대기 종료 후에도 읽을 수 있으므로 순간적인 페이지를 포착할 필요가 없습니다.

진단이 너무 늦었다면 deskctl wait가 끝난 뒤 같은 작은 세 명령 블록을 반복하세요. Hydra가 구문 또는 연결 오류를 보고하면 결과 해석 전에 따옴표 인수, 주소 127.0.0.1, 포트 8080, 선언된 경로를 바로잡습니다. 연결 실패는 보호 테스트 성공이 아닙니다. HTTP 400은 잘못된 폼 필드, 404는 잘못된 경로입니다. 환경을 재설정하지 않고 일반적인 실수를 수정하세요.

계정별 정책 적용하기

이 단계에서는 각 회원이 독립적인 제한을 갖도록 카운터 키만 바꿉니다. 교육 값과 진입점 매핑은 그대로 둡니다.

Workstation에 머무릅니다. 다음 명령은 로컬 policy.json을 대체합니다. cat > policy.json은 텍스트를 파일에 쓰고 >는 기존 파일을 덮어씁니다. 히어 도큐먼트는 종료 표시 EOF까지의 줄을 입력으로 제공합니다. 'EOF'의 따옴표는 본문을 문자 그대로 보존합니다. 종료 표시는 앞 공백 없이 한 줄에 혼자 두세요.

cat > policy.json <<'EOF'
{
  "key": "account",
  "entry_groups": {
    "/signin": "loans",
    "/mobile/signin": "loans"
  },
  "failed_attempts": 3,
  "window_seconds": 30,
  "cooldown_seconds": 12
}
EOF

바뀐 값은 key뿐입니다. account는 모든 계정을 합치지 않고 제출된 회원 ID로 시도를 묶습니다. 임계값을 0으로 낮추거나 계정을 삭제하거나 모두를 거부하면 정상 서비스를 유지할 수 없습니다.

준비된 제어 명령으로 파일을 적용합니다.

deskctl apply policy.json --wait

apply는 파일을 검증하고 실행 정책을 명시적으로 바꿉니다. --wait는 변경 정책을 적용하기 전에 기존 대기나 부분 실패 구간이 자연 만료되기를 기다립니다. 부분 구간은 최대 30초가 필요할 수 있습니다. 기다리는 동안 이전 정책이 계속 유효합니다. 이 명령은 서비스를 재시작하거나 기록을 버리거나 활성 카운터를 지우지 않습니다. 똑같은 정책을 다시 적용하면 변화가 없으며 계정 제한을 해제할 수 없습니다.

첫 변경에서는 ok: true, changed: true, 그리고 key가 account인 새 개정이 나와야 합니다. 같은 유효 파일을 이미 적용했다면 changed: false가 정상입니다.

deskctl status

파일뿐 아니라 실행 정책을 읽으세요. JSON 오류는 대개 쉼표, 따옴표, 중괄호 누락입니다. 완전한 블록과 비교해 수정한 뒤 다시 적용합니다. 유효하지 않은 정책은 활성 정책을 바꾸지 않습니다. 검사를 통과하려고 서버를 재시작하거나 구현을 편집하지 마세요.

보호와 정상 복구 입증하기

이 단계에서는 유효한 정책을 테스트하고 참조 회원의 접근을 유지하며 제한된 테스트 회원이 자연스럽게 복구되는지 확인합니다.

Workstation에 머무릅니다. 카운터가 자연스럽게 안정된 상태에서 시작합니다.

deskctl wait

이 완전한 블록을 다시 실행합니다. 경로, 알려진 진단 비밀번호, 잘못된 후보 집합은 그대로이며 활성 카운터 키만 달라졌습니다.

hydra -I -l member -P wrong-passwords.txt -s 8080 -t 1 127.0.0.1 http-post-form '/signin:username=^USER^&password=^PASS^:S=Signed in as'
curl -s -o test-login.html -w 'Test member HTTP %{http_code}\n' --data 'username=member&password=Member24' http://127.0.0.1:8080/signin
curl -s -o reference-login.html -w 'Reference member HTTP %{http_code}\n' --data 'username=reference&password=Reference24' http://127.0.0.1:8080/signin

Hydra 발견 0개, Test member HTTP 429, Reference member HTTP 200이 예상됩니다. 보호 대상은 여전히 제한되지만 무관한 참조 계정은 인증할 수 있습니다. HTTP 200만으로 부족하므로 저장된 본문에서 신원을 확인합니다.

grep -o 'Signed in as reference' reference-login.html
grep -o 'Too many attempts' test-login.html

새 개정에 기록된 결정을 읽습니다.

deskctl events

member의 임계값과 제한된 로그인, reference의 인증된 로그인이 함께 보여야 합니다. 현재 정책의 이벤트만 수정 결과를 입증합니다. 이전 전역 정책 증거는 보존되지만 새 정책을 증명하지 않습니다. 명령 사이에 멈춰 대기 구간을 놓쳤다면 자연스럽게 기다린 뒤 같은 제한 블록을 반복하세요. 후보를 늘리거나 카운터를 지우지 마세요.

이제 테스트 회원의 대기 시간이 끝나도록 기다립니다.

deskctl wait

Equipment Desk로 전환합니다. Member sign-in에서 member / Member24를 사용하고 Sign in, Open your record를 선택합니다. LN-204, Mina Park, Compact projector kit와 모든 원본 정보가 그대로여야 합니다. 이 새 로그인은 자연 만료 뒤 복구를 보여 줍니다. Sign out을 누르고 Member sign-in에서 reference / Reference24로 다시 LN-119를 엽니다. 녹음기와 윈드스크린 메모를 확인하고 로그아웃합니다.

마지막으로 Visitor guide를 선택합니다. 공개 수령 정보가 계속 제공됩니다. 터미널의 curl 로그인과 브라우저는 별도 세션을 쓰므로 이전 curl 응답이 브라우저를 자동 로그인시키지 않습니다. 기록이 403이면 실제 폼에서 로그인한 뒤 Open your record를 사용합니다. 일반적인 비밀번호나 경로 오타는 VM 재시작 대신 수정으로 해결하세요.

policy.json이 실제 계정별 정책과 일치합니다. 서버에는 현재 개정의 실제 증거인 반복 실패, 올바른 비밀번호 시도의 제한, 제한 중 정상 참조 인증, 자연 복구된 테스트 로그인이 있고 두 원본 기록도 온전합니다. 평가는 기존 사실과 공개 페이지만 읽으며 누락된 로그인, 제한 재설정, 복구를 대신하지 않습니다. 이 통제된 단일 프로세스 교육이 증명하는 것은 명시된 로컬 동작이지 모든 인증 공격에 대한 완전한 운영 방어가 아닙니다.

요약

제한된 Hydra 시도로 전역 로그인 카운터를 드러내고 서비스를 재시작하거나 재설정하지 않고 계정별 정책을 적용해 거부와 가용성을 모두 검증했습니다. 테스트 회원은 올바른 비밀번호로도 제한되었고 다른 회원은 인증할 수 있었으며 자연 만료로 변하지 않은 업무 기록에 다시 접근했습니다. 결과를 입증하는 것은 현재 정책과 실제 서버 결정이지 빈 Hydra 결과나 녹색 상태 표시만이 아닙니다.