aboutsummaryrefslogtreecommitdiff
path: root/rpkid.with_tls/doc/Publication
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid.with_tls/doc/Publication')
-rw-r--r--rpkid.with_tls/doc/Publication201
1 files changed, 201 insertions, 0 deletions
diff --git a/rpkid.with_tls/doc/Publication b/rpkid.with_tls/doc/Publication
new file mode 100644
index 00000000..0e3ce5e5
--- /dev/null
+++ b/rpkid.with_tls/doc/Publication
@@ -0,0 +1,201 @@
+****** Publication protocol ******
+
+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 left-
+right_protocol: like the left-right protocol, the publication protocol uses
+CMS-wrapped XML over HTTPS with the same eContentType OID and the same HTTPS
+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 HTTPS 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 HTTPS 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.