본문 바로가기
개발/개발공부

Container 사전지식 / 리눅스, 권한, 컨테이너, 파일, 시스템콜

by 치킨개발자 2023. 1. 1.
728x90

Kubernetes와 그 구성요소 중 하나인 Container를 공부하기 전에 너무 막막했던 적이 있다.

Container가 뭔지 공부하기 전에 기본적으로 알아두면 좋은 것들을 찾아 정리해봤다.

 

시스템콜


컨테이너는 대부분 리눅스OS를 이용하고 파일접근, 네트워크이용 등등이 필요하면 커널에 접근이 필요

사용자가 커널에 요청을 보낼 때 시스템콜 인터페이스를 통해 호출

유저가 프로그래밍을 하며 확인해볼 수 있는 것으로 Golang syscall도 그 중 하나

https://pkg.go.dev/syscall

 

syscall package - syscall - Go Packages

StringByteSlice converts a string to a NUL-terminated []byte, If s contains a NUL byte this function panics instead of returning an error. Deprecated: Use ByteSliceFromString instead.

pkg.go.dev

const (
	AF_ALG                           = 0x26
	AF_APPLETALK                     = 0x5
    ...
    )

처음 보자마자 보이는 const중 APPLETALK..? 해서 찾아봤는데 애플에서 만든 컴퓨터 네트워크 프로토콜이라고 한다..

TCP계층이라고 한다. 별게 다있네..

 

권한


컨테이너는 리눅스OS를 이용하고, 리눅스는 모두 파일시스템으로 이루어져있다.

drwxr-xr-x  7 dev-chicken  staff  96  9 23 16:55 test

 

차례대로

d(파일종류)

rwxr-xr-x(접근권한)

7(하드링크 수)

dev-chicek / staff (소유자 / 그룹)

뒤는 이제 파일크기, 최종수정시간, 파일이름 으로 구성되어있다. 

컨테이너에서 중요하게 봐야하는 부분은 접근권한과 소유자 / 그룹이다.

rwx비트가 세그룹이 존재하고, 차례로 소유주/그룹/그외 그룹에 대한 read/write/execute 권한을 표시한다.

이외에도 setuid, setgid비트와 같은 것에도 영향을 받을 수 있다.

 

setuid, setgid?

프로세스는 실행시킨 사용자의 ID로 실행된다.

하지만 파일에 setuid비트가 있다면 파일 소유자의 ID로 실행된다.

예를들어 root의 네트워크 소켓을 사용해야하는 경우라면 실행자에게 root권한 자체를 주기보단 setuid 비트를 설정하고 해당 파일을 실행 시 루트사용자로 실행을 할 수 있도록 해주는 것을 선호한다.

또 복사본에는 setuid비트가 적용되지 않고 소유자를 root로 바꾼다하여도 실제 root로 실행하여야 적용이 된다.

다시 정리하자면

  • setuid비트에 따라 파일 실행시 권한을 부여 가능
  • 복사본에는 setuid비트가 적용이 되지 않음
  • 복사본의 소유자를 root로 바꿔도 실제 root가 실행하지 않으면 적용X

이정도로 정리하고 넘어가면 될 것 같다.

 

linux capabilities


리눅스에는 다양한 capability가 있다.

실행 파일에서 시스템관련 부팅을 하거나 포트바인딩을 하거나 할때 해당 capability를 필요로 한다.

# getpcaps 142400
Capabilities for `142400': = cap_chown,cap_dac_override...

이런식으로 ps와 process id를 가져오고 getpcaps를 통해 프로세스의 capability를 확인할 수 있다.

보통 non-root 프로세스는 권한이 보여지지 않고 root 프로세스는 위 예시와 같이 권한이 부여되어 있다.

root권한과 setcap명령어를 통해 권한을 부여할 수 있다.

 

privilege escalation


앞서 말한 권한을 높여줘서 실행하지 못하던 일을 실행할 수 있도록 하게 해줄수 있다.

하지만 이런 권한은 컨테이너 보안에 큰 위협이 될 수 있기 때문에 사용시 유의해야한다.

기본적으로 컨테이너는 root로 실행이 된다.

그렇기때문에 보안에 더 신경써야하고 non-root로 실행이 된다고 해도 앞서 배운 setuid, setcap등을 통해 컨테이너권한이 필요 이상으로 escalation되어 문제가 될 수 있다.

실제로 https://blog.pentesteracademy.com/privilege-escalation-breaking-out-of-chroot-jail-927a08df5c28

 

[Privilege Escalation] Breaking out of Chroot Jail

Privilege Escalation refers to the process of getting elevated access on a system by leveraging a flaw in the system design, exploiting a…

blog.pentesteracademy.com

breaking out of chroot jail을 설명해둔 글도 있다.

물론 컨테이너들은 chroot보다 보안이 좀 더 강화된 pivot_root를 사용하긴 한다.

반응형

댓글