반응형

 

작성일: 2024년 6월 4일

 

Network Traffic을 다루는 앱을 개발하다보면, TLS 또는 HTTPS로 암호화한 통신 내용을 봐야 할 때가 있다.

원칙적으로는 TLS 통신에서 제3자가 패킷 내용을 열람하는 것이 불가능하지만,

내 PC에 저장된 Master Secret 값을 이용하면 복호화가 가능하다. (내 PC는 제3자가 아니니까 이런 복호화가 가능한 얘기가 된다)

 

참고: 3가지 복호화 방법

Master Secret 값을 이용하는 경우 외에도 TLS Payload를 복호화(Decryption)하는 방법이 있다.

Wireshark 매뉴얼에 보면, Master Secret을 포함하여 총 3가지 방법을 소개하고 있다.

방법 A : (Pre)-Master Secret 정보가 담겨있는 Key load file을 사용하여 복호화하기

이 방법이 범용적으로 사용되는 복호화 방법.

Diffie-Hellman(DH) Key 교환이 발생하더라도 (Pre)-Master Secret 정보를 이용하면 복호화가 된다.

이 블로그의 대부분 내용이 이 방식으로 복호화하는 방법이 설명되어 있다.

 
방법 B : RSA private key (예:  PEM 포맷의 private key 파일)을 이용하여 복호화하기

TLS 연동할 Peer 노드(예: 서버)의 RSA private key를 한번만 Wireshark에 등록하면 되므로 가장 편하게 설정할 수 있다.

단, 아래와 같이 조건을 모두 만족하는 경우에만 RSA private key를 사용하여 복호화하는 것이 가능하다.

  • 조건1: Cipher suite가 (EC)DHE 계열이 아니어야 한다.
  • 조건2: TLS 1.0 ~ 1.2만 허용됨. TLS 1.3에서는 복호화할 수 없음.
  • 조건3: Wireshark에 등록할 Private key는 반드시 Server certificate이어야 한다. client certificate 또는 CA(Certificate Authority) certificate은 안 된다.
  • 조건4: TLS handshake 절차에서 'ClientKeyExchange' 과정이 포함되어야 함
즉, 위 4가지 조건을 모두 만족해야 햐는데 현실적으로 요즘 TLS 통신 환경에서 RSA private key를 이용하여 복호화하는 것이 거의 어렵다는 뜻 ㅠㅠ

 

방법 C : Pre-Shared-Key(PSK) 정보를 이용하여 복호화하기

수준 높은 보안을 요구하는 곳에서 PSK를 사용하지 않고,
PSK를 사용하는 것이 흔한 경우가 아니니까, 설명을 생략~

 

 

 

그렇다면,  Master Secret이라는게 무엇이길래 패킷 복호화가 가능한 것일까?

만약 Server / Client 간 통신이 mTLS 방식으로 연결된다면, 아래와 같이 절차를 따를 것이다.

  1. Client는 Server certificate을 받아서 믿을만한 Network peer인지 확인 (즉, Root CA가 서명한 Certificate인지 확인)
  2. Server는 Client certificate을 받아서 믿을만한 Network peer인지 확인
  3. 서로 믿을만하다고 판단되면, 대칭키 교환 (여기서 교환한 대칭키는 Server, Client가 패킷을 암호화 및 복호화 할 때 사용)
  4. Server, Client가 서로 암호화한 패킷을 주고, 받을 쪽에서는 패킷을 받으면 복호화 처리 (이 때 대칭키를 사용함)

위 mTLS 핸드쉐이킹 절차 3번에서 교화한 대칭키만 있으면, Server / Client 간에 주고 받은 암호화된 HTTPS(또는 TLS) 패킷을 복호화할 수 있다.

 

이론적으로는 위와 같고, 실제로 Chrome browser 또는 Firefox browser로 HTTPS 패킷을 보내고 받은 내용을 복호화하려면 아래와 같이 해야 한다.

 

 

##
## Firefox 브라우저로 테스트할 때.
## 
$ export SSLKEYLOGFILE=/tmp/sslkey.log
$ open /Applications/Firefox.app

##
## Chrome 브라우저로 테스트할 때.
##
$ export SSLKEYLOGFILE=/tmp/sslkey.log 
$ open /Applications/Google\ Chrome.app

 

 

Wireshark을 macOS에서 실행한 경우, 아래의 순서로 설정 화면을 열어 본다.

 

[ Wireshark ]  ->  [ Preferences ]  ->  [ Protocols ]  ->  [ TLS ]  ->  [ (Pre)-Master-Secret log filename ]

 

위 순서로 설정 화면을 오픈하고, 아래 예시 화면처럼 Master-Secret log 파일 경로를 입력하면 된다.

 

 

 

[ OK ] 버튼을 클릭하고, Firefox 브라우저에서 웹 브라우징을 해보면

TLS의 Payload가 눈으로 볼 수 있는 HTTP Payload로 복호화된 것을 확인할 수 있다. 

 

 


참고: 위와 동일한 내용이지만 원문을 읽고 싶다면, 아래 문서 링크를 클릭할 것 !

 

https://wiki.wireshark.org/TLS#using-the-pre-master-secret

 

TLS - Wireshark Wiki

Some applications (such as email) use a single port for both unencrypted and encrypted sessions. To change from unencrypted to encrypted, (START)TLS is used. When a single port directly uses the TLS protocol, it is often referred to as SSL.

wiki.wireshark.org

 

 

 


 

반응형

 

작성일: 2023년 8월 16일
참고 사항:
- Let’s Encrypt 는 SSL, TLS 무료로 인증서를 제공해주는 인증 기관이다.
- 인증서 유효기간이 90일이다.
- 따라서 90일이 지나기 전에 기존 인증서를 Renewal해주어야 한다.

 

자세한 발급 방법은 아래 Web Docs를 참고하기.


https://certbot.eff.org/

https://letsencrypt.org/ko/getting-started/

https://namu.wiki/w/Let's%20Encrypt

 

 

 

반응형

 


 

 

이 블로그 내용을 테스트한 날짜: 2023년 02월 17일

 

 

아래 예시처럼 따라하면, Kubernetes 자원에 대한 Metrics 정보를 볼 수 있다.

단, 아래 절차에서 "NOTE:" 라고 표시된 부분을 추가해야 한다.

 

##
## 아래 명령을 수행해서 metrics-server를 설치하기 위한 manifest file을 download한다.
##
$  curl -L https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -o components.yaml


## 
## 다운로드한 components.yaml 파일에
## "--kubelet-insecure-tls=true" 옵션을 추가한다.
##  (아래 예제를 따라하면 된다)
$  vi components.yaml
... 중간 생략 ...
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-insecure-tls=true     ## <-- NOTE: 이 부분을 추가한다.
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
... 중간 생략 ...        


$  kubectl apply -f components.yaml
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
$

$  kubectl  get  -n kube-system  pod  -l k8s-app=metrics-server
NAME                             READY   STATUS    RESTARTS   AGE
metrics-server-ddfcd777b-lktxx   1/1     Running   0          67s

$ kubectl  top  node
NAME      CPU(cores)   CPU%   MEMORY(bytes)    MEMORY%
node-69   219m         5%     23607Mi          24%
node-73   202m         5%     48753Mi          50%
node-75   173m         4%     51048Mi          52%
... 중간 생략 ...

$ kubectl  top  -n istio-system  pod --containers
POD                                     NAME                                 CPU(cores)   MEMORY(bytes)
grafana-68cc7d6d78-7kjw8                grafana                              3m           51Mi
istio-egressgateway-6cb7bdc7fb-2wg57    istio-proxy                          3m           47Mi
istio-ingressgateway-694d8d7656-fk4tw   istio-proxy                          7m           62Mi
istiod-6c68579c55-xk6cm                 discovery                            2m           80Mi
jaeger-5d44bc5c5d-rb4v6                 jaeger                               10m          3612Mi
kiali-fd9f88575-z4wrm                   kiali                                1m           131Mi
prometheus-77b49cb997-zvjm8             prometheus-server                    9m           454Mi
prometheus-77b49cb997-zvjm8             prometheus-server-configmap-reload   1m           6Mi
... 중간 생략 ...
$

 

위에서 "--kubelet-insecure-tls=true" 라고 설정을 추가했는데, 자세한 설명은 아래 원문을 참고할 것~~~

Metrics Server Pod랑 Kubelet 이랑 API 연동할 때, CA(Certificate Authority)를 검사하지 말고 연동하라는 뜻이다.

 

kubelet-insecure-tls 옵션에 대한 설명

 

 

Reference

딱히 어려운 내용이 없어서, 아래 원문을 읽고 따라해도 잘 설치되고, 동작한다.

 

GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container resource metrics for Kubernetes built-in aut

Scalable and efficient source of container resource metrics for Kubernetes built-in autoscaling pipelines. - GitHub - kubernetes-sigs/metrics-server: Scalable and efficient source of container reso...

github.com

 

반응형
참고하면 좋은 Web Docs:

https://www.lesstif.com/software-architect/openssl-command-tip-7635159.html#OpenSSL%EC%9E%90%EC%A3%BC%EC%93%B0%EB%8A%94%EB%AA%85%EB%A0%B9%EC%96%B4(command)%EB%B0%8F%EC%82%AC%EC%9A%A9%EB%B2%95,tip%EC%A0%95%EB%A6%AC-%EC%9D%B8%EC%A6%9D%EC%84%9C%EC%A0%95%EB%B3%B4%EB%B3%B4%EA%B8%B0

 

 

 

openssl command cheat sheet

## Certificate Expiry 확인
$  openssl x509 -in my.crt -noout -enddate | cut -c10-40

## File 내용 확인
$ openssl rsa  -noout -text -in myprivate.key    # private key file
$ openssl req  -noout -text -in myreq.csr        # singing request file
$ openssl x509 -noout -text -in mycert.crt       # certificate file

## cerficate과 private key가 쌍이 맞는지 확인
$ openssl rsa  -in myprivate.key -modulus -noout | openssl md5
$ openssl x509 -in mycert.crt    -modulus -noout | openssl md5
$ openssl req  -in myreq.csr     -modulus -noout | openssl md5

Private Key를 생성하고,  Signing 요청하는 것은 아래 내용을 참고할 것!

 

Certficate 파일과 Private Key 파일의 Format 변환(DER/PEM)은 아래 내용을 참고할 것!

 

'Ubuntu' 카테고리의 다른 글

Root 계정의 SSH 로그인 허용  (0) 2021.12.28
Install BIND for name server(DNS) on Ubuntu 22.04  (0) 2021.11.05
.bashrc 또는 .bash_profile 설정  (0) 2021.07.22
.vimrc 작성  (0) 2021.07.22
iptables and netfilter  (1) 2021.07.10

+ Recent posts