Linux

Linux seccomp 프로필과 접근제어목록(ACL)이란?

Joon0464 2024. 5. 3. 14:44

seccomp 프로필


seccomp 는 보안 컴퓨팅 모드(secure computing mode)로 2005년부터 사용할 수 있게 된 리눅스 커널 기능중 하나입니다.샌드박스의 기술의 기본 개념인 seccomp라는 전용 시스템 콜을 통해 프로세스가 사용할 수 있는 시스템 콜을 제한할 수 있습니다. 컨테이너와 관련되어서는 Docker와 Kubernetes 모두 seccomp를 지원하고 있습니다.

 

다양한 Seccomp 프로필 작성 방법


Seccomp 프로필은 JSON 형식으로 작성되며, 주로 다음과 같은 구조를 가집니다:

  • defaultAction: 기본적으로 적용할 행동 (SCMP_ACT_ALLOW, SCMP_ACT_ERRNO 등)
  • architectures: 프로필이 적용될 아키텍처
  • syscalls: 시스템 호출에 대한 규칙을 정의하는 섹션
    • names: 규칙이 적용될 시스템 호출의 이름
    • action: 해당 시스템 호출에 대해 취할 행동
    • args: 시스템 호출의 인자에 대한 추가 조건

하단의 seccomp 프로필 예시는 특정 시스템 호출을 허용하고 나머지는 차단하는 방식을 보여줍니다. "defaultAction": "SCMP_ACT_ERRNO"는 기본적으로 모든 시스템 호출을 차단하고, 특정 시스템 호출에 대해서만 허용("SCMP_ACT_ALLOW")하도록 설정하는 Whitelist 방식으로 작성하였습니다.

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "architectures": [
    "SCMP_ARCH_X86_64",
    "SCMP_ARCH_X86",
    "SCMP_ARCH_X32"
  ],
  "syscalls": [
    {
      "names": ["clone", "fork", "vfork"],
      "action": "SCMP_ACT_ALLOW"
    },
    {
      "names": ["execve"],
      "action": "SCMP_ACT_ALLOW",
      "args": []
    },
    {
      "names": ["openat"],
      "action": "SCMP_ACT_ALLOW",
      "args": [
        {
            "index": 2,
            "value": O_RDONLY, // 상수 O_RDONLY의 실제 값으로 대체해야 함
            "op": "SCMP_CMP_EQ"
        }
      ]
    }
  ]
}

상단의 seccomp 프로필 예시에서는 clone, fork, vfork, 그리고 execve 시스템 호출을 허용합니다. 이는 프로세스 생성과 실행에 필수적인 시스템 호출입니다. 추가적으로, openat 시스템 호출도 특정 조건 하에 허용하는데, 여기서는 ReadOnly만 허용하기 위한 설정을 적용한 예시입니다. 자세한 설명을 위해 openat를 추가적으로 살펴보겠습니다. 

int openat(int fd, const char *path, int oflag);

openat 시스템콜은 위와같이 구성되어 있으며 상세 설명은 아래와 같습니다.

    • fd는 상대 경로를 해석하기 위한 디렉토리 파일 디스크립터입니다. 상대 경로 대신 절대 경로를 사용하려면 AT_FDCWD를 이용합니다.
    • path은 열고자 하는 파일 또는 디렉토리의 경로입니다.
    • oflag는 파일을 여는 방법을 지정합니다. 예를 들어, 파일이 없을 경우 생성하거나, 읽기 전용으로 열거나 하는 등의 옵션입니다.

즉 openat는 3개의 argument로 구성된 시스템 콜이며 seccomp 프로필에서 index 2는 oflag를 가리킵니다.

flag 모드

  • O_RDONLY : 파일을 읽기 전용으로 엽니다.
  • O_WRONLY : 파일을 쓰기 전용으로 엽니다.
  • O_RDWR : 파일을 쓰기와 읽기용으로 엽니다 .
  • O_EXEC : 파일을 실행 전용으로 엽니다 .
  • O_SEARCH : 디렉토리 파일을 탐색 전용으로 엽니다 .

즉 openat을 허용하지만 args의 index 2인 flag의 O_RDONLY 즉 읽기 전용으로만 허용하겠다는 의미가 됩니다.

이러한 방식으로 seccomp 프로필을 작성함으로써, 컨테이너나 프로세스가 수행할 수 있는 시스템 호출을 세밀하게 제어할 수 있으며, 이는 보안을 강화하는 데 중요한 역할을 합니다.

seccomp 프로필 예제


Docker에서 seccomp 프로파일을 사용하는 예제를 살펴보겠습니다. 먼저, 기본 seccomp 프로파일을 사용하여 컨테이너를 실행하는 방법입니다. Docker는 기본적으로 seccomp 프로파일을 적용을 지원합니다. 아래 실습은 WSL ubuntu 20.04 환경에서 진행되었습니다.

 

1. docker를 사용하여 ubuntu 20.04 이미지의 컨테이너를 실행시키고 bash shell로 접속합니다.

$ docker run --rm -it ubuntu:20.04 bash
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
d4c3c94e5e10: Pull complete
Digest: sha256:874aca52f79ae5f8258faff03e10ce99ae836f6e7d2df6ecd3da5c1cad3a912b
Status: Downloaded newer image for ubuntu:20.04

 

2. 컨테이너내에서 mkdir 명령어로 디렉터리 생성 시 아무런 문제 없이 디렉터리가 생성됩니다.

# mkdir로 test 디렉터리 생성 후 확인
root@9aa95698234b:/# mkdir test && ls -ald test
drwxr-xr-x 2 root root 4096 May  3 03:55 test
# exit을 통해 컨테이너 쉘에서 exit 합니다. --rm 옵션을 사용했었기 때문에 컨테이너는 자동으로 종료됩니다.
root@9aa95698234b:/# exit
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

 

3. 이번에는 seccomp 프로필을 적용하기 위해 우선 seccomp 프로필을 json 파일로 작성합니다.

$ vi profile.json
{
  "defaultAction": "SCMP_ACT_ALLOW",
  "syscalls": [
    {
      "names": ["mkdir"],
      "action": "SCMP_ACT_ERRNO"
    }
  ]
}

 

4. 이번에는 seccomp 프로필을 사용하여 컨테이너를 실행시키고 bash shell 로 접속합니다.

$ docker run --rm -it --security-opt seccomp=./profile.json ubuntu:20.04 bash
root@9682501a844b:/#

 

5. mkdir로 test 디렉토리를 생성해보면 Operation not permitted 가 발생하여 수행되지 않습니다.

root@9682501a844b:/# mkdir test || ls -ald test
mkdir: cannot create directory 'test': Operation not permitted
ls: cannot access 'test': No such file or directory
# 테스트를 마치고 exit을 통해 쉘 접속 및 컨테이너를 종료합니다.
root@9682501a844b:/# exit

 

Kubernetes 에서 seccomp 프로필 적용


이 부분은 실습까지는 아니며, Kubernetes에서 seccomp 프로필을 적용하는 pod YAML을 간단하게 작성해보면 아래와 같습니다.

apiVersion: v1
kind: Pod
metadata:
  name: seccomp-demo
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      seccompProfile:
        type: Localhost
        localhostProfile: profiles/my-seccomp-profile.json

 

 

공식문서 링크는 아래와 같습니다.

https://kubernetes.io/ko/docs/concepts/security/pod-security-standards/

 

파드 시큐리티 스탠다드

파드 시큐리티 스탠다드에 정의된 여러 가지 정책 레벨에 대한 세부사항

kubernetes.io

 

 

 

'Linux' 카테고리의 다른 글

Linux systemd 완전 정복하기  (1) 2024.05.07
Linux 부팅 프로세스  (0) 2024.05.07
Linux 접근 제어 목록(ACL) 이란?  (0) 2024.05.03
Linux Capability 란?  (1) 2024.05.02
RUID EUID SUID 란?  (0) 2024.05.02