기업 인증 연동 · SSO 연동 실전 · 실습
SAML Assertion 뜯어보기
목표
실제 형태의 SAML Response 를 디코드해 Issuer·NameID·Conditions·속성·서명 요소를
직접 추출하고, SP 가 반드시 검증해야 할 항목을 정리할 수 있게 됩니다.
왜 중요한가
SAML 연동은 대개 라이브러리가 해 주지만, 장애가 나면 결국 XML 을 직접 봅니다.
"Audience 불일치", "NotOnOrAfter 초과", "InResponseTo 없음" 같은 오류 메시지를
받았을 때 문서 어디를 봐야 하는지 알아야 합니다.
그리고 이 실습의 진짜 목적은 서명 검증의 함정을 이해하는 것입니다.
XML Signature Wrapping 공격은 서명 검증을 통과하면서도 앱이 읽는 데이터는
가짜인 상태를 만듭니다. "서명이 유효한가"와 "내가 읽는 노드가 서명된 노드인가"가
다른 질문이라는 것을 문서 위에서 확인하고 나면, 왜 SAML 을 직접 구현하면 안 되는지
스스로 설명할 수 있게 됩니다.
단계
1. /opt/lab/fixtures/auth/saml/response.b64 를 디코드해/root/saml/response.xml 로 저장합니다. 유효한 XML 이어야 합니다.
2. /root/saml/head.txt 를 만듭니다. 네 줄이고 형식은 아래와 같습니다.
issuer=<Response 의 Issuer 값> destination=<Destination 속성> inresponseto=<InResponseTo 속성> status=<StatusCode 의 Value 속성>3. /root/saml/subject.txt 를 만듭니다. 두 줄입니다.
nameid=<NameID 값> format=<NameID 의 Format 속성>4. /root/saml/conditions.txt 를 만듭니다. 네 줄입니다.
notbefore=<NotBefore> notonorafter=<NotOnOrAfter> audience=<Audience 값> valid=<현재 시각 기준 유효하면 Y, 아니면 N>5. AttributeStatement 의 속성을 뽑아 /root/saml/attrs.csv 를 만듭니다.
첫 줄은 name,value, 이름 오름차순 정렬입니다.
6. /root/saml/sig.txt 를 만듭니다. 세 줄입니다.
reference_uri=<Reference 의 URI 속성> digest_alg=<DigestMethod 의 Algorithm 속성> signature_alg=<SignatureMethod 의 Algorithm 속성>7. XML 안의 X509Certificate 내용을 PEM 형식으로 복원해/root/saml/idp.pem 에 저장합니다.openssl x509 -in /root/saml/idp.pem -noout -subject 가 성공해야 합니다.
8. /root/saml/checklist.md 를 작성합니다. SP 가 검증해야 할 항목을
7개 이상 목록으로 적고, 각 항목에 검증 실패 시 위험을 한 줄씩 덧붙입니다.
본문에 Audience, NotOnOrAfter, InResponseTo, Destination, Issuer,서명, 재사용 일곱 단어가 모두 등장해야 합니다.
참고
- 네임스페이스 무시하고 요소 찾기:
- 속성 값:
xmlstarlet sel -t -v "//*[local-name()='Response']/@Destination" -n 파일.xml - PEM 복원:
-----BEGIN CERTIFICATE-----와-----END CERTIFICATE-----사이에 - 흔한 실수 1: 접두어(
saml:,samlp:)를 그대로 XPath 에 써서 아무것도 못 찾는 것. - 흔한 실수 2:
Response의 Issuer 와Assertion의 Issuer 를 혼동하는 것. - 흔한 실수 3: PEM 을 한 줄로 만들어 openssl 이 못 읽는 것.
xmlstarlet sel -t -v "//*[local-name()='Issuer']" -n 파일.xml
base64 본문을 64자씩 줄바꿈해 넣습니다 (fold -w 64).
단계 8개
- SAMLResponse 디코드
- Response 헤더 정보 추출
- NameID 와 형식
- 유효 시간과 대상 확인
- 속성 추출
- 서명 요소 확인
- IdP 인증서 복원
- SP 검증 체크리스트