1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
|
Setting Up PAM Authentication With mon mini-HOWTO
Andrew Ryan, andrewr@nam-shub.com
$Id: mon-PAM-mini-HOWTO,v 1.1.1.1 2005/02/18 17:52:13 trockij Exp $
This document describes how to use PAM authentication with the network
monitoring software mon, gives some specific configuration
examples, and points out some gotchas with PAM authentication in mon.
------------------------------------------------------------
Contents
1.0 Introduction
2.0 Caveats and Risks
3.0 Setting Up PAM Support For mon in Your OS
3.1 Setting Up PAM Support For Solaris Using Solaris PAM
3.2 Setting Up PAM Support Using Linux-PAM (for Linux,
FreeBSD, Solaris, SunOS and HP-UX 9.0 too!)
3.3 Notes on Shadow Password Support with mon and PAM
4.0 Setting up PAM Authentication in mon
5.0 Examples
5.1 Setting Up LDAP+SSL PAM Authentication in mon
5.2 Stacking PAM Modules
5.3 Other Cool-Looking PAM Services (which haven't been
tested with mon)
------------------------------------------------------------
1.0 Introduction
PAM (Pluggable Authentication Module) is an architecture for providing
one or more of the following four services: authentication, account
management, session management, and password management. PAM allows
applications to share these functions, and for these functions to be
maintained separately from the applications themselves. Thus, not
every application developer has to write routines to perform
authentication within their applications.
You can use PAM as an authentication mechanism for mon, and in the
process gain support for cool login methods like shadow passwords,
LDAP, and NT domains into your mon server. In addition, PAM modules
can be "stacked," which allows you to require authentication against
more than one PAM module.
------------------------------------------------------------
2.0 Caveats and Risks
It is important to understand what you are getting yourself into when
you use PAM with mon. Using PAM with mon should increase your
security, not decrease it.
Perhaps the biggest risk involved is that your passwords are going to
stay around in the memory of the mon program. When a C program is done
using a password, it can release the memory and the password is more
or less gone.
Unfortunately, in perl, we can't do our own memory management
(fortunately, we don't have to!). Even an 'undef' does not guarantee
that memory is going to be released or that values will be
forgotten. If you're really really paranoid about certain passwords,
don't use PAM authentication for mon, at least for these passwords.
There is also some risk inherent in some of the third party free
PAM modules that are out there. Some of them might not work with mon,
or they might not work well at your site. This is something of a fact
of life with free software, but at least it doesn't cost you anything
to try. Of course it's also an issue with non-free software as well :)
------------------------------------------------------------
3.0 Setting Up PAM Support For mon in Your OS
Before you set up mon to use PAM for authentication, you first need to
set up PAM for mon in your operating system. We discuss the two major
PAM implementations here, Solaris and Linux PAM. Linux PAM has been
ported to FreeBSD, Solaris, SunOS and HP-UX 9.0, so it's not just for
Linux, but the instructions are the same. If you aren't running Linux,
and you use Linux-PAM, however, you have to expect to be on your own
as far as support goes, both with Linux-PAM and your vendor.
------------------------------------------------------------
3.1 Setting Up PAM Support For Solaris Using Solaris PAM
PAM on Solaris is configured in the file /etc/pam.conf. You should
reference the man page for pam.conf(4) for syntax details. What I
suggest is adding a new PAM service for mon, with the following 4
lines (you may choose to use a different PAM module):
# Solaris PAM configuration for mon and www.padl.com's pam_ldap
mon auth required /usr/lib/security/pam_ldap.so.1
mon account required /usr/lib/security/pam_ldap.so.1
mon session required /usr/lib/security/pam_ldap.so.1
mon password required /usr/lib/security/pam_ldap.so.1
Or, use shadow passwords with this configuration (see the section
on notes for shadow passwords later in this document):
# Solaris PAM configuration for shadow passwords
mon auth required /usr/lib/security/pam_unix.so.1
mon account required /usr/lib/security/pam_unix.so.1
mon session required /usr/lib/security/pam_unix.so.1
mon password required /usr/lib/security/pam_unix.so.1
Be really careful about the syntax in the pam.conf file, and I highly
recommend that you keep a root shell open while you're editing this
file, especially when you first begin experimenting with PAM. If you
mangle the pam.conf file, NO PAM AUTHENTICATION WILL WORK AND YOU WILL
BE UNABLE TO LOG IN TO THE SYSTEM.
Don't worry about defining PAM services (like account) that you won't
use. It doesn't hurt, and it makes a good placeholder.
------------------------------------------------------------
3.2 Setting Up PAM Support Using Linux PAM (for Linux,
FreeBSD, Solaris, SunOS and HP-UX 9.0 too!)
Linux PAM has a different syntax but it's just as easy to set up. You
can reference the pam(8) man page or the Linux PAM page at
http://www.kernel.org/pub/linux/libs/pam/
for more information.
Instead of one configuration file for all of PAM, like Solaris uses,
Linux uses a directory, /etc/pam.d/, which contains one file
per PAM service. The contents of each file look very much like the
Solaris pam.conf file, except that there's no service name. To duplicate what
we did above, and set up a "mon" PAM service which used pam_ldap for
authentication, we would create a file called /etc/pam.d/mon with the
following lines:
#%PAM-1.0
auth required /lib/security/pam_ldap.so.1
account required /lib/security/pam_ldap.so.1
session required /lib/security/pam_ldap.so.1
password required /lib/security/pam_ldap.so.1
Or for shadow passwords:
#%PAM-1.0
auth required /lib/security/pam_pwdb.so.1 shadow nullok
account required /lib/security/pam_pwdb.so.1
session required /lib/security/pam_pwdb.so.1
password required /lib/security/pam_pwdb.so.1
Again, don't worry about defining PAM services (like account) that you
won't use. It doesn't hurt, and it makes a good placeholder.
------------------------------------------------------------
3.3 Notes on Shadow Password Support with mon and PAM
Shadow password authentication is far and away the most commonly used
and best-supported PAM service (Sun supports Solaris', and RedHat
supports the Linux version). You can use it with mon, although there
is an important fact to note.
By default, in order to read the shadow password file, you must be
root, because /etc/shadow is 0400 and owned by root. That means that
either the mon server must run as root, or that your password file
must have less restrictive permissions. You could make it 0444, but
that's like having no shadow password support at all.
An intermediate approach is to create a new group, say "mon", and then
'chgrp mon /etc/shadow ; chmod 0440 /etc/shadow'. Now put the user
which mon runs at, preferably a dedicated user who does nothing else,
into the "mon" group and now the shadow password file will be readable
only by root and the mon user, which hopefully is a locked account
used only to run mon and nothing else.
------------------------------------------------------------
4.0 Setting up PAM Authentication in mon
Configuring PAM support in the OS is the hard part, the mon portion
is quite easy. You need to add/change 2 lines in your mon.cf file, for
example:
# Use userfile authentication, followed by PAM authentication
authtype = userfile pam
# Use the "mon" PAM service
pamservice = mon
Note that in the above example, we're still using userfile
authentication as the first check. If mon authenticates a user via
userfile authentication, PAM is not consulted. But if userfile
authentication fails, PAM is checked and the user is either
authenticated or rejected. I like to keep userfile authentication for
my default mon.cgi user, since it has a password and username that may
be sent in the clear and I don't really want to have users in my
password database with clear/known passwords.
------------------------------------------------------------
5.0 Examples
We will discuss some examples of other interesting PAM services which
mon users might find interesting. Please contribute your own examples
and success stories to this section!
------------------------------------------------------------
5.1 Setting Up LDAP+SSL PAM Authentication in mon
The original reason I wanted PAM support in mon was to use LDAP
authentication for our organization. It is a really cool application
of LDAP and PAM which will allow you to implement secure, distributed
authentication for mon in conjunction with the mon.cgi GUI. It will
also spare you from having to maintain a separate mon password file.
Because there are a lot of different ways in which LDAP can be set up,
I won't cover all possibilities here. We got this working using
essentially the following method, connecting to a Netscape 4.1
Directory Server. OpenLDAP may also work but I've never tried it.
The basic outline:
1. Download and install the Netscape LDAP SDK from
http://www.iplanet.com/
2. Download the latest pam_ldap from http://www.padl.com/
3. Presumably you have a LDAP server, either Netscape or OpenLDAP,
which is working and has the correct entries in it to allow
authentication. I'm not sure if OpenLDAP works with SSL
(it definitely works without SSL), you should check the
latest release notes for pam_ldap.
4. Compile and install pam_ldap.so into /lib/security. Make
sure to configure and build with ssl support.
5. Set your /etc/ldap.conf file to point to your LDAP server, and
change the base name to match your organization.
6. Put a copy of cert7.db (which ships with Netscape Communicator)
in the path that you specified in the ldap.conf file under
sslpath.
7. Change the authtype config parameter to include "pam" in your
mon.cf, and also change the pamservice variable to be the PAM
service that you just set up (in the above example, we used "mon").
8. Reset mon.
9. Test mon authentication with a user that you know doesn't exist
in a local password file (assuming you're using one of the files
authentication types in conjunction with PAM).
A minimal ldap.conf file could look like this (with the names changed,
this is what we use):
host 1.2.3.4
base o=your_org.name
ldap_version 3
port 636
ssl yes
sslpath /etc/cert7.db
------------------------------------------------------------
5.2 Stacking PAM Modules
As mentioned previously, PAM modules can be stacked to require one or
more forms of authentication. Using different keywords, authentication
can be controlled to a very fine degree. Here are Solaris and Linux
examples of stacking modules to require that the mon password a user
submits is found both on an LDAP server and on the local machine's
shadow password file:
# Solaris /etc/pam.conf example of stacking modules to require
# both LDAP authentication and shadow password authentication for
# the 'mon' service
mon auth required /usr/lib/security/pam_ldap.so.1
mon auth required /usr/lib/security/pam_unix.so.1 try_first_pass
# Linux /etc/pam.d/mon example of stacking modules to require
# both LDAP authentication and shadow password authentication for
# the 'mon' service
auth required /lib/security/pam_ldap.so.1
auth required /lib/security/pam_pwdb.so.1 shadow nullok try_first_pass
This example just scratches the surface of what you can do by stacking
PAM authentication modules. Please reference your PAM documentation
for more examples and syntax.
------------------------------------------------------------
5.3 Other Cool-Looking PAM Services (which haven't been tested with
mon)
See this page for more PAM modules:
http://www.kernel.org/pub/linux/libs/pam/modules.html
Some cool modules that stand out:
* pam_ntdom - Authenticate against an NT PDC. From the Samba project.
* pam_securid (static passwds only) - Using static passwords, you can
authenticate against an ACE server (2-factor would work as well but
would be of very limited usefulness, better to implement 2-factor
authentication at the web server layer, e.g. mod_securid for Apache).
* Netware - Authenticate against a Netware server
* kerberos, S/Key, Radius, TACACS+ - Self-explanatory.
|