Annotation of embedaddon/ipsec-tools/src/racoon/doc/README.privsep, revision 1.1.1.1

1.1       misho       1:                Using Racoon with Privilege Separation
                      2:                     Tue Mar 25 16:37:09 MDT 2008
                      3: 
                      4: 
                      5: Racoon can run in a chroot'd environment.  When so instructed, it runs as two
                      6: processes, one of which handles a small number of simple requests and runs as
                      7: root in the full native filesystem, and another which runs as a less
                      8: privileged user in a chroot'd environment and which handles all the other and
                      9: very complex business of racoon.
                     10: 
                     11: Because racoon does many complex things there are many opportunities for
                     12: coding errors to lead to compromises and so this separation is important.  If
                     13: someone breaks into your system using racoon and you have enabled privilege
                     14: separation, they will find themselves in a very limited environment and unable
                     15: to do much damage.  They may be able to alter the host's security associations
                     16: or obtain the private keys stored on that system using file descriptors
                     17: available to the unprivileged instance of racoon, and from there they will be
                     18: able to alter security associations on other hosts in disruptive or dangerous
                     19: ways if you have generate_policy enabled on those hosts.  But that's because
                     20: in its current form generate_policy is itself dangerous and requires that you
                     21: trust anyone with the credentials to use it.
                     22: 
                     23: They will also be able to execute any scripts you have placed in the scripts
                     24: directory, although racoon will prevent them from mis-using the traditional
                     25: environment variables PATH, LD_LIBRARY_PATH, and IFS.  But if you have
                     26: introduced vulnerabilities into your scripts you may want to re-visit them.
                     27: The thing to watch for is blindly trusting the environment variables passed
                     28: in by racoon - assume they could be set to anything by a malicious entity and
                     29: check them for suitability before using them.
                     30: 
                     31: All these possibilities are present when privilege separation is not enabled,
                     32: and they are greatly reduced when it is enabled because the resources
                     33: available to the attacker are less.
                     34: 
                     35: *****
                     36: 
                     37: The basic concept with racoon's privilege separation is that a minimal
                     38: environment containing all the files racoon needs to operate - with the
                     39: exception of private keys, scripts, and system-wide authentication services -
                     40: is placed in a stripped-down copy of the original environment.  The private
                     41: keys and scripts are left in the original environment where only the
                     42: privileged instance of racoon will have access to them.
                     43: 
                     44: Here are basic instructions for setting up racoon to run with privilege
                     45: separation:
                     46: 
                     47: 
                     48: First, create a user/group for racoon to run under.  For example, user:group
                     49: ike:ike.  The account should not have a usable password or real home
                     50: directory, so copy the general format of another system-services type account
                     51: such as 'daemon'.
                     52: 
                     53: You already have files in, e.g. /usr/local/etc/racoon - perhaps racoon.conf, a
                     54: certs directory containing certificates, a scripts directory, and other
                     55: miscellaneous files such as welcome messages.  Perform the following steps:
                     56: 
                     57: cd /usr/local/etc/racoon
                     58: mkdir root
                     59: mv certs root
                     60: mkdir certs
                     61: mv root/certs/*.key certs
                     62: 
                     63: If you want to be able to switch back and forth between using and not using
                     64: privsep, do this too:
                     65: 
                     66: cd /usr/local/etc/racoon/certs
                     67: for i in ../root/certs/*
                     68: do
                     69:        ln -s $i .
                     70: done
                     71: 
                     72: Now root/certs contains certificates and certs contains the keys.  The idea is
                     73: that the public certificates are in the chroot'd area
                     74: (/usr/local/etc/racoon/root) and the keys are available only to the privileged
                     75: instance of racoon.
                     76: 
                     77: Move any other racoon configuration data into /usr/local/etc/racoon/root,
                     78: with the exception of the scripts directory and racoon.conf.
                     79: 
                     80: All the files in /usr/local/etc/racoon/root should be owned by root and the
                     81: ike:ike user you created should not have write access to any directories or
                     82: files (unless you are using something like 'path backupsa', but you get the
                     83: idea).
                     84: 
                     85: Create the device nodes:
                     86: 
                     87: mkdir root/dev
                     88: 
                     89: Do whatever your OS requires to populate the new dev directory with a
                     90: minimal set of devices, e.g. mknod, MAKEDEV, or mount devfs...  In freebsd
                     91: this is done by adding a line to /etc/fstab:
                     92: 
                     93: devfs  /usr/local/etc/racoon/root/dev  devfs   rw              0       0
                     94: 
                     95: and then adding a line like this to /etc/rc.conf:
                     96: 
                     97: devfs_set_rulesets="/usr/local/etc/racoon/root/dev=devfsrules_basic"
                     98: 
                     99: and then adding the following lines to /etc/devfs.rules:
                    100: 
                    101: [devfsrules_basic=10]
                    102: add include $devfsrules_hide_all
                    103: add include $devfsrules_unhide_basic
                    104: 
                    105: and then either rebooting or entering "mount -a && /etc/rc.d/devfs start".
                    106: 
                    107: When done with that:
                    108: 
                    109: mkdir -p root/usr/local/etc
                    110: ln -s ../../../ root/usr/local/etc/racoon
                    111: 
                    112: This dummy hierarchy keeps the config file consistent between both copies of
                    113: racoon. Of course, you could actually put the certs directory and any other
                    114: configuration data down in the hierarchy but I prefer to leave it at the root
                    115: and link to it as shown.  You may end up with something like this:
                    116: 
                    117: root# ls -FC /usr/local/etc/racoon/root
                    118: certs/ dev/    usr/
                    119: 
                    120: root# ls -l /usr/local/etc/racoon/root/usr/local/etc
                    121: lrwxr-xr-x  1 root  wheel  9 Mar  7 22:13 racoon -> ../../../
                    122: 
                    123: root# ls -FC /usr/local/etc/racoon/root/usr/local/etc/racoon/
                    124: certs/ dev/    usr/
                    125: 
                    126: Presumably your racoon.conf already contains something like:
                    127: 
                    128: path certificate "/usr/local/etc/racoon/certs";
                    129: path script "/usr/local/etc/racoon/scripts";
                    130: 
                    131: If so, great. If not, add them. Then, finally, add the privsep section:
                    132: 
                    133: privsep {
                    134:        user "ike";
                    135:        group "ike";
                    136:        chroot "/usr/local/etc/racoon/root";
                    137: }
                    138: 
                    139: Apply the patches posted to the list and rebuild racoon (the patches will be
                    140: incorporated into the release subsequent to the date of this memo, so if you
                    141: use that or a later release you can skip this step).
                    142: 
                    143: Restart racoon and hopefully things will work.  As of the date of this memo,
                    144: re-loading the configuration file with racoonctl will not work with privsep
                    145: enabled.  However, the problem is not insurmountable and if you figure it out
                    146: let us know.
                    147: 
                    148: I have not tested privsep with many of racoon's features such as XAUTH or
                    149: scripts, so if you have trouble with them and work anything out please reply
                    150: to the list so that your discoveries may be incorporated into this document.
                    151: 
                    152: Last modified: $Date: 2008/03/28 04:18:52 $

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>