aboutsummaryrefslogtreecommitdiff
path: root/en_US.ISO8859-1/books/handbook/security
diff options
context:
space:
mode:
Diffstat (limited to 'en_US.ISO8859-1/books/handbook/security')
-rw-r--r--en_US.ISO8859-1/books/handbook/security/chapter.xml3513
1 files changed, 1597 insertions, 1916 deletions
diff --git a/en_US.ISO8859-1/books/handbook/security/chapter.xml b/en_US.ISO8859-1/books/handbook/security/chapter.xml
index 0beccf251e..df1fa9b1d0 100644
--- a/en_US.ISO8859-1/books/handbook/security/chapter.xml
+++ b/en_US.ISO8859-1/books/handbook/security/chapter.xml
@@ -24,31 +24,27 @@
<sect1 id="security-synopsis">
<title>Synopsis</title>
- <para>This chapter will provide a basic introduction to system
+ <para>This chapter provides a basic introduction to system
security concepts, some general good rules of thumb, and some
- advanced topics under &os;. A lot of the topics covered here
- can be applied to system and Internet security in general as
- well. The Internet is no longer a <quote>friendly</quote> place
- in which everyone wants to be your kind neighbor. Securing your
- system is imperative to protect your data, intellectual
+ advanced topics under &os;. Many of the topics covered here
+ can be applied to system and Internet security in general.
+ Securing a system is imperative to protect data, intellectual
property, time, and much more from the hands of hackers and the
like.</para>
- <para>&os; provides an array of utilities and mechanisms to ensure
- the integrity and security of your system and network.</para>
+ <para>&os; provides an array of utilities and mechanisms to
+ protect the integrity and security of the system and
+ network.</para>
<para>After reading this chapter, you will know:</para>
<itemizedlist>
<listitem>
- <para>Basic system security concepts, in respect to
- &os;.</para>
+ <para>Basic &os; system security concepts.</para>
</listitem>
<listitem>
- <para>About the various crypt mechanisms available in &os;,
- such as <acronym>DES</acronym> and
- <acronym>MD5</acronym>.</para>
+ <para>The various crypt mechanisms available in &os;.</para>
</listitem>
<listitem>
@@ -57,45 +53,46 @@
<listitem>
<para>How to configure <acronym>TCP</acronym> Wrappers for use
- with <application>inetd</application>.</para>
+ with &man.inetd.8;.</para>
</listitem>
<listitem>
- <para>How to set up <application>Kerberos5</application> on
+ <para>How to set up <application>Kerberos</application> on
&os;.</para>
</listitem>
<listitem>
<para>How to configure IPsec and create a
- <acronym>VPN</acronym> between &os;/&windows;
- machines.</para>
+ <acronym>VPN</acronym>.</para>
</listitem>
<listitem>
<para>How to configure and use
- <application>OpenSSH</application>, &os;'s
- <acronym>SSH</acronym> implementation.</para>
+ <application>OpenSSH</application> on &os;.</para>
+ </listitem>
+
+ <listitem>
+ <para>How to use filesystem <acronym>ACL</acronym>s.</para>
</listitem>
<listitem>
- <para>What file system <acronym>ACL</acronym>s are and how to
- use them.</para>
+ <para>How to use <application>portaudit</application> to
+ audit third party software packages installed from the
+ Ports Collection.</para>
</listitem>
<listitem>
- <para>How to use the <application>Portaudit</application>
- utility to audit third party software packages installed
- from the Ports Collection.</para>
+ <para>How to utilize &os; security advisories.</para>
</listitem>
<listitem>
- <para>How to utilize the &os; security advisories
- publications.</para>
+ <para>What Process Accounting is and how to enable it on
+ &os;.</para>
</listitem>
<listitem>
- <para>Have an idea of what Process Accounting is and how to
- enable it on &os;.</para>
+ <para>Understand the resource limits database and
+ how to utilize it to control user resources.</para>
</listitem>
</itemizedlist>
@@ -107,36 +104,26 @@
</listitem>
</itemizedlist>
- <para>Additional security topics are covered throughout this book.
- For example, Mandatory Access Control is discussed in <xref
- linkend="mac"/> and Internet Firewalls are discussed in <xref
- linkend="firewalls"/>.</para>
+ <para>Additional security topics are covered elsewhere in this
+ Handbook. For example, Mandatory Access Control is discussed in
+ <xref linkend="mac"/> and Internet firewalls are discussed in
+ <xref linkend="firewalls"/>.</para>
</sect1>
<sect1 id="security-intro">
<title>Introduction</title>
<para>Security is a function that begins and ends with the system
- administrator. While all BSD &unix; multi-user systems have
- some inherent security, the job of building and maintaining
- additional security mechanisms to keep those users
- <quote>honest</quote> is probably one of the single largest
- undertakings of the sysadmin. Machines are only as secure as
- you make them, and security concerns are ever competing with the
- human necessity for convenience. &unix; systems, in general,
- are capable of running a huge number of simultaneous processes
- and many of these processes operate as servers &mdash; meaning
- that external entities can connect and talk to them. As
- yesterday's mini-computers and mainframes become today's
- desktops, and as computers become networked and inter-networked,
- security becomes an even bigger issue.</para>
+ administrator. While &os; provides some inherent security, the
+ job of configuring and maintaining additional security
+ mechanisms is probably one of the single largest undertakings of
+ the sysadmin.</para>
<para>System security also pertains to dealing with various forms
of attack, including attacks that attempt to crash, or otherwise
make a system unusable, but do not attempt to compromise the
- <username>root</username> account (<quote>break root</quote>).
- Security concerns can be split up into several
- categories:</para>
+ <username>root</username> account. Security concerns can be
+ split up into several categories:</para>
<orderedlist>
<listitem>
@@ -148,7 +135,7 @@
</listitem>
<listitem>
- <para>Root compromise through accessible servers.</para>
+ <para>Root compromise through accessible services.</para>
</listitem>
<listitem>
@@ -171,50 +158,36 @@
</indexterm>
<indexterm><primary>Denial of Service (DoS)</primary></indexterm>
- <para>A denial of service attack is an action that deprives the
- machine of needed resources. Typically, DoS attacks are
- brute-force mechanisms that attempt to crash or otherwise make a
- machine unusable by overwhelming its servers or network stack.
- Some DoS attacks try to take advantage of bugs in the networking
- stack to crash a machine with a single packet. The latter can
- only be fixed by applying a bug fix to the kernel. Attacks on
- servers can often be fixed by properly specifying options to
+ <para>A Denial of Service <acronym>DoS</acronym> attack is an
+ action that deprives the machine of needed resources.
+ Typically, <acronym>DoS</acronym> attacks are brute-force
+ mechanisms that attempt to crash or otherwise make a machine
+ unusable by overwhelming its services or network stack. Attacks
+ on servers can often be fixed by properly specifying options to
limit the load the servers incur on the system under adverse
conditions. Brute-force network attacks are harder to deal
- with. A spoofed-packet attack, for example, is nearly
- impossible to stop, short of cutting your system off from the
- Internet. It may not be able to take your machine down, but it
- can saturate your Internet connection.</para>
+ with. This type of attack may not be able to take the machine
+ down, but it can saturate the Internet connection.</para>
<indexterm>
<primary>security</primary>
<secondary>account compromises</secondary>
</indexterm>
- <para>A user account compromise is even more common than a DoS
- attack. Many sysadmins still run standard
- <application>telnetd</application>,
- <application>rlogind</application>,
- <application>rshd</application>, and
- <application>ftpd</application> servers on their machines.
- These servers, by default, do not operate over encrypted
- connections. The result is that if you have any moderate-sized
- user base, one or more of your users logging into your system
- from a remote location (which is the most common and convenient
- way to login to a system) will have his or her password sniffed.
- The attentive system admin will analyze his remote access logs
- looking for suspicious source addresses even for successful
- logins.</para>
-
- <para>One must always assume that once an attacker has access to a
- user account, the attacker can break <username>root</username>.
- However, the reality is that in a well secured and maintained
- system, access to a user account does not necessarily give the
- attacker access to <username>root</username>. The distinction
- is important because without access to <username>root</username>
- the attacker cannot generally hide his tracks and may, at best,
- be able to do nothing more than mess with the user's files, or
- crash the machine. User account compromises are very common
+ <para>A user account compromise is more common than a
+ <acronym>DoS</acronym> attack. Many sysadmins still run
+ unencrypted services, meaning that users logging into the
+ system from a remote location are vulnerable to having their
+ password sniffed. The attentive sysadmin analyzes the remote
+ access logs looking for suspicious source addresses and
+ suspicious logins.</para>
+
+ <para>In a well secured and maintained system, access to a user
+ account does not necessarily give the attacker access to
+ <username>root</username>. Without <username>root</username>
+ access, the attacker cannot generally hide his tracks and may,
+ at best, be able to do nothing more than mess with the user's
+ files or crash the machine. User account compromises are common
because users tend not to take the precautions that sysadmins
take.</para>
@@ -223,27 +196,14 @@
<secondary>backdoors</secondary>
</indexterm>
- <para>System administrators must keep in mind that there are
- potentially many ways to break <username>root</username> on a
- machine. The attacker may know the <username>root</username>
- password, the attacker may find a bug in a root-run server and
- be able to break <username>root</username> over a network
- connection to that server, or the attacker may know of a bug in
- a suid-root program that allows the attacker to break
- <username>root</username> once he has broken into a user's
- account. If an attacker has found a way to break
- <username>root</username> on a machine, the attacker may not
- have a need to install a backdoor. Many of the
- <username>root</username> holes found and closed to date involve
- a considerable amount of work by the attacker to cleanup after
- himself, so most attackers install backdoors. A backdoor
- provides the attacker with a way to easily regain
- <username>root</username> access to the system, but it also
- gives the smart system administrator a convenient way to detect
- the intrusion. Making it impossible for an attacker to install
- a backdoor may actually be detrimental to your security, because
- it will not close off the hole the attacker found to break in
- the first place.</para>
+ <para>There are potentially many ways to break
+ <username>root</username>: the attacker may know the
+ <username>root</username> password, the attacker may exploit a
+ bug in a service which runs as <username>root</username>, or the
+ attacker may know of a bug in a SUID-root program. An attacker
+ may utilize a program known as a backdoor to search for
+ vulnerable systems, take advantage of unpatched exploits to
+ access a system, and hide traces of illegal activity.</para>
<para>Security remedies should always be implemented with a
multi-layered <quote>onion peel</quote> approach and can be
@@ -251,26 +211,26 @@
<orderedlist>
<listitem>
- <para>Securing <username>root</username> and staff
+ <para>Secure <username>root</username> and staff
accounts.</para>
</listitem>
<listitem>
- <para>Securing <username>root</username>&ndash;run servers
- and suid/sgid binaries.</para>
+ <para>Secure <username>root</username>&ndash;run servers
+ and SUID/SGID binaries.</para>
</listitem>
<listitem>
- <para>Securing user accounts.</para>
+ <para>Secure user accounts.</para>
</listitem>
<listitem>
- <para>Securing the password file.</para>
+ <para>Secure the password file.</para>
</listitem>
<listitem>
- <para>Securing the kernel core, raw devices, and
- file systems.</para>
+ <para>Secure the kernel core, raw devices, and
+ filesystems.</para>
</listitem>
<listitem>
@@ -283,8 +243,7 @@
</listitem>
</orderedlist>
- <para>The next section of this chapter will cover the above bullet
- items in greater depth.</para>
+ <para>The next section covers these items in greater depth.</para>
</sect1>
<sect1 id="securing-freebsd">
@@ -295,254 +254,137 @@
<secondary>securing &os;</secondary>
</indexterm>
- <note>
- <title>Command Versus Protocol</title>
-
- <para>Throughout this document, we will use
- <application>bold</application> text to refer to an
- application, and a <command>monospaced</command> font to refer
- to specific commands. Protocols will use a normal font. This
- typographical distinction is useful for instances such as ssh,
- since it is a protocol as well as command.</para>
- </note>
-
- <para>The sections that follow will cover the methods of securing
- your &os; system that were mentioned in the <link
- linkend="security-intro">last section</link> of this
- chapter.</para>
+ <para>This section describes methods for securing a &os; system
+ against the attacks that were mentioned in the <link
+ linkend="security-intro">previous section</link>.</para>
<sect2 id="securing-root-and-staff">
- <title>Securing the <username>root</username> Account and
- Staff Accounts</title>
+ <title>Securing the <username>root</username> Account</title>
<indexterm>
- <primary><command>su</command></primary>
+ <primary>&man.su.1;</primary>
</indexterm>
- <para>First off, do not bother securing staff accounts if you
- have not secured the <username>root</username> account. Most
+ <para>Most
systems have a password assigned to the
- <username>root</username> account. The first thing you do is
- assume that the password is <emphasis>always</emphasis>
- compromised. This does not mean that you should remove the
- password. The password is almost always necessary for console
- access to the machine. What it does mean is that you should
- not make it possible to use the password outside of the
- console or possibly even with the &man.su.1; command. For
- example, make sure that your ptys are specified as being
- insecure in the <filename>/etc/ttys</filename> file so that
- direct <username>root</username> logins via
- <command>telnet</command> or <command>rlogin</command> are
- disallowed. If using other login services such as
- <application>sshd</application>, make sure that direct
- <username>root</username> logins are disabled there as well.
- You can do this by editing your
- <filename>/etc/ssh/sshd_config</filename> file, and making
- sure that <literal>PermitRootLogin</literal> is set to
- <literal>no</literal>. Consider every access method &mdash;
- services such as FTP often fall through the cracks. Direct
- <username>root</username> logins should only be allowed via
- the system console.</para>
+ <username>root</username> account. Assume that this password
+ is <emphasis>always</emphasis> at risk of being compromised.
+ This does not mean that the password should be disabled as the
+ password is almost always necessary for console access to the
+ machine. However, it should not be possible to use this
+ password outside of the console or possibly even with
+ &man.su.1;. For example, setting the entries in
+ <filename>/etc/ttys</filename> to <literal>insecure</literal>
+ prevents <username>root</username> logins to the specified
+ terminals. In &os;, <username>root</username> logins using
+ &man.ssh.1; are disabled by default as
+ <literal>PermitRootLogin</literal> is set to
+ <literal>no</literal> in
+ <filename>/etc/ssh/sshd_config</filename>. Consider every
+ access method as services such as FTP often fall through the
+ cracks. Direct <username>root</username> logins should only
+ be allowed via the system console.</para>
<indexterm>
<primary><groupname>wheel</groupname></primary>
</indexterm>
- <para>Of course, as a sysadmin you have to be able to get to
- <username>root</username>, so we open up a few holes. But we
- make sure these holes require additional password verification
- to operate. One way to make <username>root</username>
- accessible is to add appropriate staff accounts to the
- <groupname>wheel</groupname> group (in
- <filename>/etc/group</filename>). The staff members placed in
- the <groupname>wheel</groupname> group are allowed to
- <command>su</command> to <username>root</username>. You
- should never give staff members native
- <groupname>wheel</groupname> access by putting them in the
- <groupname>wheel</groupname> group in their password entry.
- Staff accounts should be placed in a
- <groupname>staff</groupname> group, and then added to the
- <groupname>wheel</groupname> group via the
- <filename>/etc/group</filename> file. Only those staff
- members who actually need to have <username>root</username>
- access should be placed in the <groupname>wheel</groupname>
- group. It is also possible, when using an authentication
- method such as Kerberos, to use Kerberos'
- <filename>.k5login</filename> file in the
- <username>root</username> account to allow a &man.ksu.1; to
- <username>root</username> without having to place anyone at
- all in the <groupname>wheel</groupname> group. This may be
- the better solution since the <groupname>wheel</groupname>
- mechanism still allows an intruder to break
- <username>root</username> if the intruder has gotten hold of
- your password file and can break into a staff account. While
- having the <groupname>wheel</groupname> mechanism is better
- than having nothing at all, it is not necessarily the safest
- option.</para>
-
- <para>To lock an account completely, the &man.pw.8; command
- should be used:</para>
+ <para>Since a sysadmin needs access to
+ <username>root</username>, additional password verification
+ should be configured. One method is to add appropriate user
+ accounts to <groupname>wheel</groupname> in
+ <filename>/etc/group</filename>. Members of
+ <groupname>wheel</groupname> are allowed to &man.su.1; to
+ <username>root</username>. Only those users who actually need
+ to have <username>root</username> access should be placed in
+ <groupname>wheel</groupname>. When using Kerberos for
+ authentication, create a <filename>.k5login</filename> in
+ the home directory of <username>root</username> to allow
+ &man.ksu.1; to be used without having to place anyone in
+ <groupname>wheel</groupname>.</para>
+
+ <para>To lock an account completely, use &man.pw.8;:</para>
<screen>&prompt.root; <userinput>pw lock <replaceable>staff</replaceable></userinput></screen>
- <para>This will prevent the user from logging in using any
- mechanism, including &man.ssh.1;.</para>
+ <para>This will prevent the specified user from logging in using
+ any mechanism, including &man.ssh.1;.</para>
<para>Another method of blocking access to accounts would be to
replace the encrypted password with a single
<quote><literal>*</literal></quote> character. This character
- would never match the encrypted password and thus block user
- access. For example, the following staff account:</para>
+ would never match the encrypted password and thus blocks user
+ access. For example, the entry for the following
+ account:</para>
<programlisting>foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting>
- <para>Should be changed to this:</para>
+ <para>could be changed to this using &man.vipw.8;:</para>
<programlisting>foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh</programlisting>
- <para>This will prevent the <username>foobar</username> user
- from logging in using conventional methods. This method for
- access restriction is flawed on sites using
+ <para>This prevents <username>foobar</username> from logging in
+ using conventional methods. This method for access
+ restriction is flawed on sites using
<application>Kerberos</application> or in situations where the
user has set up keys with &man.ssh.1;.</para>
- <para>These security mechanisms also assume that you are logging
+ <para>These security mechanisms assume that users are logging
in from a more restrictive server to a less restrictive
- server. For example, if your main box is running all sorts of
- servers, your workstation should not be running any. In order
- for your workstation to be reasonably secure you should run as
- few servers as possible, up to and including no servers at
- all, and you should run a password-protected screen blanker.
- Of course, given physical access to a workstation an attacker
- can break any sort of security you put on it. This is
- definitely a problem that you should consider, but you should
- also consider the fact that the vast majority of break-ins
- occur remotely, over a network, from people who do not have
- physical access to your workstation or servers.</para>
-
- <para>Using something like Kerberos also gives you the ability
- to disable or change the password for a staff account in one
- place, and have it immediately affect all the machines on
- which the staff member may have an account. If a staff
- member's account gets compromised, the ability to instantly
- change his password on all machines should not be underrated.
- With discrete passwords, changing a password on N machines can
- be a mess. You can also impose re-passwording restrictions
- with Kerberos: not only can a Kerberos ticket be made to
- timeout after a while, but the Kerberos system can require
- that the user choose a new password after a certain period of
- time (say, once a month).</para>
+ server. For example, if the server is running network
+ services, the workstation should not be running any. In
+ order for a workstation to be reasonably secure, run zero or
+ as few services as possible and run a password-protected
+ screensaver. Of course, given physical access to any system,
+ an attacker can break any sort of security. Fortunately,
+ many break-ins occur remotely, over a network, from people who
+ do not have physical access to the system.</para>
+
+ <para>Using Kerberos provides the ability to disable or change
+ the password for a user in one place, and have it immediately
+ affect all the machines on which the user has an account. If
+ an account is compromised, the ability to instantly change the
+ associated password on all machines should not be underrated.
+ Additional restrictions can be imposed with Kerberos: a
+ Kerberos ticket can be configured to timeout and the Kerberos
+ system can require that the user choose a new password after a
+ configurable period of time.</para>
</sect2>
<sect2>
<title>Securing Root-run Servers and SUID/SGID Binaries</title>
<indexterm>
- <primary><command>ntalk</command></primary>
- </indexterm>
- <indexterm>
- <primary><command>comsat</command></primary>
- </indexterm>
- <indexterm>
- <primary><command>finger</command></primary>
- </indexterm>
- <indexterm>
<primary>sandboxes</primary>
</indexterm>
<indexterm>
- <primary><application>sshd</application></primary>
- </indexterm>
- <indexterm>
- <primary><application>telnetd</application></primary>
- </indexterm>
- <indexterm>
- <primary><application>rshd</application></primary>
- </indexterm>
- <indexterm>
- <primary><application>rlogind</application></primary>
- </indexterm>
-
- <para>The prudent sysadmin only runs the servers he needs to, no
- more, no less. Be aware that third party servers are often
- the most bug-prone. For example, running an old version of
- <application>imapd</application> or
- <application>popper</application> is like giving a universal
- <username>root</username> ticket out to the entire world.
- Never run a server that you have not checked out carefully.
- Many servers do not need to be run as
- <username>root</username>. For example, the
- <application>ntalk</application>,
- <application>comsat</application>, and
- <application>finger</application> daemons can be run in
- special user <firstterm>sandboxes</firstterm>. A sandbox is
- not perfect, unless you go through a large amount of trouble,
- but the onion approach to security still stands: If someone is
- able to break in through a server running in a sandbox, they
- still have to break out of the sandbox. The more layers the
- attacker must break through, the lower the likelihood of his
- success. Root holes have historically been found in virtually
- every server ever run as <username>root</username>, including
- basic system servers. If you are running a machine through
- which people only login via <application>sshd</application>
- and never login via <application>telnetd</application> or
- <application>rshd</application> or
- <application>rlogind</application>, then turn off those
- services!</para>
-
- <para>&os; now defaults to running
- <application>ntalkd</application>,
- <application>comsat</application>, and
- <application>finger</application> in a sandbox. Another
- program which may be a candidate for running in a sandbox is
- &man.named.8;. <filename>/etc/defaults/rc.conf</filename>
- includes the arguments necessary to run
- <application>named</application> in a sandbox in a
- commented-out form. Depending on whether you are installing a
- new system or upgrading an existing system, the special user
- accounts used by these sandboxes may not be installed. The
- prudent sysadmin would research and implement sandboxes for
- servers whenever possible.</para>
-
- <indexterm>
- <primary><application>sendmail</application></primary>
+ <primary>&man.sshd.8;</primary>
</indexterm>
- <para>There are a number of other servers that typically do not
- run in sandboxes: <application>sendmail</application>,
- <application>popper</application>,
- <application>imapd</application>,
- <application>ftpd</application>, and others. There are
- alternatives to some of these, but installing them may require
- more work than you are willing to perform (the convenience
- factor strikes again). You may have to run these servers as
- <username>root</username> and rely on other mechanisms to
- detect break-ins that might occur through them.</para>
-
- <para>The other big potential <username>root</username> holes in
- a system are the suid-root and sgid binaries installed on the
- system. Most of these binaries, such as
- <application>rlogin</application>, reside in <filename
- class="directory">/bin</filename>, <filename
- class="directory">/sbin</filename>, <filename
+ <para>The prudent sysadmin only enables required services and is
+ aware that third party servers are often the most bug-prone.
+ Never run a server that has not been checked out carefully.
+ Think twice before running any service as
+ <username>root</username> as many daemons can be run as a
+ separate service account or can be started in a
+ <firstterm>sandbox</firstterm>. Do not activate insecure
+ services such as &man.telnetd.8; or &man.rlogind.8;.</para>
+
+ <para>Another potential security hole is SUID-root and SGID
+ binaries. Most of these binaries, such as &man.rlogin.1;,
+ reside in <filename class="directory">/bin</filename>,
+ <filename class="directory">/sbin</filename>, <filename
class="directory">/usr/bin</filename>, or <filename
class="directory">/usr/sbin</filename>. While nothing is
- 100% safe, the system-default suid and sgid binaries can be
- considered reasonably safe. Still, <username>root</username>
- holes are occasionally found in these binaries. A
- <username>root</username> hole was found in
- <literal>Xlib</literal> in 1998 that made
- <application>xterm</application> (which is typically suid)
- vulnerable. It is better to be safe than sorry and the
- prudent sysadmin will restrict suid binaries, that only staff
- should run, to a special group that only staff can access, and
- get rid of (<command>chmod 000</command>) any suid binaries
- that nobody uses. A server with no display generally does not
- need an <application>xterm</application> binary. Sgid
- binaries can be almost as dangerous. If an intruder can break
- an sgid-kmem binary, the intruder might be able to read
+ 100% safe, the system-default SUID and SGID binaries can be
+ considered reasonably safe. It is recommended to restrict
+ SUID binaries to a special group that only staff can access,
+ and to delete any unused SUID binaries. SGID binaries can be
+ almost as dangerous. If an intruder can break an SGID-kmem
+ binary, the intruder might be able to read
<filename>/dev/kmem</filename> and thus read the encrypted
- password file, potentially compromising any passworded
- account. Alternatively an intruder who breaks group
+ password file, potentially compromising user accounts.
+ Alternatively, an intruder who breaks group
<literal>kmem</literal> can monitor keystrokes sent through
ptys, including ptys used by users who login through secure
methods. An intruder that breaks the
@@ -558,226 +400,198 @@
<title>Securing User Accounts</title>
<para>User accounts are usually the most difficult to secure.
- While you can impose draconian access restrictions on your
- staff and <quote>star</quote> out their passwords, you may not
- be able to do so with any general user accounts you might
- have. If you do have sufficient control, then you may win out
- and be able to secure the user accounts properly. If not, you
- simply have to be more vigilant in your monitoring of those
- accounts. Use of ssh and Kerberos for user accounts is more
- problematic, due to the extra administration and technical
- support required, but still a very good solution compared to a
- encrypted password file.</para>
+ Be vigilant in the monitoring of user accounts. Use of
+ &man.ssh.1; and Kerberos for user accounts requires extra
+ administration and technical support, but provides a good
+ solution compared to an encrypted password file.</para>
</sect2>
<sect2>
<title>Securing the Password File</title>
<para>The only sure fire way is to star out as many passwords as
- you can and use ssh or Kerberos for access to those accounts.
- Even though the encrypted password file
+ possible and use &man.ssh.1; or Kerberos for access to those
+ accounts. Even though the encrypted password file
(<filename>/etc/spwd.db</filename>) can only be read by
<username>root</username>, it may be possible for an intruder
to obtain read access to that file even if the attacker cannot
obtain root-write access.</para>
- <para>Your security scripts should always check for and report
- changes to the password file (see the <link
+ <para>Security scripts should be used to check for and report
+ changes to the password file as described in the <link
linkend="security-integrity">Checking file integrity</link>
- section below).</para>
+ section.</para>
</sect2>
<sect2>
<title>Securing the Kernel Core, Raw Devices, and
- File Systems</title>
-
- <para>If an attacker breaks <username>root</username> he can do
- just about anything, but there are certain conveniences. For
- example, most modern kernels have a packet sniffing device
- driver built in. Under &os; it is called the
- <devicename>bpf</devicename> device. An intruder will
- commonly attempt to run a packet sniffer on a compromised
- machine. You do not need to give the intruder the capability
- and most systems do not have the need for the
- <devicename>bpf</devicename> device compiled in.</para>
+ Filesystems</title>
+
+ <para>Most modern kernels have a packet sniffing device driver
+ built in. Under &os; it is called
+ <devicename>bpf</devicename>. This device is needed for DHCP,
+ but can be removed in the custom kernel configuration file of
+ systems that do not provide or use DHCP.</para>
<indexterm>
- <primary><command>sysctl</command></primary>
+ <primary>&man.sysctl.8;</primary>
</indexterm>
- <para>But even if you turn off the <devicename>bpf</devicename>
- device, you still have <filename>/dev/mem</filename> and
- <filename>/dev/kmem</filename> to worry about. For that
- matter, the intruder can still write to raw disk devices.
- Also, there is another kernel feature called the module
- loader, &man.kldload.8;. An enterprising intruder can use a
- KLD module to install his own <devicename>bpf</devicename>
- device, or other sniffing device, on a running kernel. To
- avoid these problems you have to run the kernel at a higher
- secure level, at least securelevel 1.</para>
-
- <para>The secure level of the kernel can be set in a variety of
- ways. The simplest way of raising the secure level of a
- running kernel is through a <command>sysctl</command> on the
- <varname>kern.securelevel</varname> kernel variable:</para>
+ <para>Even if <devicename>bpf</devicename> is disabled,
+ <filename>/dev/mem</filename> and
+ <filename>/dev/kmem</filename> are still problematic. An
+ intruder can still write to raw disk devices. An enterprising
+ intruder can use &man.kldload.8; to install his own
+ <devicename>bpf</devicename>, or another sniffing device, on a
+ running kernel. To avoid these problems, run the kernel at a
+ higher security level, at least security level 1.</para>
+
+ <para>The security level of the kernel can be set in a variety
+ of ways. The simplest way of raising the security level of a
+ running kernel is to set
+ <varname>kern.securelevel</varname>:</para>
<screen>&prompt.root; <userinput>sysctl kern.securelevel=<replaceable>1</replaceable></userinput></screen>
- <para>By default, the &os; kernel boots with a secure level of
- -1. The secure level will remain at -1 unless it is altered,
- either by the administrator or by &man.init.8; because of a
- setting in the start up scripts. The secure level may be
- raised during system startup by setting the
- <varname>kern_securelevel_enable</varname> variable to
- <literal>YES</literal> in the
- <filename>/etc/rc.conf</filename> file, and the value of the
- <varname>kern_securelevel</varname> variable to the desired
- secure level.</para>
-
- <para>The default secure level of a &os; system right after the
- startup scripts are done is -1. This is called
- <quote>insecure mode</quote> because immutable file flags may
- be turned off, all devices may be read from or written to, and
- so on.</para>
-
- <para>Once the secure level is set to 1 or a higher value, the
+ <para>By default, the &os; kernel boots with a security level of
+ -1. This is called <quote>insecure mode</quote> because
+ immutable file flags may be turned off and all devices may be
+ read from or written to. The security level will remain at -1
+ unless it is altered, either by the administrator or by
+ &man.init.8;, because of a setting in the startup scripts.
+ The security level may be raised during system startup by
+ setting
+ <varname>kern_securelevel_enable</varname> to
+ <literal>YES</literal> in <filename>/etc/rc.conf</filename>,
+ and the value of <varname>kern_securelevel</varname> to the
+ desired security level.</para>
+
+ <para>Once the security level is set to 1 or a higher value, the
append-only and immutable files are honored, they cannot be
- turned off, and access to raw devices will be denied. Higher
+ turned off, and access to raw devices is denied. Higher
levels restrict even more operations. For a full description
- of the effect of various secure levels, please read the
- &man.security.7; manual page.</para>
+ of the effect of various security levels, refer to
+ &man.security.7; and &man.init.8;.</para>
<note>
- <para>Bumping the secure level to 1 or higher may cause a few
- problems to X11 (access to <filename>/dev/io</filename> will
- be blocked), or to the installation of &os; built from
- source (the <maketarget>installworld</maketarget> part of
- the process needs to temporarily reset the append-only and
- immutable flags of some files), and in a few other cases.
- Sometimes, as in the case of X11, it may be possible to work
- around this by starting &man.xdm.1; pretty early in the boot
- process, when the securelevel is still low enough.
- Workarounds like this may not be possible for all secure
+ <para>Bumping the security level to 1 or higher may cause a
+ few problems to <application>&xorg;</application>, as access
+ to <filename>/dev/io</filename> will be blocked, or to the
+ installation of &os; built from source as
+ <maketarget>installworld</maketarget> needs to temporarily
+ reset the append-only and immutable flags of some files.
+ In the case of <application>&xorg;</application>, it may be
+ possible to work around this by starting &man.xdm.1; early
+ in the boot process, when the security level is still low
+ enough. Workarounds may not be possible for all secure
levels or for all the potential restrictions they enforce.
A bit of forward planning is a good idea. Understanding the
- restrictions imposed by each secure level is important as
+ restrictions imposed by each security level is important as
they severely diminish the ease of system use. It will also
make choosing a default setting much simpler and prevent any
surprises.</para>
</note>
- <para>If the kernel's secure level is raised to 1 or a higher
+ <para>If the kernel's security level is raised to 1 or a higher
value, it may be useful to set the <literal>schg</literal>
- flag on critical startup binaries, directories, and script
- files (i.e., everything that gets run up to the point where
- the securelevel is set). This might be overdoing it, and
- upgrading the system is much more difficult when it operates
- at a high secure level. A less strict compromise is to run
- the system at a higher secure level but skip setting the
- <literal>schg</literal> flag for every system file and
- directory under the sun. Another possibility is to simply
+ flag on critical startup binaries, directories, script files,
+ and everything that gets run up to the point where the
+ security level is set. A less strict compromise is to run
+ the system at a higher security level but skip setting the
+ <literal>schg</literal> flag. Another possibility is to
mount <filename class="directory">/</filename> and <filename
class="directory">/usr</filename> read-only. It should be
noted that being too draconian about what is permitted may
- prevent the all-important detection of an intrusion.</para>
+ prevent detection of an intrusion.</para>
</sect2>
<sect2 id="security-integrity">
- <title>Checking File Integrity: Binaries, Configuration Files,
- Etc.</title>
-
- <para>When it comes right down to it, you can only protect your
- core system configuration and control files so much before the
- convenience factor rears its ugly head. For example, using
- <command>chflags</command> to set the <literal>schg</literal>
- bit on most of the files in <filename
+ <title>Checking File Integrity</title>
+
+ <para>One can only protect the core system configuration and
+ control files so much before the convenience factor rears its
+ ugly head. For example, using &man.chflags.1; to set the
+ <literal>schg</literal> bit on most of the files in <filename
class="directory">/</filename> and <filename
class="directory">/usr</filename> is probably
counterproductive, because while it may protect the files, it
- also closes a detection window. The last layer of your
- security onion is perhaps the most important &mdash;
- detection. The rest of your security is pretty much useless
- (or, worse, presents you with a false sense of security) if
- you cannot detect potential intrusions. Half the job of the
- onion is to slow down the attacker, rather than stop him, in
- order to be able to catch him in the act.</para>
+ also closes an intrusion detection window. Security measures
+ are useless or, worse, present a false sense of security, if
+ potential intrusions cannot be detected. Half the job of
+ security is to slow down, not stop, an attacker, in order to
+ catch him in the act.</para>
<para>The best way to detect an intrusion is to look for
modified, missing, or unexpected files. The best way to look
- for modified files is from another (often centralized)
- limited-access system. Writing your security scripts on the
- extra-secure limited-access system makes them mostly invisible
- to potential attackers, and this is important. In order to
- take maximum advantage you generally have to give the
- limited-access box significant access to the other machines in
- the business, usually either by doing a read-only NFS export
- of the other machines to the limited-access box, or by setting
- up ssh key-pairs to allow the limited-access box to ssh to the
- other machines. Except for its network traffic, NFS is the
- least visible method &mdash; allowing you to monitor the file
- systems on each client box virtually undetected. If your
- limited-access server is connected to the client boxes through
- a switch, the NFS method is often the better choice. If your
- limited-access server is connected to the client boxes through
- a hub, or through several layers of routing, the NFS method
- may be too insecure (network-wise) and using ssh may be the
- better choice even with the audit-trail tracks that ssh
- lays.</para>
-
- <para>Once you have given a limited-access box at least read
- access to the client systems it is supposed to monitor, you
- must write scripts to do the actual monitoring. Given an NFS
- mount, you can write scripts out of simple system utilities
- such as &man.find.1; and &man.md5.1;. It is best to
- physically md5 the client-box files at least once a day, and
+ for modified files is from another, often centralized,
+ limited-access system. Writing security scripts on the
+ extra-security limited-access system makes them mostly
+ invisible to potential attackers. In order to take maximum
+ advantage, the limited-access box needs significant access to
+ the other machines, usually either through a read-only
+ <acronym>NFS</acronym> export or by setting up
+ &man.ssh.1; key-pairs. Except for its network traffic,
+ <acronym>NFS</acronym> is the least visible method, allowing
+ the administrator to monitor the filesystems on each client
+ box virtually undetected. If a limited-access server is
+ connected to the client boxes through a switch, the
+ <acronym>NFS</acronym> method is often the better choice. If
+ a limited-access server is connected to the client boxes
+ through several layers of routing, the <acronym>NFS</acronym>
+ method may be too insecure and &man.ssh.1; may be the better
+ choice.</para>
+
+ <para>Once a limited-access box has been given at least read
+ access to the client systems it is supposed to monitor, create
+ the monitoring scripts. Given an <acronym>NFS</acronym>
+ mount, write scripts out of simple system utilities such as
+ &man.find.1; and &man.md5.1;. It is best to physically
+ &man.md5.1; the client system's files at least once a day, and
to test control files such as those found in <filename
class="directory">/etc</filename> and <filename
class="directory">/usr/local/etc</filename> even more often.
When mismatches are found, relative to the base md5
information the limited-access machine knows is valid, it
- should scream at a sysadmin to go check it out. A good
- security script will also check for inappropriate suid
- binaries and for new or deleted files on system partitions
- such as <filename class="directory">/</filename> and <filename
+ should alert the sysadmin. A good security script will also
+ check for inappropriate SUID binaries and for new or deleted
+ files on system partitions such as <filename
+ class="directory">/</filename> and <filename
class="directory">/usr</filename>.</para>
- <para>When using ssh rather than NFS, writing the security
- script is much more difficult. You essentially have to
- <command>scp</command> the scripts to the client box in order
- to run them, making them visible, and for safety you also need
- to <command>scp</command> the binaries (such as find) that
- those scripts use. The <application>ssh</application> client
- on the client box may already be compromised. All in all,
- using ssh may be necessary when running over insecure links,
- but it is also a lot harder to deal with.</para>
-
- <para>A good security script will also check for changes to user
- and staff members access configuration files:
- <filename>.rhosts</filename>, <filename>.shosts</filename>,
- <filename>.ssh/authorized_keys</filename> and so forth, files
- that might fall outside the purview of the
+ <para>When using &man.ssh.1; rather than <acronym>NFS</acronym>,
+ writing the security script is more difficult. For example,
+ &man.scp.1; is needed to send the scripts to the client box in
+ order to run them. The &man.ssh.1; client on the client box
+ may already be compromised. Using &man.ssh.1; may be
+ necessary when running over insecure links, but it is harder
+ to deal with.</para>
+
+ <para>A good security script will also check for changes to
+ hidden configuration files, such as
+ <filename>.rhosts</filename> and
+ <filename>.ssh/authorized_keys</filename>, as these files
+ might fall outside the purview of the
<literal>MD5</literal> check.</para>
- <para>If you have a huge amount of user disk space, it may take
- too long to run through every file on those partitions. In
- this case, setting mount flags to disallow suid binaries is a
- good idea. The <literal>nosuid</literal> option (see
- &man.mount.8;) is what you want to look into. You should
- probably scan them anyway, at least once a week, since the
- object of this layer is to detect a break-in attempt, whether
- or not the attempt succeeds.</para>
+ <para>For a large amount of user disk space, it may take too
+ long to run through every file on those partitions. In this
+ case, consider setting mount flags to disallow SUID binaries
+ by using <literal>nosuid</literal> with &man.mount.8;. Scan
+ these partitions at least once a week, since the objective is
+ to detect a break-in attempt, whether or not the attempt
+ succeeds.</para>
<para>Process accounting (see &man.accton.8;) is a relatively
- low-overhead feature of the operating system which might help
- as a post-break-in evaluation mechanism. It is especially
- useful in tracking down how an intruder has actually broken
- into a system, assuming the file is still intact after the
- break-in has occurred.</para>
+ low-overhead feature of &os; which might help as a
+ post-break-in evaluation mechanism. It is especially useful
+ in tracking down how an intruder broke into a system, assuming
+ the file is still intact after the break-in has
+ occurred.</para>
<para>Finally, security scripts should process the log files,
and the logs themselves should be generated in as secure a
- manner as possible &mdash; remote syslog can be very useful.
- An intruder will try to cover his tracks, and log files are
+ manner as possible and sent to a remote syslog server. An
+ intruder will try to cover his tracks, and log files are
critical to the sysadmin trying to track down the time and
method of the initial break-in. One way to keep a permanent
record of the log files is to run the system console to a
@@ -789,14 +603,14 @@
<title>Paranoia</title>
<para>A little paranoia never hurts. As a rule, a sysadmin can
- add any number of security features, as long as they do not
- affect convenience, and can add security features that
+ add any number of security features which do not affect
+ convenience and can add security features that
<emphasis>do</emphasis> affect convenience with some added
- thought. Even more importantly, a security administrator
- should mix it up a bit &mdash; if you use recommendations such
- as those given by this document verbatim, you give away your
- methodologies to the prospective attacker who also has access
- to this document.</para>
+ thought. More importantly, a security administrator should
+ mix it up a bit. If recommendations, such as those mentioned
+ in this section, are applied verbatim, those methodologies are
+ given to the prospective attacker who also has access to this
+ document.</para>
</sect2>
<sect2>
@@ -806,11 +620,11 @@
<primary>Denial of Service (DoS)</primary>
</indexterm>
- <para>This section covers Denial of Service attacks. A DoS
- attack is typically a packet attack. While there is not much
- you can do about modern spoofed packet attacks that saturate
- your network, you can generally limit the damage by ensuring
- that the attacks cannot take down your servers by:</para>
+ <para>A <acronym>DoS</acronym> attack is typically a packet
+ attack. While there is not much one can do about spoofed
+ packet attacks that saturate a network, one can generally
+ limit the damage by ensuring that the attack cannot take down
+ servers by:</para>
<orderedlist>
<listitem>
@@ -818,146 +632,116 @@
</listitem>
<listitem>
- <para>Limiting springboard attacks (ICMP response attacks,
- ping broadcast, etc.).</para>
+ <para>Limiting springboard attacks such as ICMP response
+ attacks and ping broadcasts.</para>
</listitem>
<listitem>
- <para>Overloading the Kernel Route Cache.</para>
+ <para>Overloading the kernel route cache.</para>
</listitem>
</orderedlist>
- <para>A common DoS attack scenario is attacking a forking server
- and making it spawn so many child processes that the host
- system eventually runs out of memory, file descriptors, etc.
- and then grinds to a halt. <application>inetd</application>
- (see &man.inetd.8;) has several options to limit this sort of
- attack. It should be noted that while it is possible to
- prevent a machine from going down, it is not generally
- possible to prevent a service from being disrupted by the
- attack. Read the <application>inetd</application> manual page
- carefully and pay specific attention to the
+ <para>A common <acronym>DoS</acronym> attack scenario is to
+ force a forking server to spawn so many child processes that
+ the host system eventually runs out of memory and file
+ descriptors, and then grinds to a halt. There are several
+ options to &man.inetd.8; to limit this sort of attack. It
+ should be noted that while it is possible to prevent a machine
+ from going down, it is not generally possible to prevent a
+ service from being disrupted by the attack. Read
+ &man.inetd.8; carefully and pay specific attention to
<option>-c</option>, <option>-C</option>, and
- <option>-R</option> options. Note that spoofed-IP attacks
- will circumvent the <option>-C</option> option to
- <application>inetd</application>, so typically a combination
- of options must be used. Some standalone servers have
- self-fork-limitation parameters.</para>
-
- <para><application>Sendmail</application> has its
- <option>-OMaxDaemonChildren</option> option, which tends to
- work much better than trying to use
+ <option>-R</option>. Spoofed IP attacks will circumvent
+ <option>-C</option> to &man.inetd.8;, so typically a
+ combination of options must be used. Some standalone servers
+ have self-fork-limitation parameters.</para>
+
+ <para><application>Sendmail</application> provides
+ <option>-OMaxDaemonChildren</option>, which tends to work
+ better than trying to use
<application>Sendmail</application>'s load limiting options
- due to the load lag. You should specify a
- <literal>MaxDaemonChildren</literal> parameter, when you start
- <application>sendmail</application>; high enough to handle
- your expected load, but not so high that the computer cannot
- handle that number of <application>Sendmail</application>
- instances without falling on its face. It is also prudent to
- run <application>Sendmail</application> in queued mode
- (<option>-ODeliveryMode=queued</option>) and to run the daemon
- (<command>sendmail -bd</command>) separate from the queue-runs
- (<command>sendmail -q15m</command>). If you still want
- real-time delivery you can run the queue at a much lower
- interval, such as <option>-q1m</option>, but be sure to
- specify a reasonable <literal>MaxDaemonChildren</literal>
- option for <emphasis>that</emphasis>
- <application>Sendmail</application> to prevent cascade
- failures.</para>
-
- <para><application>Syslogd</application> can be attacked
- directly and it is strongly recommended that you use the
- <option>-s</option> option whenever possible, and the
- <option>-a</option> option otherwise.</para>
-
- <para>You should also be fairly careful with connect-back
- services such as <application>TCP Wrapper</application>'s
- reverse-identd, which can be attacked directly. You generally
- do not want to use the reverse-ident feature of
- <application>TCP Wrapper</application> for this reason.</para>
-
- <para>It is a very good idea to protect internal services from
- external access by firewalling them off at your border
- routers. The idea here is to prevent saturation attacks from
- outside your LAN, not so much to protect internal services
- from network-based <username>root</username> compromise.
- Always configure an exclusive firewall, i.e., <quote>firewall
- everything <emphasis>except</emphasis> ports A, B, C, D, and
- M-Z</quote>. This way you can firewall off all of your low
- ports except for certain specific services such as
- <application>named</application> (if you are primary for a
- zone), <application>ntalkd</application>,
- <application>sendmail</application>, and other
- Internet-accessible services. If you try to configure the
- firewall the other way &mdash; as an inclusive or permissive
- firewall, there is a good chance that you will forget to
- <quote>close</quote> a couple of services, or that you will
- add a new internal service and forget to update the firewall.
- You can still open up the high-numbered port range on the
- firewall, to allow permissive-like operation, without
- compromising your low ports. Also take note that &os; allows
- you to control the range of port numbers used for dynamic
- binding, via the various
- <varname>net.inet.ip.portrange</varname>
- <command>sysctl</command>'s (<command>sysctl -a | fgrep
- portrange</command>), which can also ease the complexity of
- your firewall's configuration. For example, you might use a
- normal first/last range of 4000 to 5000, and a hiport range of
- 49152 to 65535, then block off everything under 4000 in your
- firewall (except for certain specific Internet-accessible
- ports, of course).</para>
-
- <para>Another common DoS attack is called a springboard attack
- &mdash; to attack a server in a manner that causes the server
- to generate responses which overloads the server, the local
- network, or some other machine. The most common attack of
- this nature is the <emphasis>ICMP ping broadcast
- attack</emphasis>. The attacker spoofs ping packets sent to
- your LAN's broadcast address with the source IP address set to
- the actual machine they wish to attack. If your border
- routers are not configured to stomp on ping packets to
- broadcast addresses, your LAN winds up generating sufficient
- responses to the spoofed source address to saturate the
- victim, especially when the attacker uses the same trick on
- several dozen broadcast addresses over several dozen different
- networks at once. Broadcast attacks of over a hundred and
- twenty megabits have been measured. A second common
- springboard attack is against the ICMP error reporting system.
- By constructing packets that generate ICMP error responses, an
- attacker can saturate a server's incoming network and cause
- the server to saturate its outgoing network with ICMP
- responses. This type of attack can also crash the server by
- running it out of memory, especially if the server cannot
- drain the ICMP responses it generates fast enough. Use the
- <application>sysctl</application> variable
+ due to the load lag. Specify a
+ <literal>MaxDaemonChildren</literal> when starting
+ <application>Sendmail</application> which is high enough to
+ handle the expected load, but not so high that the computer
+ cannot handle that number of
+ <application>Sendmail</application> instances. It is prudent
+ to run <application>Sendmail</application> in queued mode
+ using <option>-ODeliveryMode=queued</option> and to run the
+ daemon (<command>sendmail -bd</command>) separate from the
+ queue-runs (<command>sendmail -q15m</command>). For
+ real-time delivery, run the queue at a much lower interval,
+ such as <option>-q1m</option>, but be sure to specify a
+ reasonable <literal>MaxDaemonChildren</literal> to prevent
+ cascade failures.</para>
+
+ <para>&man.syslogd.8; can be attacked directly and it is
+ strongly recommended to use
+ <option>-s</option> whenever possible, and
+ <option>-a</option> otherwise.</para>
+
+ <para>Be careful with connect-back services such as
+ reverse-identd, which can be attacked directly. The
+ reverse-ident feature of
+ <application>TCP Wrappers</application> is not recommended for
+ this reason.</para>
+
+ <para>It is recommended to protect internal services from
+ external access by firewalling them at the border routers.
+ This is to prevent saturation attacks from outside the LAN,
+ not so much to protect internal services from network-based
+ <username>root</username> compromise. Always configure an
+ exclusive firewall which denies everything by default except
+ for traffic which is explicitly allowed. The range of port
+ numbers used for dynamic binding in &os; is controlled by
+ several <varname>net.inet.ip.portrange</varname>
+ &man.sysctl.8; variables.</para>
+
+ <para>Another common <acronym>DoS</acronym> attack, called a
+ springboard attack, causes the server to generate responses
+ which overloads the server, the local network, or some other
+ machine. The most common attack of this nature is the
+ <emphasis>ICMP ping broadcast attack</emphasis>. The attacker
+ spoofs ping packets sent to the LAN's broadcast address with
+ the source IP address set to the machine to attack. If the
+ border routers are not configured to drop ping packets sent to
+ broadcast addresses, the LAN generates sufficient responses to
+ the spoofed source address to saturate the victim, especially
+ when the attack is against several dozen broadcast addresses
+ over several dozen different networks at once. A second
+ common springboard attack constructs packets that generate
+ ICMP error responses which can saturate a server's incoming
+ network and cause the server to saturate its outgoing network
+ with ICMP responses. This type of attack can crash the
+ server by running it out of memory, especially if the server
+ cannot drain the ICMP responses it generates fast enough. Use
+ the &man.sysctl.8; variable
<literal>net.inet.icmp.icmplim</literal> to limit these
attacks. The last major class of springboard attacks is
- related to certain internal <application>inetd</application>
- services such as the udp echo service. An attacker simply
- spoofs a UDP packet with the source address being server A's
- echo port, and the destination address being server B's echo
- port, where server A and B are both on your LAN. The two
- servers then bounce this one packet back and forth between
- each other. The attacker can overload both servers and their
- LANs simply by injecting a few packets in this manner.
- Similar problems exist with the internal
- <application>chargen</application> port. A competent sysadmin
- will turn off all of these inetd-internal test
- services.</para>
-
- <para>Spoofed packet attacks may also be used to overload the
- kernel route cache. Refer to the
+ related to certain internal &man.inetd.8; services such as the
+ UDP echo service. An attacker spoofs a UDP packet with a
+ source address of server A's echo port and a destination
+ address of server B's echo port, where server A and B on the
+ same LAN. The two servers bounce this one packet back and
+ forth between each other. The attacker can overload both
+ servers and the LAN by injecting a few packets in this manner.
+ Similar problems exist with the
+ <application>chargen</application> port. These inetd-internal
+ test services should remain disabled.</para>
+
+ <para>Spoofed packet attacks may be used to overload the kernel
+ route cache. Refer to the
<varname>net.inet.ip.rtexpire</varname>,
<varname>rtminexpire</varname>, and
- <varname>rtmaxcache</varname> <command>sysctl</command>
- parameters. A spoofed packet attack that uses a random source
- IP will cause the kernel to generate a temporary cached route
- in the route table, viewable with <command>netstat -rna |
- fgrep W3</command>. These routes typically timeout in 1600
+ <varname>rtmaxcache</varname> &man.sysctl.8; parameters. A
+ spoofed packet attack that uses a random source IP will cause
+ the kernel to generate a temporary cached route in the route
+ table, viewable with <command>netstat -rna | fgrep
+ W3</command>. These routes typically timeout in 1600
seconds or so. If the kernel detects that the cached route
- table has gotten too big it will dynamically reduce the
+ table has gotten too big, it will dynamically reduce the
<varname>rtexpire</varname> but will never decrease it to less
- than <varname>rtminexpire</varname>. There are two
+ than <varname>rtminexpire</varname>. This creates two
problems:</para>
<orderedlist>
@@ -973,55 +757,50 @@
</listitem>
</orderedlist>
- <para>If your servers are connected to the Internet via a T3 or
+ <para>If the servers are connected to the Internet via a T3 or
better, it may be prudent to manually override both
<varname>rtexpire</varname> and <varname>rtminexpire</varname>
via &man.sysctl.8;. Never set either parameter to zero
- (unless you want to crash the machine). Setting both
- parameters to 2 seconds should be sufficient to protect the
- route table from attack.</para>
+ as this could crash the machine. Setting both parameters to 2
+ seconds should be sufficient to protect the route table from
+ attack.</para>
</sect2>
<sect2>
- <title>Access Issues with Kerberos and SSH</title>
-
- <indexterm><primary><command>ssh</command></primary></indexterm>
-
- <para>There are a few issues with both Kerberos and
- ssh that need to be addressed if
- you intend to use them. Kerberos 5 is an excellent
- authentication protocol, but there are bugs in the kerberized
- <application>telnet</application> and
- <application>rlogin</application> applications that make them
- unsuitable for dealing with binary streams. Also, by default
- Kerberos does not encrypt a session unless you use the
- <option>-x</option> option. <application>ssh</application>
- encrypts everything by default.</para>
-
- <para>Ssh works quite well in every respect except that it
- forwards encryption keys by default. What this means is that
- if you have a secure workstation holding keys that give you
- access to the rest of the system, and you ssh to an insecure
- machine, your keys are usable. The actual keys themselves are
- not exposed, but ssh installs a forwarding port for the
- duration of your login, and if an attacker has broken
- <username>root</username> on the insecure machine he can
- utilize that port to use your keys to gain access to any other
- machine that your keys unlock.</para>
-
- <para>We recommend that you use ssh in combination with Kerberos
- whenever possible for staff logins.
- <application>Ssh</application> can be compiled with Kerberos
- support. This reduces your reliance on potentially exposed
- ssh keys while at the same time protecting passwords via
- Kerberos. Ssh keys should only be used for automated tasks
- from secure machines (something that Kerberos is unsuited to
- do). We also recommend that you either turn off
- key-forwarding in the ssh configuration, or that you make use
- of the <literal>from=IP/DOMAIN</literal> option that ssh
- allows in its <filename>authorized_keys</filename> file to
- make the key only usable to entities logging in from specific
- machines.</para>
+ <title>Access Issues with Kerberos and &man.ssh.1;</title>
+
+ <indexterm><primary>&man.ssh.1;</primary></indexterm>
+
+ <para>There are a few issues with both Kerberos and &man.ssh.1;
+ that need to be addressed if they are used. Kerberos is an
+ excellent authentication protocol, but there are bugs in the
+ kerberized versions of &man.telnet.1; and &man.rlogin.1; that
+ make them unsuitable for dealing with binary streams. By
+ default, Kerberos does not encrypt a session unless
+ <option>-x</option> is used whereas &man.ssh.1; encrypts
+ everything.</para>
+
+ <para>While &man.ssh.1; works well, it forwards encryption keys
+ by default. This introduces a security risk to a user who
+ uses &man.ssh.1; to access an insecure machine from a secure
+ workstation. The keys themselves are not exposed, but
+ &man.ssh.1; installs a forwarding port for the duration of the
+ login. If an attacker has broken <username>root</username> on
+ the insecure machine, he can utilize that port to gain access
+ to any other machine that those keys unlock.</para>
+
+ <para>It is recommended that &man.ssh.1; is used in combination
+ with Kerberos whenever possible for staff logins and
+ &man.ssh.1; can be compiled with Kerberos support. This
+ reduces reliance on potentially exposed <acronym>SSH</acronym>
+ keys while protecting passwords via Kerberos. Keys should
+ only be used for automated tasks from secure machines as this
+ is something that Kerberos is unsuited to. It is recommended
+ to either turn off key-forwarding in the
+ <acronym>SSH</acronym> configuration, or to make use
+ of <literal>from=IP/DOMAIN</literal> in
+ <filename>authorized_keys</filename> to make the key only
+ usable to entities logging in from specific machines.</para>
</sect2>
</sect1>
@@ -1052,56 +831,43 @@
<indexterm><primary>SHA512</primary></indexterm>
<para>Every user on a &unix; system has a password associated with
- their account. It seems obvious that these passwords need to be
- known only to the user and the actual operating system. In
- order to keep these passwords secret, they are encrypted with
- what is known as a <quote>one-way hash</quote>, that is, they
- can only be easily encrypted but not decrypted. In other words,
- what we told you a moment ago was obvious is not even true: the
- operating system itself does not <emphasis>really</emphasis>
- know the password. It only knows the
+ their account. In order to keep these passwords secret, they
+ are encrypted with a <quote>one-way hash</quote>, as they can
+ be easily encrypted but not decrypted. The operating system
+ itself does not know the password. It only knows the
<emphasis>encrypted</emphasis> form of the password. The only
way to get the <quote>plain-text</quote> password is by a brute
force search of the space of possible passwords.</para>
- <para>Unfortunately the only secure way to encrypt passwords when
- &unix; came into being was based on DES, the Data Encryption
- Standard. This was not such a problem for users resident in the
- US, but since the source code for DES could not be exported
- outside the US, &os; had to find a way to both comply with US
- law and retain compatibility with all the other &unix; variants
- that still used DES.</para>
-
- <para>The solution was to divide up the encryption libraries so
- that US users could install the DES libraries and use DES but
- international users still had an encryption method that could be
- exported abroad. This is how &os; came to use MD5 as its
- default encryption method. MD5 is believed to be more secure
- than DES, so installing DES is offered primarily for
- compatibility reasons.</para>
+ <para>Originally, the only secure way to encrypt passwords in
+ &unix; was based on the Data Encryption Standard
+ (<acronym>DES</acronym>). Since the source code for
+ <acronym>DES</acronym> could not be exported outside the US,
+ &os; had to find a way to both comply with US law and retain
+ compatibility with other &unix; variants that used
+ <acronym>DES</acronym>. The solution was MD5 which is believed
+ to be more secure than <acronym>DES</acronym>.</para>
<sect2>
- <title>Recognizing Your Crypt Mechanism</title>
-
- <para>Currently the library supports DES, MD5, Blowfish, SHA256,
- and SHA512 hash functions. By default &os;&nbsp;9.1 and later
- uses SHA512 to encrypt passwords. Older versions use MD5 by
- default.</para>
-
- <para>It is pretty easy to identify which encryption method &os;
- is set up to use. Examining the encrypted passwords in the
- <filename>/etc/master.passwd</filename> file is one way.
- Passwords encrypted with the MD5 hash are longer than those
- encrypted with the DES hash and also begin with the characters
+ <title>Recognizing the Crypt Mechanism</title>
+
+ <para>Currently the library supports <acronym>DES</acronym>,
+ MD5, Blowfish, SHA256, and SHA512 hash functions. To identify
+ which encryption method &os; is set up to use, examine the
+ encrypted passwords in
+ <filename>/etc/master.passwd</filename>. Passwords encrypted
+ with the MD5 hash are longer than those encrypted with the
+ <acronym>DES</acronym> hash and begin with the characters
<literal>&dollar;1&dollar;</literal>. Passwords starting with
<literal>&dollar;2a&dollar;</literal> are encrypted with the
- Blowfish hash function. DES password strings do not have any
- particular identifying characteristics, but they are shorter
- than MD5 passwords, and are coded in a 64-character alphabet
- which does not include the <literal>&dollar;</literal>
- character, so a relatively short string which does not begin
- with a dollar sign is very likely a DES password. Both SHA256
- and SHA512 begin with the characters
+ Blowfish hash function. <acronym>DES</acronym> password
+ strings do not have any particular identifying
+ characteristics, but they are shorter than MD5 passwords, and
+ are coded in a 64-character alphabet which does not include
+ the <literal>&dollar;</literal> character, so a relatively
+ short string which does not begin with a dollar sign is very
+ likely a <acronym>DES</acronym> password. Both SHA256 and
+ SHA512 begin with the characters
<literal>&dollar;6&dollar;</literal>.</para>
<para>The password format used for new passwords is controlled
@@ -1109,8 +875,8 @@
<filename>/etc/login.conf</filename>, which takes values of
<literal>des</literal>, <literal>md5</literal>,
<literal>blf</literal>, <literal>sha256</literal> or
- <literal>sha512</literal>. See the &man.login.conf.5; manual
- page for more information about login capabilities.</para>
+ <literal>sha512</literal>. Refer to &man.login.conf.5; for
+ more information about login capabilities.</para>
</sect2>
</sect1>
@@ -1123,83 +889,76 @@
<secondary>one-time passwords</secondary>
</indexterm>
- <para>By default, &os; includes support for OPIE (One-time
- Passwords In Everything), which uses the MD5 hash by
+ <para>By default, &os; includes support for One-time Passwords In
+ Everything (<acronym>OPIE</acronym>), which uses the MD5 hash by
default.</para>
- <para>There are three different sorts of passwords which we will
- discuss below. The first is your usual &unix; style or Kerberos
- password; we will call this a <quote>&unix; password</quote>.
- The second sort is the one-time password which is generated by
- the OPIE &man.opiekey.1; program and accepted by the
- &man.opiepasswd.1; program and the login prompt; we will call
- this a <quote>one-time password</quote>. The final sort of
- password is the secret password which you give to the
- <command>opiekey</command> program (and sometimes the
- <command>opiepasswd</command> programs) which it uses to
- generate one-time passwords; we will call it a <quote>secret
- password</quote> or just unqualified
- <quote>password</quote>.</para>
-
- <para>The secret password does not have anything to do with your
- &unix; password; they can be the same but this is not
- recommended. OPIE secret passwords are not limited to 8
+ <para>There are three different types of passwords. The first is
+ the usual &unix; style or Kerberos password. The second is the
+ one-time password which is generated by &man.opiekey.1; and
+ accepted by &man.opiepasswd.1; and the login prompt. The final
+ type of password is the <quote>secret password</quote> used by
+ &man.opiekey.1;, and sometimes &man.opiepasswd.1;, to generate
+ one-time passwords.</para>
+
+ <para>The secret password has nothing to do with the &unix;
+ password. They can be the same, but this is not recommended.
+ <acronym>OPIE</acronym> secret passwords are not limited to 8
characters like old &unix; passwords<footnote><para>Under &os;
the standard login password may be up to 128 characters in
- length.</para></footnote>, they can be as long as you like.
- Passwords of six or seven word long phrases are fairly common.
- For the most part, the OPIE system operates completely
- independently of the &unix; password system.</para>
+ length.</para></footnote>. Passwords of six or seven word
+ long phrases are fairly common. For the most part, the
+ <acronym>OPIE</acronym> system operates completely independently
+ of the &unix; password system.</para>
<para>Besides the password, there are two other pieces of data
- that are important to OPIE. One is what is known as the
+ that are important to <acronym>OPIE</acronym>. One is the
<quote>seed</quote> or <quote>key</quote>, consisting of two
- letters and five digits. The other is what is called the
- <quote>iteration count</quote>, a number between 1 and 100.
- OPIE creates the one-time password by concatenating the seed and
- the secret password, then applying the MD5 hash as many times as
- specified by the iteration count and turning the result into six
- short English words. These six English words are your one-time
- password. The authentication system (primarily PAM) keeps track
- of the last one-time password used, and the user is
- authenticated if the hash of the user-provided password is equal
- to the previous password. Because a one-way hash is used it is
- impossible to generate future one-time passwords if a
- successfully used password is captured; the iteration count is
- decremented after each successful login to keep the user and the
- login program in sync. When the iteration count gets down to 1,
- OPIE must be reinitialized.</para>
-
- <para>There are a few programs involved in each system which we
- will discuss below. The <command>opiekey</command> program
- accepts an iteration count, a seed, and a secret password, and
- generates a one-time password or a consecutive list of one-time
- passwords. The <command>opiepasswd</command> program is used to
- initialize OPIE, and to change passwords, iteration counts, or
- seeds; it takes either a secret passphrase, or an iteration
- count, seed, and a one-time password. The
- <command>opieinfo</command> program will examine the relevant
- credentials files (<filename>/etc/opiekeys</filename>) and print
- out the invoking user's current iteration count and seed.</para>
-
- <para>There are four different sorts of operations we will cover.
- The first is using <command>opiepasswd</command> over a secure
- connection to set up one-time-passwords for the first time, or
- to change your password or seed. The second operation is using
- <command>opiepasswd</command> over an insecure connection, in
- conjunction with <command>opiekey</command> over a secure
- connection, to do the same. The third is using
- <command>opiekey</command> to log in over an insecure
- connection. The fourth is using <command>opiekey</command> to
- generate a number of keys which can be written down or printed
- out to carry with you when going to some location without secure
- connections to anywhere.</para>
+ letters and five digits. The other is the <quote>iteration
+ count</quote>, a number between 1 and 100.
+ <acronym>OPIE</acronym> creates the one-time password by
+ concatenating the seed and the secret password, applying the MD5
+ hash as many times as specified by the iteration count, and
+ turning the result into six short English words. These six
+ English words are the one-time password. The authentication
+ system (primarily PAM) keeps track of the last one-time password
+ used, and the user is authenticated if the hash of the
+ user-provided password is equal to the previous password.
+ Because a one-way hash is used, it is impossible to generate
+ future one-time passwords if a successfully used password is
+ captured. The iteration count is decremented after each
+ successful login to keep the user and the login program in sync.
+ When the iteration count gets down to 1,
+ <acronym>OPIE</acronym> must be reinitialized.</para>
+
+ <para>There are a few programs involved in this process.
+ &man.opiekey.1; accepts an iteration count, a seed, and a secret
+ password, and generates a one-time password or a consecutive
+ list of one-time passwords. In addition to initializing
+ <acronym>OPIE</acronym>, &man.opiepasswd.1; is used to change
+ passwords, iteration counts, or seeds. It takes either a secret
+ passphrase, or an iteration count, seed, and a one-time
+ password. The relevant credential files in
+ <filename>/etc/opiekeys</filename> are examined by
+ &man.opieinfo.1; which prints out the invoking user's current
+ iteration count and seed.</para>
+
+ <para>There are four different sorts of operations. The first is
+ to use &man.opiepasswd.1; over a secure connection to set up
+ one-time-passwords for the first time, or to change the password
+ or seed. The second operation is to use &man.opiepasswd.1; over
+ an insecure connection, in conjunction with &man.opiekey.1; over
+ a secure connection, to do the same. The third is to use
+ &man.opiekey.1; to log in over an insecure connection. The
+ fourth is to use &man.opiekey.1; to generate a number of keys
+ which can be written down or printed out to carry to insecure
+ locations in order to make a connection to anywhere.</para>
<sect2>
<title>Secure Connection Initialization</title>
- <para>To initialize OPIE for the first time, execute the
- <command>opiepasswd</command> command:</para>
+ <para>To initialize <acronym>OPIE</acronym> for the first time,
+ execute &man.opiepasswd.1;:</para>
<screen>&prompt.user; <userinput>opiepasswd -c</userinput>
[grimreaper] ~ $ opiepasswd -f -c
@@ -1215,32 +974,29 @@ ID unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED</screen>
<para>At the <prompt>Enter new secret pass phrase:</prompt> or
- <prompt>Enter secret password:</prompt> prompts, you should
- enter a password or phrase. Remember, this is not the
- password that you will use to login with, this is used to
- generate your one-time login keys. The <quote>ID</quote> line
- gives the parameters of your particular instance: your login
- name, the iteration count, and seed. When logging in the
- system will remember these parameters and present them back to
- you so you do not have to remember them. The last line gives
- the particular one-time password which corresponds to those
- parameters and your secret password; if you were to re-login
- immediately, this one-time password is the one you would
- use.</para>
+ <prompt>Enter secret password:</prompt> prompt, enter a
+ password or phrase. This is not the login password as this
+ password is used to generate the one-time login keys. The
+ <quote>ID</quote> line gives the parameters of the instance:
+ the login name, iteration count, and seed. When logging in,
+ the system will remember these parameters and display them,
+ meaning that they do not have to be memorized. The last line
+ gives the particular one-time password which corresponds to
+ those parameters and the secret password. At the next login,
+ this one-time password is the one to use.</para>
</sect2>
<sect2>
<title>Insecure Connection Initialization</title>
- <para>To initialize or change your secret password over an
- insecure connection, you will need to already have a secure
- connection to some place where you can run
- <command>opiekey</command>; this might be in the form of a
- shell prompt on a machine you trust. You will also need to
- make up an iteration count (100 is probably a good value), and
- you may make up your own seed or use a randomly-generated one.
- Over on the insecure connection (to the machine you are
- initializing), use <command>opiepasswd</command>:</para>
+ <para>To initialize or change the secret password over an
+ insecure connection, a secure connection is needed to some
+ place where &man.opiekey.1; can be run. This might be a shell
+ prompt on a trusted machine. An iteration count is needed,
+ where 100 is probably a good value, and the seed can either be
+ specified or the randomly-generated one used. On the insecure
+ connection, the machine being initialized, use
+ &man.opiepasswd.1;:</para>
<screen>&prompt.user; <userinput>opiepasswd</userinput>
@@ -1256,26 +1012,26 @@ New secret pass phrase:
ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY</screen>
- <para>To accept the default seed press <keycap>Return</keycap>.
- Then before entering an access password, move over to your
- secure connection and give it the same parameters:</para>
+ <para>To accept the default seed, press <keycap>Return</keycap>.
+ Before entering an access password, move over to the secure
+ connection and give it the same parameters:</para>
<screen>&prompt.user; <userinput>opiekey 498 to4268</userinput>
Using the MD5 algorithm to compute response.
-Reminder: Don't use opiekey from telnet or dial-in sessions.
+Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT</screen>
- <para>Now switch back over to the insecure connection, and copy
- the one-time password generated over to the relevant
+ <para>Switch back over to the insecure connection, and copy
+ the generated one-time password over to the relevant
program.</para>
</sect2>
<sect2>
<title>Generating a Single One-time Password</title>
- <para>Once you have initialized OPIE and login, you will be
- presented with a prompt like this:</para>
+ <para>After initializing <acronym>OPIE</acronym> and logging in,
+ a prompt like this will be displayed:</para>
<screen>&prompt.user; <userinput>telnet example.com</userinput>
Trying 10.0.0.1...
@@ -1288,49 +1044,47 @@ login: <userinput>&lt;username&gt;</userinput>
otp-md5 498 gr4269 ext
Password: </screen>
- <para>As a side note, the OPIE prompts have a useful feature
- (not shown here): if you press <keycap>Return</keycap> at the
- password prompt, the prompter will turn echo on, so you can
- see what you are typing. This can be extremely useful if you
- are attempting to type in a password by hand, such as from a
- printout.</para>
+ <para>The <acronym>OPIE</acronym> prompts provides a useful
+ feature. If <keycap>Return</keycap> is pressed at the
+ password prompt, the prompt will turn echo on and display
+ what is typed. This can be useful when attempting to type in
+ a password by hand from a printout.</para>
<indexterm><primary>MS-DOS</primary></indexterm>
<indexterm><primary>Windows</primary></indexterm>
<indexterm><primary>MacOS</primary></indexterm>
- <para>At this point you need to generate your one-time password
- to answer this login prompt. This must be done on a trusted
- system that you can run <command>opiekey</command> on. (There
- are versions of these for DOS, &windows; and &macos; as well.)
- They need the iteration count and the seed as command line
- options. You can cut-and-paste these right from the login
- prompt on the machine that you are logging in to.</para>
+ <para>At this point, generate the one-time password to answer
+ this login prompt. This must be done on a trusted system
+ where it is safe to run &man.opiekey.1;. There are versions
+ of this command for &windows;, &macos; and &os;. This command
+ needs the iteration count and the seed as command line
+ options. Use cut-and-paste from the login prompt on the
+ machine being logged in to.</para>
<para>On the trusted system:</para>
<screen>&prompt.user; <userinput>opiekey 498 to4268</userinput>
Using the MD5 algorithm to compute response.
-Reminder: Don't use opiekey from telnet or dial-in sessions.
+Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT</screen>
- <para>Now that you have your one-time password you can continue
- logging in.</para>
+ <para>Once the one-time password is generated, continue to log
+ in.</para>
</sect2>
<sect2>
<title>Generating Multiple One-time Passwords</title>
- <para>Sometimes you have to go places where you do not have
- access to a trusted machine or secure connection. In this
- case, it is possible to use the <command>opiekey</command>
- command to generate a number of one-time passwords beforehand
- to be printed out and taken with you. For example:</para>
+ <para>Sometimes there is no access to a trusted machine or
+ secure connection. In this case, it is possible to use
+ &man.opiekey.1; to generate a number of one-time passwords
+ beforehand. For example:</para>
<screen>&prompt.user; <userinput>opiekey -n 5 30 zz99999</userinput>
Using the MD5 algorithm to compute response.
-Reminder: Don't use opiekey from telnet or dial-in sessions.
+Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
@@ -1339,28 +1093,26 @@ Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
30: GREW JIVE SAN GIRD BOIL PHI</screen>
<para>The <option>-n 5</option> requests five keys in sequence,
- the <option>30</option> specifies what the last iteration
+ and <option>30</option> specifies what the last iteration
number should be. Note that these are printed out in
- <emphasis>reverse</emphasis> order of eventual use. If you
- are really paranoid, you might want to write the results down
- by hand; otherwise you can cut-and-paste into
- <command>lpr</command>. Note that each line shows both the
- iteration count and the one-time password; you may still find
- it handy to scratch off passwords as you use them.</para>
+ <emphasis>reverse</emphasis> order of use. The really
+ paranoid might want to write the results down by hand;
+ otherwise, print the list. Each line shows both the iteration
+ count and the one-time password. Scratch off the passwords as
+ they are used.</para>
</sect2>
<sect2>
<title>Restricting Use of &unix; Passwords</title>
- <para>OPIE can restrict the use of &unix; passwords based on the
- IP address of a login session. The relevant file is
- <filename>/etc/opieaccess</filename>, which is present by
- default. Please check &man.opieaccess.5; for more information
- on this file and which security considerations you should be
- aware of when using it.</para>
+ <para><acronym>OPIE</acronym> can restrict the use of &unix;
+ passwords based on the IP address of a login session. The
+ relevant file is <filename>/etc/opieaccess</filename>, which
+ is present by default. Refer to &man.opieaccess.5; for more
+ information on this file and which security considerations to
+ be aware of when using it.</para>
- <para>Here is a sample <filename>opieaccess</filename>
- file:</para>
+ <para>Here is a sample <filename>opieaccess</filename>:</para>
<programlisting>permit 192.168.0.0 255.255.0.0</programlisting>
@@ -1369,7 +1121,8 @@ Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
to use &unix; passwords at any time.</para>
<para>If no rules in <filename>opieaccess</filename> are
- matched, the default is to deny non-OPIE logins.</para>
+ matched, the default is to deny non-<acronym>OPIE</acronym>
+ logins.</para>
</sect2>
</sect1>
@@ -1388,59 +1141,29 @@ Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
<indexterm><primary>TCP Wrappers</primary></indexterm>
- <para>Anyone familiar with &man.inetd.8; has probably heard of
- <acronym>TCP</acronym> Wrappers at some point. But few
- individuals seem to fully comprehend its usefulness in a network
- environment. It seems that everyone wants to install a firewall
- to handle network connections. While a firewall has a wide
- variety of uses, there are some things that a firewall will not
- handle, such as sending text back to the connection originator.
- The <acronym>TCP</acronym> Wrappers software does this and much
- more. In the next few sections many of the
- <acronym>TCP</acronym> Wrappers features will be discussed, and,
- when applicable, example configuration lines will be
- provided.</para>
-
- <para>The <acronym>TCP</acronym> Wrappers software extends the
- abilities of <application>inetd</application> to provide support
- for every server daemon under its control. Using this method it
- is possible to provide logging support, return messages to
- connections, permit a daemon to only accept internal
- connections, etc. While some of these features can be provided
- by implementing a firewall, this will add not only an extra
- layer of protection but go beyond the amount of control a
- firewall can provide.</para>
-
- <para>The added functionality of <acronym>TCP</acronym> Wrappers
- should not be considered a replacement for a good firewall.
- <acronym>TCP</acronym> Wrappers can be used in conjunction
- with a firewall or other security enhancements though and
- it can serve nicely as an extra layer of protection
- for the system.</para>
-
- <para>Since this is an extension to the configuration of
- <application>inetd</application>, the reader is expected have
- read the <link linkend="network-inetd">inetd
- configuration</link> section.</para>
-
- <note>
- <para>While programs run by &man.inetd.8; are not exactly
- <quote>daemons</quote>, they have traditionally been called
- daemons. This is the term we will use in this section
- too.</para>
- </note>
+ <para><acronym>TCP</acronym> Wrappers extends the abilities of
+ <xref linkend="network-inetd"/> to provide support for every
+ server daemon under its control. It can be configured
+ to provide logging support, return messages to connections, and
+ permit a daemon to only accept internal connections. While some
+ of these features can be provided by implementing a firewall,
+ <acronym>TCP</acronym> Wrappers adds an extra layer of
+ protection and goes beyond the amount of control a firewall can
+ provide.</para>
+
+ <para><acronym>TCP</acronym> Wrappers should not be considered a
+ replacement for a properly configured firewall.
+ <acronym>TCP</acronym> Wrappers should be used in conjunction
+ with a firewall and other security enhancements.</para>
<sect2>
<title>Initial Configuration</title>
- <para>The only requirement of using <acronym>TCP</acronym>
- Wrappers in &os; is to ensure the
- <application>inetd</application> server is started from
- <filename>rc.conf</filename> with the <option>-Ww</option>
- option; this is the default setting. Of course, proper
- configuration of <filename>/etc/hosts.allow</filename> is also
- expected, but &man.syslogd.8; will throw messages in the
- system logs in these cases.</para>
+ <para>To enable <acronym>TCP</acronym> Wrappers in &os;, ensure
+ the &man.inetd.8; server is started from
+ <filename>/etc/rc.conf</filename> with
+ <option>-Ww</option>. Then, properly configure
+ <filename>/etc/hosts.allow</filename>.</para>
<note>
<para>Unlike other implementations of <acronym>TCP</acronym>
@@ -1453,37 +1176,30 @@ Enter secret pass phrase: <userinput>&lt;secret password&gt;</userinput>
are set to either be permitted or blocked depending on the
options in <filename>/etc/hosts.allow</filename>. The default
configuration in &os; is to allow a connection to every daemon
- started with <application>inetd</application>. Changing this
- will be discussed only after the basic configuration is
- covered.</para>
+ started with &man.inetd.8;.</para>
<para>Basic configuration usually takes the form of
- <literal>daemon : address : action</literal>. Where
- <literal>daemon</literal> is the daemon name which
- <command>inetd</command> started. The
- <literal>address</literal> can be a valid hostname, an
- <acronym>IP</acronym> address or an IPv6 address enclosed in
- brackets ([&nbsp;]). The <literal>action</literal> field can
- be either <literal>allow</literal> or <literal>deny</literal>
- to grant or deny access appropriately. Keep in mind that
- configuration works off a first rule match semantic, meaning
- that the configuration file is scanned in ascending order for
- a matching rule. When a match is found the rule is applied
- and the search process will halt.</para>
-
- <para>Several other options exist but they will be explained
- in a later section. A simple configuration line may easily be
- constructed from that information alone. For example, to
- allow <acronym>POP</acronym>3 connections via the
- <filename role="package">mail/qpopper</filename> daemon,
- the following lines should be appended to
+ <literal>daemon : address : action</literal>, where
+ <literal>daemon</literal> is the daemon which &man.inetd.8;
+ started, <literal>address</literal> is a valid hostname,
+ <acronym>IP</acronym> address, or an IPv6 address enclosed in
+ brackets ([&nbsp;]), and <literal>action</literal> is
+ either <literal>allow</literal> or <literal>deny</literal>.
+ <acronym>TCP</acronym> Wrappers uses a first rule match
+ semantic, meaning that the configuration file is scanned in
+ ascending order for a matching rule. When a match is found,
+ the rule is applied and the search process stops.</para>
+
+ <para>For example, to allow <acronym>POP</acronym>3 connections
+ via the <filename role="package">mail/qpopper</filename>
+ daemon, the following lines should be appended to
<filename>hosts.allow</filename>:</para>
<programlisting># This line is required for POP3 connections:
qpopper : ALL : allow</programlisting>
- <para>After adding this line, <application>inetd</application>
- will need to be restarted by using &man.service.8;:</para>
+ <para>After adding this line, &man.inetd.8; needs to be
+ restarted:</para>
<screen>&prompt.root; <userinput>service inetd restart</userinput></screen>
</sect2>
@@ -1491,45 +1207,41 @@ qpopper : ALL : allow</programlisting>
<sect2>
<title>Advanced Configuration</title>
- <para><acronym>TCP</acronym> Wrappers has advanced options too;
- they will allow for more control over the way connections are
- handled. In some cases it may be a good idea to return a
- comment to certain hosts or daemon connections. In other
- cases, perhaps a log file should be recorded or an email sent
- to the administrator. Other situations may require the use of
- a service for local connections only. This is all possible
+ <para><acronym>TCP</acronym> Wrappers provides advanced options
+ to allow more control over the way connections are handled.
+ In some cases, it may be appropriate to return a comment to
+ certain hosts or daemon connections. In other cases, a log
+ entry should be recorded or an email sent to the
+ administrator. Other situations may require the use of a
+ service for local connections only. This is all possible
through the use of configuration options known as
<literal>wildcards</literal>, expansion characters and
- external command execution. The next two sections are written
- to cover these situations.</para>
+ external command execution.</para>
<sect3>
<title>External Commands</title>
<para>Suppose that a situation occurs where a connection
should be denied yet a reason should be sent to the
- individual who attempted to establish that connection. How
- could it be done? That action can be made possible by using
- the <option>twist</option> option. When a connection
- attempt is made, <option>twist</option> will be called to
- execute a shell command or script. An example already
- exists in the <filename>hosts.allow</filename> file:</para>
+ individual who attempted to establish that connection. That
+ action is possible with <option>twist</option>. When a
+ connection attempt is made, <option>twist</option> executes
+ a shell command or script. An example exists in
+ <filename>hosts.allow</filename>:</para>
<programlisting># The rest of the daemons are protected.
ALL : ALL \
: severity auth.info \
: twist /bin/echo "You are not welcome to use %d from %h."</programlisting>
- <para>This example shows that the message,
- <quote>You are not allowed to use <literal>daemon</literal>
- from <literal>hostname</literal>.</quote> will be returned
- for any daemon not previously configured in the access file.
- This is extremely useful for sending a reply back to the
- connection initiator right after the established connection
- is dropped. Note that any message returned
- <emphasis>must</emphasis> be wrapped in quote
- <literal>"</literal> characters; there are no exceptions to
- this rule.</para>
+ <para>In this example, the message <quote>You are not allowed
+ to use <literal>daemon</literal> from
+ <literal>hostname</literal>.</quote> will be returned for
+ any daemon not previously configured in the access file.
+ This is useful for sending a reply back to the connection
+ initiator right after the established connection is dropped.
+ Any message returned <emphasis>must</emphasis> be wrapped in
+ quote (<literal>"</literal>) characters.</para>
<warning>
<para>It may be possible to launch a denial of service
@@ -1538,14 +1250,14 @@ ALL : ALL \
requests.</para>
</warning>
- <para>Another possibility is to use the <option>spawn</option>
- option in these cases. Like <option>twist</option>, the
- <option>spawn</option> option implicitly denies the
- connection and may be used to run external shell commands or
- scripts. Unlike <option>twist</option>,
- <option>spawn</option> will not send a reply back to the
- individual who established the connection. For an example,
- consider the following configuration line:</para>
+ <para>Another possibility is to use <option>spawn</option>.
+ Like <option>twist</option>, <option>spawn</option>
+ implicitly denies the connection and may be used to run
+ external shell commands or scripts. Unlike
+ <option>twist</option>, <option>spawn</option> will not send
+ a reply back to the individual who established the
+ connection. For example, consider the following
+ configuration line:</para>
<programlisting># We do not allow connections from example.com:
ALL : .example.com \
@@ -1553,44 +1265,36 @@ ALL : .example.com \
/var/log/connections.log) \
: deny</programlisting>
- <para>This will deny all connection attempts from the <hostid
- role="fqdn">*.example.com</hostid> domain; simultaneously
- logging the hostname, <acronym>IP</acronym> address and the
- daemon which they attempted to access in the
- <filename>/var/log/connections.log</filename> file.</para>
+ <para>This will deny all connection attempts from <hostid
+ role="fqdn">*.example.com</hostid> and log the hostname,
+ <acronym>IP</acronym> address, and the daemon to which
+ access was attempted to
+ <filename>/var/log/connections.log</filename>.</para>
- <para>Aside from the already explained substitution characters
- above, e.g., <literal>%a</literal>, a few others exist. See
- the &man.hosts.access.5; manual page for the complete
- list.</para>
+ <para>This example uses the substitution characters
+ <literal>%a</literal> and <literal>%h</literal>. Refer to
+ &man.hosts.access.5; for the complete list.</para>
</sect3>
<sect3>
<title>Wildcard Options</title>
- <para>Thus far the <literal>ALL</literal> option has been used
- continuously throughout the examples. Other options exist
- which could extend the functionality a bit further. For
- instance, <literal>ALL</literal> may be used to match every
- instance of either a daemon, domain or an
- <acronym>IP</acronym> address. Another wildcard available
- is <literal>PARANOID</literal> which may be used to match
+ <para>The <literal>ALL</literal> option may be used to match
+ every instance of a daemon, domain, or an
+ <acronym>IP</acronym> address. Another wildcard is
+ <literal>PARANOID</literal> which may be used to match
any host which provides an <acronym>IP</acronym> address
- that may be forged. In other words,
+ that may be forged. For example,
<literal>PARANOID</literal> may be used to define an action
to be taken whenever a connection is made from an
<acronym>IP</acronym> address that differs from its
- hostname. The following example may shed some more light on
- this discussion:</para>
+ hostname. In this example, all connection requests to
+ &man.sendmail.8; which have an <acronym>IP</acronym> address
+ that varies from its hostname will be denied:</para>
<programlisting># Block possibly spoofed requests to sendmail:
sendmail : PARANOID : deny</programlisting>
- <para>In that example all connection requests to
- <command>sendmail</command> which have an
- <acronym>IP</acronym> address that varies from its hostname
- will be denied.</para>
-
<caution>
<para>Using the <literal>PARANOID</literal> wildcard may
severely cripple servers if the client or server has a
@@ -1599,13 +1303,11 @@ sendmail : PARANOID : deny</programlisting>
</caution>
<para>To learn more about wildcards and their associated
- functionality, see the &man.hosts.access.5; manual
- page.</para>
+ functionality, refer to &man.hosts.access.5;.</para>
<para>Before any of the specific configuration lines above
will work, the first configuration line should be commented
- out in <filename>hosts.allow</filename>. This was noted at
- the beginning of this section.</para>
+ out in <filename>hosts.allow</filename>.</para>
</sect3>
</sect2>
</sect1>
@@ -1632,52 +1334,47 @@ sendmail : PARANOID : deny</programlisting>
<para><application>Kerberos</application> is a network add-on
system/protocol that allows users to authenticate themselves
- through the services of a secure server. Services such as
- remote login, remote copy, secure inter-system file copying and
- other high-risk tasks are made considerably safer and more
- controllable.</para>
-
- <para><application>Kerberos</application> can be described as an
+ through the services of a secure server.
+ <application>Kerberos</application> can be described as an
identity-verifying proxy system. It can also be described as a
- trusted third-party authentication system.
- <application>Kerberos</application> provides only one function
- &mdash; the secure authentication of users on the network. It
- does not provide authorization functions (what users are allowed
- to do) or auditing functions (what those users did). After a
- client and server have used <application>Kerberos</application>
- to prove their identity, they can also encrypt all of their
- communications to assure privacy and data integrity as they go
- about their business.</para>
-
- <para>Therefore it is highly recommended that
- <application>Kerberos</application> be used with other security
- methods which provide authorization and audit services.</para>
-
- <para>The following instructions can be used as a guide on how to
- set up <application>Kerberos</application> as distributed for
- &os;. However, you should refer to the relevant manual pages
- for a complete description.</para>
+ trusted third-party authentication system. After a user
+ authenticates with <application>Kerberos</application>, their
+ communications can be encrypted to assure privacy and data
+ integrity.</para>
+
+ <para>The only function of <application>Kerberos</application> is
+ to provide the secure authentication of users on the network.
+ It does not provide authorization functions (what users are
+ allowed to do) or auditing functions (what those users did). It
+ is recommended that <application>Kerberos</application> be used
+ with other security methods which provide authorization and
+ audit services.</para>
+
+ <para>This section provides a guide on how to set up
+ <application>Kerberos</application> as distributed for &os;.
+ Refer to the relevant manual pages for more complete
+ descriptions.</para>
<para>For purposes of demonstrating a
<application>Kerberos</application> installation, the various
- name spaces will be handled as follows:</para>
+ name spaces will be as follows:</para>
<itemizedlist>
<listitem>
<para>The <acronym>DNS</acronym> domain (<quote>zone</quote>)
- will be example.org.</para>
+ will be <hostid role="fqdn">example.org</hostid>.</para>
</listitem>
<listitem>
<para>The <application>Kerberos</application> realm will be
- EXAMPLE.ORG.</para>
+ <literal>EXAMPLE.ORG</literal>.</para>
</listitem>
</itemizedlist>
<note>
- <para>Please use real domain names when setting up
- <application>Kerberos</application> even if you intend to run
- it internally. This avoids <acronym>DNS</acronym> problems
+ <para>Use real domain names when setting up
+ <application>Kerberos</application> even if it will run
+ internally. This avoids <acronym>DNS</acronym> problems
and assures inter-operation with other
<application>Kerberos</application> realms.</para>
</note>
@@ -1699,9 +1396,9 @@ sendmail : PARANOID : deny</programlisting>
<para><application>Kerberos</application> is both the name of a
network authentication protocol and an adjective to describe
- programs that implement the program
- (<application>Kerberos</application> telnet, for example).
- The current version of the protocol is version 5, described in
+ programs that implement it, such as
+ <application>Kerberos</application> telnet. The current
+ version of the protocol is version 5, described in
<acronym>RFC</acronym>&nbsp;1510.</para>
<para>Several free implementations of this protocol are
@@ -1711,24 +1408,22 @@ sendmail : PARANOID : deny</programlisting>
<application>Kerberos</application> was originally developed,
continues to develop their <application>Kerberos</application>
package. It is commonly used in the <acronym>US</acronym> as
- a cryptography product, as such it has historically been
- affected by <acronym>US</acronym> export regulations. The
+ a cryptography product, and has historically been affected by
+ <acronym>US</acronym> export regulations. The
<acronym>MIT</acronym> <application>Kerberos</application> is
- available as a port (<filename
- role="package">security/krb5</filename>). Heimdal
- <application>Kerberos</application> is another version 5
- implementation, and was explicitly developed outside of the
- <acronym>US</acronym> to avoid export regulations (and is thus
- often included in non-commercial &unix; variants). The
+ available as the <filename
+ role="package">security/krb5</filename> package or port.
+ Heimdal <application>Kerberos</application> is another version
+ 5 implementation, and was explicitly developed outside of the
+ <acronym>US</acronym> to avoid export regulations. The
Heimdal <application>Kerberos</application> distribution is
- available as a port (<filename
- role="package">security/heimdal</filename>), and a minimal
- installation of it is included in the base &os;
+ available as a the <filename
+ role="package">security/heimdal</filename> package or port,
+ and a minimal installation is included in the base &os;
install.</para>
- <para>In order to reach the widest audience, these instructions
- assume the use of the Heimdal distribution included in
- &os;.</para>
+ <para>These instructions assume the use of the Heimdal
+ distribution included in &os;.</para>
</sect2>
<sect2>
@@ -1741,30 +1436,28 @@ sendmail : PARANOID : deny</programlisting>
<para>The Key Distribution Center (<acronym>KDC</acronym>) is
the centralized authentication service that
- <application>Kerberos</application> provides &mdash; it is the
+ <application>Kerberos</application> provides. It is the
computer that issues <application>Kerberos</application>
tickets. The <acronym>KDC</acronym> is considered
<quote>trusted</quote> by all other computers in the
<application>Kerberos</application> realm, and thus has
heightened security concerns.</para>
- <para>Note that while running the
- <application>Kerberos</application> server requires very few
- computing resources, a dedicated machine acting only as a
- <acronym>KDC</acronym> is recommended for security
- reasons.</para>
+ <para>While running the <application>Kerberos</application>
+ server requires very few computing resources, a dedicated
+ machine acting only as a <acronym>KDC</acronym> is recommended
+ for security reasons.</para>
<para>To begin setting up a <acronym>KDC</acronym>, ensure that
- your <filename>/etc/rc.conf</filename> file contains the
- correct settings to act as a <acronym>KDC</acronym> (you may
- need to adjust paths to reflect your own system):</para>
+ <filename>/etc/rc.conf</filename> contains the correct
+ settings to act as a <acronym>KDC</acronym>. As required,
+ adjust paths to reflect the system:</para>
<programlisting>kerberos5_server_enable="YES"
kadmind5_server_enable="YES"</programlisting>
- <para>Next we will set up your
- <application>Kerberos</application> config file,
- <filename>/etc/krb5.conf</filename>:</para>
+ <para>Next, edit <filename>/etc/krb5.conf</filename> as
+ follows:</para>
<programlisting>[libdefaults]
default_realm = EXAMPLE.ORG
@@ -1776,24 +1469,22 @@ kadmind5_server_enable="YES"</programlisting>
[domain_realm]
.example.org = EXAMPLE.ORG</programlisting>
- <para>Note that this <filename>/etc/krb5.conf</filename> file
- implies that your <acronym>KDC</acronym> will have the
- fully-qualified hostname of <hostid
- role="fqdn">kerberos.example.org</hostid>. You will need to
- add a CNAME (alias) entry to your zone file to accomplish this
- if your <acronym>KDC</acronym> has a different
- hostname.</para>
+ <para>This <filename>/etc/krb5.conf</filename> implies that the
+ <acronym>KDC</acronym> will use the fully-qualified hostname
+ <hostid role="fqdn">kerberos.example.org</hostid>. Add a
+ CNAME (alias) entry to the zone file to accomplish this
+ if the <acronym>KDC</acronym> has a different hostname.</para>
<note>
<para>For large networks with a properly configured
- <acronym>BIND</acronym> <acronym>DNS</acronym> server, the
- above example could be trimmed to:</para>
+ <acronym>DNS</acronym> server, the above example could be
+ trimmed to:</para>
<programlisting>[libdefaults]
default_realm = EXAMPLE.ORG</programlisting>
<para>With the following lines being appended to the
- <hostid role="fqdn">example.org</hostid> zonefile:</para>
+ <hostid role="fqdn">example.org</hostid> zone file:</para>
<programlisting>_kerberos._udp IN SRV 01 00 88 kerberos.example.org.
_kerberos._tcp IN SRV 01 00 88 kerberos.example.org.
@@ -1804,7 +1495,7 @@ _kerberos IN TXT EXAMPLE.ORG</programlisting>
<note>
<para>For clients to be able to find the
- <application>Kerberos</application> services, you
+ <application>Kerberos</application> services, it
<emphasis>must</emphasis> have either a fully configured
<filename>/etc/krb5.conf</filename> or a minimally
configured <filename>/etc/krb5.conf</filename>
@@ -1812,34 +1503,27 @@ _kerberos IN TXT EXAMPLE.ORG</programlisting>
server.</para>
</note>
- <para>Next we will create the
- <application>Kerberos</application> database. This database
- contains the keys of all principals encrypted with a master
- password. You are not required to remember this password, it
- will be stored in a file
- (<filename>/var/heimdal/m-key</filename>). To create the
- master key, run <command>kstash</command> and enter a
- password.</para>
-
- <para>Once the master key has been created, you can initialize
- the database using the <command>kadmin</command> program with
- the <literal>-l</literal> option (standing for
- <quote>local</quote>). This option instructs
- <command>kadmin</command> to modify the database files
- directly rather than going through the
- <command>kadmind</command> network service. This handles the
- chicken-and-egg problem of trying to connect to the database
- before it is created. Once you have the
- <command>kadmin</command> prompt, use the
- <command>init</command> command to create your realms initial
- database.</para>
-
- <para>Lastly, while still in <command>kadmin</command>, create
- your first principal using the <command>add</command> command.
- Stick to the defaults options for the principal for now, you
- can always change them later with the
- <command>modify</command> command. Note that you can use the
- <literal>?</literal> command at any prompt to see the
+ <para>Next, create the <application>Kerberos</application>
+ database which contains the keys of all principals encrypted
+ with a master password. It is not required to remember this
+ password as it will be stored in
+ <filename>/var/heimdal/m-key</filename>. To create the
+ master key, run &man.kstash.8; and enter a password.</para>
+
+ <para>Once the master key has been created, initialize the
+ database using <command>kadmin -l</command>. This option
+ instructs &man.kadmin.8; to modify the local database files
+ directly rather than going through the &man.kadmind.8; network
+ service. This handles the chicken-and-egg problem of trying
+ to connect to the database before it is created. At the
+ &man.kadmin.8; prompt, use <command>init</command> to create
+ the realm's initial database.</para>
+
+ <para>Lastly, while still in &man.kadmin.8;, create the first
+ principal using <command>add</command>. Stick to the default
+ options for the principal for now, as these can be changed
+ later with <command>modify</command>. Type
+ <literal>?</literal> at the &man.kadmin.8; prompt to see the
available options.</para>
<para>A sample database creation session is shown below:</para>
@@ -1858,13 +1542,13 @@ Attributes []:
Password: <userinput>xxxxxxxx</userinput>
Verifying password - Password: <userinput>xxxxxxxx</userinput></screen>
- <para>Now it is time to start up the <acronym>KDC</acronym>
- services. Run <command>service kerberos start</command> and
+ <para>Next, start the <acronym>KDC</acronym> services. Run
+ <command>service kerberos start</command> and
<command>service kadmind start</command> to bring up the
- services. Note that you will not have any kerberized daemons
- running at this point but you should be able to confirm that
- the <acronym>KDC</acronym> is functioning by obtaining and
- listing a ticket for the principal (user) that you just
+ services. While there will not be any kerberized daemons
+ running at this point, it is possible to confirm that the
+ <acronym>KDC</acronym> is functioning by obtaining and
+ listing a ticket for the principal (user) that was just
created from the command-line of the <acronym>KDC</acronym>
itself:</para>
@@ -1878,8 +1562,7 @@ Credentials cache: FILE:<filename>/tmp/krb5cc_500</filename>
Issued Expires Principal
Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG</screen>
- <para>The ticket can then be revoked when you have
- finished:</para>
+ <para>The ticket can then be revoked when finished:</para>
<screen>&prompt.user; <userinput>kdestroy</userinput></screen>
</sect2>
@@ -1893,55 +1576,46 @@ Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG</screen>
<secondary>enabling services</secondary>
</indexterm>
- <para>First, we need a copy of the
- <application>Kerberos</application> configuration file,
- <filename>/etc/krb5.conf</filename>. To do so, simply copy
- it over to the client computer from the
- <acronym>KDC</acronym> in a secure fashion (using network
- utilities, such as &man.scp.1;, or physically via a floppy
- disk).</para>
-
- <para>Next you need a <filename>/etc/krb5.keytab</filename>
- file. This is the major difference between a server
- providing <application>Kerberos</application> enabled
- daemons and a workstation &mdash; the server must have a
- <filename>keytab</filename> file. This file contains the
+ <para>First, copy
+ <filename>/etc/krb5.conf</filename> from the
+ <acronym>KDC</acronym> to the client computer in a secure
+ fashion, such as &man.scp.1;, or physically via a removable
+ media.</para>
+
+ <para>Next, create <filename>/etc/krb5.keytab</filename>.
+ This is the major difference between a server providing
+ <application>Kerberos</application> enabled daemons and a
+ workstation: the server must have a
+ <filename>keytab</filename>. This file contains the
server's host key, which allows it and the
<acronym>KDC</acronym> to verify each others identity. It
must be transmitted to the server in a secure fashion, as
the security of the server can be broken if the key is made
- public. This explicitly means that transferring it via a
- clear text channel, such as <acronym>FTP</acronym>, is a
- very bad idea.</para>
-
- <para>Typically, you transfer the <filename>keytab</filename>
- to the server using the <command>kadmin</command> program.
- This is handy because you also need to create the host
- principal (the <acronym>KDC</acronym> end of the
- <filename>krb5.keytab</filename>) using
- <command>kadmin</command>.</para>
-
- <para>Note that you must have already obtained a ticket and
- that this ticket must be allowed to use the
- <command>kadmin</command> interface in the
+ public.</para>
+
+ <para>Typically, the <filename>keytab</filename> is transferred
+ to the server using &man.kadmin.8;. This is handy because the
+ host principal, the <acronym>KDC</acronym> end of the
+ <filename>krb5.keytab</filename>, is also created using
+ &man.kadmin.8;.</para>
+
+ <para>A ticket must already be obtained and this ticket must be
+ allowed to use the &man.kadmin.8; interface in the
<filename>kadmind.acl</filename>. See the section titled
- <quote>Remote administration</quote> in the Heimdal info
- pages (<command>info heimdal</command>) for details on
- designing access control lists. If you do not want to
- enable remote <command>kadmin</command> access, you can
- simply securely connect to the <acronym>KDC</acronym> (via
- local console, &man.ssh.1; or
- <application>Kerberos</application> &man.telnet.1;) and
- perform administration locally using
+ <quote>Remote administration</quote> in<command>info
+ heimdal</command> for details on designing access control
+ lists. Instead of enabling remote &man.kadmin.8; access, the
+ administrator can securely connect to the
+ <acronym>KDC</acronym> via the local console or &man.ssh.1;,
+ and perform administration locally using
<command>kadmin -l</command>.</para>
- <para>After installing the <filename>/etc/krb5.conf</filename>
- file, you can use <command>kadmin</command> from the
- <application>Kerberos</application> server. The
- <command>add --random-key</command> command will let you add
- the server's host principal, and the <command>ext</command>
- command will allow you to extract the server's host
- principal to its own keytab. For example:</para>
+ <para>After installing <filename>/etc/krb5.conf</filename>,
+ use <command>add --random-key</command> from the
+ <application>Kerberos</application> server. This adds
+ the server's host principal. Then, use <command>ext</command>
+ to extract the server's host principal to its own keytab. For
+ example:</para>
<screen>&prompt.root; <userinput>kadmin</userinput>
kadmin><userinput> add --random-key host/myserver.example.org</userinput>
@@ -1951,47 +1625,42 @@ Attributes []:
kadmin><userinput> ext host/myserver.example.org</userinput>
kadmin><userinput> exit</userinput></screen>
- <para>Note that the <command>ext</command> command (short for
- <quote>extract</quote>) stores the extracted key in
- <filename>/etc/krb5.keytab</filename> by default.</para>
+ <para>Note that <command>ext</command> stores the extracted key
+ in <filename>/etc/krb5.keytab</filename> by default.</para>
- <para>If you do not have <command>kadmind</command> running on
- the <acronym>KDC</acronym> (possibly for security reasons)
- and thus do not have access to <command>kadmin</command>
- remotely, you can add the host principal
+ <para>If &man.kadmind.8; is not running on the
+ <acronym>KDC</acronym> and there is no access to
+ &man.kadmin.8; remotely, add the host principal
(<username>host/myserver.EXAMPLE.ORG</username>) directly on
the <acronym>KDC</acronym> and then extract it to a
- temporary file (to avoid over-writing the
+ temporary file to avoid overwriting the
<filename>/etc/krb5.keytab</filename> on the
- <acronym>KDC</acronym>) using something like this:</para>
+ <acronym>KDC</acronym>, using something like this:</para>
<screen>&prompt.root; <userinput>kadmin</userinput>
kadmin><userinput> ext --keytab=/tmp/example.keytab host/myserver.example.org</userinput>
kadmin><userinput> exit</userinput></screen>
- <para>You can then securely copy the keytab to the server
- computer (using <command>scp</command> or a floppy, for
- example). Be sure to specify a non-default keytab name to
- avoid over-writing the keytab on the
+ <para>The keytab can then be securely copied to the server
+ using &man.scp.1; or a removable media. Be sure to specify a
+ non-default keytab name to avoid overwriting the keytab on the
<acronym>KDC</acronym>.</para>
- <para>At this point your server can communicate with the
- <acronym>KDC</acronym> (due to its
- <filename>krb5.conf</filename> file) and it can prove its
- own identity (due to the <filename>krb5.keytab</filename>
- file). It is now ready for you to enable some
- <application>Kerberos</application> services. For this
- example we will enable the <command>telnet</command> service
- by putting a line like this into your
- <filename>/etc/inetd.conf</filename> and then restarting the
- &man.inetd.8; service with <command>service inetd
+ <para>At this point, the server can communicate with the
+ <acronym>KDC</acronym> using
+ <filename>krb5.conf</filename> and it can prove its
+ own identity with <filename>krb5.keytab</filename>. It is now
+ ready for the <application>Kerberos</application> services to
+ be enabled. For this example, the &man.telnetd.8; service
+ is enabled in <filename>/etc/inetd.conf</filename> and
+ &man.inetd.8; has been restarted with <command>service inetd
restart</command>:</para>
<programlisting>telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user</programlisting>
- <para>The critical bit is that the <command>-a</command> (for
- authentication) type is set to user. Consult the
- &man.telnetd.8; manual page for more details.</para>
+ <para>The critical change is that the <option>-a</option>
+ authentication type is set to user. Refer to &man.telnetd.8;
+ for more details.</para>
</sect2>
<sect2>
@@ -2003,44 +1672,35 @@ kadmin><userinput> exit</userinput></screen>
<secondary>configure clients</secondary>
</indexterm>
- <para>Setting up a client computer is almost trivially easy.
- As far as <application>Kerberos</application> configuration
- goes, you only need the <application>Kerberos</application>
- configuration file, located at
- <filename>/etc/krb5.conf</filename>. Simply securely copy
- it over to the client computer from the
+ <para>Setting up a client computer is easy as only
+ <filename>/etc/krb5.conf</filename> is needed. Securely copy
+ this file over to the client computer from the
<acronym>KDC</acronym>.</para>
- <para>Test your client computer by attempting to use
- <command>kinit</command>, <command>klist</command>, and
- <command>kdestroy</command> from the client to obtain, show,
- and then delete a ticket for the principal you created
- above. You should also be able to use
- <application>Kerberos</application> applications to connect
- to <application>Kerberos</application> enabled servers,
- though if that does not work and obtaining a ticket does the
- problem is likely with the server and not with the client or
- the <acronym>KDC</acronym>.</para>
-
- <para>When testing an application like
- <command>telnet</command>, try using a packet sniffer (such
- as &man.tcpdump.1;) to confirm that your password is not
- sent in the clear. Try using <command>telnet</command> with
- the <literal>-x</literal> option, which encrypts the entire
- data stream (similar to <command>ssh</command>).</para>
+ <para>Test the client by attempting to use &man.kinit.1;,
+ &man.klist.1;, and &man.kdestroy.1; from the client to obtain,
+ show, and then delete a ticket for the principal created
+ above. <application>Kerberos</application> applications
+ should also be able to connect to
+ <application>Kerberos</application> enabled servers. If that
+ does not work but obtaining a ticket does, the problem is
+ likely with the server and not with the client or the
+ <acronym>KDC</acronym>.</para>
+
+ <para>When testing a Kerberized application, try using a packet
+ sniffer such as &man.tcpdump.1; to confirm that the password
+ is not sent in the clear.</para>
<para>Various non-core <application>Kerberos</application>
- client applications are also installed by default. This is
- where the <quote>minimal</quote> nature of the base Heimdal
- installation is felt: <command>telnet</command> is the only
+ client applications are available. The <quote>minimal</quote>
+ installation in &os; installs &man.telnetd.8; as the only
<application>Kerberos</application> enabled service.</para>
- <para>The Heimdal port adds some of the missing client
- applications: <application>Kerberos</application> enabled
- versions of <command>ftp</command>, <command>rsh</command>,
- <command>rcp</command>, <command>rlogin</command>, and a few
- other less common programs. The <acronym>MIT</acronym> port
- also contains a full suite of
+ <para>The Heimdal port installs
+ <application>Kerberos</application> enabled versions of
+ &man.ftpd.8;, &man.rshd.8;, &man.rcp.1;, &man.rlogind.8;, and
+ a few other less common programs. The <acronym>MIT</acronym>
+ port also contains a full suite of
<application>Kerberos</application> client
applications.</para>
</sect2>
@@ -2058,40 +1718,29 @@ kadmin><userinput> exit</userinput></screen>
</indexterm>
<para>Users within a realm typically have their
- <application>Kerberos</application> principal (such as
- <username>tillman@EXAMPLE.ORG</username>) mapped to a local
- user account (such as a local account named
- <username>tillman</username>). Client applications such as
- <command>telnet</command> usually do not require a user name
- or a principal.</para>
-
- <para>Occasionally, however, you want to grant access to a
- local user account to someone who does not have a matching
- <application>Kerberos</application> principal. For example,
- <username>tillman@EXAMPLE.ORG</username> may need access to
- the local user account <username>webdevelopers</username>.
- Other principals may also need access to that local
- account.</para>
+ <application>Kerberos</application> principal mapped to a
+ local user account. Occasionally, one needs to grant access
+ to a local user account to someone who does not have a
+ matching <application>Kerberos</application> principal. For
+ example, <username>tillman@EXAMPLE.ORG</username> may need
+ access to the local user account
+ <username>webdevelopers</username>. Other principals may also
+ need access to that local account.</para>
<para>The <filename>.k5login</filename> and
- <filename>.k5users</filename> files, placed in a users home
- directory, can be used similar to a powerful combination of
- <filename>.hosts</filename> and
- <filename>.rhosts</filename>, solving this problem. For
- example, if a <filename>.k5login</filename> with the
- following contents:</para>
+ <filename>.k5users</filename> files, placed in a user's home
+ directory, can be used to solve this problem. For example, if
+ <filename>.k5login</filename> with the following contents is
+ placed in the home directory of
+ <username>webdevelopers</username>, both principals listed
+ will have access to that account without requiring a shared
+ password.:</para>
<screen>tillman@example.org
jdoe@example.org</screen>
- <para>Were to be placed into the home directory of the local
- user <username>webdevelopers</username> then both principals
- listed would have access to that account without requiring a
- shared password.</para>
-
- <para>Reading the manual pages for these commands is
- recommended. Note that the <command>ksu</command> manual
- page covers <filename>.k5users</filename>.</para>
+ <para>Refer to &man.ksu.1; for more information about
+ <filename>.k5users</filename>.</para>
</sect2>
<sect2>
@@ -2107,135 +1756,123 @@ jdoe@example.org</screen>
<listitem>
<para>When using either the Heimdal or
<acronym>MIT</acronym>
- <application>Kerberos</application> ports ensure that
- your <envar>PATH</envar> environment variable lists the
+ <application>Kerberos</application> ports, ensure that
+ the <envar>PATH</envar> lists the
<application>Kerberos</application> versions of the
client applications before the system versions.</para>
</listitem>
<listitem>
- <para>Do all the computers in your realm have synchronized
- time settings? If not, authentication may fail.
+ <para>If all the computers in the realm do not have
+ synchronized time settings, authentication may fail.
<xref linkend="network-ntp"/> describes how to synchronize
clocks using <acronym>NTP</acronym>.</para>
</listitem>
<listitem>
- <para><acronym>MIT</acronym> and Heimdal inter-operate
- nicely. Except for <command>kadmin</command>, the
- protocol for which is not standardized.</para>
+ <para><acronym>MIT</acronym> and Heimdal interoperate
+ except for &man.kadmin.8;, which is not
+ standardized.</para>
</listitem>
<listitem>
- <para>If you change your hostname, you also need to change
- your <username>host/</username> principal and update
- your keytab. This also applies to special keytab
+ <para>If the hostname is changed, the
+ <username>host/</username> principal must be changed and
+ the keytab updated. This also applies to special keytab
entries like the <username>www/</username> principal
- used for Apache's
- <filename
+ used for Apache's <filename
role="package">www/mod_auth_kerb</filename>.</para>
</listitem>
<listitem>
- <para>All hosts in your realm must be resolvable (both
- forwards and reverse) in <acronym>DNS</acronym> (or
- <filename>/etc/hosts</filename> as a minimum). CNAMEs
+ <para>All hosts in the realm must be both forward and
+ reverse resolvable in <acronym>DNS</acronym> or, at a
+ minimum, in <filename>/etc/hosts</filename>. CNAMEs
will work, but the A and PTR records must be correct and
- in place. The error message is not very intuitive:
- <errorname>Kerberos5 refuses authentication because Read
- req failed: Key table entry not
+ in place. The error message for unresolvable hosts is not
+ intuitive: <errorname>Kerberos5 refuses authentication
+ because Read req failed: Key table entry not
found</errorname>.</para>
</listitem>
<listitem>
- <para>Some operating systems that may being acting as
- clients to your <acronym>KDC</acronym> do not set the
- permissions for <command>ksu</command> to be setuid
- <username>root</username>. This means that
- <command>ksu</command> does not work, which is a good
- security idea but annoying. This is not a
+ <para>Some operating systems that act as clients to the
+ <acronym>KDC</acronym> do not set the permissions for
+ &man.ksu.1; to be setuid <username>root</username>. This
+ means that &man.ksu.1; does not work. This is not a
<acronym>KDC</acronym> error.</para>
</listitem>
<listitem>
<para>With <acronym>MIT</acronym>
- <application>Kerberos</application>, if you want to
- allow a principal to have a ticket life longer than the
- default ten hours, you must use
- <command>modify_principal</command> in
- <command>kadmin</command> to change the maxlife of both
- the principal in question and the
+ <application>Kerberos</application>, in order to allow a
+ principal to have a ticket life longer than the default
+ ten hours, use <command>modify_principal</command> at the
+ &man.kadmin.8; prompt to change the maxlife of both the
+ principal in question and the
<username>krbtgt</username> principal. Then the
- principal can use the <literal>-l</literal> option with
- <command>kinit</command> to request a ticket with a
- longer lifetime.</para>
+ principal can use <command>kinit -l</command> to request a
+ ticket with a longer lifetime.</para>
</listitem>
<listitem>
<note>
- <para>If you run a packet sniffer on your
- <acronym>KDC</acronym> to add in troubleshooting and
- then run <command>kinit</command> from a workstation,
- you will notice that your <acronym>TGT</acronym> is
- sent immediately upon running <command>kinit</command>
- &mdash; even before you type your password! The
- explanation is that the
+ <para>When running a packet sniffer on the
+ <acronym>KDC</acronym> to aid in troubleshooting while
+ running &man.kinit.1; from a workstation, the Ticket
+ Granting Ticket (<acronym>TGT</acronym>) is sent
+ immediately upon running &man.kinit.1;, even before the
+ password is typed. This is because the
<application>Kerberos</application> server freely
- transmits a <acronym>TGT</acronym> (Ticket Granting
- Ticket) to any unauthorized request; however, every
- <acronym>TGT</acronym> is encrypted in a key derived
- from the user's password. Therefore, when a user
- types their password it is not being sent to the
- <acronym>KDC</acronym>, it is being used to decrypt
- the <acronym>TGT</acronym> that
- <command>kinit</command> already obtained. If the
- decryption process results in a valid ticket with a
- valid time stamp, the user has valid
+ transmits a <acronym>TGT</acronym> to any unauthorized
+ request. However, every <acronym>TGT</acronym> is
+ encrypted in a key derived from the user's password.
+ When a user types their password, it is not sent to the
+ <acronym>KDC</acronym>, it is instead used to decrypt
+ the <acronym>TGT</acronym> that &man.kinit.1; already
+ obtained. If the decryption process results in a valid
+ ticket with a valid time stamp, the user has valid
<application>Kerberos</application> credentials.
These credentials include a session key for
establishing secure communications with the
<application>Kerberos</application> server in the
- future, as well as the actual ticket-granting ticket,
- which is actually encrypted with the
+ future, as well as the actual <acronym>TGT</acronym>,
+ which is encrypted with the
<application>Kerberos</application> server's own key.
- This second layer of encryption is unknown to the
- user, but it is what allows the
+ This second layer of encryption allows the
<application>Kerberos</application> server to verify
- the authenticity of each
- <acronym>TGT</acronym>.</para>
+ the authenticity of each <acronym>TGT</acronym>.</para>
</note>
</listitem>
<listitem>
- <para>If you want to use long ticket lifetimes (a week,
- for example) and you are using
- <application>OpenSSH</application> to connect to the
- machine where your ticket is stored, make sure that
+ <para>To use long ticket lifetimes, such as a week, when
+ using <application>OpenSSH</application> to connect to the
+ machine where the ticket is stored, make sure that
<application>Kerberos</application>
<option>TicketCleanup</option> is set to
- <literal>no</literal> in your
- <filename>sshd_config</filename> or else your tickets
- will be deleted when you log out.</para>
+ <literal>no</literal> in
+ <filename>sshd_config</filename> or else tickets will be
+ deleted at log out.</para>
</listitem>
<listitem>
- <para>Remember that host principals can have a longer
- ticket lifetime as well. If your user principal has a
- lifetime of a week but the host you are connecting to
- has a lifetime of nine hours, you will have an expired
- host principal in your cache and the ticket cache will
- not work as expected.</para>
+ <para>Host principals can have a longer ticket lifetime. If
+ the user principal has a lifetime of a week but the host
+ being connected to has a lifetime of nine hours, the user
+ cache will have an expired host principal and the ticket
+ cache will not work as expected.</para>
</listitem>
<listitem>
- <para>When setting up a <filename>krb5.dict</filename>
- file to prevent specific bad passwords from being used
- (the manual page for <command>kadmind</command> covers
- this briefly), remember that it only applies to
- principals that have a password policy assigned to them.
- The <filename>krb5.dict</filename> files format is
- simple: one string per line. Creating a symbolic link
- to <filename>/usr/share/dict/words</filename> might be
+ <para>When setting up <filename>krb5.dict</filename> to
+ prevent specific bad passwords from being used as
+ described in &man.kadmind.8;, remember that it only
+ applies to principals that have a password policy assigned
+ to them. The format used in
+ <filename>krb5.dict</filename> is one string per line.
+ Creating a symbolic link to
+ <filename>/usr/share/dict/words</filename> might be
useful.</para>
</listitem>
</itemizedlist>
@@ -2245,46 +1882,41 @@ jdoe@example.org</screen>
<title>Differences with the <acronym>MIT</acronym>
Port</title>
- <para>The major difference between the <acronym>MIT</acronym>
- and Heimdal installs relates to the
- <command>kadmin</command> program which has a different (but
- equivalent) set of commands and uses a different protocol.
- This has a large implications if your <acronym>KDC</acronym>
- is <acronym>MIT</acronym> as you will not be able to use the
- Heimdal <command>kadmin</command> program to administer your
- <acronym>KDC</acronym> remotely (or vice versa, for that
- matter).</para>
-
- <para>The client applications may also take slightly different
+ <para>The major difference between <acronym>MIT</acronym> and
+ Heimdal relates to &man.kadmin.8; which has a different, but
+ equivalent, set of commands and uses a different protocol.
+ If the <acronym>KDC</acronym> is <acronym>MIT</acronym>, the
+ Heimdal version of &man.kadmin.8; cannot be used to administer
+ the <acronym>KDC</acronym> remotely, and vice versa.</para>
+
+ <para>The client applications may also use slightly different
command line options to accomplish the same tasks.
Following the instructions on the <acronym>MIT</acronym>
- <application>Kerberos</application> web site
- (<ulink url="http://web.mit.edu/Kerberos/www/"></ulink>) is
+ <application>Kerberos</application> <ulink
+ url="http://web.mit.edu/Kerberos/www/">web site</ulink> is
recommended. Be careful of path issues: the
- <acronym>MIT</acronym> port installs into
- <filename class="directory">/usr/local/</filename> by default,
- and the <quote>normal</quote> system applications may be run
- instead of <acronym>MIT</acronym> if your
- <envar>PATH</envar> environment variable lists the system
- directories first.</para>
+ <acronym>MIT</acronym> port installs into <filename
+ class="directory">/usr/local/</filename> by default, and the
+ <quote>normal</quote> system applications run instead of
+ <acronym>MIT</acronym> versions if <envar>PATH</envar> lists
+ the system directories first.</para>
<note>
- <para>With the <acronym>MIT</acronym>
- <filename role="package">security/krb5</filename> port that
- is provided by &os;, be sure to read the
+ <para>With the &os; <acronym>MIT</acronym> <filename
+ role="package">security/krb5</filename> port, be sure to
+ read
<filename>/usr/local/share/doc/krb5/README.FreeBSD</filename>
- file installed by the port if you want to understand why
- logins via <command>telnetd</command> and
- <command>klogind</command> behave somewhat oddly. Most
- importantly, correcting the <quote>incorrect permissions on
- cache file</quote> behavior requires that the
+ installed by the port to understand why logins via
+ &man.telnetd.8; and <command>klogind</command> behave
+ somewhat oddly. Correcting the <quote>incorrect permissions
+ on cache file</quote> behavior requires that the
<command>login.krb5</command> binary be used for
authentication so that it can properly change ownership for
the forwarded credentials.</para>
</note>
- <para>The <filename>rc.conf</filename> must also be modified
- to contain the following configuration:</para>
+ <para>The following edits should also be made to
+ <filename>rc.conf</filename>:</para>
<programlisting>kerberos5_server="/usr/local/sbin/krb5kdc"
kadmind5_server="/usr/local/sbin/kadmind"
@@ -2292,7 +1924,7 @@ kerberos5_server_enable="YES"
kadmind5_server_enable="YES"</programlisting>
<para>This is done because the applications for
- <acronym>MIT</acronym> kerberos installs binaries in the
+ <acronym>MIT</acronym> Kerberos installs binaries in the
<filename class="directory">/usr/local</filename>
hierarchy.</para>
</sect2>
@@ -2308,17 +1940,16 @@ kadmind5_server_enable="YES"</programlisting>
<sect3>
<title><application>Kerberos</application> is an
- all-or-nothing approach</title>
+ All or Nothing Approach</title>
<para>Every service enabled on the network must be modified
- to work with <application>Kerberos</application> (or be
- otherwise secured against network attacks) or else the
- users credentials could be stolen and re-used. An example
+ to work with <application>Kerberos</application>, or be
+ otherwise secured against network attacks, or else the
+ user's credentials could be stolen and re-used. An example
of this would be <application>Kerberos</application>
- enabling all remote shells (via <command>rsh</command> and
- <command>telnet</command>, for example) but not converting
- the <acronym>POP3</acronym> mail server which sends
- passwords in plain text.</para>
+ enabling all remote shells but not converting the
+ <acronym>POP3</acronym> mail server which sends passwords in
+ plain text.</para>
</sect3>
<sect3>
@@ -2326,73 +1957,65 @@ kadmind5_server_enable="YES"</programlisting>
Single-User Workstations</title>
<para>In a multi-user environment,
- <application>Kerberos</application> is less secure.
- This is because it stores the tickets in the
- <filename class="directory">/tmp</filename> directory, which
- is readable by all users. If a user is sharing a computer
- with several other people simultaneously (i.e.
- multi-user), it is possible that the user's tickets can be
- stolen (copied) by another user.</para>
+ <application>Kerberos</application> is less secure. This is
+ because it stores the tickets in <filename
+ class="directory">/tmp</filename>, which is readable by
+ all users. If a user is sharing a computer with other
+ users, it is possible that the user's tickets can be stolen
+ or copied by another user.</para>
<para>This can be overcome with the <literal>-c</literal>
- filename command-line option or (preferably) the
- <envar>KRB5CCNAME</envar> environment variable, but this
- is rarely done. In principal, storing the ticket in the
- users home directory and using simple file permissions can
- mitigate this problem.</para>
+ command-line option or, preferably, the
+ <envar>KRB5CCNAME</envar> environment variable. Storing
+ the ticket in the user's home directory and using file
+ permissions are commonly used to mitigate this
+ problem.</para>
</sect3>
<sect3>
<title>The KDC is a Single Point of Failure</title>
- <para>By design, the <acronym>KDC</acronym> must be as
- secure as the master password database is contained on it.
- The <acronym>KDC</acronym> should have absolutely no other
- services running on it and should be physically secured.
- The danger is high because
+ <para>By design, the <acronym>KDC</acronym> must be as secure
+ as its master password database. The <acronym>KDC</acronym>
+ should have absolutely no other services running on it and
+ should be physically secure. The danger is high because
<application>Kerberos</application> stores all passwords
- encrypted with the same key (the <quote>master</quote>
- key), which in turn is stored as a file on the
- <acronym>KDC</acronym>.</para>
-
- <para>As a side note, a compromised master key is not quite
- as bad as one might normally fear. The master key is only
- used to encrypt the <application>Kerberos</application>
- database and as a seed for the random number generator.
- As long as access to your <acronym>KDC</acronym> is
- secure, an attacker cannot do much with the master
- key.</para>
+ encrypted with the same <quote>master</quote> key which is
+ stored as a file on the <acronym>KDC</acronym>.</para>
+
+ <para>A compromised master key is not quite as bad as one
+ might fear. The master key is only used to encrypt the
+ <application>Kerberos</application> database and as a seed
+ for the random number generator. As long as access to the
+ <acronym>KDC</acronym> is secure, an attacker cannot do much
+ with the master key.</para>
<para>Additionally, if the <acronym>KDC</acronym> is
- unavailable (perhaps due to a denial of service attack or
- network problems) the network services are unusable as
- authentication can not be performed, a recipe for a
- denial-of-service attack. This can alleviated with
- multiple <acronym>KDC</acronym>s (a single master and one
- or more slaves) and with careful implementation of
- secondary or fall-back authentication
- (<acronym>PAM</acronym> is excellent for this).</para>
+ unavailable, network services are unusable as authentication
+ cannot be performed. This can be alleviated with a single
+ master <acronym>KDC</acronym> and one or more slaves, and
+ with careful implementation of secondary or fall-back
+ authentication using <acronym>PAM</acronym>.</para>
</sect3>
<sect3>
<title><application>Kerberos</application>
Shortcomings</title>
- <para><application>Kerberos</application> allows users,
- hosts and services to authenticate between themselves. It
- does not have a mechanism to authenticate the
+ <para><application>Kerberos</application> allows users, hosts
+ and services to authenticate between themselves. It does
+ not have a mechanism to authenticate the
<acronym>KDC</acronym> to the users, hosts or services.
- This means that a trojanned <command>kinit</command> (for
- example) could record all user names and passwords.
- Something like
- <filename role="package">security/tripwire</filename> or
- other file system integrity checking tools can alleviate
+ This means that a trojanned &man.kinit.1; could record all
+ user names and passwords. Filesystem integrity checking
+ tools like <filename
+ role="package">security/tripwire</filename> can alleviate
this.</para>
</sect3>
</sect2>
<sect2>
- <title>Resources and further information</title>
+ <title>Resources and Further Information</title>
<indexterm>
<primary>Kerberos5</primary>
@@ -2455,31 +2078,29 @@ kadmind5_server_enable="YES"</programlisting>
<secondary>OpenSSL</secondary>
</indexterm>
- <para>One feature that many users overlook is the
- <application>OpenSSL</application> toolkit included in &os;.
- <application>OpenSSL</application> provides an encryption
- transport layer on top of the normal communications layer;
- thus allowing it to be intertwined with many network
- applications and services.</para>
-
- <para>Some uses of <application>OpenSSL</application> may
- include encrypted authentication of mail clients, web based
- transactions such as credit card payments and more. Many
- ports such as
+ <para>The
+ <application>OpenSSL</application> toolkit is included in &os;.
+ It provides an encryption transport layer on top of the normal
+ communications layer, allowing it to be intertwined with many
+ network applications and services.</para>
+
+ <para>Some uses of <application>OpenSSL</application> may include
+ encrypted authentication of mail clients and web based
+ transactions such as credit card payments. Many ports such as
<filename role="package">www/apache22</filename>, and
- <filename role="package">mail/claws-mail</filename> will offer
+ <filename role="package">mail/claws-mail</filename> offer
compilation support for building with
<application>OpenSSL</application>.</para>
<note>
- <para>In most cases the Ports Collection will attempt to build
+ <para>In most cases, the Ports Collection will attempt to build
the <filename role="package">security/openssl</filename>
- port unless the <makevar>WITH_OPENSSL_BASE</makevar> make
- variable is explicitly set to <quote>yes</quote>.</para>
+ port unless <makevar>WITH_OPENSSL_BASE</makevar> is explicitly
+ set to <quote>yes</quote>.</para>
</note>
<para>The version of <application>OpenSSL</application> included
- in &os; supports Secure Sockets Layer v2/v3 (SSLv2/SSLv3),
+ in &os; supports Secure Sockets Layer v2/v3 (SSLv2/SSLv3) and
Transport Layer Security v1 (TLSv1) network security protocols
and can be used as a general cryptographic library.</para>
@@ -2489,7 +2110,7 @@ kadmind5_server_enable="YES"</programlisting>
due to United States patents. To use it, the license should
be reviewed and, if the restrictions are acceptable, the
<makevar>MAKE_IDEA</makevar> variable must be set in
- <filename>make.conf</filename>.</para>
+ <filename>/etc/make.conf</filename>.</para>
</note>
<para>One of the most common uses of
@@ -2497,15 +2118,14 @@ kadmind5_server_enable="YES"</programlisting>
for use with software applications. These certificates ensure
that the credentials of the company or individual are valid
and not fraudulent. If the certificate in question has not
- been verified by one of the several <quote>Certificate
- Authorities</quote>, or <acronym>CA</acronym>s, a warning is
- usually produced. A Certificate Authority is a company, such
- as <ulink url="http://www.verisign.com">VeriSign</ulink>,
- which will sign certificates in order to validate credentials
- of individuals or companies. This process has a cost
- associated with it and is definitely not a requirement for
- using certificates; however, it can put some of the more
- paranoid users at ease.</para>
+ been verified by a <quote>Certificate Authority</quote>
+ (<acronym>CA</acronym>), a warning is produced. A
+ <acronym>CA</acronym> is a company, such as <ulink
+ url="http://www.verisign.com">VeriSign</ulink>, signs
+ certificates in order to validate the credentials of individuals
+ or companies. This process has a cost associated with it and is
+ not a requirement for using certificates; however, it can put
+ users at ease.</para>
<sect2>
<title>Generating Certificates</title>
@@ -2544,25 +2164,25 @@ to be sent with your certificate request
A challenge password []:<userinput><replaceable>SOME PASSWORD</replaceable></userinput>
An optional company name []:<userinput><replaceable>Another Name</replaceable></userinput></screen>
- <para>Notice the response directly after the
- <quote>Common Name</quote> prompt shows a domain name. This
- prompt requires a server name to be entered for verification
- purposes; placing anything but a domain name would yield a
- useless certificate. Other options, for instance expire
- time, alternate encryption algorithms, etc. are available.
- A complete list may be obtained by viewing the
- &man.openssl.1; manual page.</para>
-
- <para>Two files should now exist in the directory in which the
- aforementioned command was issued. The certificate request,
- <filename>req.pem</filename>, may be sent to a certificate
- authority who will validate the credentials that you
- entered, sign the request and return the certificate to you.
- The second file created will be named
+ <para>Notice the response directly after the <quote>Common
+ Name</quote> prompt shows a domain name. This prompt
+ requires a server name to be entered for verification
+ purposes and placing anything but a domain name yields a
+ useless certificate. Other options, such as the expire
+ time and alternate encryption algorithms, are available. A
+ complete list of options is described in
+ &man.openssl.1;.</para>
+
+ <para>Two files should now exist in the directory in which this
+ command was issued. The certificate request,
+ <filename>req.pem</filename>, may be sent to a
+ <acronym>CA</acronym> who will validate the entered
+ credentials, sign the request, and return the signed
+ certificate. The second file is named
<filename>cert.pem</filename> and is the private key for the
- certificate and should be protected at all costs; if this
+ certificate and should be protected at all costs. If this
falls in the hands of others it can be used to impersonate
- you (or your server).</para>
+ the user or the server.</para>
<para>In cases where a signature from a <acronym>CA</acronym>
is not required, a self signed certificate can be created.
@@ -2582,32 +2202,29 @@ An optional company name []:<userinput><replaceable>Another Name</replaceable></
certificate authority signature file,
<filename>myca.key</filename> and the certificate itself,
<filename>new.crt</filename>. These should be placed in a
- directory, preferably under
- <filename class="directory">/etc</filename>, which is readable
- only by <username>root</username>. Permissions of 0700 should
- be fine for this and they can be set with the
- <command>chmod</command> utility.</para>
+ directory, preferably under <filename
+ class="directory">/etc</filename>, which is readable only by
+ <username>root</username>. Permissions of 0700 are
+ appropriate and can be set using &man.chmod.1;.</para>
</sect2>
<sect2>
- <title>Using Certificates, an Example</title>
+ <title>Using Certificates</title>
- <para>So what can these files do? A good use would be to
- encrypt connections to the
+ <para>One use for a certificate is to encrypt connections to the
<application>Sendmail</application> <acronym>MTA</acronym>.
- This would dissolve the use of clear text authentication for
- users who send mail via the local
- <acronym>MTA</acronym>.</para>
+ This prevents the use of clear text authentication for users
+ who send mail via the local <acronym>MTA</acronym>.</para>
<note>
- <para>This is not the best use in the world as some
- <acronym>MUA</acronym>s will present the user with an
- error if they have not installed the certificate locally.
- Refer to the documentation included with the software for
- more information on certificate installation.</para>
+ <para>Some <acronym>MUA</acronym>s will display error if the
+ user has not installed the certificate locally. Refer to
+ the documentation included with the software for more
+ information on certificate installation.</para>
</note>
- <para>The following lines should be placed inside the local
+ <para>To configure <application>Sendmail</application>, the
+ following lines should be placed in the local
<filename>.mc</filename> file:</para>
<programlisting>dnl SSL Options
@@ -2617,24 +2234,24 @@ define(`confSERVER_CERT',`/etc/certs/new.crt')dnl
define(`confSERVER_KEY',`/etc/certs/myca.key')dnl
define(`confTLS_SRV_OPTIONS', `V')dnl</programlisting>
- <para>Where <filename class="directory">/etc/certs/</filename>
- is the directory to be used for storing the certificate and
- key files locally. The last few requirements are a rebuild
- of the local <filename>.cf</filename> file. This is easily
- achieved by typing <command>make
- <maketarget>install</maketarget></command> within the
- <filename class="directory">/etc/mail</filename> directory.
+ <para>In this example, <filename
+ class="directory">/etc/certs/</filename>
+ stores the certificate and key files locally. After saving
+ the edits, rebuild the local <filename>.cf</filename> file by
+ typing
+ <command>make <maketarget>install</maketarget></command>
+ within <filename class="directory">/etc/mail</filename>.
Follow that up with <command>make
<maketarget>restart</maketarget></command> which should
start the <application>Sendmail</application> daemon.</para>
- <para>If all went well there will be no error messages in the
- <filename>/var/log/maillog</filename> file and
+ <para>If all went well, there will be no error messages in
+ <filename>/var/log/maillog</filename> and
<application>Sendmail</application> will show up in the
process list.</para>
- <para>For a simple test, simply connect to the mail server
- using the &man.telnet.1; utility:</para>
+ <para>For a simple test, connect to the mail server using
+ &man.telnet.1;:</para>
<screen>&prompt.root; <userinput>telnet <replaceable>example.com</replaceable> 25</userinput>
Trying 192.0.34.166...
@@ -2658,7 +2275,7 @@ Escape character is '^]'.
Connection closed by foreign host.</screen>
<para>If the <quote>STARTTLS</quote> line appears in the
- output then everything is working correctly.</para>
+ output, everything is working correctly.</para>
</sect2>
</sect1>
@@ -2676,15 +2293,12 @@ Connection closed by foreign host.</screen>
</authorgroup>
</sect1info>
- <title>VPN over IPsec</title>
+ <title><acronym>VPN</acronym> over IPsec</title>
<indexterm>
<primary>IPsec</primary>
</indexterm>
- <para>Creating a VPN between two networks, separated by the
- Internet, using FreeBSD gateways.</para>
-
<sect2>
<sect2info>
<authorgroup>
@@ -2701,18 +2315,16 @@ Connection closed by foreign host.</screen>
<title>Understanding IPsec</title>
- <para>This section will guide you through the process of
- setting up IPsec. In order to set up IPsec, it is necessary
- that you are familiar with the concepts of building a custom
+ <para>This section demonstrates the process of setting up IPsec.
+ It assumes familiarity with the concepts of building a custom
kernel (see <xref linkend="kernelconfig"/>).</para>
<para><emphasis>IPsec</emphasis> is a protocol which sits on
- top of the Internet Protocol (IP) layer. It allows two or
- more hosts to communicate in a secure manner (hence the
- name). The FreeBSD IPsec <quote>network stack</quote> is
- based on the <ulink url="http://www.kame.net/">KAME</ulink>
- implementation, which has support for both protocol
- families, IPv4 and IPv6.</para>
+ top of the Internet Protocol (<acronym>IP</acronym>) layer.
+ It allows two or more hosts to communicate in a secure manner.
+ The &os; IPsec <quote>network stack</quote> is based on the
+ <ulink url="http://www.kame.net/">KAME</ulink> implementation,
+ which has support for both IPv4 and IPv6.</para>
<indexterm>
<primary>IPsec</primary>
@@ -2729,16 +2341,17 @@ Connection closed by foreign host.</screen>
<itemizedlist>
<listitem>
<para><emphasis>Encapsulated Security Payload
- ESP)</emphasis>, protects the IP packet data from
- third party interference, by encrypting the contents
- using symmetric cryptography algorithms (like Blowfish,
- 3DES).</para>
+ <acronym>ESP</acronym>)</emphasis>: this protocol
+ protects the IP packet data from third party interference
+ by encrypting the contents using symmetric cryptography
+ algorithms such as Blowfish and 3DES.</para>
</listitem>
<listitem>
- <para><emphasis>Authentication Header (AH)</emphasis>,
+ <para><emphasis>Authentication Header
+ (<acronym>AH</acronym>)</emphasis>: this protocol
protects the IP packet header from third party
- interference and spoofing, by computing a cryptographic
+ interference and spoofing by computing a cryptographic
checksum and hashing the IP packet header fields with a
secure hashing function. This is then followed by an
additional header that contains the hash, to allow the
@@ -2760,26 +2373,23 @@ Connection closed by foreign host.</screen>
</indexterm>
<para>IPsec can either be used to directly encrypt the traffic
- between two hosts (known as <emphasis>Transport
- Mode</emphasis>); or to build <quote>virtual
- tunnels</quote> between two subnets, which could be used for
- secure communication between two corporate networks (known
- as <emphasis>Tunnel Mode</emphasis>). The latter is more
+ between two hosts using <emphasis>Transport Mode</emphasis> or
+ to build <quote>virtual tunnels</quote> using
+ <emphasis>Tunnel Mode</emphasis>. The latter mode is more
commonly known as a <emphasis>Virtual Private Network
- (VPN)</emphasis>. The &man.ipsec.4; manual page should be
- consulted for detailed information on the IPsec subsystem in
- FreeBSD.</para>
+ (<acronym>VPN</acronym>)</emphasis>. Consult &man.ipsec.4;
+ for detailed information on the IPsec subsystem in
+ &os;.</para>
- <para>To add IPsec support to your kernel, add the following
- options to your kernel configuration file:</para>
+ <para>To add IPsec support to the kernel, add the following
+ options to the custom kernel configuration file:</para>
<indexterm>
<primary>kernel options</primary>
<secondary>IPSEC</secondary>
</indexterm>
- <screen>
-options IPSEC #IP security
+ <screen>options IPSEC #IP security
device crypto</screen>
<indexterm>
@@ -2790,45 +2400,34 @@ device crypto</screen>
<para>If IPsec debugging support is desired, the following
kernel option should also be added:</para>
- <screen>
-options IPSEC_DEBUG #debug for IP security</screen>
+ <screen>options IPSEC_DEBUG #debug for IP security</screen>
</sect2>
<sect2>
- <title>The Problem</title>
-
- <para>There is no standard for what constitutes a VPN. VPNs
- can be implemented using a number of different technologies,
- each of which have their own strengths and weaknesses. This
- section presents a scenario, and the strategies used for
- implementing a VPN for this scenario.</para>
- </sect2>
-
- <sect2>
- <title>The Scenario: Two networks, one home based and one
- corporate based. Both are connected to the Internet, and
- expected, via this <acronym>VPN</acronym> to behave as
- one.</title>
+ <title><acronym>VPN</acronym> Between a Home and Corporate
+ Network</title>
<indexterm>
<primary>VPN</primary>
<secondary>creating</secondary>
</indexterm>
- <para>The premise is as follows:</para>
+ <para>There is no standard for what constitutes a
+ <acronym>VPN</acronym>. <acronym>VPN</acronym>s can be
+ implemented using a number of different technologies, each
+ of which has their own strengths and weaknesses. This
+ section presents the strategies used for implementing a
+ <acronym>VPN</acronym> for the following scenario:</para>
<itemizedlist>
<listitem>
- <para>You have at least two sites</para>
+ <para>There are at least two sites where each site is using
+ IP internally.</para>
</listitem>
<listitem>
- <para>Both sites are using IP internally</para>
- </listitem>
-
- <listitem>
- <para>Both sites are connected to the Internet, through a
- gateway that is running FreeBSD.</para>
+ <para>Both sites are connected to the Internet through a
+ gateway that is running &os;.</para>
</listitem>
<listitem>
@@ -2838,15 +2437,15 @@ options IPSEC_DEBUG #debug for IP security</screen>
<listitem>
<para>The internal addresses of the two networks can be
- public or private IP addresses, it does not matter.
- They just may not collide; e.g.: may not both use
+ either public or private IP addresses. However, the
+ address space must not collide. For example, both
+ networks cannot use
<hostid role="ipaddr">192.168.1.x</hostid>.</para>
</listitem>
</itemizedlist>
- </sect2>
- <sect2>
- <sect2info>
+ <sect3>
+ <sect3info>
<authorgroup>
<author>
<firstname>Tom</firstname>
@@ -2857,23 +2456,24 @@ options IPSEC_DEBUG #debug for IP security</screen>
<contrib>Written by </contrib>
</author>
</authorgroup>
- </sect2info>
+ </sect3info>
<title>Configuring IPsec on &os;</title>
- <para>To begin, the
+ <para>To begin,
<filename role="package">security/ipsec-tools</filename>
- must be installed from the Ports Collection. This third
- party software package provides a number of applications
- which will help support the configuration.</para>
+ must be installed from the Ports Collection. This software
+ provides a number of applications which support the
+ configuration.</para>
<para>The next requirement is to create two &man.gif.4;
pseudo-devices which will be used to tunnel packets and
allow both networks to communicate properly. As
<username>root</username>, run the following commands,
- replacing the <replaceable>internal</replaceable> and
- <replaceable>external</replaceable> items with the real
- internal and external gateways:</para>
+ replacing <replaceable>internal</replaceable> and
+ <replaceable>external</replaceable> with the real IP
+ addresses of the internal and external interfaces of the two
+ gateways:</para>
<screen>&prompt.root; <userinput>ifconfig gif0 create</userinput></screen>
@@ -2881,18 +2481,18 @@ options IPSEC_DEBUG #debug for IP security</screen>
<screen>&prompt.root; <userinput>ifconfig gif0 tunnel <replaceable>external1 external2</replaceable></userinput></screen>
- <para>For example, the corporate <acronym>LAN</acronym>'s
- public <acronym>IP</acronym> is
- <hostid role="ipaddr">172.16.5.4</hostid> having a private
- <acronym>IP</acronym> of
- <hostid role="ipaddr">10.246.38.1</hostid>. The home
- <acronym>LAN</acronym>'s public <acronym>IP</acronym> is
- <hostid role="ipaddr">192.168.1.12</hostid> with an internal
- private <acronym>IP</acronym> of
- <hostid role="ipaddr">10.0.0.5</hostid>.</para>
+ <para>In this example, the corporate <acronym>LAN</acronym>'s
+ external <acronym>IP</acronym> address is <hostid
+ role="ipaddr">172.16.5.4</hostid> and its internal
+ <acronym>IP</acronym> address is <hostid
+ role="ipaddr">10.246.38.1</hostid>. The home
+ <acronym>LAN</acronym>'s external <acronym>IP</acronym>
+ address is <hostid role="ipaddr">192.168.1.12</hostid> and its
+ internal private <acronym>IP</acronym> address is <hostid
+ role="ipaddr">10.0.0.5</hostid>.</para>
- <para>This may seem confusing, so review the following example
- output from the &man.ifconfig.8; command:</para>
+ <para>If this is confusing, review the following example output
+ from &man.ifconfig.8;:</para>
<programlisting>Gateway 1:
@@ -2908,9 +2508,8 @@ tunnel inet 192.168.1.12 --&gt; 172.16.5.4
inet 10.0.0.5 --&gt; 10.246.38.1 netmask 0xffffff00
inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4</programlisting>
- <para>Once complete, both private <acronym>IP</acronym>s
- should be reachable using the &man.ping.8; command like
- the following output suggests:</para>
+ <para>Once complete, both internal <acronym>IP</acronym>
+ addresses should be reachable using &man.ping.8;:</para>
<programlisting>priv-net# ping 10.0.0.5
PING 10.0.0.5 (10.0.0.5): 56 data bytes
@@ -2950,8 +2549,7 @@ round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms</programlisting>
<para>At this point, internal machines should be reachable
from each gateway as well as from machines behind the
- gateways. This is easily determined from the following
- example:</para>
+ gateways. Again, use &man.ping.8; to confirm:</para>
<programlisting>corp-net# ping 10.0.0.8
PING 10.0.0.8 (10.0.0.8): 56 data bytes
@@ -2975,13 +2573,13 @@ PING 10.246.38.1 (10.246.38.107): 56 data bytes
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms</programlisting>
- <para>Setting up the tunnels is the easy part. Configuring
- a secure link is a much more in depth process. The
- following configuration uses pre-shared
- (<acronym>PSK</acronym>) <acronym>RSA</acronym> keys. Aside
- from the <acronym>IP</acronym> addresses, both
- <filename>/usr/local/etc/racoon/racoon.conf</filename> files
- will be identical and look similar to</para>
+ <para>Setting up the tunnels is the easy part. Configuring a
+ secure link is a more in depth process. The following
+ configuration uses pre-shared (<acronym>PSK</acronym>)
+ <acronym>RSA</acronym> keys. Other than the
+ <acronym>IP</acronym> addresses, the
+ <filename>/usr/local/etc/racoon/racoon.conf</filename> on
+ both gateways will be identical and look similar to:</para>
<programlisting>path pre_shared_key "/usr/local/etc/racoon/psk.txt"; #location of pre-shared key file
log debug; #log verbosity setting: set to 'notify' when testing and debugging is complete
@@ -3041,21 +2639,17 @@ sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # address $network/
compression_algorithm deflate;
}</programlisting>
- <para>Explaining every available option, along with those
- listed in these examples is beyond the scope of this
- document. There is plenty of relevant information in the
- <application>racoon</application> configuration manual
- page.</para>
-
- <para>The <acronym>SPD</acronym> policies need to be
- configured so &os; and <application>racoon</application> is
- able to encrypt and decrypt network traffic between
- hosts.</para>
-
- <para>This task may be undertaken with a simple shell script
- similar to the following which is on the corporate gateway.
- This file will be used during system initialization and
- should be saved as
+ <para>For descriptions of each available option, refer to the
+ manual page for <filename>racoon.conf</filename>.</para>
+
+ <para>The Security Policy Database (<acronym>SPD</acronym>)
+ needs to be configured so that &os; and
+ <application>racoon</application> are able to encrypt and
+ decrypt network traffic between the hosts.</para>
+
+ <para>This can be achieved with a shell script, similar to the
+ following, on the corporate gateway. This file will be used
+ during system initialization and should be saved as
<filename>/usr/local/etc/racoon/setkey.conf</filename>.</para>
<programlisting>flush;
@@ -3088,12 +2682,12 @@ Foreground mode.
another console and use &man.tcpdump.1; to view network
traffic using the following command. Replace
<literal>em0</literal> with the network interface card as
- required.</para>
+ required:</para>
<screen>&prompt.root; <userinput>tcpdump -i em0 host <replaceable>172.16.5.4 and dst 192.168.1.12</replaceable></userinput></screen>
<para>Data similar to the following should appear on the
- console. If not, there is an issue, and debugging the
+ console. If not, there is an issue and debugging the
returned data will be required.</para>
<programlisting>01:47:32.021683 IP corporatenetwork.com &gt; 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa)
@@ -3102,11 +2696,10 @@ Foreground mode.
<para>At this point, both networks should be available and
seem to be part of the same network. Most likely both
- networks are protected by a firewall, as they should be. To
- allow traffic to flow between them, rules need to be added
- to pass packets back and forth. For the &man.ipfw.8;
- firewall, add the following lines to the firewall
- configuration file:</para>
+ networks are protected by a firewall. To allow traffic to
+ flow between them, rules need to be added to pass packets.
+ For the &man.ipfw.8; firewall, add the following lines to the
+ firewall configuration file:</para>
<programlisting>ipfw add 00201 allow log esp from any to any
ipfw add 00202 allow log ah from any to any
@@ -3140,7 +2733,8 @@ pass out quick on gif0 from any to any</programlisting>
ipsec_program="/usr/local/sbin/setkey"
ipsec_file="/usr/local/etc/racoon/setkey.conf" # allows setting up spd policies on boot
racoon_enable="yes"</programlisting>
- </sect2>
+ </sect3>
+ </sect2>
</sect1>
<sect1 id="openssh">
@@ -3165,65 +2759,62 @@ racoon_enable="yes"</programlisting>
<para><application>OpenSSH</application> is a set of network
connectivity tools used to access remote machines securely.
- It can be used as a direct replacement for
- <command>rlogin</command>, <command>rsh</command>,
- <command>rcp</command>, and <command>telnet</command>.
Additionally, TCP/IP connections can be tunneled/forwarded
- securely through SSH. <application>OpenSSH</application>
- encrypts all traffic to effectively eliminate eavesdropping,
- connection hijacking, and other network-level attacks.</para>
+ securely through <acronym>SSH</acronym> connections.
+ <application>OpenSSH</application> encrypts all traffic to
+ effectively eliminate eavesdropping, connection hijacking, and
+ other network-level attacks.</para>
<para><application>OpenSSH</application> is maintained by the
- OpenBSD project, and is based upon SSH v1.2.12 with all the
- recent bug fixes and updates. It is compatible with both SSH
- protocols 1 and 2.</para>
+ OpenBSD project and is installed by default in &os;. It is
+ compatible with both <acronym>SSH</acronym> version 1 and 2
+ protocols.</para>
<sect2>
- <title>Advantages of Using OpenSSH</title>
-
- <para>Normally, when using &man.telnet.1; or &man.rlogin.1;,
- data is sent over the network in a clear, un-encrypted form.
- Network sniffers anywhere in between the client and server
- can steal your user/password information or data transferred
- in your session. <application>OpenSSH</application> offers
- a variety of authentication and encryption methods to
- prevent this from happening.</para>
+ <title>Advantages of Using
+ <application>OpenSSH</application></title>
+
+ <para>When data is sent over the network in an unencrypted form,
+ network sniffers anywhere in between the client and server
+ can steal user/password information or data transferred
+ during the session. <application>OpenSSH</application> offers
+ a variety of authentication and encryption methods to prevent
+ this from happening.</para>
</sect2>
<sect2>
- <title>Enabling <application>sshd</application></title>
+ <title>Enabling The SSH Server</title>
<indexterm>
<primary>OpenSSH</primary>
<secondary>enabling</secondary>
</indexterm>
- <para>The <application>sshd</application> is an option
- presented during a <literal>Standard</literal> install of
- &os;. To see if <application>sshd</application> is enabled,
- check the <filename>rc.conf</filename> file for:</para>
+ <para>To see if &man.sshd.8; is enabled, check
+ <filename>/etc/rc.conf</filename> for this line:</para>
<programlisting>sshd_enable="YES"</programlisting>
- <para>This will load &man.sshd.8;, the daemon program for
- <application>OpenSSH</application>, the next time your
- system initializes. Alternatively, it is possible to use
- &man.service.8; to
- start <application>OpenSSH</application>:</para>
+ <para>This will start &man.sshd.8;, the daemon program for
+ <application>OpenSSH</application>, the next time the system
+ initializes. Alternatively, it is possible to use
+ &man.service.8; to start <application>OpenSSH</application>
+ now:</para>
<screen>&prompt.root; <userinput>service sshd start</userinput></screen>
</sect2>
<sect2>
- <title>SSH Client</title>
+ <title>The SSH Client</title>
<indexterm>
<primary>OpenSSH</primary>
<secondary>client</secondary>
</indexterm>
- <para>The &man.ssh.1; utility works similarly to
- &man.rlogin.1;.</para>
+ <para>To use &man.ssh.1; to connect to a system running
+ &man.sshd.8;, specify the username and host to log
+ into:</para>
<screen>&prompt.root; <userinput>ssh <replaceable>user@example.com</replaceable></userinput>
Host key not found from the list of known hosts.
@@ -3231,27 +2822,22 @@ Are you sure you want to continue connecting (yes/no)? <userinput>yes</userinput
Host 'example.com' added to the list of known hosts.
user@example.com's password: <userinput>*******</userinput></screen>
- <para>The login will continue just as it would have if a
- session was created using <command>rlogin</command> or
- <command>telnet</command>. SSH utilizes a key fingerprint
- system for verifying the authenticity of the server when the
- client connects. The user is prompted to enter
- <literal>yes</literal> only when connecting for the first
- time. Future attempts to login are all verified against the
- saved fingerprint key. The SSH client will alert you if the
- saved fingerprint differs from the received fingerprint on
- future login attempts. The fingerprints are saved in
- <filename>~/.ssh/known_hosts</filename>, or
- <filename>~/.ssh/known_hosts2</filename> for SSH v2
- fingerprints.</para>
-
- <para>By default, recent versions of the
- <application>OpenSSH</application> servers only accept SSH
- v2 connections. The client will use version 2 if possible
- and will fall back to version 1. The client can also be
- forced to use one or the other by passing it the
- <option>-1</option> or <option>-2</option> for version 1 or
- version 2, respectively. The version 1 compatibility is
+ <para><acronym>SSH</acronym> utilizes a key fingerprint system
+ to verify the authenticity of the server when the client
+ connects. The user is prompted to type
+ <literal>yes</literal> when connecting for the first time.
+ Future attempts to login are verified against the saved
+ fingerprint key and the &man.ssh.1; client will display an
+ alert if the saved fingerprint differs from the received
+ fingerprint on future login attempts. The fingerprints are
+ saved in <filename>~/.ssh/known_hosts</filename>.</para>
+
+ <para>By default, recent versions of &man.sshd.8; only accept
+ <acronym>SSH</acronym> v2 connections. The client will use
+ version 2 if possible and will fall back to version 1. The
+ client can also be forced to use one or the other by passing
+ it the <option>-1</option> or <option>-2</option> for version
+ 1 or version 2, respectively. The version 1 compatibility is
maintained in the client for backwards compatibility with
older versions.</para>
</sect2>
@@ -3264,12 +2850,11 @@ user@example.com's password: <userinput>*******</userinput></screen>
<secondary>secure copy</secondary>
</indexterm>
<indexterm>
- <primary><command>scp</command></primary>
+ <primary>&man.scp.1;</primary>
</indexterm>
- <para>The &man.scp.1; command works similarly to &man.rcp.1;;
- it copies a file to or from a remote machine, except in a
- secure fashion.</para>
+ <para>Use &man.scp.1; to copy a file to or from a remote machine
+ in a secure fashion.</para>
<screen>&prompt.root; <userinput> scp <replaceable>user@example.com:/COPYRIGHT COPYRIGHT</replaceable></userinput>
user@example.com's password: <userinput>*******</userinput>
@@ -3282,10 +2867,11 @@ COPYRIGHT 100% |*****************************| 4735
here.</para>
<para>The arguments passed to &man.scp.1; are similar to
- &man.cp.1;, with the file or files in the first argument,
- and the destination in the second. Since the file is
- fetched over the network, through SSH, one or more of the
- file arguments takes on the form
+ &man.cp.1;, with the file or files to copy in the first
+ argument, and the destination in the second. Since the file
+ is fetched over the network, through an
+ <acronym>SSH</acronym>, connection, one or more of the file
+ arguments takes the form
<option>user@host:&lt;path_to_remote_file&gt;</option>.</para>
</sect2>
@@ -3299,25 +2885,20 @@ COPYRIGHT 100% |*****************************| 4735
<para>The system-wide configuration files for both the
<application>OpenSSH</application> daemon and client reside
- within the <filename class="directory">/etc/ssh</filename>
- directory.</para>
+ in <filename class="directory">/etc/ssh</filename>.</para>
<para><filename>ssh_config</filename> configures the client
settings, while <filename>sshd_config</filename> configures
- the daemon.</para>
-
- <para>Additionally, the <option>sshd_program</option>
- (<filename>/usr/sbin/sshd</filename> by default), and
- <option>sshd_flags</option> <filename>rc.conf</filename>
- options can provide more levels of configuration.</para>
+ the daemon. Each file has its own manual page which describes
+ the available configuration options.</para>
</sect2>
<sect2 id="security-ssh-keygen">
- <title><application>ssh-keygen</application></title>
+ <title>&man.ssh-keygen.1;</title>
- <para>Instead of using passwords, &man.ssh-keygen.1; can
- be used to generate DSA or RSA keys to authenticate a
- user:</para>
+ <para>Instead of using passwords, &man.ssh-keygen.1; can be used
+ to generate <acronym>DSA</acronym> or <acronym>RSA</acronym>
+ keys to authenticate a user:</para>
<screen>&prompt.user; <userinput>ssh-keygen -t <replaceable>dsa</replaceable></userinput>
Generating public/private dsa key pair.
@@ -3335,7 +2916,7 @@ bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com</screen>
in <filename>~/.ssh/id_dsa</filename> or
<filename>~/.ssh/id_rsa</filename>, whereas the public key
is stored in <filename>~/.ssh/id_dsa.pub</filename> or
- <filename>~/.ssh/id_rsa.pub</filename>, respectively for
+ <filename>~/.ssh/id_rsa.pub</filename>, respectively for the
<acronym>DSA</acronym> and <acronym>RSA</acronym> key types.
The public key must be placed in the
<filename>~/.ssh/authorized_keys</filename> file of the
@@ -3343,45 +2924,60 @@ bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com</screen>
<acronym>DSA</acronym> keys in order for the setup to
work.</para>
- <para>This will allow connection to the remote machine based
- upon SSH keys instead of passwords.</para>
+ <para>This setup allows connections to the remote machine based
+ upon <acronym>SSH</acronym> keys instead of passwords.</para>
+
+ <warning>
+ <para>Many users believe that keys are secure by design and
+ will use a key without a passphrase. This is
+ <emphasis>dangerous</emphasis> behavior and the method
+ an administrator may use to verify keys have a passphrase
+ is to view the key manually. If the private key file
+ contains the word <literal>ENCRYPTED</literal> the key
+ owner is using a passphrase. While it may still be a weak
+ passphrase, at least if the system is compromised, access
+ to other sites will still require some level of password
+ guessing. In addition, to better secure end users, the
+ <literal>from</literal> may be placed in the public key
+ file. For example, adding
+ <literal>from="192.168.10.5</literal> in the front of
+ <literal>ssh-rsa</literal> or <literal>rsa-dsa</literal>
+ prefix will only allow that specific user to login from
+ that host <acronym>IP</acronym>.</para>
+ </warning>
<para>If a passphrase is used in &man.ssh-keygen.1;, the user
- will be prompted for a password each time in order to use
+ will be prompted for the passphrase each time in order to use
the private key. &man.ssh-agent.1; can alleviate the strain
of repeatedly entering long passphrases, and is explored in
- the <xref linkend="security-ssh-agent"/> section
- below.</para>
+ <xref linkend="security-ssh-agent"/>.</para>
<warning>
- <para>The various options and files can be different
- according to the <application>OpenSSH</application>
- version you have on your system; to avoid problems you
- should consult the &man.ssh-keygen.1; manual page.</para>
+ <para>The various options and files can be different according
+ to the <application>OpenSSH</application> version. To avoid
+ problems, consult &man.ssh-keygen.1;.</para>
</warning>
</sect2>
<sect2 id="security-ssh-agent">
- <title><application>ssh-agent</application> and <application>ssh-add</application></title>
-
- <para>The &man.ssh-agent.1; and &man.ssh-add.1; utilities
- provide methods for <application>SSH</application> keys to
- be loaded into memory for use, without needing to type the
- passphrase each time.</para>
-
- <para>The &man.ssh-agent.1; utility will handle the
- authentication using the private key(s) that are loaded into
- it. &man.ssh-agent.1; should be used to launch another
- application. At the most basic level, it could spawn a
- shell or at a more advanced level, a window manager.</para>
-
- <para>To use &man.ssh-agent.1; in a shell, first it will need
- to be spawned with a shell as an argument. Secondly, the
- identity needs to be added by running &man.ssh-add.1; and
- providing it the passphrase for the private key. Once these
- steps have been completed the user will be able to
- &man.ssh.1; to any host that has the corresponding public
- key installed. For example:</para>
+ <title>Using SSH Agent To Cache Keys</title>
+
+ <para>To load <acronym>SSH</acronym> keys into memory for use,
+ without needing to type the passphrase each time, use
+ &man.ssh-agent.1; and &man.ssh-add.1;.</para>
+
+ <para>Authentication is handled by &man.ssh-agent.1;, using the
+ private key(s) that are loaded into it. Then,
+ &man.ssh-agent.1; should be used to launch another
+ application. At the most basic level, it could spawn a shell
+ or a window manager.</para>
+
+ <para>To use &man.ssh-agent.1; in a shell, start it with a shell
+ as an argument. Next, add the identity by running
+ &man.ssh-add.1; and providing it the passphrase for the
+ private key. Once these steps have been completed, the user
+ will be able to &man.ssh.1; to any host that has the
+ corresponding public key installed. For example:</para>
<screen>&prompt.user; ssh-agent <replaceable>csh</replaceable>
&prompt.user; ssh-add
@@ -3389,24 +2985,26 @@ Enter passphrase for /home/user/.ssh/id_dsa:
Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
&prompt.user;</screen>
- <para>To use &man.ssh-agent.1; in X11, a call to
- &man.ssh-agent.1; will need to be placed in
- <filename>~/.xinitrc</filename>. This will provide the
- &man.ssh-agent.1; services to all programs launched in X11.
- An example <filename>~/.xinitrc</filename> file might look
- like this:</para>
+ <para>To use &man.ssh-agent.1; in
+ <application>&xorg;</application>, a call to &man.ssh-agent.1;
+ needs to be placed in <filename>~/.xinitrc</filename>. This
+ provides the &man.ssh-agent.1; services to all programs
+ launched in <application>&xorg;</application>. An example
+ <filename>~/.xinitrc</filename> file might look like
+ this:</para>
<programlisting>exec ssh-agent <replaceable>startxfce4</replaceable></programlisting>
- <para>This would launch &man.ssh-agent.1;, which would in turn
- launch <application>XFCE</application>, every time X11
- starts. Then once that is done and X11 has been restarted so
- that the changes can take effect, simply run &man.ssh-add.1;
- to load all of your SSH keys.</para>
+ <para>This launches &man.ssh-agent.1;, which in turn launches
+ <application>XFCE</application>, every time
+ <application>&xorg;</application> starts. Once
+ <application>&xorg;</application> has been restarted so that
+ the changes can take effect, run &man.ssh-add.1; to load all
+ of the <acronym>SSH</acronym> keys.</para>
</sect2>
<sect2 id="security-ssh-tunneling">
- <title>SSH Tunneling</title>
+ <title><acronym>SSH</acronym> Tunneling</title>
<indexterm>
<primary>OpenSSH</primary>
@@ -3418,22 +3016,20 @@ Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
encrypted session.</para>
<para>The following command tells &man.ssh.1; to create a
- tunnel for <application>telnet</application>:</para>
+ tunnel for &man.telnet.1;:</para>
<screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5023:localhost:23 user@foo.example.com</replaceable></userinput>
&prompt.user;</screen>
- <para>The <command>ssh</command> command is used with the
- following options:</para>
+ <para>This example uses the following options:</para>
<variablelist>
<varlistentry>
<term><option>-2</option></term>
<listitem>
- <para>Forces <command>ssh</command> to use version 2 of
- the protocol. (Do not use if you are working with
- older SSH servers)</para>
+ <para>Forces &man.ssh.1; to use version 2 to connect to
+ the server.</para>
</listitem>
</varlistentry>
@@ -3442,8 +3038,7 @@ Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
<listitem>
<para>Indicates no command, or tunnel only. If omitted,
- <command>ssh</command> would initiate a normal
- session.</para>
+ &man.ssh.1; initiates a normal session.</para>
</listitem>
</varlistentry>
@@ -3451,8 +3046,7 @@ Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
<term><option>-f</option></term>
<listitem>
- <para>Forces <command>ssh</command> to run in the
- background.</para>
+ <para>Forces &man.ssh.1; to run in the background.</para>
</listitem>
</varlistentry>
@@ -3462,7 +3056,7 @@ Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
<listitem>
<para>Indicates a local tunnel in
<replaceable>localport:remotehost:remoteport</replaceable>
- fashion.</para>
+ format.</para>
</listitem>
</varlistentry>
@@ -3470,30 +3064,32 @@ Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
<term><option>user@foo.example.com</option></term>
<listitem>
- <para>The remote SSH server.</para>
+ <para>The login name to use on the specified remote
+ <acronym>SSH</acronym> server.</para>
</listitem>
</varlistentry>
</variablelist>
- <para>An SSH tunnel works by creating a listen socket on
- <hostid>localhost</hostid> on the specified port. It then
- forwards any connection received on the local host/port via
- the SSH connection to the specified remote host and
- port.</para>
+ <para>An <acronym>SSH</acronym> tunnel works by creating a
+ listen socket on <hostid>localhost</hostid> on the specified
+ port. It then forwards any connections received on the local
+ host/port via the <acronym>SSH</acronym> connection to the
+ specified remote host and port.</para>
<para>In the example, port <replaceable>5023</replaceable> on
- <hostid>localhost</hostid> is being forwarded to port
+ <hostid>localhost</hostid> is forwarded to port
<replaceable>23</replaceable> on <hostid>localhost</hostid>
of the remote machine. Since <replaceable>23</replaceable>
- is <application>telnet</application>, this would create a
- secure <application>telnet</application> session through an
- SSH tunnel.</para>
+ is used by &man.telnet.1;, this creates an encrypted
+ &man.telnet.1; session through an
+ <acronym>SSH</acronym> tunnel.</para>
<para>This can be used to wrap any number of insecure TCP
- protocols such as SMTP, POP3, FTP, etc.</para>
+ protocols such as SMTP, POP3, and FTP.</para>
<example>
- <title>Using SSH to Create a Secure Tunnel for SMTP</title>
+ <title>Using &man.ssh.1; to Create a Secure Tunnel
+ for SMTP</title>
<screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>5025:localhost:25 user@mailserver.example.com</replaceable></userinput>
user@mailserver.example.com's password: <userinput>*****</userinput>
@@ -3503,66 +3099,60 @@ Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP</screen>
- <para>This can be used in conjunction with an
- &man.ssh-keygen.1; and additional user accounts to create
- a more seamless/hassle-free SSH tunneling environment.
- Keys can be used in place of typing a password, and the
- tunnels can be run as a separate user.</para>
+ <para>This can be used in conjunction with &man.ssh-keygen.1;
+ and additional user accounts to create a more seamless
+ <acronym>SSH</acronym> tunneling environment. Keys can be
+ used in place of typing a password, and the tunnels can be
+ run as a separate user.</para>
</example>
<sect3>
- <title>Practical SSH Tunneling Examples</title>
+ <title>Practical <acronym>SSH</acronym> Tunneling
+ Examples</title>
<sect4>
<title>Secure Access of a POP3 Server</title>
- <para>At work, there is an SSH server that accepts
- connections from the outside. On the same office
- network resides a mail server running a POP3 server.
- The network, or network path between your home and
- office may or may not be completely trustable. Because
- of this, you need to check your e-mail in a secure
- manner. The solution is to create an SSH connection to
- your office's SSH server, and tunnel through to the mail
- server.</para>
+ <para>In this example, there is an <acronym>SSH</acronym>
+ server that accepts connections from the outside. On the
+ same network resides a mail server running a POP3 server.
+ To check email in a secure manner, create an
+ <acronym>SSH</acronym> connection to the
+ <acronym>SSH</acronym> server, and tunnel through to the
+ mail server.</para>
<screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>2110:mail.example.com:110 user@ssh-server.example.com</replaceable></userinput>
user@ssh-server.example.com's password: <userinput>******</userinput></screen>
- <para>When the tunnel is up and running, you can point
- your mail client to send POP3 requests to
-
- <hostid>localhost</hostid> port 2110. A connection here
- will be forwarded securely across the tunnel to
+ <para>Once the tunnel is up and running, point the email
+ client to send POP3 requests to <hostid>localhost</hostid>
+ on port 2110. This connection will be forwarded securely
+ across the tunnel to
<hostid>mail.example.com</hostid>.</para>
</sect4>
<sect4>
<title>Bypassing a Draconian Firewall</title>
- <para>Some network administrators impose extremely
- draconian firewall rules, filtering not only incoming
- connections, but outgoing connections. You may be only
- given access to contact remote machines on ports 22 and
- 80 for SSH and web surfing.</para>
-
- <para>You may wish to access another (perhaps non-work
- related) service, such as an Ogg Vorbis server to stream
- music. If this Ogg Vorbis server is streaming on some
- other port than 22 or 80, you will not be able to access
- it.</para>
+ <para>Some network administrators impose firewall rules
+ which filter both incoming and outgoing connections. For
+ example, it might limit access from remote machines to
+ ports 22 and 80 to only allow &man.ssh.1; and web surfing.
+ This prevents access to any other service which uses a
+ port other than 22 or 80.</para>
- <para>The solution is to create an SSH connection to a
- machine outside of your network's firewall, and use it
- to tunnel to the Ogg Vorbis server.</para>
+ <para>The solution is to create an <acronym>SSH</acronym>
+ connection to a machine outside of the network's firewall
+ and use it to tunnel to the desired service.</para>
<screen>&prompt.user; <userinput>ssh -2 -N -f -L <replaceable>8888:music.example.com:8000 user@unfirewalled-system.example.org</replaceable></userinput>
user@unfirewalled-system.example.org's password: <userinput>*******</userinput></screen>
- <para>Your streaming client can now be pointed to
- <hostid>localhost</hostid> port 8888, which will be
- forwarded over to <hostid>music.example.com</hostid>
- port 8000, successfully evading the firewall.</para>
+ <para>In this example, a streaming Ogg Vorbis client can now
+ be pointed to <hostid>localhost</hostid> port 8888, which
+ will be forwarded over to
+ <hostid>music.example.com</hostid> on port 8000,
+ successfully bypassing the firewall.</para>
</sect4>
</sect3>
</sect2>
@@ -3571,17 +3161,15 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
<title>The <varname>AllowUsers</varname> Option</title>
<para>It is often a good idea to limit which users can log in
- and from where. The <literal>AllowUsers</literal> option is
- a good way to accomplish this. For example, to only allow
- the <username>root</username> user to log in from
- <hostid role="ipaddr">192.168.1.32</hostid>, something like
- this would be appropriate in the
- <filename>/etc/ssh/sshd_config</filename> file:</para>
+ and from where using <literal>AllowUsers</literal>. For
+ example, to only allow <username>root</username> to log in
+ from <hostid role="ipaddr">192.168.1.32</hostid>, add this
+ line to <filename>/etc/ssh/sshd_config</filename>:</para>
<programlisting>AllowUsers root@192.168.1.32</programlisting>
- <para>To allow the user <username>admin</username> to log in
- from anywhere, just list the username by itself:</para>
+ <para>To allow <username>admin</username> to log in from
+ anywhere, list that username by itself:</para>
<programlisting>AllowUsers admin</programlisting>
@@ -3591,14 +3179,13 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
<programlisting>AllowUsers root@192.168.1.32 admin</programlisting>
<note>
- <para>It is important that you list each user that needs to
- log in to this machine; otherwise they will be locked
- out.</para>
+ <para>It is important to list each user that needs to log into
+ this machine; otherwise, they will be locked out.</para>
</note>
<para>After making changes to
- <filename>/etc/ssh/sshd_config</filename> you must tell
- &man.sshd.8; to reload its config files, by running:</para>
+ <filename>/etc/ssh/sshd_config</filename>, tell &man.sshd.8;
+ to reload its configuration file by running:</para>
<screen>&prompt.root; <userinput>service sshd reload</userinput></screen>
</sect2>
@@ -3606,14 +3193,15 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
<sect2>
<title>Further Reading</title>
- <para><ulink
- url="http://www.openssh.com/">OpenSSH</ulink></para>
+ <para>The <ulink url="http://www.openssh.com/">OpenSSH</ulink>
+ website.</para>
- <para>&man.ssh.1; &man.scp.1; &man.ssh-keygen.1;
- &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5;</para>
+ <para>&man.ssh.1;, &man.scp.1;, &man.ssh-keygen.1;,
+ &man.ssh-agent.1;, &man.ssh-add.1;, and &man.ssh.config.5; for
+ client options.</para>
- <para>&man.sshd.8; &man.sftp-server.8;
- &man.sshd.config.5;</para>
+ <para>&man.sshd.8;, &man.sftp-server.8;, and &man.sshd.config.5;
+ for server options.</para>
</sect2>
</sect1>
@@ -3628,35 +3216,33 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
</authorgroup>
</sect1info>
- <title>File System Access Control Lists
+ <title>Filesystem Access Control Lists
(<acronym>ACL</acronym>s)</title>
<indexterm>
<primary>ACL</primary>
</indexterm>
- <para>In conjunction with file system enhancements like
- snapshots, FreeBSD offers the security of File System Access
- Control Lists (<acronym>ACL</acronym>s).</para>
+ <para>Filesystem Access Control Lists (<acronym>ACL</acronym>s)
+ extend the standard &unix; permission model in a &posix;.1e
+ compatible way. This permits an administrator to make use of
+ and take advantage of a more sophisticated security
+ model.</para>
- <para>Access Control Lists extend the standard &unix; permission
- model in a highly compatible (&posix;.1e) way. This feature
- permits an administrator to make use of and take advantage of
- a more sophisticated security model.</para>
-
- <para>To enable <acronym>ACL</acronym> support for
- <acronym>UFS</acronym> file systems, the following:</para>
+ <para>The &os; <filename>GENERIC</filename> kernel provides
+ <acronym>ACL</acronym> support for <acronym>UFS</acronym> file
+ systems. Users who prefer to compile a custom kernel must
+ include the following option in their custom kernel
+ configuration file:</para>
<programlisting>options UFS_ACL</programlisting>
- <para>must be compiled into the kernel. If this option has not
- been compiled in, a warning message will be displayed when
- attempting to mount a file system supporting
- <acronym>ACL</acronym>s. This option is included in the
- <filename>GENERIC</filename> kernel. <acronym>ACL</acronym>s
- rely on extended attributes being enabled on the file system.
- Extended attributes are natively supported in the next
- generation &unix; file system, <acronym>UFS2</acronym>.</para>
+ <para>If this option is not compiled in, a warning message will be
+ displayed when attempting to mount a filesystem supporting
+ <acronym>ACL</acronym>s. <acronym>ACL</acronym>s rely on
+ extended attributes being enabled on the filesystem. Extended
+ attributes are natively supported in
+ <acronym>UFS2</acronym>.</para>
<note>
<para>A higher level of administrative overhead is required to
@@ -3664,9 +3250,7 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
than on <acronym>UFS2</acronym>. The performance of
extended attributes on <acronym>UFS2</acronym> is also
substantially higher. As a result, <acronym>UFS2</acronym>
- is generally recommended in preference to
- <acronym>UFS1</acronym> for use with access control
- lists.</para>
+ is recommended for use with <acronym>ACL</acronym>s.</para>
</note>
<para><acronym>ACL</acronym>s are enabled by the mount-time
@@ -3674,50 +3258,46 @@ user@unfirewalled-system.example.org's password: <userinput>*******</userinput><
to <filename>/etc/fstab</filename>. The mount-time flag can
also be automatically set in a persistent manner using
&man.tunefs.8; to modify a superblock <acronym>ACL</acronym>s
- flag in the file system header. In general, it is preferred
+ flag in the filesystem header. In general, it is preferred
to use the superblock flag for several reasons:</para>
<itemizedlist>
<listitem>
<para>The mount-time <acronym>ACL</acronym>s flag cannot be
- changed by a remount (&man.mount.8; <option>-u</option>),
- only by means of a complete &man.umount.8; and fresh
- &man.mount.8;. This means that <acronym>ACL</acronym>s
- cannot be enabled on the root file system after boot. It
- also means that you cannot change the disposition of a
- file system once it is in use.</para>
+ changed by a remount using <option>mount -u</option>. It
+ requires a complete &man.umount.8; and fresh &man.mount.8;.
+ This means that <acronym>ACL</acronym>s cannot be enabled on
+ the root filesystem after boot. It also means that the
+ disposition of a filesystem cannot be changed once it is in
+ use.</para>
</listitem>
<listitem>
- <para>Setting the superblock flag will cause the file system
- to always be mounted with <acronym>ACL</acronym>s enabled
+ <para>Setting the superblock flag will cause the filesystem
+ to always be mounted with <acronym>ACL</acronym>s enabled,
even if there is not an <filename>fstab</filename> entry
or if the devices re-order. This prevents accidental
- mounting of the file system without
- <acronym>ACL</acronym>s enabled, which can result in
- <acronym>ACL</acronym>s being improperly enforced, and
- hence security problems.</para>
+ mounting of the filesystem without <acronym>ACL</acronym>s
+ enabled, which can result in the security problem of
+ <acronym>ACL</acronym>s being improperly enforced.</para>
</listitem>
</itemizedlist>
<note>
- <para>We may change the <acronym>ACL</acronym>s behavior to
- allow the flag to be enabled without a complete fresh
- &man.mount.8;, but we consider it desirable to discourage
- accidental mounting without <acronym>ACL</acronym>s enabled,
- because you can shoot your feet quite nastily if you enable
- <acronym>ACL</acronym>s, then disable them, then re-enable
- them without flushing the extended attributes. In general,
- once you have enabled <acronym>ACL</acronym>s on a file
- system, they should not be disabled, as the resulting file
+ <para>It is desirable to discourage accidental mounting without
+ <acronym>ACL</acronym>s enabled, because nasty things can
+ happen if <acronym>ACL</acronym>s are enabled, then disabled,
+ then re-enabled without flushing the extended attributes. In
+ general, once <acronym>ACL</acronym>s are enabled on a
+ filesystem, they should not be disabled, as the resulting file
protections may not be compatible with those intended by the
users of the system, and re-enabling <acronym>ACL</acronym>s
may re-attach the previous <acronym>ACL</acronym>s to files
that have since had their permissions changed, resulting in
- other unpredictable behavior.</para>
+ unpredictable behavior.</para>
</note>
- <para>File systems with <acronym>ACL</acronym>s enabled will
+ <para>Filesystems with <acronym>ACL</acronym>s enabled will
show a <literal>+</literal> (plus) sign in their permission
settings when viewed. For example:</para>
@@ -3727,22 +3307,21 @@ drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2
drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3
drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
- <para>Here we see that the
+ <para>In this example,
<filename class="directory">directory1</filename>,
<filename class="directory">directory2</filename>, and
- <filename class="directory">directory3</filename> directories
- are all taking advantage of <acronym>ACL</acronym>s. The
- <filename class="directory">public_html</filename> directory
+ <filename class="directory">directory3</filename>
+ are all taking advantage of <acronym>ACL</acronym>s, whereas
+ <filename class="directory">public_html</filename>
is not.</para>
<sect2>
<title>Making Use of <acronym>ACL</acronym>s</title>
- <para>The file system <acronym>ACL</acronym>s can be viewed by
- the &man.getfacl.1; utility. For instance, to view the
- <acronym>ACL</acronym> settings on the
- <filename>test</filename> file, one would use the
- command:</para>
+ <para>Filesystem <acronym>ACL</acronym>s can be viewed using
+ &man.getfacl.1;. For instance, to view the
+ <acronym>ACL</acronym> settings on
+ <filename>test</filename>:</para>
<screen>&prompt.user; <userinput>getfacl <filename>test</filename></userinput>
#file:test
@@ -3753,27 +3332,25 @@ drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
other::r--</screen>
<para>To change the <acronym>ACL</acronym> settings on this
- file, invoke the &man.setfacl.1; utility. Observe:</para>
+ file, use &man.setfacl.1;:</para>
<screen>&prompt.user; <userinput>setfacl -k <filename>test</filename></userinput></screen>
- <para>The <option>-k</option> flag will remove all of the
- currently defined <acronym>ACL</acronym>s from a file or
- file system. The more preferable method would be to use
+ <para>To remove all of the currently defined
+ <acronym>ACL</acronym>s from a file or filesystem, one can use
+ <option>-k</option>. However, the preferred method is to use
<option>-b</option> as it leaves the basic fields required
for <acronym>ACL</acronym>s to work.</para>
<screen>&prompt.user; <userinput>setfacl -m u:trhodes:rwx,group:web:r--,o::--- <filename>test</filename></userinput></screen>
- <para>In the aforementioned command, the <option>-m</option>
- option was used to modify the default <acronym>ACL</acronym>
- entries. Since there were no pre-defined entries, as they
- were removed by the previous command, this will restore the
- default options and assign the options listed. Take care to
- notice that if you add a user or group which does not exist
- on the system, an <errorname>Invalid argument</errorname>
- error will be printed to
- <devicename>stdout</devicename>.</para>
+ <para>In this example, <option>-m</option> is used to modify the
+ default <acronym>ACL</acronym> entries. Since there were no
+ pre-defined entries, as they were removed by the previous
+ command, it restores the default options and assign the
+ options listed. If a user or group is added which does not
+ exist on the system, an <errorname>Invalid
+ argument</errorname> error will be displayed.</para>
</sect2>
</sect1>
@@ -3791,7 +3368,7 @@ drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
<title>Monitoring Third Party Security Issues</title>
<indexterm>
- <primary>Portaudit</primary>
+ <primary>portaudit</primary>
</indexterm>
<para>In recent years, the security world has made many
@@ -3800,33 +3377,32 @@ drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
are installed and configured for virtually any operating
system available today.</para>
- <para>Vulnerability assessment is a key factor in security, and
- while &os; releases advisories for the base system, doing so
+ <para>Vulnerability assessment is a key factor in security.
+ While &os; releases advisories for the base system, doing so
for every third party utility is beyond the &os; Project's
capability. There is a way to mitigate third party
vulnerabilities and warn administrators of known security
issues. A &os; add on utility known as
- <application>Portaudit</application> exists solely for this
+ <application>portaudit</application> exists solely for this
purpose.</para>
<para>The
<filename role="package">ports-mgmt/portaudit</filename>
- port polls a database, updated and maintained by the &os;
- Security Team and ports developers, for known security
+ port polls a database, which is updated and maintained by the
+ &os; Security Team and ports developers, for known security
issues.</para>
- <para>To begin using <application>Portaudit</application>, one
- must install it from the Ports Collection:</para>
+ <para>To install <application>portaudit</application> from the
+ Ports Collection:</para>
<screen>&prompt.root; <userinput>cd /usr/ports/ports-mgmt/portaudit &amp;&amp; make install clean</userinput></screen>
- <para>During the install process, the configuration files for
+ <para>During the installation, the configuration files for
&man.periodic.8; will be updated, permitting
- <application>Portaudit</application> output in the daily
- security runs. Ensure the daily security run emails, which
+ <application>portaudit</application> output in the daily
+ security runs. Ensure that the daily security run emails, which
are sent to <username>root</username>'s email account, are
- being read. No more configuration will be required
- here.</para>
+ being read. No other configuration is required.</para>
<para>After installation, an administrator can update the
database and view known vulnerabilities in installed packages
@@ -3835,20 +3411,19 @@ drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html</programlisting>
<screen>&prompt.root; <userinput>portaudit -Fda</userinput></screen>
<note>
- <para>The database will automatically be updated during the
- &man.periodic.8; run; thus, the previous command is
- completely optional. It is only required for the following
- examples.</para>
+ <para>The database is automatically updated during the
+ &man.periodic.8; run. The above command is optional and can
+ be used to manually update the database now.</para>
</note>
<para>To audit the third party utilities installed as part of
- the Ports Collection at anytime, an administrator need only
- run the following command:</para>
+ the Ports Collection at anytime, an administrator can run the
+ following command:</para>
<screen>&prompt.root; <userinput>portaudit -a</userinput></screen>
- <para><application>Portaudit</application> will produce
- something like this for vulnerable packages:</para>
+ <para><application>portaudit</application> will display messages
+ for any installed vulnerable packages:</para>
<programlisting>Affected package: cups-base-1.1.22.0_1
Type of problem: cups-base -- HPGL buffer overflow vulnerability.
@@ -3858,15 +3433,15 @@ Reference: &lt;http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-00
You are advised to update or deinstall the affected package(s) immediately.</programlisting>
- <para>By pointing a web browser to the <acronym>URL</acronym>
- shown, an administrator may obtain more information about the
- vulnerability in question. This will include versions
- affected, by &os; Port version, along with other web sites
- which may contain security advisories.</para>
+ <para>By pointing a web browser to the displayed
+ <acronym>URL</acronym>, an administrator may obtain more
+ information about the vulnerability. This will include the
+ versions affected, by &os; port version, along with other web
+ sites which may contain security advisories.</para>
- <para>In short, <application>Portaudit</application> is a
- powerful utility and extremely useful when coupled with the
- <application>Portupgrade</application> port.</para>
+ <para><application>portaudit</application> is a powerful utility
+ and is extremely useful when coupled with the
+ <application>portmaster</application> port.</para>
</sect1>
<sect1 id="security-advisories">
@@ -3883,23 +3458,22 @@ You are advised to update or deinstall the affected package(s) immediately.</pro
<title>&os; Security Advisories</title>
<indexterm>
- <primary>FreeBSD Security Advisories</primary>
+ <primary>&os; Security Advisories</primary>
</indexterm>
<para>Like many production quality operating systems, &os;
publishes <quote>Security Advisories</quote>. These
advisories are usually mailed to the security lists and noted
in the Errata only after the appropriate releases have been
- patched. This section will work to explain what an advisory
- is, how to understand it, and what measures to take in order
- to patch a system.</para>
+ patched. This section explains what an advisory is, how to
+ understand it, and what measures to take in order to patch a
+ system.</para>
<sect2>
<title>What Does an Advisory Look Like?</title>
- <para>The &os; security advisories look similar to the one
- below, taken from the &a.security-notifications.name;
- mailing list.</para>
+ <para>&os; security advisories use the format seen in this
+ example:</para>
<programlisting>=============================================================================
FreeBSD-SA-XX:XX.UTIL Security Advisory
@@ -3951,10 +3525,10 @@ VII. References <co id="co-ref"/></programlisting>
<calloutlist>
<callout arearefs="co-topic">
- <para>The <literal>Topic</literal> field indicates exactly
- what the problem is. It is basically an introduction to
- the current security advisory and notes the utility with
- the vulnerability.</para>
+ <para>The <literal>Topic</literal> field specifies the
+ problem. It provides an introduction to the security
+ advisory and notes the utility affected by the
+ vulnerability.</para>
</callout>
<callout arearefs="co-category">
@@ -3966,28 +3540,26 @@ VII. References <co id="co-ref"/></programlisting>
component of the &os; operating system. The
<literal>contrib</literal> category means that the
vulnerability affects software contributed to the &os;
- Project, such as <application>sendmail</application>.
- Finally the <literal>ports</literal> category indicates
- that the vulnerability affects add on software available
- as part of the Ports Collection.</para>
+ Project, such as <application>Sendmail</application>.
+ The <literal>ports</literal> category indicates that the
+ vulnerability affects add on software available through
+ the Ports Collection.</para>
</callout>
<callout arearefs="co-module">
<para>The <literal>Module</literal> field refers to the
- component location, for instance <literal>sys</literal>.
- In this example, we see that the module,
- <literal>sys</literal>, is affected; therefore, this
+ component location. In this example, the
+ <literal>sys</literal> module is affected; therefore, this
vulnerability affects a component used within the
kernel.</para>
</callout>
<callout arearefs="co-announce">
<para>The <literal>Announced</literal> field reflects the
- date said security advisory was published, or announced
+ date the security advisory was published, or announced
to the world. This means that the security team has
- verified that the problem does exist and that a patch
- has been committed to the &os; source code
- repository.</para>
+ verified that the problem exists and that a patch has
+ been committed to the &os; source code repository.</para>
</callout>
<callout arearefs="co-credit">
@@ -4000,13 +3572,13 @@ VII. References <co id="co-ref"/></programlisting>
<para>The <literal>Affects</literal> field explains which
releases of &os; are affected by this vulnerability.
For the kernel, a quick look over the output from
- <command>ident</command> on the affected files will help
- in determining the revision. For ports, the version
- number is listed after the port name in
- <filename class="directory">/var/db/pkg</filename>. If
- the system does not sync with the &os;
- Subversion repository and rebuilt daily,
- chances are that it is affected.</para>
+ &man.ident.1; on the affected files will help in
+ determining the revision. For ports, the version number
+ is listed after the port name in <filename
+ class="directory">/var/db/pkg</filename>. If the
+ system does not sync with the &os; Subversion repository
+ and is not rebuilt daily, chances are that it is
+ affected.</para>
</callout>
<callout arearefs="co-corrected">
@@ -4017,24 +3589,24 @@ VII. References <co id="co-ref"/></programlisting>
<callout arearefs="co-cve">
<para>Reserved for the identification information used to
- look up vulnerabilities in the Common Vulnerabilities
- Database system.</para>
+ look up vulnerabilities in the <ulink
+ url="http://cve.mitre.org">Common Vulnerabilities
+ and Exposures</ulink> database.</para>
</callout>
<callout arearefs="co-backround">
<para>The <literal>Background</literal> field gives
- information on exactly what the affected utility is.
- Most of the time this is why the utility exists in &os;,
- what it is used for, and a bit of information on how the
- utility came to be.</para>
+ information about the affected utility. Most of the time
+ this is why the utility exists in &os;, what it is used
+ for, and a bit of information on how the utility came to
+ be.</para>
</callout>
<callout arearefs="co-descript">
<para>The <literal>Problem Description</literal> field
explains the security hole in depth. This can include
information on flawed code, or even how the utility
- could be maliciously used to open a security
- hole.</para>
+ could be maliciously used to open a security hole.</para>
</callout>
<callout arearefs="co-impact">
@@ -4047,28 +3619,26 @@ VII. References <co id="co-ref"/></programlisting>
<callout arearefs="co-workaround">
<para>The <literal>Workaround</literal> field offers a
- feasible workaround to system administrators who may be
- incapable of upgrading the system. This may be due to
- time constraints, network availability, or a slew of
- other reasons. Regardless, security should not be taken
- lightly, and an affected system should either be patched
- or the security hole workaround should be
- implemented.</para>
+ workaround to system administrators who cannot
+ upgrade the system due to time constraints, network
+ availability, or other reasons. Security should not be
+ taken lightly, and an affected system should either be
+ patched or the workaround implemented.</para>
</callout>
<callout arearefs="co-solution">
<para>The <literal>Solution</literal> field offers
- instructions on patching the affected system. This is a
+ instructions for patching the affected system. This is a
step by step tested and verified method for getting a
system patched and working securely.</para>
</callout>
<callout arearefs="co-details">
<para>The <literal>Correction Details</literal> field
- displays the Subversion branch or release
- name with the periods changed to underscore characters.
- It also shows the revision number of the affected files
- within each branch.</para>
+ displays the Subversion branch or release name with the
+ periods changed to underscore characters. It also shows
+ the revision number of the affected files within each
+ branch.</para>
</callout>
<callout arearefs="co-ref">
@@ -4099,22 +3669,22 @@ VII. References <co id="co-ref"/></programlisting>
</indexterm>
<para>Process accounting is a security method in which an
- administrator may keep track of system resources used,
+ administrator may keep track of system resources used and
their allocation among users, provide for system monitoring,
and minimally track a user's commands.</para>
- <para>This indeed has its own positive and negative points. One
+ <para>This indeed has both positive and negative points. One
of the positives is that an intrusion may be narrowed down to
the point of entry. A negative is the amount of logs
generated by process accounting, and the disk space they may
- require. This section will walk an administrator through the
+ require. This section walks an administrator through the
basics of process accounting.</para>
<sect2>
<title>Enabling and Utilizing Process Accounting</title>
- <para>Before making use of process accounting, it must be
- enabled. To do this, execute the following commands:</para>
+ <para>Before using process accounting, it must be enabled using
+ the following commands:</para>
<screen>&prompt.root; <userinput>touch <filename>/var/account/acct</filename></userinput>
@@ -4122,31 +3692,142 @@ VII. References <co id="co-ref"/></programlisting>
&prompt.root; <userinput>echo 'accounting_enable="YES"' &gt;&gt; <filename>/etc/rc.conf</filename></userinput></screen>
- <para>Once enabled, accounting will begin to track
- <acronym>CPU</acronym> stats, commands, etc. All accounting
- logs are in a non-human readable format and may be viewed
- using the &man.sa.8; utility. If issued without any
- options, <command>sa</command> will print information
- relating to the number of per user calls, the total elapsed
- time in minutes, total <acronym>CPU</acronym> and user time
- in minutes, average number of I/O operations, etc.</para>
-
- <para>To view information about commands being issued, one
- would use the &man.lastcomm.1; utility. The
- <command>lastcomm</command> command may be used to print out
- commands issued by users on specific &man.ttys.5;, for
- example:</para>
+ <para>Once enabled, accounting will begin to track information
+ such as <acronym>CPU</acronym> statistics and executed
+ commands. All accounting logs are in a non-human readable
+ format which can be viewed using &man.sa.8;. If issued
+ without any options, &man.sa.8; prints information relating to
+ the number of per-user calls, the total elapsed time in
+ minutes, total <acronym>CPU</acronym> and user time in
+ minutes, and the average number of I/O operations.</para>
+
+ <para>To view information about commands being issued, use
+ &man.lastcomm.1;. This command displays the commands issued
+ by users on specific &man.ttys.5;. For example, this command
+ prints out all known usage of &man.ls.1; by
+ <username>trhodes</username> on the <literal>ttyp1</literal>
+ terminal:</para>
<screen>&prompt.root; <userinput>lastcomm ls
<username>trhodes</username> ttyp1</userinput></screen>
- <para>Would print out all known usage of the
- <command>ls</command> by <username>trhodes</username> on the
- <literal>ttyp1</literal> terminal.</para>
-
<para>Many other useful options exist and are explained in the
- &man.lastcomm.1;, &man.acct.5; and &man.sa.8; manual
- pages.</para>
+ &man.lastcomm.1;, &man.acct.5;, and &man.sa.8;.</para>
</sect2>
</sect1>
+
+ <sect1 id="security-resourcelimits">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>Contributed by </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>Resource Limits</title>
+
+ <indexterm>
+ <primary>Resource limits</primary>
+ </indexterm>
+
+ <para>For years, &os; has used a resource limits
+ database controlled through a flat file,
+ <filename>/etc/login.conf</filename>. While it has
+ been discussed previously and is still supported, it
+ is not the most optimal method of controlling resources.
+ The flat file requires users to be divided into various
+ group labels known as classes, which require changes not
+ only to this flat file but also the password database.
+ Potentially a single, more constrained user would require
+ an additional label added, the resource database needs to be
+ built using <command>cap_mkdb</command>, edits made to
+ the <filename>/etc/master.passwd</filename> file. In
+ addition, the password database must be rebuilt using
+ <command>pwd_mkdb</command>. This multi-step process could be
+ very time consuming depending on how many users must be
+ singled out.</para>
+
+ <para>A new command in &os;, &man.rctl.8;, allows for a more
+ fine grained method of controlling resources limits for
+ users. This command will support much more than users,
+ it will also set resource constraints on processes, jails,
+ and the original login class. These advanced features
+ provide administrators and users with methods to control
+ resources through the command line and set rules on
+ system initialization using a configuration
+ file.</para>
+
+ <para>To enable this feature, add these lines to
+ <filename>GENERIC</filename>, or the custom kernel
+ configuration file, and rebuild.:</para>
+
+ <programlisting>options RACCT
+options RCTL</programlisting>
+
+ <para>The entire system will need rebuilt. See <xref
+ linkend="kernelconfig"/>, which will provide instructions for
+ the process. Once this is complete, the <command>rctl</command>
+ may be used to set rules for the system.</para>
+
+ <para>Rule syntax is simple, controlled through the use of
+ a <emphasis>subject</emphasis>, a <emphasis>subject-id</emphasis>,
+ <emphasis>resource</emphasis>, and <emphasis>action</emphasis>.
+ Take the following example rule:</para>
+
+ <programlisting>user:trhodes:<literal>maxproc</literal>:<literal>deny</literal>=10/user</programlisting>
+
+ <para>This rule shows a basic premise of a rule, here the
+ subject is <literal>user</literal> and the subject-id
+ is <literal>trhodes</literal>. The maxproc is, of course,
+ max number of processes, which is considered the action.
+ The action here is set to <literal>deny</literal>, which blocks
+ any new processes from being created. In the previous example,
+ the user, <literal>trhodes</literal> will be constrained
+ to <literal>10</literal> (ten) processes and no greater.
+ Other actions are available and could be log to the console,
+ pass a notification to &man.devd.8;, or
+ send a sigterm to the process.</para>
+
+ <para>Some care must be taken while adding rules. The one above
+ will unfortunately block my user from doing the most simple tasks
+ after I have logged in and executed a <command>screen</command>
+ session. When a resource limit has been hit, an error will
+ be printed, as in this example:</para>
+
+ <screen>&prompt.user; <userinput>man test</userinput>
+ /usr/bin/man: Cannot fork: Resource temporarily unavailable
+eval: Cannot fork: Resource temporarily unavailable</screen>
+
+ <para>For another example, &man.rctl.8; can be used to prevent
+ a jail from exceeding a memory limit. This rule could be
+ written as:</para>
+
+ <screen>&prompt.root; <userinput>rctl -a jail:httpd:memoryuse:deny=2G/jail</userinput></screen>
+
+ <para>Rules may also persist across reboots if they have been
+ added to <filename>/etc/rctl.conf</filename> file. The
+ format is a rule, without the preceding command. For example,
+ the previous rule could be added like the following:</para>
+
+ <programlisting># Block jail from using more than 2G memory:
+jail:httpd:memoryuse:deny=2G/jail</programlisting>
+
+ <para>To remove a rule, just ask <command>rctl</command> to
+ remove it from the list:</para>
+
+ <screen>&prompt.root; <userinput>rctl -r user:trhodes:maxproc:deny=10/user</userinput></screen>
+
+ <para>The manual page shows a method for removing all rules;
+ however, if removing all rules for a single user is required,
+ this command may be issued:</para>
+
+ <screen>&prompt.root; <userinput>rctl -r user:trhodes</userinput></screen>
+
+ <para>Many other resources exist which can be used to excert
+ additional control over various <literal>subjects</literal>.
+ See &man.rctl.8; to learn about them.</para>
+ </sect1>
</chapter>