본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

BGP 세션 보호하기

원문 보기 위키 갱신

BGP 피어링에 비밀번호를 걸어두면 공격자가 거짓 라우팅 정보를 주입하는 것을 막을 수 있다는 사실을 알고 계셨나요? 이 문서는 Kubernetes Secret에 BGP 비밀번호를 저장하고, calico-node에 RBAC 권한을 주고, BGPPeer 또는 BGP 구성에 비밀번호를 지정하는 과정을 안내해요. 클러스터의 라우팅 신뢰성을 지키는 데 꼭 필요한 설정이에요.

출처: 문서

본문

큰 그림

BGP 비밀번호를 사용해 공격자가 거짓 라우팅 정보를 주입하는 것을 방지해요.

가치

BGP 스피커 사이의 BGP 피어링에 비밀번호를 설정하면, 피어링 양쪽 끝이 같은 비밀번호를 갖고 있을 때만 피어링이 동작해요. 이는 외부 BGP 피어나 클러스터 내 워크로드를 사칭해 클러스터에 악의적인 라우팅 정보를 주입하려는 공격자에 대한 방어 계층을 제공해요.

개념

BGP 세션에 대한 비밀번호 보호

비밀번호 보호는 BGP 세션의 표준화된 선택적 기능이에요. 효과는 BGP 세션 양쪽 끝의 두 피어가 같은 비밀번호로 구성된 경우에만 서로 통신하고 라우팅 정보를 교환할 수 있다는 거예요.

비밀번호 사용이 데이터 교환을 암호화하지는 않는다는 점에 유의하세요. 데이터 교환을 도청하는 것은 여전히 비교적 쉽지만, 거짓 정보를 주입하는 것은 어려워져요.

Kubernetes 시크릿을 사용해 비밀번호 저장하기

Kubernetes에서 Secret 리소스는 비밀번호를 포함한 민감한 정보를 담도록 설계됐어요. 따라서 이 Calico 기능에서는 BGP 비밀번호를 Secret에 저장해요.

방법

BGP 피어링에 비밀번호를 사용하려면:

  1. calico-node가 실행 중인 네임스페이스에 Kubernetes 시크릿을 만들거나(또는 갱신하고), 원하는 비밀번호를 값으로 갖는 키를 추가하세요. 시크릿 이름과 키 이름을 기록해 두세요.

    참고: BGP 비밀번호는 80자 이하여야 해요. 그보다 긴 비밀번호를 구성하면 해당 비밀번호를 사용하는 BGP 세션은 수립에 실패해요.

  2. calico-node가 그 시크릿에 접근할 수 있는 RBAC 권한을 갖도록 하세요.

  3. 대상 BGPPeer 리소스에 시크릿 이름과 키 이름을 지정하세요.

Kubernetes 시크릿 만들기 또는 갱신하기

예를 들면:

kubectl create -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: bgp-secrets
  namespace: calico-system
type: Opaque
stringData:
  rr-password: very-secret
EOF

참고: 클러스터의 calico-node가 calico-system이 아닌 다른 네임스페이스에서 실행 중이라면, calico-system 대신 그 네임스페이스에 시크릿을 만들어야 해요.

아래에서 이 비밀번호를 BGPPeer 리소스에 사용하려면 시크릿 이름 bgp-secrets와 키 이름 rr-password를 기록해 두어야 해요.

RBAC 권한 확인하기

calico-node pod는 그 시크릿에 접근할 수 있는 권한이 있어야 해요. calico-node가 시크릿에 접근하도록 허용하려면 다음과 같이 구성해요:

kubectl create -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-access
  namespace: calico-system
rules:
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["bgp-secrets"]
  verbs: ["watch", "list", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: secret-access
  namespace: calico-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: secret-access
subjects:
- kind: ServiceAccount
  name: calico-node
  namespace: calico-system
EOF

BGP 리소스에 시크릿 이름과 키 이름 지정하기

용도에 따라 별도 리소스에 BGP 비밀번호를 지정할 수 있어요. 특정 BGP 피어링을 보호하려면 BGP 피어에 비밀번호를 지정하고, 노드 간 메시(node to node mesh)의 모든 클러스터 내부 통신에 비밀번호를 설정하려면 BGP 구성에 비밀번호를 지정하세요.

Tab: 특정 피어링 또는 외부 피어링

BGP 피어 구성 시 BGPPeer 리소스 스펙에 시크릿 이름과 키 이름을 다음과 같이 포함하세요:

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: bgppeer-global-3040
spec:
  peerIP: 192.20.30.40
  asNumber: 64567
  password:
    secretKeyRef:
      name: bgp-secrets
      key: rr-password

Tab: 노드 간 메시

기본 BGP 구성에 다음과 유사하게 시크릿을 포함하세요:

kind: BGPConfiguration
apiVersion: projectcalico.org/v3
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  nodeMeshPassword:
    secretKeyRef:
      name: bgp-secrets
      key: rr-password

참고: 노드 간 메시 BGP 비밀번호를 설정하려면 노드 간 메시가 활성화되어 있어야 해요.

추가 리소스

BGPPeer 리소스에 대한 자세한 내용은 BGPPeer를 참고하세요.

BGP 피어 구성에 대해 더 알아보려면 BGP 피어 구성하기를 참고하세요.

더 알아보기 (Learn more)

BGP 비밀번호는 라우팅 정보 주입을 막는 방어 계층일 뿐, 트래픽 자체를 암호화하지는 않는다는 점을 기억하세요. 데이터 기밀성이 필요하다면 WireGuard 같은 암호화 옵션을 함께 검토하는 게 좋아요.