요약

  • 제안된immutable어노테이션은 클라이언트가 읽기-쓰기 데이터스토어를 통해 변경할 수 없는 시스템 제공 구성을 기술합니다. 서버 측 값이 결코 바뀔 수 없다는 뜻은 아닙니다.
  • 유효 플래그는 명시적이거나 상위 노드에서 상속되거나 최상위 기본값으로 공급될 수 있으므로, 경로와 상속 출처 없는 불리언 값만으로는 완전한 증거가 아닙니다.
  • 관측된 스냅샷, 서버 권한, 변경 이벤트, 클라이언트 편집 결과를 기록하는 시간적 출처(provenance) 영수증을 어노테이션 옆에 두되, 그 필드들이 드래프트에 속한 것처럼 가장하지 말아야 합니다.

하나의 단어, 두 개의 축

“불변(immutable)”이라는 말은 보통 시간에 관한 약속처럼 들립니다. 기록은 한 번 쓰이고, 다이제스트는 절대 바뀌지 않으며, 아카이브는 고정된 채 남습니다. 그러나 NETMOD 제안은 이 단어를 훨씬 좁은 의미로 사용합니다. 이 불리언 메타데이터는 서버가 클라이언트가 읽기-쓰기 데이터스토어에 다른 값을 놓거나 시스템 제공 노드를 intended 구성에서 제거함으로써 변경하는 것을 허용하지 않는 구성을 기술합니다.

이 통제 경계는 유용합니다. YANG의 일반적인config true분류만으로는 실제 장비에서 발견되는 모든 혼합 트리를 표현할 수 없습니다. 서버는 클라이언트가 제거할 수 없는 리스트 항목을 공급하면서도 하위 노드의 구성이나 자체 항목 추가는 허용해야 할 수 있습니다. 지금까지 구현체는 이런 거절을 서술문으로 설명할 수밖에 없었습니다.draft-ietf-netmod-immutable-flag-14는 기존 동작을 기계가 읽을 수 있게 만듭니다.

드래프트는 이 플래그가 규범적이 아니라 기술적(descriptive)임을 이례적으로 명확히 밝힙니다. 서버가 이미 하는 일을 문서화할 뿐입니다. 또한 불변 시스템 구성은 서버가 생성·갱신·삭제할 수 있다고 명시합니다. 이 진술들을 함께 놓으면 겉보기 역설이 사라집니다. 불변은 “이 클라이언트가 구성 인터페이스를 통해 이 노드를 통제할 수 있는가?”에 대한 답이지, “이 값이 다른 시점에 달라질 수 있는가?”에 대한 답이 아닙니다.

이 두 질문을 동의어로 취급하는 거버넌스 시스템은 자신의 증거를 과장하게 됩니다. 정오에 참인 플래그는 세 시의 하드웨어 교체 이후 다른 서버 제공 값과 완벽히 양립할 수 있습니다. 정오의 응답은 여전히 정확하지만, 그것은 이력이 아닙니다.

어노테이션은 요청해야 수신됩니다

플래그는 모든 구성 응답에 자동으로 실려 오지 않습니다. 클라이언트가 시스템, intended 또는 운영 데이터스토어를 읽을 때with-immutability를 요청해야 합니다. 제안에 따라 다른 데이터스토어에 대한 요청은 유효하지 않습니다. NETCONF 클라이언트는 YANG 라이브러리 정보에서ietf-immutable-annotation모듈을 확인할 수 있고, RESTCONF 클라이언트는 정의된 기능(capability) 식별자를 확인할 수 있습니다.

이로써 작지만 중요한 증거 사슬이 만들어집니다. 기능 탐지는 서버가 요청을 이해한다는 것을 보여줍니다. 질의는 클라이언트가 어떤 읽기 전용 데이터스토어와 서브트리를 요청했는지 보여줍니다. 응답은 그 클라이언트가 읽기 권한 하에서 볼 수 있는 어노테이션을 담습니다. 이 요소들 중 어떤 것도 뒤늦은 불리언 스크린샷 하나로부터 안전하게 재구성될 수 없습니다.

레거시 동작이 이 사슬을 더욱 중요하게 만듭니다. 구형 클라이언트는 새 메타데이터를 요청하지 않으므로 이를 수신하지 못합니다. 신형 클라이언트가 구형 서버에 요청하면 구현에 따라 지원되지 않는 파라미터에 대한 오류를 보거나 파라미터가 무시될 수 있습니다. 따라서 응답에서의 부재는 기본 가변성, 상속, 억제, 미지원, 레거시 상호작용 또는 노드 접근 권한 부족을 의미할 수 있습니다. 주변의 기능 및 요청 증거가 이 경우들이 하나로 뭉개지지 않도록 막아 줍니다.

값이 없어도 참일 수 있습니다

제안은 트리 전반에서 메타데이터 반복을 피하기 위해 상속을 사용합니다. 명시적 어노테이션이 없는 자식은 부모의 상태를 상속합니다. 어노테이션이 없는 최상위 노드는 false가 기본입니다. 자손은 상속된 값을 다시 설정하여 자신의 서브트리에 대해 다른 상태를 확립할 수 있습니다. 드래프트는 데이터 트리에서 이런 변경이 몇 번 일어날 수 있는지 제한하지 않습니다.

결과는 회선에서는 간결하지만 감사에서는 까다롭습니다. 선택된 노드와 해석된 불리언만 기록하는 클라이언트는 그 값이 명시적이었는지, 상속되었는지, 기본값이었는지 잃어버립니다. 답을 지배한 조상 노드와 중간의 재설정도 잃습니다. 두 노드가 서로 다른 이유로 참으로 해석될 수 있고, 부모가 바뀔 때 결과도 달라집니다.

리스트와 leaf-list는 또 하나의 경계를 더합니다. 메타데이터는 개별 인스턴스에 붙으며, 추상적인 리스트 전체에 붙지 않습니다. 개별 항목은 서로 다를 수 있습니다. YANG 메타데이터의 제약 때문에 리스트 전체 동작은 부모로부터 상속될 수 있는 반면, 항목은 자체 상태를 가질 수 있습니다. 순서 있는 리스트에서 상속된 불변성은 추가, 제거, 재정렬을 모두 포괄할 수 있습니다. 포괄적인 “필드 잠김” 라벨은 어느 연산이 배제되는지 표현하지 못합니다.

따라서 관측 영수증은 인스턴스 경로, 노드 종류, 존재하는 경우 명시적 어노테이션, 해석된 상태, 상속 출처, 스키마 리비전을 저장해야 합니다. 해석은 하나의 계산입니다. 입력을 보존하면 재현 가능해집니다.

running에 같은 값이 있어도 클라이언트 소유가 되지는 않습니다

시스템 정의 구성 모델은 서버가 공급하는 것과 클라이언트가 쓰는 것을 분리합니다. 불변 제안은 클라이언트가 running 같은 읽기-쓰기 데이터스토어에 같은 값을 놓고, 나중에 그 항목을 제거해도 intended 구성의 값은 변하지 않도록 허용합니다. 이 연산은 쓰기 가능한 데이터스토어에서의 가시성을 바꿀 뿐, 기저 시스템 값에 대한 권한을 바꾸지 않습니다.

이 구분은 단순한 변경 로그를 난처하게 합니다. “클라이언트가 노드를 생성함”이라는 기록은 running에 대해서는 기술적으로 맞지만, intended 값의 출처로 해석되면 틀립니다. 반대로 불변 시스템 노드는 명시적으로 구성되지 않는 한 running에 없을 수 있습니다. 따라서 running 전용 인벤토리는 실제로 장비를 구속하는 구성을 놓칠 수 있습니다.

시간적 출처 기록에는 두 계층이 모두 필요합니다. 클라이언트의 편집 이벤트와 서버의 시스템 구성 이벤트입니다. 서버 이벤트는 하드웨어 탐색, 부트 프로파일, 벤더 정책 등 실제로 정보가 존재할 때에만 국지적 출처를 식별해야 합니다. 표준 어노테이션은 이 출처를 제공하지 않으므로 운영자가 임의로 만들어서는 안 됩니다. “서버 제공, 출처 불명”은 정당한 상태입니다.

접근 거부가 불변성보다 먼저 옵니다

Network Configuration Access Control Model이 사용 중일 때, 서버는 불변성보다 접근을 먼저 검사합니다. 요청된 연산을 수행할 권한이 없는 사용자는 접근 거부 결과를 받으며, 서버는 대상이 불변이었을지 먼저 드러내지 않습니다.

이 순서는 보안과 분석 양면에서 중요합니다. 실패한 편집이 곧 불변성의 증거는 아닙니다. 오류 태그, 인증된 주체, 대상 경로, 접근 제어 결정을 먼저 확인한 뒤에야 운영자가 실패를 새 플래그 탓으로 돌릴 수 있습니다. 모든 거절을 “불변 정책이 작동 중”으로 계수하면 권한 실패와 가변성 규칙이 뒤섞입니다.

어노테이션 자체는 유용한 구조적 힌트를 드러낼 수 있습니다. 드래프트는 공격자가 고정된 시스템 구성에 대한 지식을 공격 설계에 활용할 수 있음을 언급합니다. 따라서 가시성은 이미 어노테이션된 노드를 읽을 수 있도록 허용된 클라이언트로 제한되며, NETCONF 또는 RESTCONF의 보안 속성은 그대로 적용됩니다. 읽기 범위 맥락을 제거한 광범위한 관측 내보내기는 원 클라이언트가 드러내려던 것보다 더 많은 내용을 우연히 공개할 수 있습니다.

시간 경계가 있는 출처 영수증을 만들어야 합니다

어노테이션은 지금의 좁은 필드로 남아 있어야 합니다. 운영 보충 자료는 별도의 영수증이 될 수 있습니다. 영수증은 서버 또는 논리적 네트워크 요소 식별, 소프트웨어 버전, 데이터스토어, YANG 모듈 리비전, 기능 탐지 결과로 시작합니다. 선택된 서브트리, 노드 인스턴스 경로, 값, 해석된 불변 상태, 명시적 또는 상속 기원, 응답 시각을 기록합니다. 플랫폼이 구성 리비전, 스냅샷 ID 또는 다이제스트를 노출한다면 그것은 관측 옆에 놓여야 합니다.

영수증은 운영자가 증명할 수 있는 서버 측 사실을 기록합니다. 시스템 구성 출처, 결정 권한, 마지막 변경 이벤트와 그 이유입니다. 출처가 없으면 없음으로 표시됩니다. 클라이언트 편집 시도에 대해서는 인증된 역할, 요청된 연산, NACM 결과, 불변성 결과, 반환된 오류 태그를 추가합니다.

마지막으로 검토 시각이 있습니다. 이 필드는 “관측된 불변”이 “인증된 영구성”으로 변질되는 것을 막습니다. 이후의 서버 갱신은 이전 영수증을 반증하지 않고 새 영수증을 만듭니다. 이 한 쌍은 원래 통제 경계를 보존하면서 변화를 드러냅니다.

이것은 YANG 어노테이션을 확장하자는 요구가 아닙니다. 이력, 식별자, 운영 워크플로를 불리언 하나에 넣으면 상호운용성이 훼손됩니다. 이는 국지적 증거 아키텍처에 관한 권고입니다. 표준 문장은 작게 유지한 뒤, 로컬 시스템이 실제로 관측할 수 있는 사실과 결합하라는 것입니다.

도입은 설계상 엇갈릴 것입니다

연구 기준 시점에 리비전 14는 IESG의 승인을 받아 RFC Editor 대기열에 있으면서도 여전히 활성 Internet-Draft였습니다. YANG 검증 보고서는 오류나 경고를 보이지 않았습니다. 이런 절차적 사실이 제품이나 플릿 전반의 구현을 입증하지는 않습니다.

호환성 설계는 혼재된 환경을 예측합니다. 어떤 서버는 모듈이나 RESTCONF 기능을 광고하고, 어떤 클라이언트는 이를 요청하며, 다른 이들은 메타데이터 없이 계속합니다. 신형 클라이언트는 요청을 무시하거나 거부하는 구형 서버를 만날 수 있습니다. 도입 보고서는 모든 어노테이션 부재를 가변으로 표시하기보다 이 조합들을 보여주어야 합니다.

바람직한 모니터링 단위는 완결된 관측 경로입니다. 기능 발견, 유효한 요청 전송, 응답 수신, 상태 해석, 그리고 관련 시에는 접근 제어 이후 분류된 편집 결과입니다. 이 경로는 제품 호환성 목록보다 정보적입니다. 증거가 끊긴 정확한 경계를 짚어 주기 때문입니다.

출처