시큐리티 콘텍스트
보안 컨텍스트
- 서버 침해사고 발생 시 침해사고를 당한 권한을 최대한 축소하여 그 사고에 대한 확대를 방지 
- 침해사고를 당한 서비스가 모든 권한(root나 노드 커널 기능)으로 동작하는 경우 서비스를 탈취한 공격자는 그대로 컨테이너의 권한을 사용할 수 있음 
- 최소 권한 정책에 따른 취약점 감소 
- 보안 컨텍스트 설정에는 다음 사항을 포함 - 권한 상승 가능 여부
- 프로세스 기본 UID/GID를 활용한 파일 등의 오브젝트의 액세스 제어
- Linux Capabilities를 활용한 커널 기능 추가
- 오브젝트에 보안 레이블을 지정하는 SELinux (Security Enhanced Linux) 기능
- AppArmor : 프로그램 프로필을 사용하여 개별 프로그램의 기능 제한
- Seccomp : 프로세스의 시스템 호출을 필터링
 
포드에 시큐리티 콘텍스트 설정하기
- 포드에 UID를 설정하면 모든 컨테이너에 적용됨- 컨테이너 UID/GID 설정하기
- 권한상승 제한하기
 
$ kubectl exec -it security-context-demo /bin/bash / 
$ id
uid=1000 gid=3000 groups=2000
$ ps -eaf
PID  USER   TIME   COMMAND
1    1000   0:00   sleep 1h
10   1000   0:00   sh
16   1000   0:00   ps -eafsecurity-context.yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000  # UID
    runAsGroup: 3000 # GID
    fsGroup: 2000    # groups
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false # 부모 권한보다 더 높은 권한을 주지 못하도록 막음컨테이너에 시큐리티 콘텍스트 설정하기
- 컨테이너에 내부에 새로운 유저를 사용하면 그 설정이 우선됨- 컨테이너 UID/GID 설정하기
 
security-context-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  securityContext:
    runAsUser: 1000 # pod 전역설정
  containers:
  - name: sec-ctx-demo-2
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      runAsUser: 2000 # 내부 설정이 우선이 됨
      allowPrivilegeEscalation: false캐퍼빌리티 적용
- 캐퍼빌리티를 적용하면 리눅스 커널에서 사용할 수 있는 권한을 추가 설정 가능 
- 캐퍼빌리티를 활용한 리눅스 커널 권한 변수 
- date +%T -s "12:00:00"명령은 SYS_TIME 커널 권한이 있어야만 가능
security-context-4.yaml
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  containers:
  - name: sec-ctx-4
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      capabilities: # 리눅스 커널 권한 부여
        add: ["NET_ADMIN", "SYS_TIME"]SELinux 권한
- 모든 프로세스와 객체에 시큐리티콘텍스트(또는 레이블)을 달아 관리하는 형태 
- 넷필터와 더불어 리눅스의 핵심 보안 기능을 담당 
- 그러나 실무에서는 복잡도가 높아 오히려 소외... 
- SELinux에 대한 자세한 정보 사이트 
- 다음과 같은 형태로 취급 
...
securityContext:
  seLinuxOptions:
    level: "s0:c123,c456"자료출처: https://www.lesstif.com/ws/selinux/selinux
| 요소 | 설명 | 
|---|---|
| 사용자 | 시스템의 사용자와는 별도의 SELinux 사용자로 역할이나 레벨과 연계하여 접근 권한을 관리하는데 사용 | 
| 역할(Role) | 하나 혹은 그 이상의 타입과 연결되어 SELinux의 사용자의 접근을 허용할 지 결정하는데 사용 | 
| 타입(Type) | Type Enforcement의 속성중 하나로 프로세스의 도메인이나 파일의 타입을 지정하고 이를 기반으로 접근 통제를 수행 | 
| 레벨(Label) | 레벨은 MLS(Multi Level System)에 필요하며 강제 접근 통제보다 더 강력한 보안이 필요할 때 사용하는 기능으로 정부나 군대등 최고의 기밀을 취급하는 ㅂ곳이 아니라면 사용하지 않음 | 
Pod Security Context 실습
Security Context 는 Container 내부에 있는 유저의 권한을 축소시켜서 사고의 범위를 줄이고자 하는 취지로 만들어져 있음
http-go deployment 생성 및 확인
$ kubectl create deploy http-go --image=gasbugs/http-go
deployment.apps/http-go created
$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
http-go-568f649bb-qqcgl   1/1     Running   0          47shttp-go deployment 접속해보면 root 권한임을 알 수 있음
프로세스가 root 의 권한으로 동작하고 있음을 알 수 있음
보안이 굉장히 취약함
$ kubectl exec --stdin --tty http-go-568f649bb-qqcgl -- bash
root@http-go-568f649bb-qqcgl:/usr/src/app# id
uid=0(root) gid=0(root) groups=0(root)
root@http-go-568f649bb-qqcgl:/usr/src/app# ps -eaf
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 10:27 ?        00:00:00 /usr/src/app/main
root          55       0  0 12:18 pts/0    00:00:00 bash
root          64      55  0 12:20 pts/0    00:00:00 ps -eafsecurity-context.yaml 설정을 수정해서 사용하기 위해 wget 다운로드 받기
$ wget https://k8s.io/examples/pods/security/security-context.yamlGroup 번호 임의로 수정
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 1234
    fsGroup: 8888
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: falsekubectl 로 생성
$ kubectl create -f security-context.yaml
pod/security-context-demo created접속해서 권한을 확인해보면 1000 으로 되어있어 root 권한의 파일들을 삭제할 수 없음
$ kubectl exec --stdin --tty security-context-demo -- sh
/ $ id
uid=1000 gid=1234 groups=8888
/ $ ps -eaf
PID   USER     TIME  COMMAND
    1 1000      0:00 sleep 1h
   15 1000      0:00 sh
   22 1000      0:00 ps -eafsecurityContext 내부 유저를 2000 으로 설정
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-2
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 1234
    fsGroup: 8888
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false
      runAsUser: 2000kubectl 로 생성
$ kubectl create -f security-context-2.yaml
pod/security-context-demo-2 createdUID 가 2000 으로 설정된 것을 확인할 수 있음
$ kubectl exec -it security-context-demo-2 -- sh
/ $ id
uid=2000 gid=1234 groups=8888
/ $ ps -eaf
PID   USER     TIME  COMMAND
    1 2000      0:00 sleep 1h
    7 2000      0:00 sh
   14 2000      0:00 ps -eafSet capabilities for a Container 실습
capabilities 가 설정된 것과 그렇지 않은 컨테이너의 비교
security-context-3.yaml 파일 생성
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-3
spec:
  containers:
  - name: sec-ctx-3
    image: gcr.io/google-samples/node-hello:1.0$ kubectl apply -f https://k8s.io/examples/pods/security/security-context-3.yaml
pod/security-context-demo-3 createdsecurity-context-4.yaml 파일 생성
apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo-4
spec:
  containers:
  - name: sec-ctx-4
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]$ kubectl apply -f https://k8s.io/examples/pods/security/security-context-4.yaml
pod/security-context-demo-4 createdpod 생성 확인
$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
security-context-demo-3   1/1     Running   0          11s
security-context-demo-4   1/1     Running   0          6ssecurity-context-demo-3 접속 후 시간변경 시도시 권한이 없어서 시간변경에 실패함
$ kubectl exec -it security-context-demo-3 -- sh
# date
Thu Jan 21 12:47:52 UTC 2021
# date +%T -s "12:00:00"
date: cannot set date: Operation not permitted
12:00:00security-context-demo-4 접속 후 시간변경 시도시capabilities 에 SYS_TIME 권한이 있어서 시간변경에 성공하는 것을 확인할 수 있음
$ kubectl exec -it security-context-demo-4 -- sh
# date
Thu Jan 21 12:49:30 UTC 2021
# date +%T -s "12:00:00"
12:00:00'개발강의정리 > DevOps' 카테고리의 다른 글
| [데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - 클러스터, 애플리케이션 트러블 슈팅 가이드 (0) | 2021.01.22 | 
|---|---|
| [데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - 네트워크 정책 적용 (0) | 2021.01.22 | 
| [데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - RBAC를 활용한 롤 기반 엑세스 컨트롤 (0) | 2021.01.22 | 
| [데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - kube config 파일을 사용한 인증 (0) | 2021.01.20 | 
| [데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - TLS 인증서를 활용한 유저 생성하기 (0) | 2021.01.20 | 
 
			
			 
				
			
댓글