EXAMPLES
Control Files - To illustrate the user-specific access control mechanisms, let us consider a typical user named bob. Normally, as long as bob can authenticate himself, the authpf program will load the appropriate rules. Enter the /etc/authpf/banned/ directory. If bob has somehow fallen from grace in the eyes of the powers-that-be, they can prohibit him from using the gateway by creating the file /etc/authpf/banned/bob containing a message about why he has been banned from using the network. Once bob has done suitable penance, his access may be restored by moving or removing the file /etc/authpf/banned/bob. Now consider a workgroup containing alice, bob, carol and dave. They have a wireless network which they would like to protect from unauthorized use. To accomplish this, they create the file /etc/authpf/authpf.allow which lists their login ids, one per line. At this point, even if eve could authenticate to sshd(8), she would not be allowed to use the gateway. Adding and removing users from the work group is a simple matter of maintaining a list of allowed userids. If bob once again manages to annoy the powers-that-be, they can ban him from using the gateway by creating the familiar /etc/authpf/banned/bob file. Though bob is listed in the allow file, he is prevented from using this gateway due to the existence of a ban file.
Distributed Authentication - It is often desirable to interface with a distributed password system rather than forcing the sysadmins to keep a large number of local password files in sync. The login.conf(5) mechanism in
.Ox can be used to fork the right shell. To make that happen, login.conf(5) should have entries that look something like this:
shell-default:shell=/bin/csh
default:\
...
:shell=/usr/sbin/authpf
daemon:\
...
:shell=/bin/csh:\
:tc=default:
staff:\
...
:shell=/bin/csh:\
:tc=default:
Using a default password file, all users will get authpf as their shell except for root who will get /bin/csh.
SSH Configuration - As stated earlier, sshd(8) must be properly configured to detect and defeat network attacks. To that end, the following options should be added to sshd_config(5):
Protocol 2
ClientAliveInterval 15
ClientAliveCountMax 3
This ensures that unresponsive or spoofed sessions are terminated within a minute, since a hijacker should not be able to spoof ssh keepalive messages.
Banners - Once authenticated, the user is shown the contents of /etc/authpf/authpf.message. This message may be a screen-full of the appropriate use policy, the contents of /etc/motd or something as simple as the following:
This means you will be held accountable by the powers that be
for traffic originating from your machine, so please play nice.
To tell the user where to go when the system is broken, /etc/authpf/authpf.problem could contain something like this:
Sorry, there appears to be some system problem. To report this
problem so we can fix it, please phone 1-900-314-1597 or send
an email to remove@bulkmailerz.net.
Packet Filter Rules - In areas where this gateway is used to protect a wireless network (a hub with several hundred ports), the default rule set as well as the per-user rules should probably allow very few things beyond encrypted protocols like ssh(1), ssl(8), or ipsec(4). On a securely switched network, with plug-in jacks for visitors who are given authentication accounts, you might want to allow out everything. In this context, a secure switch is one that tries to prevent address table overflow attacks.
Example /etc/pf.conf:
# by default we allow internal clients to talk to us using
# ssh and use us as a dns server.
internal_if="fxp1"
gateway_addr="10.0.1.1"
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
block in on $internal_if from any to any
pass in quick on $internal_if proto tcp from any to $gateway_addr \
port = ssh
pass in quick on $internal_if proto udp from any to $gateway_addr \
port = domain
anchor "authpf/*"
For a switched, wired net - This example /etc/authpf/authpf.rules makes no real restrictions; it turns the IP address on and off, logging TCP connections.
external_if = "xl0"
internal_if = "fxp0"
pass in log quick on $internal_if proto tcp from $user_ip to any \
keep state
pass in quick on $internal_if from $user_ip to any
For a wireless or shared net - This example /etc/authpf/authpf.rules could be used for an insecure network (such as a public wireless network) where we might need to be a bit more restrictive.
internal_if="fxp1"
ipsec_gw="10.2.3.4"
# rdr ftp for proxying by ftp-proxy(8)
rdr on $internal_if proto tcp from $user_ip to any port 21 \
-> 127.0.0.1 port 8081
# allow out ftp, ssh, www and https only, and allow user to negotiate
# ipsec with the ipsec server.
pass in log quick on $internal_if proto tcp from $user_ip to any \
port { 21, 22, 80, 443 } flags S/SA
pass in quick on $internal_if proto tcp from $user_ip to any \
port { 21, 22, 80, 443 }
pass in quick proto udp from $user_ip to $ipsec_gw port = isakmp \
keep state
pass in quick proto esp from $user_ip to $ipsec_gw
Dealing with NAT - The following /etc/authpf/authpf.rules shows how to deal with NAT, using tags:
ext_if = "fxp1"
ext_addr = 129.128.11.10
int_if = "fxp0"
# nat and tag connections...
nat on $ext_if from $user_ip to any tag $user_ip -> $ext_addr
pass in quick on $int_if from $user_ip to any
pass out log quick on $ext_if tagged $user_ip keep state
With the above rules added by authpf, outbound connections corresponding to each users NATed connections will be logged as in the example below, where the user may be identified from the ruleset name.
# tcpdump -n -e -ttt -i pflog0
Oct 31 19:42:30.296553 rule 0.bbeck(20267).1/0(match): pass out on fxp1: \
129.128.11.10.60539 > 198.137.240.92.22: S 2131494121:2131494121(0) win \
16384 <mss 1460,nop,nop,sackOK> (DF)
Using the authpf_users table - Simple authpf settings can be implemented without an anchor by just using the "authpf_users" table. For example, the following pf.conf(5) lines will give SMTP and IMAP access to logged in users:
table <authpf_users> persist
pass in on $ext_if proto tcp from <authpf_users> \
to port { smtp imap } keep state
It is also possible to use the "authpf_users" table in combination with anchors. For example, pf(4) processing can be sped up by looking up the anchor only for packets coming from logged in users:
table <authpf_users> persist
anchor "authpf/*" from <authpf_users>
rdr-anchor "authpf/*" from <authpf_users>
FILES