Security
1 인증 이해
1.1 API 서버의 인증 절차
- 인증 플러그인으로 클라이언트 인증
- 요청을 보낸 클라이언트를 인증하며 하나 이상으로 구성된 인증 플러그인에 의해 수행된다.
- HTTP 요청을 검사해 수행하는데 인증 방법에 따라 클라이언트 인증서 HTTP 헤더에서 사용자를 가져온다.
- 인증 플러그인은 다음 방법을 사용해 클라이언트의 아이덴티티를 얻는다.
- 클라이언트의 인증서
- HTTP 헤더로 전달된 인증 토큰
- 기본 HTTP 인증
- 인증 플러그인은 인증된 사용자의 이름과 그룹을 반환하며 이를 인가 플러그인이 사용한다.
- 인가 플러그인으로 클라이언트 인가
- 하나 이상의 인가 플러그인에 의해 인가가 수행된다.
- 인증된 사용자가 요청한 작업이 요청한 리소스 대상으로 수행할 수 있는지를 판별
- 예를 들어 사용자가 요청한 네임스페이스에 파드를 생성할 수 있는지 권한을 판별한다.
- 어드미션 컨트롤 플러그인으로 요청된 리소스 확인과 수정
- 리소스를 생성, 수정, 삭제하려는 요청인 경우 어드미션 컨트롤로 보내진다.
- 데이터를 읽는 요청의 경우 어드미션 컨트롤을 거치지 않는다.
- 어드미션 컨트롤 플러그인은 리소스 정의에서 누락된 필드를 기본값으로 초기화하거나 재정의하는 역할을 한다.
- 리소스 유효성 확인 및 영구 저장
- 오브젝트의 유효성을 검증하고 etcd에 저장한다.
- 클라이언트에 응답 반환
1.2 사용자와 그룹
- 인증 플러그인은 인증된 사용자 이름과 그룹을 반환한다.
- 쿠버네티스 API 서버에 접속하는 두 종류의 클라이언트가 있다.
- UserAccount: 사용자(실제 사람)
- ServiceAccount: 파드
- 위 두 가지 유형의 클라이언트는 모두 인증 플러그인을 사용해 인증된다.
1.2.1 UserAccount
- GKE에서 구글 계정과 연결되어 있거나 EKS에서 IAM과 연결되어 있어 쿠버네티스 관리 대상이 아니다.
- 이는 api 서버를 통해 사용자를 생성, 수정, 삭제할 수 없다는 뜻이다.
- 클러스터 수준의 존재로 네임스페이스에 영향을 받지 않는다.
1.2.2 ServiceAccount
- 쿠버네티스에서만 사용된다.
- 파드에서 실행되는 프로세스를 위해 할당된다.
- 파드 기동 시 반드시 서비스 어카운트 한 개를 할당해야 한다.
- 지정하지 않으면 default 서비스 어카운트가 할당된다.
- 서비스 어카운트는 네임스페이스와 연결된 리소스다.
1.2.3 group
- UserAccount와 ServiceAccount는 하나 이상의 그룹에 속할 수 있다.
- 인증 플러그인은 사용자 이름 및 사용자 ID와 함께 그룹을 반환한다.
- 그룹은 개별 사용자에게 권한을 부여하지 않고 한 번에 여러 사용자에게 권한을 부여하는데 사용된다.
built-in group
system:unauthenticated- 어떤 인증 플러그인에서도 클라이언트를 인증할 수 없는 요청에 사용된다.
system:authenticated- 성공적으로 인증된 사용자에게 자동으로 할당된다.
system:serviceaccounts- 시스템의 모든 서비스 어카운트를 포함 한다.
system:serviceaccounts:<namespace>- 특정 네임스페이스의 모든 서비스 어카운트를 포함한다.
2 UserAccount
- 인간 사용자를 위한 어카운트
- UserAccount은 전역으로 지정됩니다.
- 이름은 클러스터의 모든 네임스페이스에서 고유하다.
- 어떤 네임스페이스를 보든지 사용자를 나타내는 특정 사용자 이름은 동일한 사용자를 나타낸다.
- 쿠버네티스 관리 대상이 아니다.
- API 서버를 통해 사용자를 생성, 수정, 삭제할 수 없다는 뜻이다.
- 모든 유저의 접근은 API Server에 의해 관리된다.
- API Server에 kubectl로 접근하거나 http 요청으로 접근한다.
- 일반 사용자가 API 서버를 호출하기 위해서는 몇 가지 인증 단계가 필요하다.
- API 서버의 인증 절차 참고
2.1 인증 방식
- API 서버는 하나 이상의 인증 플러그인으로 구성할 수 있다.
- 인증 플러그인은 요청을 검사해 보낸 사람이 누구인가를 검증한다.
- 아이덴티티를 얻기위해 사용되는 정보로 아래와 같은 것들이 있다.
- HTTP 헤더로 전달된 인증 토큰
- 클라이언트의 인증서
- 기본 HTTP 인증
2.1.1 static 방식
- 먼저 가장 이해하기 쉬운 static 방식의 인증 방식을 알아보자.
- 최신 버전의 Kubernetes에는 static 방식을 지원하지 않는다. 인증 방식을 이해하기위해 알아보자.
static password file 인증 방식
- 유저 정보를 담은 파일을 작성한다.
<password,username,userID,groupID>엔트리로 구성된 파일이다.
- 앞서 작성한 유저 정보를 담은 파일을
--basic-auth-file=<static_password_file>옵션에 추가해 kube-apiserver를 실행한다. curl명령어로 api-server에 요청할 때-u "user1:password123"옵션을 추가해 인증한다.- api 서버는
--basic-auth-file옵션에 명시된 유저 정보 파일을 보고 인증 절차를 거친다.
static token file
- static password file과 비슷한 방식이다.
<token,username,userID,groupID>엔트리로 구성된 파일으을 작성한다.- 비밀번호 대신 토큰 사용하는 점이 static password file과의 차이점
--token-auth-file=<static token file>옵션을 추가해 kube-apiserver를 실행한다.curl명령어로 api-server에 요청할 때--header "Authorization: Bearer <token>"옵션을 추가해 인증한다.