중국시가넷 - 개인 서명 - K8s 의 서비스 계정 토큰

K8s 의 서비스 계정 토큰

이전 문장 동안 apiserver 에 요청을 보내는 인증으로 sa 토큰을 사용했습니다. 여기서는 인증 원리와 과정을 간단히 설명하겠습니다.

우선 이 토큰을 JWT(json web token) 라고 부르는데, 홈페이지에서 소개할 수 있는 것은 RFC 표준입니다.

JWT 는 서버에서 클라이언트로 보내는 암호화된 인증서 (RSA 또는 암호로 암호화됨) 입니다. 클라이언트가 서버에 액세스할 때 (인증서를 발급한 서버가 아닐 수도 있음) 서버는 인증서를 해독하고 인증 후 클라이언트가 액세스할 수 있도록 합니다.

K8s 에서 RSA 개인/공개 키는 암호화 및 인증에 사용되고 kube-controller-manager 는 다음 매개 변수를 사용하여 개인 키를 지정하고 토큰에 서명합니다.

Kube-apiserver 는 다음 매개변수를 사용하여 토큰을 인증하는 공개 키를 지정합니다.

JWT 는 헤더, 페이로드 및 서명의 세 부분으로 구성되며 "."로 구분되므로 일반적인 형식은 xxx.yyy.zzz 입니다.

머리글

일반적으로 두 부분이 있습니다. 유형 지정 유형, 고정 "JWT", alg 는 서명 알고리즘 (예: HMAC SHA256 또는 RSA) 을 지정합니다.

페이로드

사용자 데이터는 정의되며 잘 알려진 정의 필드가 있으며 사용자 정의 필드를 가질 수 있습니다.

페이로드는 JWT 의 두 번째 부분으로 Base64Url 로 암호화해야 합니다.

서명

서명에는 Base64Url 암호화의 헤더, paload, Base64Url 암호화의 secret (암호 또는 RSA 의 개인 키), 헤더에 지정된 암호화 알고리즘의 네 가지 조건이 필요합니다. 예를 들어 RSASHA256 알고리즘을 사용하여 서명을 계산하는 공식은 다음과 같습니다.

위의 공식을 실행할 때 대략 두 단계로 나뉩니다.

마지막으로 "."를 사용하여 이 세 부분 (모두 base64 로 암호화) 을 결합하는 것이 마지막 토큰입니다.

이것은 원리와 프로세스에 대한 간단한 설명일 뿐이다. 여기서는 JWT 를 생성하는 방법과 JWT 를 검증하는 방법을 연습합니다.

JWT 를 생성/검증하는 방법에는 두 가지가 있습니다.

A. jwt.io 에서 제공하는 공식 그래픽 인터페이스 사용

B. python jwt 의 jwt 와 같은 타사 라이브러리를 사용합니다 jwt (pip install python-jwt 는 이 명령으로 설치됨).

JWT 생성

헤더, 페이로드 및 검증 서명의 개인 키로 아래 오른쪽에 디코딩된 세 개의 상자 (k8s 의 경우 개인 키는 /etc/kubernetes/pkt/sa.key) 를 채웁니다. Top 알고리즘에서 서명 알고리즘을 선택합니다. 여기서 rs256 을 선택하면 결과 JWT 가 아래 그림과 같이 왼쪽의 인코딩 상자에 자동으로 표시됩니다.

JWT 복호화

왼쪽 인코딩 상자에 JWT 를 입력하면 헤더 및 페이로드가 자동으로 인식됩니다. base64 암호화로 인해 직접 암호를 해독할 수 있지만 서명 부분은 인증을 위해 공개 키를 제공해야 합니다. 그렇지 않으면 인코딩 상자 아래에 빨간색 "유효하지 않은 서명" 이 표시되며 공개 키 (k8s 의 경우 공개 키는/ETC/KUBEE) 만 넣으면 됩니다

공개 키가 채워지지 않은 경우

정확한 공개 키를 기입한 후

다음은 JWT 라이브러리를 사용하여 jwt 를 생성하고 검증하는 파이썬 스크립트입니다.

Python3 을 사용하여 스크립트 실행 (python3 인 이유는 무엇입니까? 그 이유는 아래), 결과를 확인하십시오.

파이썬 라이브러리를 사용할 때 주의해야 할 두 가지가 있습니다.

다음은 파이썬 디버그 내용이며 무시할 수 있습니다.

Sha256 에서 생성된 해시 값

(Pdb) p 데이터

B'\x9e, \ x86 \ xd2g74 \ xed \ xdbo \ x14 \ xaa \ x02b \ xd6 \ x0/kr

(Pdb) len (데이터)

32

(Pdb) 인쇄 (data.hex ())

9e2a2c86d2673734eddb6f14aa0262d60161a6defb82d02ce01

(Pdb) 인쇄 (데이터)

B'\x9e, \ x86 \ xd2g74 \ xed \ xdbo \ x14 \ xaa \ x02b \ xd6 \ x0/kr

/usr/lib/python3/dist-packages/jwt/API _ jws.py

Alg_obj = self 입니다. _ 알고리즘 [알고리즘]

키 key = alg_obj.prepare_key(key (키)

Signature = alg _ obj.sign (signing _ input, 키)