TLSOption
출처: TLSOption
본문
TLSOption
TLS 옵션을 사용하면 Traefik에서 TLS 연결의 일부 파라미터를 구성할 수 있어요.
TLSOption 객체를 만들거나 IngressRoute/IngressRouteTCP 객체에서 TLS 옵션을 참조하기 전에 Traefik Kubernetes CRD를 Kubernetes 클러스터에 적용해야 해요.
참조와 네임스페이스
선택적 namespace 속성이 설정되지 않으면 구성은 IngressRoute/IngressRouteTCP의 네임스페이스로 적용돼요.
추가로, TLS 옵션의 정의가 다른 provider에서 온 경우, TLS 옵션을 참조할 때 교차 provider 문법(middlewarename@provider)을 사용해야 해요. 이 경우 namespace 속성을 지정하는 것은 의미가 없으며 무시돼요.
Kubernetes의 TLSOption
Kubernetes에서 TLSOption 리소스를 사용할 때, 명시적으로 덮어쓰지 않으면 모든 인그레스에 적용될 기본 옵션 집합을 설정할 수 있어요. 이를 달성하려면 이름이 default인 TLSOption 리소스를 만들어야 해요. 이름이 default인 TLSOption은 (모든 네임스페이스에서) 하나만 존재할 수 있어요 — 그렇지 않으면 모두 무시돼요. 다른 TLSOption을 명시적으로 사용하려면(Kubernetes Ingress 리소스를 사용할 때) Ingress에 다음 형식의 어노테이션을 추가해야 해요: traefik.ingress.kubernetes.io/router.tls.options: -@kubernetescrd.
이 default TLSOption은 명시적으로 TLSOption을 참조하지 않는 모든 라우터의 TLS 강제 정책(클라이언트 인증, TLS 버전, 암호화 스위트, SNI 엄격성)을 담당해요. defaultTLSResourcesNamespace provider 옵션은 이 클러스터 전역 기본값이 정의될 수 있는 네임스페이스를 제한해요.
Configuration Example (설정 예시)
TLSOption
apiVersion: traefik.io/v1alpha1
kind: TLSOption
metadata:
name: mytlsoption
namespace: default
spec:
minVersion: VersionTLS12
sniStrict: true
cipherSuites:
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_RSA_WITH_AES_256_GCM_SHA384
clientAuth:
secretNames:
- secret-ca1
- secret-ca2
clientAuthType: VerifyClientCertIfGiven
Configuration Options (설정 옵션)
| Field | Description | Default | Required |
| minVersion | 허용되는 최소 TLS 버전이에요. | "VersionTLS12" | No |
| maxVersion | 허용되는 최대 TLS 버전이에요. 이 옵션을 사용해 TLS 1.3을 비활성화하는 것은 권장하지 않아요. | | No |
| cipherSuites | TLS 1.2까지의 TLS 버전에 대해 지원되는 암호화 스위트 목록이에요. TLS 1.2 이하를 위해 정의된 암호화 스위트는 TLS 1.3에서 사용할 수 없고, 그 반대도 마찬가지예요. TLS 1.3에서는 암호화 스위트를 구성할 수 없어요(이 경우 모든 지원 암호화 스위트가 안전해요). | | No |
| curvePreferences | ECDHE 핸드셰이크에서 사용될 타원 곡선 참조 목록이에요. crypto 또는 RFC의 곡선 이름을 사용하세요. 자세한 내용은 CurveID를 참고해 주세요. | | No |
| clientAuth.secretNames | 클라이언트 인증(mTLS) 옵션이에요. 참조된 Kubernetes Secrets(TLSOption 네임스페이스)의 이름 목록이에요. 시크릿은 tls.ca 또는 ca.crt 키 중 하나에 인증서를 포함해야 해요. | | No |
| clientAuth.clientAuthType | 클라이언트 인증(mTLS) 옵션이에요. 적용할 클라이언트 인증 유형이에요. 사용 가능한 값은 여기를 참고해 주세요. | | No |
| sniStrict | server_name 확장을 지정하지 않는 클라이언트 연결을 거부하도록 허용해요. 옵션이 활성화되면 기본 인증서는 결코 제공되지 않아요. | false | No |
| alpnProtocols | TLS 핸드셰이크를 위해 선호 순서대로 지원되는 애플리케이션 레벨 프로토콜 목록이에요. 클라이언트가 ALPN을 지원하면 선택되는 프로토콜은 이 목록 중 하나이며, 상호 지원되는 프로토콜이 없으면 연결이 실패해요. | "h2, http/1.1, acme-tls/1" | No |
| disableSessionTickets | 세션 티켓 사용을 비활성화해서 모든 클라이언트가 세션을 재개하는 대신 전체 TLS 핸드셰이크를 수행하도록 강제해요. | false | No |
Client Authentication (mTLS) (클라이언트 인증)
clientAuth.clientAuthType 옵션은 다음과 같이 동작을 결정해요:
-
NoClientCert: 클라이언트 인증서를 무시해요.
-
RequestClientCert: 인증서를 요청하지만, 제공되지 않으면 계속 진행해요.
-
RequireAnyClientCert: 인증서를 요구하지만, clientAuth.caFiles나 clientAuth.secretNames에 나열된 CA가 서명했는지는 검증하지 않아요.
-
VerifyClientCertIfGiven: 인증서가 제공되면 clientAuth.caFiles나 clientAuth.secretNames에 나열된 CA가 서명했는지 검증해요. 그렇지 않으면 인증서 없이 진행해요.
-
RequireAndVerifyClientCert: 인증서를 요구하며, 이 인증서는 clientAuth.caFiles나 clientAuth.secretNames에 나열된 CA가 서명해야 해요.
CA Secret
CA 시크릿은 tls.ca 또는 ca.crt 키 중 하나에 base64로 인코딩된 인증서를 포함해야 해요.
Default TLS Option (기본 TLS 옵션)
IngressRoute/IngressRouteTCP에 TLS 옵션이 지정되지 않으면 default 옵션이 사용돼요. 기본 동작은 아래 표에 요약되어 있어요:
| Configuration | Behavior |
| default TLS Option 없음 | 기본적으로 내부 기본 TLS 옵션 집합을 사용해요. |
| default TLS Option 하나 | 기본적으로 사용자 정의 TLS 옵션이 적용돼요. |
| default TLS Option 여러 개 | 오류 로그 + 기본적으로 내부 기본 TLS 옵션 집합을 사용해요. |