Skip to content

TAK Server posture & governed Cursor-on-Target ingest

The tak source governs a TAK (Team Awareness Kit) deployment as one more surface. It does two separable things, and you can enable either alone:

  • TAK Server posture — report a server’s configuration (its inputs and their protocols/ports, TLS/keystore settings, certificate-signing backend) as minimal-data findings. The grounded source is the server’s own CoreConfig.xml, read offline from disk; an optional live version probe is the only thing read over the network. It does not read TAK federation.
  • Governed CoT ingest — receive Cursor-on-Target events on the connector’s own UDP and TCP listeners and turn each into a governed access edge.

The connector is read-first: it never writes to a TAK Server, never joins a federation, and never re-emits a payload. With no credential and no listener configured it is an honest no-op — it emits nothing rather than fabricate a posture for a deployment it never contacted.

FieldValue
Signal sourcecot
Modewrite — a CoT emitter contributes situational-awareness state to the feed
Originthe emitter uid, hashed by default (cot_uid_mode)
Confidenceapproximate, always — base CoT is unauthenticated (see below)
Findingsdrop-track cancellations, unbounded-error events, and aggregated listener rejections (rate-limit / oversize / malformed / conn-limit)

1. Posture: read the server, offline first

Section titled “1. Posture: read the server, offline first”

The grounded posture source is the server’s own configuration file. On a package install it is /opt/tak/CoreConfig.xml. Point the connector at it and it reads the configured inputs, TLS/keystore settings and certificate-signing backend without touching the network. The <federation> element is deliberately not modelled, so no federation posture is produced.

The live version probe is optional and adds only the running version. Because TAK Server authenticates operators with mTLS, the probe is deny-closed: if you set server_url with posture on but omit the client certificate, the connector refuses to start rather than probe anonymously and report a posture it did not authenticate. server_url must be https.

// OLIVARES_SOURCES_CONFIG — posture only
{
"sources": [{
"name": "tak-server",
"kind": "tak",
"tenant": "<tenant-id>",
"config": {
"core_config_path": "/opt/tak/CoreConfig.xml",
"server_url": "https://takserver.example.mil:8443",
"client_cert": "${TAK_CLIENT_CERT_PEM}",
"client_key": "${TAK_CLIENT_KEY_PEM}"
}
}]
}

Enable a listener and the connector receives CoT — one message per UDP datagram, one message per TCP connection (“open-squirt-close”). You point a TAK feed or CoT clients at the connector’s listen address; the connector is the consumer, it does not dial the server to pull.

// OLIVARES_SOURCES_CONFIG — ingest
{
"sources": [{
"name": "tak-edge",
"kind": "tak",
"tenant": "<tenant-id>",
"config": {
"cot_udp_listen": "0.0.0.0:6969",
"cot_multicast_group": "239.2.3.1",
"cot_tcp_listen": "0.0.0.0:8087",
"allow_public_bind": true,
"feed_ref": "tak"
}
}]
}

Configuration keys (from the connector’s shipped descriptor)

Section titled “Configuration keys (from the connector’s shipped descriptor)”
KeyTypeDefaultSecretMeaning
core_config_pathstringnoPath to CoreConfig.xml (package installs: /opt/tak/CoreConfig.xml) — the grounded, offline posture source
server_urlstringnoTAK Server base URL (e.g. https://takserver.example.mil:8443). Optional: enables a live version probe only
version_pathstring/Marti/api/versionnoMarti version endpoint on server_url. Configurable because tak.gov’s API reference is account-gated
client_certstringyesPEM client certificate for TAK Server mTLS, by reference
client_keystringyesPEM private key for the client certificate, by reference
ca_certstringnoPEM CA bundle for the TAK Server certificate. Empty uses the host trust store
posturebooltruenoEmit TAK Server posture findings
request_timeoutduration15snoPer-request timeout against the TAK Server API
feed_refstringtaknoStable reference for this CoT feed — the source_ref a sourcescope binding scopes (source_type=data)
cot_udp_listenstringnoUDP listen address for CoT (e.g. 127.0.0.1:6969). Empty disables UDP ingest
cot_tcp_listenstringnoTCP listen address for CoT open-squirt-close (e.g. 127.0.0.1:8087). Empty disables TCP ingest
cot_multicast_groupstringnoOptional multicast group to join on the UDP listener (TAK’s SA default is 239.2.3.1). A group join receives from OTHER HOSTS by design, so it requires allow_public_bind
allow_public_bindboolfalsenoDANGEROUS. Allow binding the CoT bearers to a non-loopback address, and allow joining a multicast group. CoT is carried in the CLEAR and a CoT event is a position report keyed by a device uid: off-host, anyone who can route to the host can read where the bearers are, and anyone can inject forged positions into the governed feed. Leave it off and keep the bearers on loopback unless the deployment genuinely needs LAN ingest
cot_max_event_bytesint65536noMaximum bytes for one CoT event
cot_max_detail_bytesint32768noMaximum bytes for the opaque <detail> span of one CoT event
cot_rate_limit_epsint500noMaximum accepted CoT events per second across all listeners; excess is dropped and counted
cot_max_tcp_connsint128noMaximum concurrent TCP CoT connections
cot_uid_modestringhashnoHow a uid leaves the connector: hash (default, one-way) or raw. A uid identifies a device, and a device identifies its bearer

Ports (TAK Server Configuration Guide v5.2)

Section titled “Ports (TAK Server Configuration Guide v5.2)”

For context on what you are integrating with. The connector’s own listeners bind whatever host:port you configure — the examples reuse these numbers only for familiarity.

Port / groupConvention
8089TLS CoT streaming input — the authenticated client↔server channel
6969 + multicast 239.2.3.1Situational-awareness (SA) multicast group
8087Conventional input port; the guide’s canonical example binds it as UDP. Protocol-configurable — 8087 is not inherently TCP
8088stcp — unencrypted TCP input, testing only
8443Administrative web UI
8446Certificate enrollment

Privacy: coordinates and detail never leave the connector

Section titled “Privacy: coordinates and detail never leave the connector”

CoT is a position-reporting protocol — the most PII-dense signal this product ingests — so minimal-data is enforced hard:

  • The lat / lon / hae of the <point> never leave the connector. A coordinate is the location of a person; the product records that an event was received, from which emitter, of which CoT type — never where anybody is.
  • The opaque <detail> span never leaves the connector; only its size and a SHA-256 digest are kept, so identical payloads correlate without the payload being stored.
  • The emitter uid is hashed by default (cot_uid_mode=hash, domain-separated and one-way). raw is an explicit operator opt-in.

Confidence: a CoT uid is not an authenticated identity

Section titled “Confidence: a CoT uid is not an authenticated identity”

Base CoT carries no authentication — any host that can reach a listener may assert any uid. TAK Server’s TLS protects the client↔server channel (port 8089); it says nothing about an event this connector receives on its own plain UDP/TCP listener. So every edge from a base CoT listener is graded approximate, by design — there is no code path that returns attributed.

Scoping: govern the feed with a sourcescope binding

Section titled “Scoping: govern the feed with a sourcescope binding”

The feed is a first-class governed source. A sourcescope binding scopes who may use it with source_type=data and source_ref=<feed_ref>, on any subject axis — session / agent / user / user_group / role. Effects are allow (default) or forbid, and forbid is absolute (forbid overrides allow).

POST /v1/m/sourcescope/bindings
Content-Type: application/json
{
"source_type": "data",
"source_ref": "tak",
"scope_tree": "agent",
"scope_ref": "agent:recon-planner",
"effect": "allow",
"enabled": true
}

Set "effect": "forbid" (with, say, "scope_tree": "user_group") to subtract a whole group’s access, even where an allow exists.

The CoT wire format is a clean-room implementation written from the public-release MITRE specification only — no TAK or ATAK source code was read, copied or derived:

  • The Developer’s Guide to Cursor on Target, Butler, MITRE, Aug 2005 — DTIC ADA637348, MITRE Case #06-0249.
  • Event-PUBLIC.xsd, the CoT base-event schema (Version 2.0) — MITRE Case #11-3895.
  • TAK Server Configuration Guide v5.2 — for the port/protocol conventions.

ATAK-CIV and TAK Server are GPLv3 and off-limits to the connector (Apache-2.0), enforced by the licence boundary check. Both carry a U.S. Federal “Distribution A” marking, which is a government release statement, not a software licence — the code trees are GPLv3. MITRE’s public-release schema and guide are what make a clean-room implementation legitimate.

  • No mesh/radio bearers — UDP and TCP only; no serial, TAK mesh or radio.
  • No ATAK/WinTAK plugins — the connector implements no end-user TAK client.
  • No TAK federation — it only observes that federation is configured; it never federates.
  • No Link-16 / MIL-STD or certification-gated tactical protocol, and no Iron Bank / DoD accreditation — separate, optional customer paths.
  • The CoT <detail> sub-schema is not modelled — only the base event is parsed; detail is opaque, size-capped, digested bytes.
  • UDP loss is uncountable — backpressure slows the listeners; for UDP the kernel drops datagrams before this process sees them, and those drops cannot be counted. Only events the connector actually refused are aggregated into rejection findings.