피드 구독

컨테이너 기반 아키텍처의 핵심 구성 요소 중 하나는 보안입니다.

여기에는 여러 가지 측면이 있지만(여기에서 공식 OpenShift 도큐멘테이션의 주제 목록 참조), 가장 기본적인 요구 사항으로는 인증 및 권한 부여가 있습니다. 이 문서에서는 쿠버네티스와 Red Hat OpenShift에서 인증과 권한 부여가 작동하는 방식을 설명합니다. 인프라 계층, 쿠버네티스 계층, 컨테이너화된 애플리케이션 계층 등 쿠버네티스 에코시스템의 다양한 계층 간 상호작용을 다룹니다.

인증 및 권한 부여란?

간단히 말해서, 컴퓨터 시스템에서 인증은 '당신은 누구입니까?'라는 질문에 답하는 것이고, 권한 부여는 '당신이 누구인지는 알았습니다. 그러면 당신이 할 수 있는 일은 무엇입니까?'라는 질문에 답하는 것입니다.

제 경험에 따르면 쿠버네티스에서 이 주제를 이해하기 어려운 가장 큰 이유는 여러 구성 요소(사용자, API, 컨테이너, 포드)가 서로 상호작용하기 때문입니다. 인증에 대해 이야기할 때는 먼저 어떤 구성 요소가 관련되어 있는지 명확히 해야 합니다. 쿠버네티스 클러스터에 인증하고 있습니까? 아니면 환경 내의 다른 마이크로서비스에 액세스하려는 마이크로서비스를 말하는 겁니까? 아니면 쿠버네티스 클러스터 외부에 있는 클라우드 리소스입니까? 아니면 클러스터에서 실행되는 애플리케이션 중 하나에 액세스하여 사용하려는 엔드포인트(클라우드 리소스, 시스템 또는 사람)입니까?

OAuth 2.0 및 OIDC를 통한 인증 및 권한 부여

사용자가 엔드포인트에 액세스하려고 한다고 가정해보겠습니다. 사용자는 다음과 같을 수 있습니다.

  • 실제 사람
  • 사람이 아닌 계정(애플리케이션 포드, 시스템 구성 요소, 소프트웨어 파이프라인, 물리적 엔터티 또는 논리적 엔터티)

엔드포인트는 다음과 같을 수 있습니다.

  • API
  • 소프트웨어(예: 데이터베이스)
  • 물리 또는 가상 서버

 

endpoint receives

 

엔드포인트가 사용자로부터 요청을 받으면 다음 사항을 이해할 수 있어야 합니다.

  • 이 요청을 보내는 사용자(인증의 경우)
  • 이 사용자가 수행할 수 있는 권한(권한 부여의 경우)

공식 쿠버네티스 도큐멘테이션에서 인증에 대해 다루는 섹션을 확인하실 수 있습니다. 이 도큐멘테이션의 요점은 쿠버네티스의 인증이란 쿠버네티스 API 서버에 대한 API 요청을 인증하는 프로세스를 의미한다는 것입니다. 이러한 요청은 터미널, GUI 또는 API 호출을 통해 kubectl 또는 oc 명령으로 수행할 수 있지만, 궁극적으로 모든 것이 API 서버로 전송됩니다.

많은 인증 기술과 프로토콜(LDAP, SAML, Kerberos 등)을 사용할 수 있지만 가장 성공적이고 일반적인 API 인증 방법은 OAuth 2.0과 OpenID Connect(OIDC)를 결합하는 것입니다.

OAuth 2.0은 일련의 리소스(예: 원격 API 또는 사용자 데이터)에 대한 액세스 권한을 부여하도록 설계된 권한 부여 프로토콜(인증 프로토콜 아님)입니다. 이를 위해 OAuth 2.0은 최종 사용자를 대신하여 리소스에 액세스할 수 있는 권한을 나타내는 데이터인 액세스 토큰을 사용합니다.

OpenID Connect(OIDC)는 OAuth 2.0 프레임워크 위에 ID 계층을 제공하여 OAuth 2.0 프레임워크를 확장하는 인증 프로토콜입니다. 이름 또는 이메일 주소와 같은 특정 사용자 정보를 요청하는 메커니즘을 제공하며 사용자가 이 정보에 대한 액세스 권한을 부여하거나 거부할 수 있습니다. 이 프로토콜이 OAuth2에 대해 확장한 주요 요소는 ID 토큰이라는 액세스 토큰과 함께 반환되는 추가 필드입니다. 이 토큰은 서버에서 서명한 사용자 이메일과 같은 특정 필드가 있는 JSON Web Token(JWT)입니다.

아래 다이어그램은 사용자가 kubectl 명령을 사용하여 쿠버네티스 클러스터에서 일련의 작업을 구성하려고 할 때 수행되는 단계를 보여줍니다. 전체 프로세스는 더 복잡하지만 공식 도큐멘테이션에 잘 설명되어 있습니다.

 

kubernetes cluster

 

캡션: 인증 프로세스를 보여주는 쿠버네티스 도큐멘테이션의 순서도

  1. 먼저 IdP(Identity Provider)에 로그인합니다.
  2. IdP(Identity Provider)는 access_token, id_token, refresh_token을 제공합니다.
  3. kubectl의 경우 --token 매개 변수를 가지고 id_token을 사용하거나 kubeconfig에 해당 토큰을 추가합니다.
  4. kubectl은 'Authorization'이라는 헤더의 id_token을 API 서버에 전송합니다.
  5. API 서버는 JWT 서명이 유효하고 id_token이 만료되지 않았으며 해당 사용자에게 이 트랜잭션에 대한 권한이 있는지 확인합니다.
  6. API 서버는 사용자에게 피드백을 제공하는 kubectl에 대한 응답을 반환합니다.

id_token에는 ID를 검증하는 데 필요한 모든 데이터가 포함되어 있으므로 쿠버네티스는 IdP(Identity Provider)와 더 이상 상호작용할 필요가 없습니다. 이는 특히 각 요청이 스테이트리스(stateless)인 경우 확장성이 뛰어난 인증 솔루션입니다.

역할 기반 액세스 제어(RBAC)란 무엇인가요?

역할 기반 액세스 제어(RBAC)는 조직 내 개별 사용자의 역할에 따라 컴퓨터 또는 네트워크 리소스에 대한 액세스를 규제하는 방법입니다. 예를 들어 플랫폼의 시스템 관리자는 전체 환경을 수정할 수 있습니다(클러스터의 모든 애플리케이션에 잠재적으로 영향을 미침). 그러나 클러스터에서 하나의 애플리케이션만 관리하는 경우 해당 애플리케이션만 수정할 수 있습니다.

아래 그림은 이러한 두 가지 사용자 예시를 보여줍니다. 녹색 아이콘은 HR 팀에 속하는 사용자이고 검은색 아이콘은 플랫폼 관리자입니다. HR 사용자는 HR 애플리케이션 그룹의 리소스에만 액세스할 수 있지만, 플랫폼 관리자는 플랫폼 내의 모든 항목에 액세스할 수 있습니다.

 

role-based access control

 

HR 사용자에게는 권한 부여 단계에서 녹색 토큰이 부여되고, 관리자에게는 검은색 토큰이 부여됩니다. 엔드포인트(쿠버네티스 클러스터 또는 OpenShift API)와의 상호작용의 일부로 각 사용자는 요청에 토큰(녹색 또는 검은색)을 추가합니다. 이 토큰을 기반으로 클러스터는 각 사용자가 액세스할 수 있는 애플리케이션을 확인합니다.

전송 계층 및 엔드포인트

쿠버네티스 엔드포인트에 도달하는 가장 일반적인 전송 메커니즘은 HTTPS에 암호화된 터널을 제공하는 TLS(Transport Layer Security)입니다.

Linux 또는 Windows 가상 머신의 시스템 관리자인 경우 이러한 엔드포인트에 대한 액세스 방법은 SSH 또는 RDP일 수 있습니다. 이러한 프로토콜은 사용자(사용자)와 엔드포인트(Linux 또는 Windows 서버) 간의 트래픽을 암호화합니다. 마찬가지로 API, 소프트웨어 또는 타사 서비스로서의 소프트웨어(SaaS)를 처리할 때 가장 일반적인 전송 메커니즘은 TLS입니다.

 

Transport layer and endpoints

 

엔드포인트와 사용자 간에 보안 및 암호화된 세션을 설정하는 방법은 이 블로그의 범위에 속하지 않지만, 엔드포인트를 인증하는 데 사용되는 터널과 키(또는 인증서)를 사용하며(사용자 또는 엔드포인트 또는 둘 다) 엔드포인트 간에 전송된 패킷을 암호화하고 해독합니다.

쿠버네티스 및 OpenShift 액세스 계층

인증, 권한 부여, 전송의 세 가지 개념은 알고 나면 비교적 간단합니다. 그러나 모든 IT 환경에는 고려해야 할 여러 계층이 있으며, 바로 이 부분에서 복잡성과 혼란이 발생합니다.

쿠버네티스 아키텍처에는 3가지 기본 계층이 있습니다.

  • 인프라 계층: 컴퓨팅, 스토리지 및 네트워킹입니다. 이 계층은 퍼블릭 클라우드, 온프레미스 또는 공동 배치 데이터센터 또는 이들의 조합이 해당될 수 있습니다.
  • 쿠버네티스 계층: 컨테이너화된 모든 애플리케이션의 호스팅 및 관리를 담당합니다.
  • 컨테이너화된 애플리케이션: 특정 애플리케이션을 구성하는 컨테이너 그룹입니다. 이러한 애플리케이션에는 상용 기성품(COTS), ISV, 사내에서 개발한 애플리케이션 또는 이들의 조합이 해당될 수 있습니다.

각 계층은 인증 및 권한 부여 기능을 모두 제공하며 동시에 이를 필요로 합니다.

 

authentication and authorization

 

인프라 계층의 인증 및 권한 부여

인프라 계층의 사용자는 일반적으로 특정 구성 요소(스토리지, 네트워킹, 컴퓨팅 또는 가상화)에 액세스해야 하는 시스템 관리자입니다. 이 계층(위 그림에서 검은색으로 표시된 맨 아래 계층)에 액세스하기 위해 관리자는 일반적으로 스토리지, 네트워킹 또는 계산 노드(iLO, iDRAC 등)에 대한 전용 인터페이스를 사용하여 SSH를 통해 서버에 연결합니다. 인증 메커니즘은 RADIUS/TACACS(네트워킹), LDAP 또는 Kerberos(서버 및 스토리지) 또는 기타 도메인별 인증 메커니즘이 조합되어 사용될 수 있습니다.

흥미롭게도, 동일한 인프라 관리자 사용자가 OpenShift(파란색 계층)에서 호스팅되는 애플리케이션(녹색 계층)을 사용하여 작업을 수행할 수 있습니다.

예를 들어 네트워킹 관리 스택은 OpenShift에서 실행되는 컨테이너화된 애플리케이션일 수 있습니다. 그러나 그러한 맥락에서 관리자 사용자는 기능적으로 애플리케이션(이 예시에서는 네트워킹 관리 스택)에 액세스하려는 일반(녹색) 사용자입니다. 이 계층에서는 인증 및 권한 부여 메커니즘이 다릅니다. 예를 들어 애플리케이션에 대한 연결은 TLS/SSL 연결을 통해 이루어지며 네트워크 관리 스택 콘솔에 액세스하는 데 자격 증명이 필요할 수 있습니다.

OpenShift의 인증 및 권한 부여

계층을 위로 이동하여 파란색 계층을 보면(즉, 일반적으로 OpenShift 또는 쿠버네티스와 상호작용) 쿠버네티스 API 서버와 통신합니다. 이는 GUI 콘솔을 사용하든 터미널을 사용하던 사람이거나 사람이 아닌 사용자 모두에게 해당됩니다. 결국 OpenShift 또는 쿠버네티스와의 모든 상호작용은 API 서버를 통해 이루어집니다.

OAuth2/OIDC 조합은 API 인증 및 권한 부여에 적합하므로 OpenShift에는 OAuth2 서버가 내장되어 있습니다. 이 OAuth2 서버 구성의 일부로 지원 IdP(Identity Provider)를 추가해야 합니다. IdP(Identity Provider)는 OAuth2 서버가 사용자를 확인하는 데 도움이 됩니다. 이 부분이 구성되면 OpenShift에서 사용자를 인증할 준비가 된 것입니다.

인증된 사용자의 경우 OpenShift는 액세스 토큰을 생성하고 해당 토큰을 사용자에게 반환합니다. 이 토큰을 OAuth 액세스 토큰이라고 합니다. 사용자는 OpenShift API와 상호작용할 때마다 만료되거나 취소될 때까지 해당 OAuth 액세스 토큰을 사용할 수 있습니다.

사용자 및 서비스 계정

사용자는 사람이거나 사람이 아닐 수 있습니다. OpenShift에는 지정된 사용자가 수행할 수 있는 개념적으로 다른 역할이 있습니다.

  • 일반 사용자: 쿠버네티스 클러스터와 상호작용하는 사람
  • 시스템 사용자: 사람(예: 플랫폼 관리자) 및 사람이 아닌 클러스터 구성 요소(예: 레지스트리, 다양한 컨트롤 플레인 노드, 애플리케이션 노드)
  • 사람이 아닌 기타 사용자: 서비스 계정이 포함됩니다. 일반적으로 쿠버네티스 API와 상호작용해야 하는 애플리케이션(클러스터 내부 또는 외부)을 나타냅니다. 예를 들어 GitLab, GitHub, Tekton을 사용하는 파이프라인은 서비스 계정을 사용하여 OpenShift와 상호작용합니다.

OpenShift에서 사용자 및 서비스 계정을 그룹으로 구성할 수 있습니다. 그룹은 한 번에 여러 사용자에게 권한을 부여하는 권한 부여 정책을 관리할 때 유용합니다. 예를 들어 각 사용자에게 개별적으로 액세스 권한을 부여하는 대신 프로젝트 내의 오브젝트에 대한 그룹 액세스 권한을 허용할 수 있습니다.

사용자는 각각 특정 사용자 집합을 나타내는 하나 이상의 그룹에 할당될 수 있습니다. 대부분의 조직에는 이미 사용자 그룹이 있습니다(예: Active Directory 서버). LDAP 레코드를 내부 OpenShift 그룹 레코드와 동기화할 수 있습니다.

역할 기반 액세스 제어(RBAC) 및 권한 부여

사용자가 OAuth2 액세스 토큰을 성공적으로 인증하고 수신하면 해당 사용자에게 RBAC를 기반으로 하는 액세스 권한 집합이 부여됩니다. RBAC 오브젝트는 사용자가 리소스에 대해 지정된 작업을 수행할 수 있는지 여부를 결정합니다. RBAC 정의는 클러스터 전체 또는 프로젝트 전체에 적용할 수 있습니다.

RBAC는 다음을 사용하여 관리됩니다.

  • 룰(Rule): 오브젝트 집합에 허용된 동사 집합입니다. 생성, 읽기, 업데이트, 삭제를 총칭하여 CRUD라고 합니다. 이는 퍼시스턴트 스토리지의 기본 작업입니다. RESTful API의 경우, HTTP 프로토콜의 POST, GET, PUT 또는 PATCH 및 DELETE에 해당합니다. 예를 들어 사용자 또는 서비스 계정에 포드를 생성할 수 있는 권한이 있을 수 있습니다.
  • 롤(Role): 룰 집합입니다. 사용자와 그룹을 여러 역할에 연결하거나 바인딩할 수 있습니다.
  • 바인딩(Binding): 역할이 부여된 사용자와 그룹 간의 관계

OpenShift는 사전 정의된 역할(cluster-admin, basic user 등 여러 가지)을 제공합니다. 룰, 역할 및 바인딩을 사용하는 RBAC에 대한 개요는 아래 그림에 설명되어 있습니다(OpenShift 도큐멘테이션에서 발췌).

 

Role-based access control (RBAC) and authorization

 

OpenShift 계층 내의 리소스에서 인증 및 권한 부여

쿠버네티스 계층 내의 리소스(일반적으로 포드)는 다음 작업 중 하나를 수행하기 위해 액세스가 필요할 수 있습니다.

  • 쿠버네티스 API와 상호작용
  • 리소스가 호스팅되는 호스트(인프라 계층)와 상호작용
  • 클러스터 외부의 리소스와 상호작용(예: 클라우드 리소스)
Authentication and authorization from resources within the OpenShift layer

 

쿠버네티스 API와 상호작용

쿠버네티스 API와의 모든 상호작용에는 OAuth를 사용한 일종의 인증이 필요합니다. 포드는 사람이 아닌 사용자를 나타내므로 API 서버와 상호작용하려면 서비스 계정이 필요합니다.

기본적으로 포드는 서비스 계정과 연결되며 해당 서비스 계정의 자격 증명(토큰)은 /var/run/secrets/kubernetesio/serviceaccount/token에 있는 해당 포드의 각 컨테이너의 파일 시스템에 배치됩니다. 이 모델이 좋은 아이디어인지에 대한 논쟁이 있으므로, OpenShift에서 구성할 수 있으며 ACS와 같은 툴이 있는 정책을 사용하여 적용할 수 있습니다.

호스트/쿠버네티스 인프라 계층과 상호작용

이러한 유형의 상호작용은 쿠버네티스 API 호출에 의존하지 않습니다. 실제로 기본 호스트의 프로세스 수준 권한 관리(Linux 수준 권한)와 관련이 있습니다.

포드가 기본 인프라로 수행할 수 있는 작업(권한)과 액세스할 수 있는 리소스를 매핑하려면 보안 컨텍스트 제약 조건(SCC)을 사용합니다. SCC는 포드를 리소스 그룹으로 제한하는 OpenShift 리소스로, 쿠버네티스 보안 컨텍스트 리소스와 유사합니다.

예를 들어 프로세스에 지정된 경로에 파일을 생성할 수 있는 권한이 있거나 없을 수 있으며, 기존 파일에 대한 쓰기 권한이 없을 수 있습니다(읽기 권한만 있을 수 있음). 둘 다 기본 목적은 호스트 환경에 대한 포드의 액세스를 제한하는 것입니다. 역할 기반 액세스 제어를 사용하여 사용자 권한을 관리하는 방식과 유사하게 SCC를 사용하여 포드 권한을 제어할 수 있습니다.

외부 리소스와 상호작용

포드에서 클러스터 외부의 리소스에 액세스해야 하는 경우가 있습니다. 예를 들어 데이터 또는 로그 파일을 위해 오브젝트 저장소(예: S3 버킷)에 액세스해야 할 수 있습니다. 이를 위해서는 리소스가 사용자를 인증하는 방법과 해당 리소스와 통신할 포드에 구축해야 하는 항목을 이해해야 합니다.

Amazon의 IRSA(서비스 계정에 대한 IAM 역할, IAM Roles for Service Accounts)는 AWS의 서비스에 액세스할 수 있는 자격 증명 세트를 포드에 제공하는 설계의 한 예입니다. 포드가 생성되면 웹 후크는 서비스 계정을 참조하는 포드에 변수(쿠버네티스 서비스 계정 토큰의 경로 및 가정한 역할의 ARN)를 삽입합니다. 이를 '변형'이라고도 합니다. IAM 가정 역할에 필요한 AWS 권한이 있는 경우 포드는 임시 STS 자격 증명을 사용하여 AWS SDK 작업을 실행할 수 있습니다.

 

Interacting with external resources

OpenShift의 컨테이너화된 애플리케이션에 대한 인증 및 권한 부여

마지막 계층은 컨테이너화된 애플리케이션입니다. 이전 계층과 유사하게 각 컨테이너는 다음에 액세스를 시도할 수 있습니다.

  • 쿠버네티스 API
  • 클러스터 내의 다른 컨테이너 또는 클러스터 외부의 리소스에서 제공하는 또 다른 API
  • 비 API 연결(예: 데이터베이스 액세스를 위해 특정 포트에 연결) 

 

Authentication and authorization for containerised applications in OpenShift

 

위 그림에서 볼 수 있듯이 API에 액세스하는 컨테이너는 다음을 수행할 수 있습니다.

  • 애플리케이션과 연결된 인증 자격 증명을 사용하여 다른 API에 직접 액세스(예: 쿠버네티스 시크릿 사용)
  • 엔드포인트에서 지원하는 인증 메커니즘을 사용하여 비 API 엔드포인트에 직접 액세스
  • 포드 서비스 계정 사용

직접 API 호출

컨테이너는 KUBERNETES_SERVICE_HOST 및 KUBERNETES_SERVICE_PORT_HTTPS 환경 변수를 가져와 쿠버네티스 API에 액세스할 수 있습니다. 비 쿠버네티스 API 트래픽의 경우, 애플리케이션은 클라이언트 라이브러리(예: AWS API) 또는 개발자가 생성한 사용자 지정 통합을 사용할 수 있습니다.

비 API 기반 통신

애플리케이션은 데이터를 검색하거나 내보내기 위해 데이터베이스에 연결해야 할 수 있습니다. 이러한 경우 인증은 일반적으로 컨테이너 내에서 코드의 일부로 처리되며, 일반적으로 환경 변수, 시크릿, ConfigMaps 등을 사용하여 런타임에 업데이트할 수 있습니다.

서비스 계정 사용

 쿠버네티스 API 서버에 인증하는 데 권장되는 방법은 서비스 계정 자격 증명을 사용하는 것입니다. 대부분의 코딩 언어에는 지원되는 쿠버네티스 클라이언트 라이브러리세트가 있습니다. 이러한 라이브러리를 기반으로 포드의 서비스 계정 자격 증명은 API 서버와 통신하는 데 사용됩니다. OpenShift는 각 포드 내에 서비스 계정을 자동으로 마운트하여 범위가 지정된 토큰에 액세스할 수 있도록 합니다.

쿠버네티스가 아닌 API 호출의 경우 컨테이너는 외부 API 서비스에 인증할 때 포드 서비스 계정을 사용할 수도 있습니다.

인증 및 권한 부여

컴퓨터는 사용자가 누구이며 해당 사용자가 수행할 수 있는 작업을 알아야 합니다. 이는 인증 및 권한 부여 영역이며, 이제 쿠버네티스와 OpenShift 내에서 이러한 영역이 어떻게 관리되는지 이해하게 되었습니다.

이 문서를 자세히 검토하고 피드백을 주신 Shane Boulden 님과 Derek Waters 님에게 감사드립니다.


저자 소개

Simon Delord is a Solution Architect at Red Hat. He works with enterprises on their container/Kubernetes practices and driving business value from open source technology. The majority of his time is spent on introducing OpenShift Container Platform (OCP) to teams and helping break down silos to create cultures of collaboration.Prior to Red Hat, Simon worked with many Telco carriers and vendors in Europe and APAC specializing in networking, data-centres and hybrid cloud architectures.Simon is also a regular speaker at public conferences and has co-authored multiple RFCs in the IETF and other standard bodies.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

채널별 검색

automation icon

오토메이션

기술, 팀, 인프라를 위한 IT 자동화 최신 동향

AI icon

인공지능

고객이 어디서나 AI 워크로드를 실행할 수 있도록 지원하는 플랫폼 업데이트

open hybrid cloud icon

오픈 하이브리드 클라우드

하이브리드 클라우드로 더욱 유연한 미래를 구축하는 방법을 알아보세요

security icon

보안

환경과 기술 전반에 걸쳐 리스크를 감소하는 방법에 대한 최신 정보

edge icon

엣지 컴퓨팅

엣지에서의 운영을 단순화하는 플랫폼 업데이트

Infrastructure icon

인프라

세계적으로 인정받은 기업용 Linux 플랫폼에 대한 최신 정보

application development icon

애플리케이션

복잡한 애플리케이션에 대한 솔루션 더 보기

Virtualization icon

가상화

온프레미스와 클라우드 환경에서 워크로드를 유연하게 운영하기 위한 엔터프라이즈 가상화의 미래