home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 August / PCWorld_1999-08_cd.bin / doc / HOWTO / mini / VPN < prev    next >
Text File  |  1998-05-08  |  16KB  |  595 lines

  1.   The VPN HOWTO
  2.   Arpad Magosanyi <mag@bunuel.tii.matav.hu> v0.2,7 Aug1997
  3.   v0.2, 7 August 1997
  4.  
  5.   1.  Changes
  6.  
  7.  
  8.   The 'no controlling tty problem' -> -o 'BatchMode yes' by Zot O'Connor
  9.   <zot@crl.com>
  10.  
  11.   warning about kernel 2.0.30 by mag
  12.  
  13.   2.  Blurb
  14.  
  15.  
  16.   This is the Linux VPN howto, a collection of information on how to set
  17.   up a Virtual Protected Network in Linux (and other unices in general).
  18.  
  19.   2.1.  Copyright
  20.  
  21.  
  22.   This document is part of the Linux HOWTO project. The copyright notice
  23.   is the following: Unless otherwise stated, Linux HOWTO documents are
  24.   copyrighted by their respective authors. Linux HOWTO documents may be
  25.   reproduced and distributed in whole or in part, in any medium physical
  26.   or electronic, as long as this copyright notice is retained on all
  27.   copies. Commercial redistribution is allowed and encouraged; however,
  28.   the author would like to be notified of any such distributions. All
  29.   translations, derivative works, or aggregate works incorporating any
  30.   Linux HOWTO documents must be covered under this copyright notice.
  31.   That is, you may not produce a derivative work from a HOWTO and impose
  32.   additional restrictions on its distribution. Exceptions to these rules
  33.   may be granted under certain conditions; please contact the Linux
  34.   HOWTO coordinator at the address given below. In short, we wish to
  35.   promote dissemination of this information through as many channels as
  36.   possible. However, we do wish to retain copyright on the HOWTO
  37.   documents, and would like to be notified of any plans to redistribute
  38.   the HOWTOs. If you have questions, please contact Tim Bynum, the Linux
  39.   HOWTO coordinator, at linux-howto@sunsite.unc.edu via email.
  40.  
  41.   2.2.  Disclaimer
  42.  
  43.  
  44.   As usual: the author not responsible for any damage. For the correct
  45.   wording, see the relevant part of the GNU GPL 0.1.1
  46.  
  47.   2.3.  Disclaimer
  48.  
  49.  
  50.   We are dealing with security: you are not safe if you haven't got good
  51.   security policy, and other rather boring things.
  52.  
  53.   2.4.  Credits
  54.  
  55.  
  56.   Thanks to all of who has written the tools used.
  57.  
  58.   Thanks to Zot O'Connor <zot@crl.com> for pointing out the "no
  59.   controlling tty" problem, and it's solution.
  60.  
  61.   2.5.  State of this document
  62.  
  63.  
  64.   This is very preliminary. You should have thorough knowledge of
  65.   administrating IP, at least some knowledge of firewalls, ppp and ssh.
  66.   You should know them anyway if you want to set up a VPN. I just
  67.   decided to write down my experiences not to forget them. There are
  68.   possibly some security holes indeed. To be fair I've tried it on hosts
  69.   configured as routers not firewalls, saying: It's simple from that
  70.   point.
  71.  
  72.   2.6.  Related documentations
  73.  
  74.  
  75.   ╖  The Linux Firewall-HOWTO /usr/doc/HOWTO/Firewall-HOWTO
  76.  
  77.   ╖  The Linux PPP-HOWTO /usr/doc/HOWTO/PPP-HOWTO.gz
  78.  
  79.   ╖  The ssh documentations /usr/doc/ssh/*
  80.  
  81.   ╖  The Linux Network Admins' Guide
  82.  
  83.   ╖  NIST Computer Security Special Publications
  84.      http://csrc.ncsl.nist.gov/nistpubs/
  85.  
  86.   ╖  Firewall list (majordomo@greatcircle.com)
  87.  
  88.   3.  Introduction
  89.  
  90.  
  91.   As firewalls are in more and more widely use in internet and intranet
  92.   security, the ability to do nice VPNs is important. Here are my
  93.   experiences. Comments are welcome.
  94.  
  95.   3.1.  Naming conventions
  96.  
  97.  
  98.   I will use the terms "master firewall" and "slave firewall", though
  99.   making a VPN has nothing to do with client-server architecture. I
  100.   simply refer to them as the active and passive participants of the
  101.   connection's setup. The host which is starts the setup will be
  102.   referred as the master, and the passive participant will be the slave.
  103.  
  104.   4.  Doing it
  105.  
  106.  
  107.   4.1.  Planning
  108.  
  109.  
  110.   Before you start to set up your system, you should know the networking
  111.   details. I assume you have two firewalls protecting one intranet per
  112.   firewall, and they are both connected to the internet. So now you
  113.   should have two network interfaces (at least) per firewall. Take a
  114.   sheet of paper, write down their IP addresses and network mask. You
  115.   will need one more IP adresses per firewall for the VPN you want to do
  116.   now. Those addresses should be outside of your existing subnets. I
  117.   suggest using addresses from the "private" address ranges. They are
  118.   the followings:
  119.  
  120.   ╖  10.0.0.0 - 10.255.255.255
  121.  
  122.   ╖  172.16.0.0 - 172.31.255.255
  123.  
  124.   ╖  192.168.0.0 - 192.168.255.255
  125.  
  126.   For the sake of example, here's a sample configuration: The two
  127.   bastions are called fellini and polanski. They have one interface for
  128.   the internet (-out), one for the intranet (-in), and one for the vpn
  129.   (-vpn). The addresses and netmasks:
  130.  
  131.   ╖  fellini-out: 193.6.34.12 255.255.255.0
  132.  
  133.   ╖  fellini-in: 193.6.35.12 255.255.255.0
  134.  
  135.   ╖  fellini-vpn: 192.168.0.1 point-to-point
  136.  
  137.   ╖  polanski-out: 193.6.36.12 255.255.255.0
  138.  
  139.   ╖  polanski-in: 193.6.37.12 255.255.255.0
  140.  
  141.   ╖  polanski-vpn: 192.168.0.2 point-to-point
  142.  
  143.   So we have the plan.
  144.  
  145.   4.2.  Gathering the tools
  146.  
  147.  
  148.   You will need a
  149.  
  150.   ╖  Linux firewall
  151.  
  152.   ╖  kernel
  153.  
  154.   ╖  very minimal configuration
  155.  
  156.   ╖  ipfwadm
  157.  
  158.   ╖  fwtk
  159.  
  160.   ╖  Tools for the VPN
  161.  
  162.   ╖  ssh
  163.  
  164.   ╖  pppd
  165.  
  166.   ╖  sudo
  167.  
  168.   ╖  pty-redir
  169.  
  170.   Current versions:
  171.  
  172.   ╖  kernel: 2.0.29 Use a stable kernel, and it must be newer than
  173.      2.0.20, because the ping'o'death bug. At the time of writing 2.0.30
  174.      is the last "stable" kernel, but it has some bugs. If you want to
  175.      have the fast and cool networking code introduced in it, try a
  176.      prepatch. the 3rd is working for me nicely.
  177.  
  178.   ╖  base system: I prefer Debian. YMMV. You absolutely don't want to
  179.      use any big packages, and you never even tought of using sendmail,
  180.      of course. You also definitely don't want to enable telnet, ftp,
  181.      and the 'r' commands (as usual in case of any other unix hosts).
  182.  
  183.   ╖  ipfwadm: I've used 2.3.0
  184.  
  185.   ╖  fwtk: I've used 1.3
  186.  
  187.   ╖  ssh: >= 1.2.20. There are problems with the underlying protocol in
  188.      the older versions.
  189.  
  190.   ╖  pppd: I've used 2.2.0f for the tests, but I'm not sure if is it
  191.      secure, this is why I turned the setuid bit off, and used sudo to
  192.      launch it.
  193.  
  194.   ╖  sudo: 1.5.2 the newest I am aware of
  195.  
  196.   ╖  pty-redir: It is written by me. Try
  197.      ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz. Its version
  198.      number is 0.1 now. Tell me it there is any problem with it.
  199.   4.3.  Compile and install
  200.  
  201.  
  202.   Compile or otherwise install the gathered tools. Look at every one's
  203.   documentation (and the firewall-howto) for details. Now we have the
  204.   tools.
  205.  
  206.   4.4.  Configure the other subsystems
  207.  
  208.  
  209.   Configure your firewall rules, etc. You need to enable ssh traffic
  210.   between the two firewll hosts. It means a connection to port 22 on the
  211.   slave from the master. Start sshd on the slave and verify if you can
  212.   login. This step is untested, please tell me your results.
  213.  
  214.   4.5.  Set up the accounts for the VPN
  215.  
  216.  
  217.   Create an account on the slave firewall use your favourite tool (e.g.
  218.   vi, mkdir, chown, chmod) you might create an account on the master
  219.   also, but I think you want to set up the connection at boot time, so
  220.   your ordinary root account will do. Can anyone point out risks on
  221.   using the root account on the master?
  222.  
  223.   4.6.  Generate an ssh key for your master account
  224.  
  225.  
  226.   Use the ssh-keygen program. Set empty password for the private key if
  227.   you want to do automatic setup of the VPN.
  228.  
  229.   4.7.  Set up automatic ssh login for the slave account
  230.  
  231.  
  232.   Copy the newly generated public key in the slave account under
  233.   .ssh/authorized_keys, and set up file permissions like the following:
  234.  
  235.   drwx------ 2 slave slave 1024 Apr 7 23:49 ./
  236.   drwx------ 4 slave slave 1024 Apr 24 14:05 ../
  237.   -rwx------ 1 slave slave 328 Apr 7 03:04 authorized_keys
  238.   -rw------- 1 slave slave 660 Apr 14 15:23 known_hosts
  239.   -rw------- 1 slave slave 512 Apr 21 10:03 random_seed
  240.  
  241.  
  242.  
  243.   The first row being ~slave/.ssh, and the second is ~slave.
  244.  
  245.   4.8.  Tighten ssh security on the bastions.
  246.  
  247.  
  248.   It means the followings on my setup in sshd_conf:
  249.  
  250.   PermitRootLogin no
  251.   IgnoreRhosts yes
  252.   StrictModes yes
  253.   QuietMode no
  254.   FascistLogging yes
  255.   KeepAlive yes
  256.   RhostsAuthentication no
  257.   RhostsRSAAuthentication no
  258.   RSAAuthentication yes
  259.   PasswordAuthentication no
  260.   PermitEmptyPasswords no
  261.  
  262.  
  263.  
  264.  
  265.   Password authentication is turned off, so login is only possible with
  266.   authorized keys. (You've turned off telnet and the 'r' commands of
  267.   course).
  268.  
  269.   4.9.  Enable execution of ppp and route for both accounts.
  270.  
  271.  
  272.   As the master account is the root in my case, it has nothing to do.
  273.   For the slave account, the following lines appear in /etc/sudoers:
  274.  
  275.   Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route
  276.   slave ALL=NOPASSWD: VPN
  277.  
  278.  
  279.  
  280.   As you can see, I am using some scripts to set up ppp and the routing
  281.   tables on the slave host.
  282.  
  283.   4.10.  Do the scripting
  284.  
  285.  
  286.   On the master host there is a full-blown init script I am using:
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.   #! /bin/sh
  332.   # skeleton      example file to build /etc/init.d/ scripts.
  333.   #               This file should be used to construct scripts for /etc/init.d.
  334.   #
  335.   #               Written by Miquel van Smoorenburg <miquels@cistron.nl>.
  336.   #               Modified for Debian GNU/Linux
  337.   #               by Ian Murdock <imurdock@gnu.ai.mit.edu>.
  338.   #
  339.   # Version:      @(#)skeleton  1.6  11-Nov-1996  miquels@cistron.nl
  340.   #
  341.  
  342.   PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:
  343.   PPPAPP=/home/slave/ppp
  344.   ROUTEAPP=/home/slave/route
  345.   PPPD=/usr/sbin/pppd
  346.   NAME=VPN
  347.   REDIR=/usr/local/bin/pty-redir
  348.   SSH=/usr/bin/ssh
  349.   MYPPPIP=192.168.0.1
  350.   TARGETIP=192.168.0.2
  351.   TARGETNET=193.6.37.0
  352.   MYNET=193.6.35.0
  353.   SLAVEWALL=polanski-out
  354.   SLAVEACC=slave
  355.  
  356.   test -f $PPPD || exit 0
  357.  
  358.   set -e
  359.  
  360.   case "$1" in
  361.     start)
  362.           echo setting up vpn
  363.           $REDIR $SSH -o 'Batchmode yes' -t -l $SLAVEACC $SLAVEWALL sudo $PPPAPP >/tmp/device
  364.           TTYNAME=`cat /tmp/device`
  365.   echo tty is $TTYNAME
  366.           sleep 10s
  367.           if [ ! -z $TTYNAME ]
  368.           then
  369.           $PPPD $TTYNAME ${MYPPPIP}:${TARGETIP}
  370.           else
  371.                   echo FAILED!
  372.                   logger "vpn setup failed"
  373.           fi
  374.           sleep 5s
  375.           route add -net $TARGETNET gw $TARGETIP
  376.           $SSH -o 'Batchmode yes' -l $SLAVEACC $SLAVEWALL sudo $ROUTEAPP
  377.       ;;
  378.     stop)
  379.           ps -ax | grep "ssh -t -l $SLAVEACC " | grep -v grep | awk '{print $1}' | xargs kill
  380.       ;;
  381.     *)
  382.       # echo "Usage: /etc/init.d/$NAME {start|stop|reload}"
  383.       echo "Usage: /etc/init.d/$NAME {start|stop}"
  384.       exit 1
  385.       ;;
  386.   esac
  387.  
  388.   exit 0
  389.  
  390.  
  391.  
  392.  
  393.   The slave uses one script for routing setup (/usr/local/vpn/route):
  394.  
  395.  
  396.  
  397.   #!/bin/bash
  398.   /sbin/route add -net 193.6.35.0 gw 192.168.0.1
  399.  
  400.  
  401.  
  402.   and its .ppprc consists of the following:
  403.  
  404.   passive
  405.  
  406.  
  407.  
  408.   5.  Look at what's happening:
  409.  
  410.  
  411.   The master logs in into the slave, starts pppd, and redirects this all
  412.   thing into a local pty. It consists of the following steps:
  413.  
  414.   ╖  allocating a new pty
  415.  
  416.   ╖  sshing into the slave
  417.  
  418.   ╖  running pppd on the slave
  419.  
  420.   ╖  the master runs pppd in this local pty
  421.  
  422.   ╖  and sets up the routing table on the client.
  423.  
  424.   There are (not very tight) timing considerations involved, this is why
  425.   that 'sleep 10s'.
  426.  
  427.   6.  Doing it by hand.
  428.  
  429.  
  430.   6.1.  Logging in
  431.  
  432.  
  433.   You've already tried if ssh works well, aren't you? If the slave
  434.   refuses to log you in, read the logs. Perhaps there are problems with
  435.   file permissions or the sshd setup.
  436.  
  437.   6.2.  Firing up ppp
  438.  
  439.  
  440.   Log in into slave, and issue:
  441.  
  442.   sudo /usr/sbin/pppd passive
  443.  
  444.  
  445.  
  446.  
  447.   You should see garbage coming at this point. If it works good, if not,
  448.   there is some problem either with sudo, either with pppd. Look what
  449.   the commands had said, and at the logs and at the /etc/ppp/options,
  450.   and the .ppprc file.  If it works, write this 'passive' word into
  451.   .ppprc, and try again. To get rid off the garbage and continue
  452.   working, press enter,'~' and '^Z'.  You should have the master's
  453.   prompt now, and kill %1. See the section about tuning if you want to
  454.   know more of the escape character.
  455.  
  456.   6.3.  Together the two
  457.  
  458.  
  459.   Well, then
  460.  
  461.  
  462.  
  463.   ssh -l slave polanski sudo /usr/sbin/pppd
  464.  
  465.  
  466.  
  467.  
  468.   should work also, and deliver the garbage right into your face.
  469.  
  470.   6.4.  Pty redirecting
  471.  
  472.  
  473.   Try to redirect this whole thing this time:
  474.  
  475.   /usr/local/bin/pty-redir /usr/bin/ssh -l slave polanski sudo /usr/sbin/pppd
  476.  
  477.  
  478.  
  479.  
  480.   Nice long sentence isn't it?  You should use the full path into the
  481.   ssh executable, as the pty-redir program allows only this form for
  482.   security reasons.  Now you've got a device name from the program.
  483.   Let's say, you've got /dev/ttyp0  You can use the ps command to look
  484.   what has happened. Look for 'p0'
  485.  
  486.   6.5.  Is anything on the device?
  487.  
  488.  
  489.   Try
  490.  
  491.   /usr/sbin/pppd /dev/ttyp0 local 192.168.0.1:192.168.0.2
  492.  
  493.  
  494.  
  495.  
  496.   to establish the connection. Look at the output of the ifconfig
  497.   command to see if the device has established, and use ping to check
  498.   your virtual net.
  499.  
  500.   6.6.  Setting up the routes
  501.  
  502.  
  503.   Set up the routes on the master host, and on the slave also. Now you
  504.   should be able to ping one host in one intranet from other host in the
  505.   other intranet.  Set up the additional firewalling rules. Now as you
  506.   have the VPN, you can set up the rules concerning the connectivity of
  507.   the two intranets.
  508.  
  509.   7.  Tuning
  510.  
  511.  
  512.   7.1.  Configuration tuning
  513.  
  514.  
  515.   As I said this HOWTO is mainly a quick memo on how I had set up a VPN.
  516.   There are things in the configuration I didn't experiment yet. These
  517.   things will go into their place when I try them, or anyone tells me
  518.   "it works in the following way" The most important thing is that the
  519.   connection ppp uses is not 8-bit yet. I believe it has something to do
  520.   either with ssh configuration or the pty setup. In this configuration
  521.   ssh uses the tilde (~) character as an escape character. It might stop
  522.   or slow down the communication, as any newline-tilde sequence causes
  523.   ssh to give a prompt. Ssh documentation said:  <On most systems,
  524.   setting the escape character to ``none'' will also make the session
  525.   transparent even if a tty is used.> The corresponding flag to ssh is
  526.   '-e', and you can also set it in the configuration file.
  527.  
  528.  
  529.   7.2.  Bandwith vs. cicles
  530.  
  531.  
  532.   Creating anything virtual comes with utilization of real-world
  533.   resources. A VPN eats up bandwidth and computing resources. The goal
  534.   would be to get balance between the two. You can tune it with the '-C'
  535.   switch or the 'CompressionLevel' option. You might try using another
  536.   cipher, but I don't recommend it. Also note that the round-trip-time
  537.   can be longer if you use better compression. Any experiments on it are
  538.   welcome.
  539.  
  540.   8.  Vulnerability analisis
  541.  
  542.  
  543.   I try to cover here the vulnerability issues arising from this
  544.   particular setup and VPNs in general. Any comments are warmly welcome.
  545.  
  546.   ╖  sudo: Well, I'm excessively using sudo. I believe it's still safer
  547.      than using setuid bits. It's still a backdraw of Linux that it
  548.      hasn't got more fine-grained access control. Waiting for POSIX.6
  549.      compatibility <http://www.xarius.demon.co.uk/software/posix6/>.
  550.      What is worse, there are shell scripts which are getting called
  551.      through sudo. Bad enough. Any idea out there?
  552.  
  553.   ╖  pppd: It runs suid root also. It can be configured by user's
  554.      .ppprc. There might be some nice buffer overruns in it. The bottom
  555.      line: secure your slave account as tightly as you can.
  556.  
  557.   ╖  ssh: Beware that ssh older than 1.2.20 has security holes. What is
  558.      worse, we made a configuration such when the master account had
  559.      been compromised, the slave account is also compromised, and wide
  560.      open to attacks using the two sudoed programs. It is because I've
  561.      choosen not to have password on the master's secret key to enable
  562.      automatic setup of the VPN.
  563.  
  564.   ╖  firewall: With inproperly set firewall rules on one bastion, you
  565.      open both of the intranets. I recommend using IP masquerading (as
  566.      setting up incorrect routes is a bit less trivial), and doing hard
  567.      control on the VPN interfaces.
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.