# 쿠버네티스 시크릿 모범 사례

> 클러스터 운영자와 애플리케이션 개발자를 위한 모범 시크릿 관리 규칙 및 사례.

---

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

<p><p>쿠버네티스에서 시크릿은 비밀번호, OAuth 토큰 및 SSH 키와 같은 민감한 정보를 저장한다.</p></p>
<p>시크릿을 사용하면 민감한 정보가 사용되는 방법을 더 잘 통제할 수 있으며,
실수로 외부에 노출되는 위험도 줄일 수 있다.
시크릿 값은 base64 문자열로 인코딩되며 기본적으로는 평문으로 저장되지만,
<a href="/docs/tasks/administer-cluster/encrypt-data/#ensure-all-secrets-are-encrypted">암호화하여 저장</a>하도록 설정할 수도 있다.</p>
<p><a class='glossary-tooltip' title='파드는 클러스터에서 실행 중인 컨테이너의 집합을 나타낸다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/concepts/workloads/pods/' target='_blank' aria-label='파드'>파드</a>는 볼륨을 마운트하거나 혹은 환경 변수를 통하는 등
다양한 방식으로 시크릿을 참조할 수 있다.
시크릿은 기밀 데이터를 다루는 용도로 적합하며,
<a href="/docs/tasks/configure-pod-container/configure-pod-configmap/">컨피그맵</a>은
기밀이 아닌 데이터를 다루는 용도로 적합하다.</p>

다음 모범 사례는 클러스터 관리자와 애플리케이션 개발자 모두를 위한 것이다.
이 가이드라인을 사용하여 시크릿 오브젝트에 있는
민감한 정보의 보안을 개선하고
시크릿을 보다 효과적으로 관리할 수 있다.

<!-- body -->

## 클러스터 관리자

이 섹션에서는 클러스터 관리자가 클러스터의 기밀 정보 보안을 개선하는 데
사용할 수 있는 모범 사례를 제공한다.

### 저장된 데이터(at rest)에 암호화 구성

기본적으로 시크릿 오브젝트는 <a class='glossary-tooltip' title='모든 클러스터 데이터를 담는 쿠버네티스 뒷단의 저장소로 사용되는 일관성·고가용성 키-값 저장소.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/tasks/administer-cluster/configure-upgrade-etcd/' target='_blank' aria-label='etcd'>etcd</a>에
암호화되지 않은 상태로 저장된다. 따라서 `etcd`의 시크릿 데이터에 암호화를 구성해야 한다.
자세한 내용은 
[Encrypt Secret Data at Rest](/docs/tasks/administer-cluster/encrypt-data/)를 참고한다.

### 시크릿에 대한 최소 권한 접근 구성 {#least-privilege-secrets}

쿠버네티스 <a class='glossary-tooltip' title='인가 결정을 관리하며, 운영자가 쿠버네티스 API를 통해서 동적으로 액세스 정책을 설정하게 한다.' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/access-authn-authz/rbac/' target='_blank' aria-label='역할 기반 접근 제어 (RBAC)'>역할 기반 접근 제어 (RBAC)</a>
[(RBAC)](/ko/docs/reference/access-authn-authz/rbac/)와 같은 접근 제어 메커니즘을 계획할 때,
`Secret` 오브젝트에 대한 접근에 대해 다음 가이드라인을 고려한다. 또한
[역할 기반 접근 제어 (RBAC) 모범 사례](/ko/docs/concepts/security/rbac-good-practices)의
다른 가이드라인도 따라야 한다.

- **컴포넌트**: 가장 권한이 높은 시스템 수준의 구성 요소에 대해서만 
  `watch`나 `list` 액세스를 제한한다. 컴포넌트의 정상 동작에 필요한 경우에만
  시크릿에 대한 `get` 액세스를 허용한다.
- **사람**: 시크릿에 `get`, `watch` 또는 `list` 액세스를 제한한다. 클러스터 관리자에게만
  `etcd`에 대한 액세스를 허용한다. 여기에는 읽기 전용 액세스가 포함된다. 특정 어노테이션을
  사용하여 시크릿에 대한 액세스를 제한하는 등의 더 복잡한 액세스 제어를 수행하려면
  써드파티(third-party) 권한 부여 메커니즘을 사용하는 것을 고려한다.

<div class="alert alert-caution" role="note"><h4 class="alert-heading">주의:</h4>시크릿에 대한 <code>list</code> 액세스 권한을 부여하면 주체가 암시적으로
시크릿의 내용을 가져갈 수 있다.</div>


시크릿을 사용하는 파드를 생성할 수 있는 사용자는 해당 시크릿의 값도 볼 수 있다.
클러스터 정책에서 사용자가 시크릿을 직접 읽는 것을 허용하지 않더라도,
동일한 사용자가 시크릿을 노출하는 파드를 실행할 수 있다.
이 액세스 권한을 가진 사용자가 의도적이든 의도적이지 않든 시크릿 데이터를 노출시켜
발생할 수 있는 영향을 감지하거나 제한할 수 있다.
몇 가지 권장 사항은 다음과 같다.

*  수명이 짧은 시크릿 사용
*  한 사용자가 여러 비밀을 동시에 읽는 것과 같은 특정 이벤트에 대해
   경고하는 감사 규칙 구현

### etcd 관리 정책 개선

더 이상 사용하지 않는다면 `etcd`에서 사용하는 내구성 스토리지를
지우거나 파쇄하는 것을 고려한다.

여러 개의 `etcd` 인스턴스가 있는 경우, 인스턴스 간에 암호화된 SSL/TLS 통신을 구성하여
전송 중(in transit)인 시크릿 데이터를 보호한다.

### 외부 시크릿에 대한 액세스 구성

<div class="alert alert-secondary callout third-party-content" role="note"><strong>참고:</strong>&puncsp;이 섹션은 쿠버네티스에 필요한 기능을 제공하는 써드파티 프로젝트와 관련이 있다. 쿠버네티스 프로젝트 작성자는 써드파티 프로젝트에 책임이 없다. 이 페이지는 <a href="https://github.com/cncf/foundation/blob/master/website-guidelines.md" target="_blank">CNCF 웹사이트 가이드라인</a>에 따라 프로젝트를 알파벳 순으로 나열한다. 이 목록에 프로젝트를 추가하려면 변경사항을 제출하기 전에 <a href="/contribute/style/content-guide/#third-party-content">콘텐츠 가이드</a>를 읽어본다.</div>


써드파티 시크릿 저장소 공급자를 사용하여 기밀 데이터를 클러스터 외부에 보관한 다음
해당 정보에 액세스하도록 파드를 구성할 수 있다.
[쿠버네티스 시크릿 스토어 CSI 드라이버](https://secrets-store-csi-driver.sigs.k8s.io/)는 
kubelet이 외부 스토어에서 시크릿을 검색하고
접근 권한을 부여한 특정 파드에 시크릿을 볼륨으로 마운트할 수 있도록 하는
데몬셋(DaemonSet)이다.

지원되는 제공자 목록은 다음을 참고한다.
[시크릿 스토어 CSI 드라이버 제공자](https://secrets-store-csi-driver.sigs.k8s.io/concepts.html#provider-for-the-secrets-store-csi-driver).

## 개발자

이 섹션은 개발자가 쿠버네티스 리소스를 구축하고 배포할 때
기밀 데이터의 보안을 개선하기 위해 사용할 수 있는 모범 사례를 제공한다.

### 특정 컨테이너에 시크릿 액세스 제한

파드에 여러 개의 컨테이너를 정의하고 있고 그 중 하나만 시크릿에 접근해야 하는 경우,
볼륨 마운트 또는 환경 변수 구성을 정의하여
다른 컨테이너가 해당 시크릿에 액세스하지 못하도록
한다.

### 읽기 후 시크릿 데이터 보호

애플리케이션은 환경 변수나 볼륨에서 기밀 정보를 읽은 후에도 그 값을 보호해야 한다.
예를 들어, 애플리케이션은 시크릿 데이터를 로그에 남기거나
신뢰할 수 없는 상대에게
전송하지 않아야 한다.

### 시크릿 매니페스트 공유 방지

시크릿 데이터가 base64로 인코딩된
<a class='glossary-tooltip' title='하나 이상의 쿠버네티스 API 오브젝트를 직렬화한 명세(specification).' data-bs-toggle='tooltip' data-bs-placement='top' href='/ko/docs/reference/glossary/?all=true#term-manifest' target='_blank' aria-label='매니페스트'>매니페스트</a>를 통해 시크릿을 구성하는 경우,
이 파일을 공유하거나 소스 리포지토리에 체크인하면 매니페스트를 읽을 수 있는 모든 사람이
시크릿을 사용할 수 있다는 것을 의미한다.

<div class="alert alert-caution" role="note"><h4 class="alert-heading">주의:</h4>Base64 인코딩은 암호화 방식이 <em>아니며</em>, 일반 텍스트에 비해 추가적인
기밀성을 제공하지 않는다.</div>
