728x90

 

P254 시크릿 - 예제: nginx의 기본인증정보가 담긴 파일을 시크릿으로 관리

접근통제 3단계

  • 식별(identification)
  • 인증(authentication)
    • TYPE1 : 알고 있는 정보 (지식기반) - 패스워드

    • TYPE2 : 가고 있는 정보 (소유기반) - 주민등록증, OTP, 인증서, 스마트폰, … 

    • TYPE3 : 특징 - 홍채, 지문, 성문, 정맥, … , 필기체 서명(싸인)

               ~~~~~~~~~~~~~~~~~~~~~~

               생물학적 특징을 이용 ⇒ 바이오 인증

  • 2가지 이상을 혼용 : 2-factor 인증, multi-factor 인증(=다중인증방식)

  • 멀티 디바이스 인증 = 멀티 채널 인증 

  • 인가(authorization)

 

HTTP 기본인증(HTTP Basic Authentication)

#1 openssl 모듈을 이용해서 사용명과 암호화한 패스워드를 BASE64로 인코딩

[vagrant@master ~]$ echo "your_name:$(openssl passwd -quiet -crypt your_password)" | base64

                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                    (1) your_password 문자열을 암호화        

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   ~~~~~~

                    (2) "your_name:암호화된패스워드" 문자열을 생성                   (3) (2)에서 생성된 문자열을

                                                                                         BASE64로 인코딩해서 반환

eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK

 

 

#2 시크릿을 생성하는 YAML 파일을 작성

[vagrant@master ~]$ vi nginx-secret.yaml

apiVersion: v1

kind: Secret

metadata:

  name: nginx-secret

type: Opaque

data:

  .htpasswd: eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK   ⇐ basic authentication에 사용할 사용자 파일

 

 

[vagrant@master ~]$ kubectl create secret generic nginx-secret --from-literal .htpasswd=eW91cl9uYW1lOjVOU1h3NTFsd1pmOHcK --dry-run -o yaml > test.yaml

 

[vagrant@master ~]$ cat test.yaml

apiVersion: v1

data:

  .htpasswd: ZVc5MWNsOXVZVzFsT2pWT1UxaDNOVEZzZDFwbU9IY0s=

kind: Secret

metadata:

  creationTimestamp: null

  name: nginx-secret

 

 

 

#3 시크릿 생성

[vagrant@master ~]$ kubectl apply -f nginx-secrect.yaml

secret/nginx-secret created

 

[vagrant@master ~]$ kubectl get secrets

NAME                  TYPE                                  DATA   AGE

default-token-mmbs5   kubernetes.io/service-account-token   3      8d

my-password           Opaque                                1      136m

nginx-secret          Opaque                                1      13s

our-password          Opaque                                2      127m

 

 

#4 시크릿을 활용해 기본인증을 적용하는 nginx 파드를 구성

[vagrant@master ~]$ vi basic-auth.yaml

apiVersion: v1

kind: Service

metadata:

  name: basic-auth

spec:

  type: NodePort

  selector: 

    app: basic-auth

  ports:

    - protocol: TCP

      port: 80

      targetPort: http

      nodePort: 30060                ⇐ 클러스터 외부에서 해당 포트로 서비스를 이용

---

apiVersion: apps/v1

kind: Deployment

metadata:

  name: basic-auth

  labels:

    app: basic-auth

spec:

  replicas: 1

  selector:

    matchLabels:

      app: basic-auth

  template:

    metadata:

      labels:

        app: basic-auth

    spec:

      containers:

        - name: nginx

          image: "gihyodocker/nginx:latest"      

          imagePullPolicy: Always

          ports:

          - name: http

            containerPort: 80

          env:

          - name: BACKEND_HOST

            value: "localhost:8080"

          - name: BASIC_AUTH_FILE

            value: "/etc/nginx/secret/.htpasswd" ⇐ (1) 기본인증에 사용하는 인증정보가 담긴 파일

          volumeMounts:

            - mountPath: /etc/nginx/secret       ⇐ 볼륨과 연결된 디렉터리 아래에 시크릿 키 이름의 파일이 생성 (1)

              name: nginx-secret                 ⇐ 볼륨 이름

              readOnly: true

        - name: echo

          image: "gihyodocker/echo:latest"

          imagePullPolicy: Always

          ports: 

          - containerPort: 8080

          env:

          - name: HTTP_PORT

            value: "8080"

      volumes:

      - name: nginx-secret                        ⇐ 볼륨 이름

        secret:

          secretName: nginx-secret                ⇐ 시크릿 이름

    

 

 

 

#3 생성 및 확인

[vagrant@master ~]$ kubectl apply -f basic-auth.yaml

service/basic-auth created

deployment.apps/basic-auth created

 

[vagrant@master ~]$ kubectl get pods,deployments,services

NAME                              READY   STATUS    RESTARTS   AGE

pod/basic-auth-745c944d45-mq747   2/2     Running   0          5m7s

 

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE

deployment.extensions/basic-auth   1/1     1            1           5m7s

 

NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE

service/basic-auth              NodePort    10.100.206.209   <none>        80:30060/TCP     5m7s

service/hello-service           NodePort    10.104.232.118   <none>        8001:32480/TCP   5d1h

service/hostname-svc-nodeport   NodePort    10.98.73.80      <none>        8080:30355/TCP   9h

service/kubernetes              ClusterIP   10.96.0.1        <none>        443/TCP          8d

service/nginx-test              NodePort    10.100.68.211    <none>        80:32228/TCP     5d7h

 

 

#4 인증 정보 없이 호출 시 401 오류를 반환

[vagrant@master ~]$ curl -i http://127.0.0.1:30060

HTTP/1.1 401 Unauthorized            ⇐ 응답(response) 시작 ← 인증 정보가 없는 경우 401 오류를 반환

Server: nginx/1.13.12  ⇐ 응답 헤더 시작

Date: Wed, 24 Feb 2021 10:11:03 GMT

Content-Type: text/html; charset=utf-8

Content-Length: 196

Connection: keep-alive

WWW-Authenticate: Basic realm="Restricted"         ⇐ 기본인증 방식으로 인증정보를 요청

                             ⇐ 응답 헤더 끝

<html>  ⇐ 응답 본문 → 사용자 브라우저에 출력되는 내용

<head><title>401 Authorization Required</title></head>

<body bgcolor="white">

<center><h1>401 Authorization Required</h1></center>

<hr><center>nginx/1.13.12</center>

</body>

</html>

 

 

#5 인증 정보와 함께 호출 시 정상 처리

[vagrant@master ~]$ curl -i --user your_name:your_password http://127.0.0.1:30060

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

                                                  ⇐ 인증 정보 

HTTP/1.1 200 OK                      ⇐ 정상 처리

Server: nginx/1.13.12

Date: Wed, 24 Feb 2021 10:16:44 GMT

Content-Type: text/plain; charset=utf-8

Content-Length: 14

Connection: keep-alive

 

Hello Docker!!

 

 

P250 잡(job)

하나 이상의 파드를 생성해 지정된 수(parallelism)의 파드가 정상 종료될 때까지 이를 관리하는 리소스

잡이 생성한 파드는 정상 종료 후에도 삭제되지 않고 남아 있어 로그나 실행 결과를 분석할 수 있음

배치 작업 형태에 적합

 

[vagrant@master ~]$ vi simple-job.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: pingpong

  labels:

    app: pingpong

spec:

  parallelism: 3                        ⇐ 동시에 실행하는 포드의 수 (= 병렬로 실행)

  template:                             ⇐ 포드를 정의

    metadata:

      labels:

        app: pingpong

    spec:

      containers:

        - name: pingpong

          image: gihyodocker/alpine:bash

          command: ["/bin/bash"]  

          args: 

          - "-c"

          - |

            echo [`date`] ping!

            sleep 10

            echo [`date`] pong!

      restartPolicy: Never              ⇐ 포드 종류 후 재실행 여부를 설정

                                           Always, Never, OnFailure

                                           포드는 Always가 기본

                                           잡은 Always로 설정 불가, Never, OnFailure만 설정 가능

 

 

[vagrant@master ~]$ kubectl apply -f simple-job.yaml

job.batch/pingpong created

 

[vagrant@master ~]$ kubectl logs -l app=pingpong

[Wed Feb 24 10:35:37 UTC 2021] ping! ← (1) 37초

[Wed Feb 24 10:35:47 UTC 2021] pong!

[Wed Feb 24 10:35:39 UTC 2021] ping! ← (2) 39초

[Wed Feb 24 10:35:49 UTC 2021] pong!

[Wed Feb 24 10:35:53 UTC 2021] ping! ← (3) 53초

[Wed Feb 24 10:36:03 UTC 2021] pong!

 

[vagrant@master ~]$ kubectl get pods -l app=pingpong -o wide

NAME             READY   STATUS      RESTARTS   AGE     IP                NODE    NOMINATED NODE   READINESS GATES

pingpong-mgb58   0/1     Completed   0          3m52s   192.168.104.1     node2   <none>           <none>

pingpong-vdm7r   0/1     Completed   0          3m52s   192.168.104.2     node2   <none>           <none>

pingpong-w9hs6   0/1     Completed   0          3m52s   192.168.166.137   node1   <none>           <none>

                         ⇒ 종료 상태

 

 

P252 크론잡(CronJob)

잡은 한 번만 실행되는 반면, 크론잡은 스케줄을 지정해 정기적으로 포드를 실행

cron 등을 사용해 정기적으로 실행하는 작업에 적합

 

 

*      *      *      *      *

분(0-59)  시간(0-23)  일(1-31)  월(1-12)   요일(0-7)

 

 

[vagrant@master ~]$ vi simple-cronjob.yaml

apiVersion: batch/v1beta1

kind: CronJob

metadata:

  name: pingpong

spec:

  schedule: "*/1 * * * *"                    ⇐ 파드를 실행할 스케줄을 정의

  jobTemplate:                               ⇐ 파드를 정의

    spec:

      template:

        metadata:

          labels:

            app: pingpong

        spec:

          containers:

            - name: pingpong

              image: gihyodocker/alpine:bash

              command: ["/bin/bash"]

              args: 

              - "-c"

              - |

                echo [`date`] ping!

                sleep 10 

                echo [`date`] pong!

          restartPolicy: OnFailure

 

[vagrant@master ~]$ kubectl delete -f simple-job.yaml

job.batch "pingpong" deleted

 

[vagrant@master ~]$ kubectl apply -f simple-cronjob.yaml

cronjob.batch/pingpong created

 

[vagrant@master ~]$ kubectl get job -l app=pingpong

NAME                  COMPLETIONS   DURATION   AGE

pingpong-1614164340   1/1           13s        2m7s          ⇐ 약 60초 간격으로 실행

pingpong-1614164400   1/1           12s        66s

pingpong-1614164460   0/1           6s         6s

 

[vagrant@master ~]$ kubectl logs -l app=pingpong

[Wed Feb 24 10:57:52 UTC 2021] ping!

[Wed Feb 24 10:58:02 UTC 2021] pong!

[Wed Feb 24 10:58:53 UTC 2021] ping!

[Wed Feb 24 10:59:03 UTC 2021] pong!

[Wed Feb 24 10:59:52 UTC 2021] ping!

[Wed Feb 24 11:00:02 UTC 2021] pong!

 

 

 



 

 

 

 

 

 

728x90

+ Recent posts