summaryrefslogtreecommitdiff
path: root/doc/opportunism.howto
diff options
context:
space:
mode:
authorRene Mayrhofer <rene@mayrhofer.eu.org>2006-05-22 05:12:18 +0000
committerRene Mayrhofer <rene@mayrhofer.eu.org>2006-05-22 05:12:18 +0000
commitaa0f5b38aec14428b4b80e06f90ff781f8bca5f1 (patch)
tree95f3d0c8cb0d59d88900dbbd72110d7ab6e15b2a /doc/opportunism.howto
parent7c383bc22113b23718be89fe18eeb251942d7356 (diff)
downloadvyos-strongswan-aa0f5b38aec14428b4b80e06f90ff781f8bca5f1.tar.gz
vyos-strongswan-aa0f5b38aec14428b4b80e06f90ff781f8bca5f1.zip
Import initial strongswan 2.7.0 version into SVN.
Diffstat (limited to 'doc/opportunism.howto')
-rw-r--r--doc/opportunism.howto415
1 files changed, 415 insertions, 0 deletions
diff --git a/doc/opportunism.howto b/doc/opportunism.howto
new file mode 100644
index 000000000..14b5ed5a2
--- /dev/null
+++ b/doc/opportunism.howto
@@ -0,0 +1,415 @@
+FreeS/WAN Opportunism HowTo
+===========================
+
+RCSID $Id: opportunism.howto,v 1.1 2004/03/15 20:35:21 as Exp $
+
+D. Hugh Redelmeier
+
+
+FreeS/WAN, the LINUX IPSEC implementation, is intended to allow
+systems to connect through secure tunnels with or without prearrangement.
+We use the term "Opportunism" to describe tunnels set up without
+prearrangement. This HowTo will show you how to set your system up
+for Opportunism.
+
+You are expected to already have built and used FreeS/WAN. Much more
+information about FreeS/WAN is provided at http://www.freeswan.org.
+This document is only intended to describe the support for
+opportunism. The features described here are available in FreeS/WAN
+version 1.91 or later (there were important bugs up until 1.95).
+
+For a more complete description of the design of Opportunism, see our
+paper "Opportunistic Encryption" (available as opportunism.spec in
+the same directory as this document).
+
+
+Steps
+=====
+
+- Understand what you are attempting. Security requires care.
+ Problems are hard to untangle. Be sure to read the last section
+ "Important Limitations".
+
+- Install FreeS/WAN (version 1.91 or later).
+
+- Add appropriate DNS records to your reverse-map domains.
+
+- Add suitable conns to /etc/ipsec.conf.
+
+- Try it out: start it, monitor it, fix it.
+
+- Now you understand the system better, reread "Important Limitations"
+
+These steps are also an outline of this document.
+
+
+Theory
+======
+
+FreeS/WAN runs on a machine that we will call a "Security Gateway".
+Usually this machine is a gateway to the internet. It may be that the
+only machine for which it provides gateway services is itself, but
+that is just a special case -- we will still call it a Security
+Gateway.
+
+A FreeS/WAN Security Gateway implements secure tunnels to other
+Security Gateways. One problem is to arrange for these tunnels to be
+created and used. If opportunism is enabled, a Security Gateway
+running FreeS/WAN will intercept the first outbound packet to a
+particular destination (IP address), and try to negotiate a security
+tunnel suitable for traffic to that destination.
+
+To make this work going the other way, the Security Gateway must be
+willing to negotiate with peers trying to protect traffic initiated
+from their side.
+
+The first novel problem is that our Security Gateway needs to discover
+the IP address of the other Security Gateway for the packet that
+prompted the negotiation. Oh, and quickly discover if there is none
+-- that negotiation will be impossible.
+
+The second novel problem is that our Security Gateway needs to
+authenticate the other Security Gateway. This authentication needs to
+ensure that the other Security Gateway is who it claims to be AND that
+it is authorized to represent the client for which it claims to be the
+gateway.
+
+The roles in a particular negotiation are:
+ Source----Initiator----...----Responder----Destination
+
+The Source and Destination are endpoints of the traffic that is to be
+protected. The Source is the one that happened to send the first
+packet of traffic. Neither needs to be aware of IPSEC or FreeS/WAN.
+That is the job of their respective Security Gateways, Initiator and
+Responder. The names "Initiator" and "Responder" match those used in
+the IPSEC standards for IKE negotiation. Remember that Source and
+Initiator could be the same machine; similarly, Destination and
+Responder could be the same. All traffic from Source or Destination
+must flow through their Security Gateways if it is to be considered
+for protection. These roles are fluid -- they can be different for
+each negotiation.
+
+We use the DNS (the Domain Name System) as a distributed database to
+publish the required information.
+
+
+DNS Records Required
+====================
+
+See section 2.3 of "Opportunistic Encryption" for a fuller
+explanation.
+
+Generally, we need to add records to the reverse-map DNS entries for
+the client machine and its Security Gateway machine. There are
+special cases that are exceptions.
+
+A Security Gateway that is going to initiate an Opportunistic
+negotiation needs to provide a way for the Responding SG to find a
+public key for the Initiator to allow authentication. This is
+accomplished by putting the public key in a KEY record in the
+reverse-map of the Initiator. Conveniently, the KEY record can
+be generated by the ipsec_showhostkey(8) command.
+
+ ipsec showhostkey
+
+Here is an example of the output, with many characters of the key
+itself left out:
+
+ ; RSA 2048 bits xy.example.com Sat Apr 15 13:53:22 2000
+ xy.example.com. IN KEY 0x4200 4 1 AQOF8tZ2...+buFuFn/
+
+=> Copy the output of the command into the zone information for the
+ reverse-map of the Security Gateway's public interface.
+
+Each client that is to be protected by Opportunistic Encryption must
+include a special TXT record in its reverse-map. The
+ipsec_showhostkey(8) command can create this too. Remember: this
+command must be run on the Security Gateway where the ipsec.secrets
+file resides. You must tell the command what IP address to put in the
+TXT record. The IP address is that of the Security Gateway.
+
+ ipsec showhostkey --txt 10.11.12.13
+
+This command might produce the output:
+
+ ; RSA 2048 bits xy.example.com Sat Apr 15 13:53:22 2000
+ IN TXT "X-IPsec-Server(10)=10.11.12.13 AQOF8tZ2...+buFuFn/"
+
+- The quotes matter: this is a single string, as far as DNS is
+ concerned.
+
+- The X-IPsec-Server is a prefix that signifies that the TXT record
+ contains Opportunism configuration information.
+
+- The (10) specifies a precedence for this record. This is similar
+ to MX record preferences. Lower numbers have stronger preference.
+
+- 10.11.12.13 specifies the IP address of the Security Gateway for
+ this machine.
+
+- AQOF8tZ2...+buFuFn/ is the (shortened) encoding of the RSA Public
+ key of the Security Gateway.
+
+=> Added this output to the zone information for the reverse-map for
+ each client machine. This gets a bit dull and repetitive.
+
+Unfortunately, not every administrator has control over the contents
+of the reverse-map. The only case where we can work around this is
+where the Initiator has no suitable reverse map. In this case, the
+Source's TXT record gives @FQDN ("Fully Qualified Domain Name") in
+place of its Security Gateway's IP address. This FQDN must match the
+ID-payload used by the Initiator. Furthermore, a forward lookup for a
+KEY record on the FQDN must yield the Initiator's public key.
+
+If the Source's IP address is the same as the Initiator's IP address,
+the Responder will assume that the Initiator is authorized to talk for
+the Source (itself!). In this case, the Responder won't try to fetch
+the Source's TXT record from the reverse map for the Source's IP
+address.
+
+These two features can be combined. If the Source and the Initiator
+are the same (i.e. the Security Gateway is protecting itself), and the
+Initiator uses a @FQDN ID (leftid=@example.com), then the
+administrator of that machine need only have installed a KEY record in
+the FQDN domain -- he need not control any reverse map.
+
+Obscure fact: the forward lookup is only done by a Responder, and then
+only when the Initiator's ID payload specifies the FQDN. There is no
+provision for a Responder with no control over its reverse-map.
+
+Beware: DNS changes sometimes take a long time to propagate.
+
+
+Configuring FreeS/WAN
+=====================
+
+To enable opportunism, you must include a suitable conn in
+/etc/ipsec.conf and you must enable it.
+
+A suitable conn looks roughly like an ordinary conn. It more closely
+resembles a Road Warrior conn (a Road Warrior conn is one that has a
+wildcard %any specified as the other Security Gateway). But in the
+Opportunistic case, both the other Security Gateway AND its client are
+unknown ahead of time.
+
+conn client-to-anyone # for our client subnet
+ leftsubnet=10.3.2.1.0/24 # any single client in our subnet
+ also=sg-to-anyone # rest is same as for SG
+
+conn sg-to-anyone # for our Security Gateway
+ left=%defaultroute # our SG (defaults leftnexthop too)
+ right=%opportunistic
+ authby=rsasig # almost always the right choice
+ keyingtries=2 # don't be persistent -- peer might disappear
+ auto=route # enable at ipsec startup
+
+(%defaultroute only works if you have specified
+interfaces=%defaultroute. Since this isn't the topic of the howto,
+you will have to look at the other documentation to find out how to
+handle other cases.)
+
+You can have any number of opportunistic conns, but generally it only
+makes sense to have one for each client subnet and one for the
+Security Gateway itself.
+
+Currently only one interface may be used for opportunism: Pluto knows
+nothing about routing, so would be unable to choose amongst several.
+Almost certainly our side's nexthop must be predetermined
+(%defaultroute will do that).
+
+Note: the routing done for outbound Opportunism will catch any packets
+not covered by a more specific route. This is what you want for
+packets that are also covered by an eroute. But packets caught by the
+route and not an eroute will be subject to the no-eroute policy of
+KLIPS, which defaults to %drop. Remember that routing ignores the
+packet's source address, but erouting pays attention to it. So if
+Opportunism is enabled, it is best to provide for it covering all IP
+addresses behind or on the Security Gateway.
+
+To enable these conns for inbound opportunistic negotiation, they must be
+--added. auto=add would accomplish this at ipsec startup, but if you cannot
+wait:
+ ipsec auto --add sg-to-anyone
+ ipsec auto --add client-to-anyone
+
+To enable these conns for outbound opportunistic negotiation, they must
+be both --added and --routed. Outbound packets will then be trapped
+and will trigger negotiation. auto=route would cause this to happen
+at startup, but if you wish to do this at another time:
+ ipsec auto --add sg-to-anyone
+ ipsec auto --add client-to-anyone
+ ipsec auto --route sg-to-anyone
+ ipsec auto --route client-to-anyone
+
+
+Getting DNS Through
+===================
+
+There is a serious chicken-and-egg problem. Outbound Opportunism blocks
+communication with an IP address until Pluto discovers whether that IP
+address can have an IPSEC connection negotiated. This discovery takes
+DNS queries. These DNS queries might involve communicating with
+arbitrary IP addresses. Thus we require DNS queries to succeed before
+any communication succeeds, including those same DNS queries! The way
+out of this conundrum is to exempt at least some DNS query IP traffic
+from Opportunism.
+
+There are several possible solutions, all of which have advantages and
+disadvantages.
+
+1. If you use a single machine, outside your Security Gateway, as DNS
+server, you can build a clear path (or even an IPSEC tunnel, but not
+opportunistically) directly to that machine.
+
+- you could use a type=passthrough conn to provide a clear path
+ between your machine and the DNS machine.
+
+- better still, you could explicitly create an IPSEC connection to
+ your DNS server. Just be sure that Pluto does not need to access
+ DNS to find the IP addresses or RSA public keys for that connection!
+
+- you could install an explicit route to the DNS machine through
+ your public interface (not ipsecN). This will bypass KLIPS
+ processing. You might have to adjust your firewall. For example:
+
+ route add host -net ns.example.com gw gw.example.com dev eth1
+
+2. Generally, it is better to run DNS on your Security Gateway. This
+leads to a need for non-opportunistic paths to an arbitrary number of
+DNS servers in the internet. One way to accomplish this is to NOT
+have outbound opportunism cover the SG itself, but only the subnet
+behind it. In other words, leave out the
+ ipsec auto --route sg-to-anyone
+You must also add a type=passthrough eroute specifically for
+sg-to-anyone (without this, the traffic will be handled by the KLIPS
+no-eroute policy).
+
+3. It is actually possible to use a single machine inside your client
+subnet as a DNS server. The techniques listed in 1 could be used to
+let it communicate with other DNS servers without interference. This
+might have advantages over 1 if the DNS machine *only* did DNS.
+Another technique (not often possible or reasonable) is to give this
+machine another route to the internet, one that avoids the SG.
+
+4. DNS queries will eventually time out and then Pluto will give up
+and establish %pass eroutes. So communications should start flowing.
+
+We would like to have better solutions. Perhaps we will in the
+future. Suggestions are welcome.
+
+
+Figuring out what is going on
+=============================
+
+Since Opportunism lets your SG operate with less supervision, you may
+be puzzled by what it is up to. The usual tools exist, but their use
+is more important. To look at what Pluto is doing, use:
+ ipsec auto --status
+To look at what KLIPS is doing, use
+ ipsec look
+
+To just see the kernel's eroute table, look at the "file"
+/proc/net/ipsec_eroute. It contains a description of all the eroutes
+in the kernel. Here is an example:
+
+10 10.2.1.0/24 -> 0.0.0.0/0 => %trap
+259 10.2.1.115/32 -> 10.19.75.161/32 => tun0x1002@10.19.75.145
+71 10.44.73.97/32 -> 0.0.0.0/0 => %trap
+4119 10.44.73.97/32 -> 10.114.121.41/32 => %pass
+
+You read each line as: a packet from within the first subnet, destined
+for the second subnet, will be processed by the Security Association
+Identity (SAID) specified last. The first column is the number of
+(outbound) packets processed by this eroute.
+
+For shunt eroutes, the SAID is printed as just the type of shunt:
+%pass pass the packet through with no processing
+%drop discard the packet
+%reject discard the packet and notify sender
+%hold keep the last packet; discard others
+%trap cause any trapped packet to generate a PF_KEY ACQUIRE
+ to request negotiation; install a corresponding %hold
+ shunt and attach this packet to the %hold
+
+For other eroutes, the SAID is printed as a triple: protocol (three
+letters), SPI (32-bit number in hex), and destination IP address.
+Protocols include:
+
+tun IP in IP encapsulation (used for most tunnels)
+esp ESP encapsulation -- part of an IPSEC SA group
+ah AH packet authentication -- part of an IPSEC SA group
+
+So, looking at our sample eroutes:
+
+10 10.2.1.0/24 -> 0.0.0.0/0 => %trap
+
+ This is a TRAP (int0x104) shunt eroute. It was installed by
+ Pluto so that it can catch all traffic from its client subnet
+ to the world at large. Ten outbound packets have been trapped.
+
+259 10.2.1.115/32 -> 10.19.75.161/32 => tun0x1002@10.19.75.145
+
+ This is a tunnel eroute: packets from 10.2.1.115 (within
+ our client subnet) going to 10.19.75.161 will be encrypted
+ and sent to the peer SG 10.19.75.145. This was the product
+ of an Opportunistic negotiation (a hint is that each client
+ subnet has only one member). 259 packets have been sent
+ through this tunnel.
+
+71 10.44.73.97/32 -> 0.0.0.0/0 => %trap
+
+ This is another TRAP shunt eroute. It is to catch traffic
+ from the Security Gateway to the world. It has caught
+ 71 outbound packets.
+
+4119 10.44.73.97/32 -> 10.114.121.41/32 => %pass
+
+ This is a %pass (0x100) shunt eroute. It was installed when an
+ attempted Opportunistic negotiation failed because the reverse
+ domain of 10.114.121.41 had no suitable TXT record. 4119
+ outbound packets have been passed.
+
+
+Important Limitations
+=====================
+
+Pluto's DNS lookup is synchronous (single-threaded). Not only does
+this slow things down, but it turns out that in extreme cases where
+there are a lot of ACQUIRE messages from KLIPS at once, some of those
+messages can be lost and communications will be blocked by the %hold
+eroute that Pluto doesn't know about. Pluto now looks every 2 minutes
+for any %holds that it missed.
+
+DNS lookup is not verified -- we don't use Secure DNS. A spoofed DNS
+could compromise Opportunism.
+
+There are several new opportunities for Denial of Service attacks.
+For example, a Bad Guy could spray our system with pings with forged
+source addresses. For each unique source address, our system would do
+a (synchronous!) DNS lookup.
+
+Once a %pass eroute is added for a failed negotiation, it will stay
+until it has been inactive for about 15 minutes. The only activity
+that counts is outbound -- not surprising since a %pass only affects
+outbound traffic.
+
+If a destination's DNS entry specifies the information we need for
+negotiation, Pluto will not let communications proceed without
+negotiating a Security Tunnel.
+
+There is currently no way to tear down a tunnel that is no longer in
+use. To add insult to injury, when the lifetime is about to be
+exceeded, the initiating Pluto will rekey! Restarting will clear
+these out. rekey=no doesn't solve this since SA expiry would be
+uncoordinated and hence cause packets to be lost.
+
+If one side of a Security Tunnel restarts, but doesn't initiate
+negotiation with its peer, the peer will not be able to communicate
+with it until the peer thinks the tunnel needs rekeying due to
+lifetime, or the restarted Security Gateway decides to negotiate for
+its own reasons.
+
+It isn't clear what firewall policies make sense with Opportunism.
+
+If VPN and Opportunism connections coexist, security policies
+implemented via a firewall can only distinguish traffic by IP address.