aboutsummaryrefslogtreecommitdiff
path: root/doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication
diff options
context:
space:
mode:
Diffstat (limited to 'doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication')
-rw-r--r--doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication216
1 files changed, 216 insertions, 0 deletions
diff --git a/doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication b/doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication
new file mode 100644
index 00000000..fedc0889
--- /dev/null
+++ b/doc/wiki-dump/doc%2FRPKI%2FCA%2FProtocols%2FPublication
@@ -0,0 +1,216 @@
+= The Publication Protocol =
+
+[[TracNav(doc/RPKI/TOC)]]
+[[PageOutline]]
+
+The publication protocol is really two separate client/server
+protocols, between different parties. The first is a configuration
+protocol for an IRBE to use to configure a publication engine,
+the second is the interface by which authorized clients request
+publication of specific objects.
+
+Much of the architecture of the publication protocol is borrowed from
+the [[LeftRight|left-right protocol]]: like the left-right
+protocol, the publication protocol uses CMS-wrapped XML over HTTP with
+the same eContentType OID and the same HTTP content-type, and the
+overall style of the XML messages is very similar to the left-right
+protocol. All operations allow an optional "tag" attribute to allow
+batching.
+
+The publication engine operates a single HTTP server which serves
+both of these subprotocols. The two subprotocols share a single
+server port, but use distinct URLs to allow demultiplexing.
+
+== Publication control subprotocol ==
+
+The control subprotocol reuses the message-passing design of the
+left-right protocol. Configured objects support the "create", "set",
+"get", "list", and "destroy" actions, or a subset thereof when the
+full set of actions doesn't make sense.
+
+=== <config/> object ===
+
+The <config/> object allows configuration of data that apply to the
+entire publication server rather than a particular client.
+
+There is exactly one <config/> object in the publication server, and
+it only supports the "set" and "get" actions -- it cannot be created
+or destroyed.
+
+Payload data which can be configured in a <config/> object:
+
+bpki_crl:: (element)
+ This is the BPKI CRL used by the publication server when
+ signing the CMS wrapper on responses in the publication
+ subprotocol. As the CRL must be updated at regular intervals,
+ it's not practical to restart the publication server when the
+ BPKI CRL needs to be updated. The BPKI model doesn't require
+ use of a BPKI CRL between the IRBE and the publication server,
+ so we can use the publication control subprotocol to update the
+ BPKI CRL.
+
+=== <client/> object ===
+
+The <client/> object represents one client authorized to use the
+publication server.
+
+The <client/> object supports the full set of "create", "set", "get",
+"list", and "destroy" actions. Each client has a "client_handle"
+attribute, which is used in responses and must be specified in "create", "set",
+"get", or "destroy" actions.
+
+Payload data which can be configured in a <client/> object:
+
+base_uri:: (attribute)
+ This is the base URI below which this client is allowed to publish
+ data. The publication server may impose additional constraints in
+ the case of a child publishing beneath its parent.
+
+bpki_cert:: (element)
+ BPKI CA certificate for this <client/>. This is used as part of
+ the certificate chain when validating incoming TLS and CMS
+ messages. If the bpki_glue certificate is in use (below), the
+ bpki_cert certificate should be issued by the bpki_glue
+ certificate; otherwise, the bpki_cert certificate should be issued
+ by the publication engine's bpki_ta certificate.
+
+bpki_glue:: (element)
+ Another BPKI CA certificate for this <client/>, usually not
+ needed. Certain pathological cross-certification cases require a
+ two-certificate chain due to issuer name conflicts. If used, the
+ bpki_glue certificate should be the issuer of the bpki_cert
+ certificate and should be issued by the publication engine's
+ bpki_ta certificate; if not needed, the bpki_glue certificate
+ should be left unset.
+
+== Publication subprotocol ==
+
+The publication subprotocol is structured somewhat differently from
+the publication control protocol. Objects in the publication
+subprotocol represent objects to be published or objects to be
+withdrawn from publication. Each kind of object supports two actions:
+"publish" and "withdraw". In each case the XML element representing
+hte object to be published or withdrawn has a "uri" attribute which
+contains the publication URI. For "publish" actions, the XML element
+body contains the DER object to be published, encoded in Base64; for
+"withdraw" actions, the XML element body is empty.
+
+In theory, the detailed access control for each kind of object might
+be different. In practice, as of this writing, access control for all
+objects is a simple check that the client's {{{base_uri}}} is a leading
+substring of the publication URI. Details of why access control might
+need to become more complicated are discussed in a later section.
+
+=== <certificate/> object ===
+
+The <certificate/> object represents an RPKI certificate to be
+published or withdrawn.
+
+=== <crl/> object ===
+
+The <crl/> object represents an RPKI CRL to be published or withdrawn.
+
+=== <manifest/> object ===
+
+The <manifest/> object represents an RPKI publication manifest to be
+published or withdrawn.
+
+Note that part of the reason for the batching support in the
+publication protocol is because //every// publication or withdrawal
+action requires a new manifest, thus every publication or withdrawal
+action will involve at least two objects.
+
+=== <roa/> object ===
+
+The <roa/> object represents a ROA to be published or withdrawn.
+
+== Error handling ==
+
+Error in this protocol are handled at two levels.
+
+Since all messages in this protocol are conveyed over HTTP
+connections, basic errors are indicated via the HTTP response code.
+4xx and 5xx responses indicate that something bad happened. Errors
+that make it impossible to decode a query or encode a response are
+handled in this way.
+
+Where possible, errors will result in a <report_error/> message which
+takes the place of the expected protocol response message.
+<report_error/> messages are CMS-signed XML messages like the rest of
+this protocol, and thus can be archived to provide an audit trail.
+
+<report_error/> messages only appear in replies, never in
+queries. The <report_error/> message can appear in both the
+control and publication subprotocols.
+
+The <report_error/> message includes an optional //tag// attribute to
+assist in matching the error with a particular query when using
+batching.
+
+The error itself is conveyed in the {{{error_code}}} (attribute). The
+value of this attribute is a token indicating the specific error that
+occurred. At present this will be the name of a Python exception; the
+production version of this protocol will nail down the allowed error
+tokens here, probably in the RelaxNG schema.
+
+The body of the <report_error/> element itself is an optional text
+string; if present, this is debugging information. At present this
+capabilty is not used, debugging information goes to syslog.
+
+== Additional access control considerations ==
+
+As detailed above, the publication protocol is trivially simple. This
+glosses over two bits of potential complexity:
+
+* In the case where parent and child are sharing a repository, we'd
+ like to nest child under parent, because testing has demonstrated
+ that even on relatively slow hardware the delays involved in setting
+ up separate rsync connections tend to dominate synchronization time
+ for relying parties.
+
+* The repository operator might also want to do some checks to assure
+ itself that what it's about to allow the RPKI engine to publish is
+ not dangerous toxic waste.
+
+The up-down protocol includes a mechanism by which a parent can
+suggest a publication URI to each of its children. The children are
+not required to accept this hint, and the children must make separate
+arrangements with the repository operator (who might or might not be
+the same as the entity that hosts the children's RPKI engine
+operations) to use the suggested publication point, but if everything
+works out, this allows children to nest cleanly under their parents
+publication points, which helps reduce synchronization time for
+relying parties.
+
+In this case, one could argue that the publication server is
+responsible for preventing one of its clients (the child in the above
+description) from stomping on data published by another of its clients
+(the parent in the above description). This goes beyond the basic
+access check and requires the publication server to determine whether
+the parent has given its consent for the child to publish under the
+parent. Since the RPKI certificate profile requires the child's
+publication point to be indicated in an SIA extension in a certificate
+issued by the parent to the child, the publication engine can infer
+this permission from the parent's issuance of a certificate to the
+child. Since, by definition, the parent also uses this publication
+server, this is an easy check, as the publication server should
+already have the parent's certificate available by the time it needs
+to check the child's certificate.
+
+The previous paragraph only covers a "publish" action for a
+{{{<certificate/>}}} object. For "publish" actions on other
+objects, the publication server would need to trace permission back
+to the certificate issued by the parent; for "withdraw" actions,
+the publication server would have to perform the same checks it
+would perform for a "publish" action, using the current published
+data before withdrawing it. The latter in turn implies an ordering
+constraint on "withdraw" actions in order to preserve the data
+necessary for these access control decisions; as this may prove
+impractical, the publication server may probably need to make
+periodic sweeps over its published data looking for orphaned
+objects, but that's probably a good idea anyway.
+
+Note that, in this publication model, any agreement that the
+repository makes to publish the RPKI engine's output is conditional
+upon the object to be published passing whatever access control checks
+the publication server imposes.