OpenADR μš”μ²­ μ‹œ 451 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€ πŸ’₯

OpenADR ν”„λ‘œν† μ½œμ—μ„œ NOT_ALLOWED(451)은 μš”μ²­μ΄ μ˜¬λ°”λ₯΄μ§€ μ•Šμ„λ•Œ μ‘λ‹΅λ˜λŠ” λ©”μ‹œμ§€μ΄λ‹€. μ²˜μŒμ—λŠ” OpenADR ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ μ‹œ μ „λ‹¬ν•œ μΈμ¦μ„œκ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 것을 μ²΄ν¬ν–ˆμœΌλ‚˜ ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ ν™•μΈν•΄λ³΄λ‹ˆ μΈμ¦μ„œκ°€ μ„œλ²„κΉŒμ§€ μ „λ‹¬λ˜μ§€ μ•ŠμŒμ„ 확인할 수 μžˆμ—ˆλ‹€. ν•΄λ‹Ή ν…ŒμŠ€νŠΈ ν™˜κ²½μ€ κ·Έλ™μ•ˆ μ‘°μ§μ—μ„œ κ΅¬μ„±ν•œ 인프라 방식이 μ•„λ‹Œ 일본 고객 ν™˜κ²½μ„ μ΅œλŒ€ν•œ λͺ¨λ°©ν•΄μ„œ λ§Œλ“  μ‹ κ·œ ν™˜κ²½μ— ν•΄λ‹Ήλœλ‹€. ν˜„μž¬ μ‘°μ§μ—μ„œ μ œκ³΅ν•˜λŠ” μ†”λ£¨μ…˜μ€ μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ—μ„œ 인프라λ₯Ό κ΅¬μ„±ν•˜λŠ” 경우 Elastic Beanstalk 와 (ELB 쀑 L4에 ν•΄λ‹Ήν•˜λŠ”) NLB 둜 κ΅¬μ„±λœλ‹€.

λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό ALB둜 κ΅¬μ„±ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λΉ λ₯Έ νŠΈλž˜ν”½ 전달과 μ—λ„ˆμ§€ κ΄€λ ¨ μ‹œμŠ€ν…œ νŠΉμ„± 상 μ™ΈλΆ€μ—μ„œ κ³ μ •λ˜μ–΄μ•Όν•˜λŠ” 아이피가 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

AWS ALB λŠ” mTLSλ₯Ό μ§€μ›ν•΄μš” 🌼

2023λ…„ 12월에 Application Load Balancer μƒν˜Έ 인증 κΈ°λŠ₯을 μ§€μ›ν•˜κ²Œ λ˜μ—ˆκ³  μ•„λž˜μ™€ 같이 Application Load Balancer용 HTTPS λ¦¬μŠ€λ„ˆ μƒμ„±λ¬Έμ„œμ—λŠ” κ·Έλ™μ•ˆ ALB μ—μ„œ mTLS μ μš©μ„ ν•  수 μ—†λ‹€λŠ” 정보가 λ‚¨μ•„μžˆλŠ” κ±Έ 확인할 수 μžˆλ‹€. 고객 ν™˜κ²½κ³Ό λ™μΌν•œ 인프라λ₯Ό κ΅¬μ„±ν•˜λ©΄μ„œλ„ ALB μ—μ„œ mTLSλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 뢀뢄에 μ œμ•½μ΄ μžˆλ‹€λŠ” 것을 μ•Œμ•„μ±„μ§€ λͺ»ν–ˆλ‹€.

μ›λž˜λŠ” μ§€μ›ν•˜μ§€ μ•Šμ•˜λ‹€λŠ”κ±Έ μ•Œ 수 μžˆλŠ” μŠ€νƒμ˜€λ²„ν”Œλ‘œμš° λ‹΅λ³€ 링크

mTLS 패슀슀루 μ˜΅μ…˜

μƒν˜Έ 인증 μ˜΅μ…˜μ€ 두 가지가 μžˆμŠ΅λ‹ˆλ‹€. 패슀슀루 μ˜΅μ…˜μ„ μ„ νƒν•˜λ©΄ HTTP 헀더λ₯Ό μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° 받은 λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ 체인을 λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ λ³΄λƒ…λ‹ˆλ‹€. mTLSκ°€ ν™œμ„±ν™”λœ Application Load BalancerλŠ” ν•Έλ“œμ…°μ΄ν¬μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ₯Ό κ°€μ Έμ˜€κ³ , TLS 연결을 μ„€μ •ν•œ λ‹€μŒ, HTTPS 헀더에 μžˆλŠ” λͺ¨λ“  ν•­λͺ©μ„ λŒ€μƒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ λ³΄λƒ…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μΈμ¦ν•˜κΈ° μœ„ν•΄ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ 체인을 확인해야 ν•©λ‹ˆλ‹€.

μœ„ λ¬Έμž₯으둜만 ν•΄μ„ν•˜λ©΄ ALB μ—μ„œ 패슀슀루 μ˜΅μ…˜μ„ μ μš©ν•œ λ’€ λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κΉŒμ§€ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œκ°€ λ„λ‹¬ν•΄μ•Όν•˜μ§€λ§Œ 패슀슀루 μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•˜μ—¬λ„ ν•΄λ‹Ή 증상은 λ™μΌν•˜κ²Œ λ°œμƒν–ˆλ‹€. 졜근 κ°±μ‹ λœ νŽ˜μ΄μ§€λΌ ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­μ΄ λ˜μ§€ μ•Šμ€ Mutual authentication with TLS in Application Load Balancerλ₯Ό μ°Έκ³ ν•˜λ©΄ X-Amzn-Mtls-Clientcert ν—€λ”μ˜ URL-encoded PEM ν˜•νƒœμ˜ κ°’μœΌλ‘œ λ‘œλ“œλ°ΈλŸ°μ„œμ˜ λŒ€μƒμœΌλ‘œ μ „λ‹¬λ˜λŠ” 것을 확인할 수 μžˆμ—ˆλ‹€.


URL-encoded PEM with +=/ as safe characters 둜 μΈν•œ 였λ₯˜ ⚑️

μ›λž˜λŠ” NLBλ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ AWS Elastic Beanstalk ν™˜κ²½μ˜ Nginx에 μ „λ‹¬λ˜λŠ” μΈμ¦μ„œλ₯Ό λ°±μ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ „λ‹¬ν•˜κΈ° μœ„ν•΄μ„œ $ssl_client_escaped_cert λ³€μˆ˜λ₯Ό X-SSL-CERT 헀더에 ν¬ν•¨ν•˜μ—¬ μ „λ‹¬ν•˜λ©΄ ν—€λ”μ˜ 값을 μΆ”μΆœν•˜μ—¬ μΈμ¦μ„œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•˜λ„λ‘ μ‘°μΉ˜λ˜μ–΄ μžˆμ—ˆκΈ°μ— X-Amzn-Mtls-Clientcert ν—€λ”λ‘œ μ „λ‹¬λ˜λŠ” μΈμ¦μ„œ 정보λ₯Ό κ·ΈλŒ€λ‘œ X-SSL-CERT 헀더에 μ „λ‹¬ν•˜λŠ” 쑰치둜 ν•΄κ²°ν•˜λ € ν–ˆμœΌλ‚˜ 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€. μ•Œκ³ λ³΄λ‹ˆ 일반적인 URL 인코딩이 μ•„λ‹ˆλΌ +=/ 와 같은 일뢀 λ¬ΈμžλŠ” μΈμ½”λ”©μ—μ„œ μ œμ™Έλ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ½”λ“œμ—μ„œ μ‚¬μš©ν•˜κ³  있던 URLDecoder둜 λ””μ½”λ”©ν•˜λŠ” 경우 μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ μΈμ¦μ„œκ°€ λ˜μ–΄λ²„λ¦¬λŠ” 상황이 λ˜μ—ˆλ‹€.

μœ„μ™€ 같은 μƒν™©μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ μˆ˜μ •μ—†μ΄λŠ” μ‘°μΉ˜κ°€ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— X-SSL-CERT 헀더 이외에 X-Amzn-Mtls-Clientcert κ°€ μžˆλ‹€λ©΄ μΈμ¦μ„œλ‘œ λ³€ν™˜ν•˜λ„λ‘ ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, κΈ΄κΈ‰ν•œ 상황은 μ•„λ‹ˆμ—ˆκΈ°μ— μ˜ˆμ •λœ λ¦΄λ¦¬μ¦ˆμ— ν¬ν•¨ν•΄μ„œ λ°°ν¬ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

Tip. ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” λ‘œλ“œλ°ΈλŸ°μ„œμ—μ„œ μ „λ‹¬ν•œ μš”μ²­ ν—€λ”μ˜ 값을 Nginxμ—μ„œ λ‹€λ₯Έ ν—€λ”λ‘œ λ°”κΎΈμ–΄μ„œ μ „λ‹¬ν•˜λŠ” 방법

Nginx μ„€μ •μ—μ„œ X-Amzn-Mtls-Clientcert ν—€λ”μ˜ 값을 X-SSL-CERT 으둜 μ „λ‹¬ν•˜λŠ” 것은 μ•„λž˜μ™€ 같이 ν•  수 μžˆλ‹€.

server {
    underscores_in_headers on;
  
    location / {
        proxy_set_header X-SSL-CERT $http_x_amzn_mtls_clientcert;
    }
}

ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” λ‘œλ“œλ°ΈλŸ°μ„œμ—μ„œ μ „λ‹¬ν•œ μ»€μŠ€ν…€ 헀더λ₯Ό Nginx μ—μ„œ λ‹€μ‹œ μ„€μ •ν•˜μ—¬ ν¬ν•¨μ‹œν‚€λŠ” 방법을 μ°Ύκ³  μžˆλŠ” λΆ„μ—κ²Œ 도움이 되길 λ°”λžλ‹ˆλ‹€.

κ΄€λ ¨ 링크