반응형

 

k8s Audit Policy 설명이다.

감사로그 설정 자체는 가이드에 잘 되어있어서 그대로 따라하면된다.

https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/

 

1.감사로그에는 단계 및 레벨이 존재한다.

단계

Stage Description
RequestReceived Audit Handler 가 요청을 수신한 직후
ResponseStarted 요청은 받았으나 응답 전
ResponseComplete 요청을 완전히 처리하고 응답 완료
Panic 요청을 처리하는 동안 오류가 발생할 때

 

레벨

Level Description
None 해당 규칙에 해당되는 이벤트는 로깅하지 않음
Metadata 요청된 메타데이터(사용자, 리소스, 시간,verbs) 등은 로깅하지만 요청/응답 내용은 로깅안함
Request 이벤트 메타데이터 및 요청 내용은 로깅하지만 응답은 로깅 안함
RequestReponse 메타데이터, 요청, 응답 로깅 함

 

또한 omitStages 라는 것이 있는데, 해당 필드는 전역으로 줄 수도 있고 지역으로도 설정하여 단계를 제외시킬 수 있다.

기본적으로 단계를 설정하지않으면, 모든 단계(발생할 경우)를 호출한다.

 

2. 예제

2.1 Level 을 Metadata로 설정 했을 경우

본문 내용은 로깅되지않고 기본적인 메타데이터와 RequestReceived, ResponseComplete 호출

(ResposneStarted와 Panic 은 특수한 경우에 호출되는 듯함)

# audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  - level: metadata
    resources:
      - group: ""
        resources: ["*"]
        

# result
{
    "kind" : 
    "apiVersion" :
    "level" : "Metadata"
    "auditID" :
    "stage" : "RequestReceived"
    "requestURI" :
    "verb":
    "user": {
    }
    ...
}
{
    "kind" : 
    "apiVersion" :
    "level" : "Metadata"
    "auditID" :
    "stage" : "ResponseComplete"
    "requestURI" :
    "verb":
    "user": {
    }
    ...
}

 

2.2 모든 요청의 단계 대해 RequestReceived 제외하고 Level은 Metadata인 경우

위의 결과와 달리 RequestReceived 로깅안함.

# audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
omitStages:
  - "RequestReceived"
rules:
  - level: metadata
    resources:
      - group: ""
        resources: ["*"]
        

# result
{
    "kind" : 
    "apiVersion" :
    "level" : "Metadata"
    "auditID" :
    "stage" : "ResponseComplete"
    "requestURI" :
    "verb":
    "user": {
    }
    ...
}

 

omitStages는 위에 설명한대로 전역 또는 지역에도 설정 가능

# audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  - level: metadata
    omitStages:
      - "RequestReceived"
    resources:
      - group: ""
        resources: ["*"]

 

2.3 모든 요청의 단계 대해 RequestReceived 제외하고 Level은 Request인 경우

RequestReceived 로깅안하며, 요청내용의 Body만 로깅, 응답 Body는 로깅안함.

# audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
omitStages:
  - "RequestReceived"
rules:
  - level: Request
    resources:
      - group: ""
        resources: ["*"]
        

# result
{
    "kind" : 
    "apiVersion" :
    "level" : "Request"
    "auditID" :
    "stage" : "ResponseComplete"
    "requestURI" :
    "verb" :
    "user" : {
    }
    "responseStatus": {
    }
    "requestObject": {
    	"kind" : "Pod",
        "apiversion" :
        "metadata" : {
        }
        "spec : {
          "volumes" : {
          }
          "containers" : {
          }
        ...
    }
}

 

이 외에도 특정 namspace 및 특정 사용자만 로깅 또는 로깅제외 시킬 수가 있다.

 

참고 :

https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/

반응형
반응형

 

k8s 에서 1.24 이전 버전에는 service account secret token이 자동으로 생성 되었지만,

이후 버전 부터는 직접 생성하고 관리해주어야 한다.

특히 토큰에는 수명주기가 있으며 이를 관리해주어야 한다.

임시 기간 토큰 생성 및 영구 생성, Refresh를 통한 토큰 관리가 있다.

 

1. 임시 기간 토큰 생성

kubectl create token 명령어를 통해 토큰 생성이 가능하며, --duration 옵션을 통해 시간 지정 가능하다.

duration 옵션이 없을 경우 기본적으로 1시간으로 세팅된다.

또한, 해당 명령어로 토큰을 생성할 경우 생성할 때 조회 가능하고 더 이상 생성한 토큰에 대해 조회가 불가능하다.

# 임시 계정 생성
kubectl create sa temp-sa

# create token 명령어를 통해 임시 생성
kubectl create token temp-sa --duration 30m

# result
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXaElkV0tEZC1nemlxeTFhdWQiGE5ZC1hM2E3LTQ4OGYtOTM3OS1iYzc0MGU1ZjUyMDkifX0sIm5iZiI6MTczNDQzOTY4MCwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6dGVtcC1zYSJ9.Ya83wdlUMifQww_XUmK2rEfxkAMqueDT6QeYiQqwXlWYnUIq4YaCZDbo7XZz8xW3W-_efpx1-7n9dHkUMzk88LvCCS5C0S6J89hGGAI4T_nhyTfIhj4AbC_hhLdZR3b9pSuh7a0xY_CiD
{
    "aud": [
        "https://kubernetes.default.svc.cluster.local"
    ],
    "exp": 1734441480,
    "iat": 1734439680,
    "iss": "https://kubernetes.default.svc.cluster.local",
    "jti": "360425d7-587d-44ca-8633-67e5e07ac9e5",
    "kubernetes.io": {
        "namespace": "default",
        "serviceaccount": {
            "name": "temp-sa",
            "uid": "34bd8a9d-a3a7-488f-9379-bc740e5f5209"
        }
    },
    "nbf": 1734439680,
    "sub": "system:serviceaccount:default:temp-sa"
}

 

 

2. 영구 토큰 생성

영구 토큰은 Service Account 생성 후 Secret을 따로 생성해주면 된다.

하지만, 권장하지는 않는다.

# 계정 생성
kubectl create sa permanent-sa

# secret 생성
vi secret.yaml
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: permanent-sa-secret
  annotations:
    kubernetes.io/service-account.name: permanent-sa
    
# 적용
kubectl apply -f secret.yaml
 
# 조회
kubectl get secret
NAME                               TYPE                                  DATA   AGE
permanent-sa-secret                kubernetes.io/service-account-token   3      4s

# 토큰 조회
kubectl describe secret apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: permanent-sa-secret
  annotations:
    kubernetes.io/service-account.name: permanent-apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
  name: permanent-sa-secret
  annotations:
    kubernetes.io/service-account.name: permanent-sa
root@master:~/account# kubectl describe secret permanent-sa
Name:         permanent-sa-secret
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: permanent-sa
              kubernetes.io/service-account.uid: 349d3c79-1180-4cea-9357-5169a7a88d4c

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3V
ca.crt:     1107 bytes
namespace:  7 bytes

 

 

3. Service Account Mount를 통한 갱신

 

3.1 기본적인 Mount 를 통한 갱신

기본적으로 pod yaml 설정시 Service Account를 적용하게되면 1시간마다 토큰이 갱신된다.
(확인하려면 1시간 후 pod 에 접속해서 확인 가능, 공식문서에서도 1시간마다 kubelet이 갱신한다고 나와 있음)

# 토큰 생성
kubectl create sa auto-sa

# deploy.yaml 내 serviceAccount 적용
...
spec:
  template:
    spec:
      serviceAccount: auto-sa
      containers:
      ...
...

# 토큰 조회를 위해 pod 접속
kubectl exec -it stdout-node-869cff8b95-cxqf2 -- sh

# 경로
pwd
/var/run/secrets/kubernetes.io/serviceaccount

ls
ca.crt     namespace  token

# 토큰 조회
# 토큰이 변경되는걸 확인하려면 1시간 후에 해당 pod 접속해서 똑같이 확인하면 됨.
cat token
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHYS1RN2dXaElkV0tEZC1nemlxeTFMclJubTVTaFhoVkZIY2sifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzY1OTc2NzIxLCJpYXQiOjE3MzQ0NDA3MjEsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiNjQ3ZDZmYWMtODc

 

 

3.2 Volume Project 를 통한 관리

위 방법 말고 Volume Project를 통한 시간 설정 및 갱신이 가능하다.

automountServiceAccountToken 옵션을 false 로 주어야하므로 yaml로 생성
기본적으로 ServiceAccount 생성시 true 로 생성 됨.

해당 예제는 2시간으로 설정

(2시간뒤 자동 갱신됨)

# automountServiceAccountToken 옵션을 false 로 주어야하므로 yaml로 생성
# 기본적으로 ServiceAccount 생성시 true 로 생성 됨.
vi passive-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: passive-sa
  namespace: default
automountServiceAccountToken: false

# deploy.yaml 내 serviceAccount volume project 적용
...
spec:
  template:
    spec:
      serviceAccount: passive-sa
      volumes:
      - name: project-passive-sa
        projected:
          sources:
          - serviceAccountToken:
              path: passive-account-file
              expirationSeconds: 7200
      containers:
        volumeMounts:
        - mountPath: /tmp/token
          name: project-passive-sa
...

# 토큰 조회를 위해 pod 접속
kubectl exec -it stdout-node-7fcc7ff87-tjfjf -- sh

# 경로
# 위에서 /tmp/token 에 설정했음
pwd
/tmp/token

# 위에서 passive-sa-file 로 설정했음
ls
passive-sa-file

# 토큰 조회
# 토큰이 변경되는걸 확인하려면 2시간으로 설정했으므로 2시간 후에 해당 pod 접속해서 똑같이 확인하면 됨.
cat passive-sa-file 
eyJhbGciOiJSUzI1NiIsImtpZCI6ImU1Mnp2SFpHY

 

 

3.3 TokenRequest API 이용

API 호출용, 일반 Service Account 2개를 만들어, 하나는 Token 갱신을 위해 사용하는 방법으로 사용한다.

또는 하나의 계정을 통해 직접 갱신해서 사용한다.

pod 에 접속해서 아래 API를 호출하면된다.

curl -k --header "Authorization: Bearer token" https://kubernetes.default.svc/api/v1/namespaces/default/pods

 

 

참고 :

https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/

https://kubernetes.io/docs/concepts/security/service-accounts/

반응형
반응형

 

opensearch 무료지만 가이드가 너무하네

 

OpenSearch Dashboard Operator로 설정시  readolny 설정

대충입력하면 배열로 입력하라는데 아래와 같이 입력해야함.

다른 설정도 배열과 같이 입력하라면 아래와 같이 쌍따옴표 및 대괄호해서 입력하면 됨.

진짜 가이드 너무할정도로 별로임...

apiVersion: opensearch.opster.io/v1
kind: OpenSearchCluster
#...
spec:
  dashboards:
    additionalConfig:
      opensearch_security.readonly_mode.roles: "['readonly']"
반응형

+ Recent posts