Difference between revisions of "Linux Active Directory How-To"

From VistApedia
Jump to: navigation, search
(Fixed some formatting)
Line 11: Line 11:
  
 
The whole process is rather complicated and relies on a number of subsystems working together:
 
The whole process is rather complicated and relies on a number of subsystems working together:
Pluggable Authentication Modules (PAM)
+
* Pluggable Authentication Modules (PAM)
Server Message Block (SMB, Samba)
+
* Server Message Block (SMB, Samba)
WinBIND (part of Samba)
+
* WinBIND (part of Samba)
Kerberos 5 (By MIT, with Microsoft compatibility hacks)
+
* Kerberos 5 (By MIT, with Microsoft compatibility hacks)
  
 
The biggest problem is configuring Samba and determining exactly what identifiers and spelling to use where, since Kerberos and NETBIOS are fond of uppercase, while everything else prefers lowercase.  
 
The biggest problem is configuring Samba and determining exactly what identifiers and spelling to use where, since Kerberos and NETBIOS are fond of uppercase, while everything else prefers lowercase.  
Line 40: Line 40:
  
 
This guide assumes that you already have a Windows ADS running.  First verify a few things on the Windows ADS machine and note that the NETBIOS work group must be uppercase:
 
This guide assumes that you already have a Windows ADS running.  First verify a few things on the Windows ADS machine and note that the NETBIOS work group must be uppercase:
 +
<pre>
 
NETBIOS Workgroup:  YOURWORKGROUPNAME
 
NETBIOS Workgroup:  YOURWORKGROUPNAME
 
Domain name: example.com
 
Domain name: example.com
Line 48: Line 49:
 
Administrator name: Administrator
 
Administrator name: Administrator
 
Administrator password: Supersecret
 
Administrator password: Supersecret
 
+
</pre>
 
This illustrates some weird points.  Rather confusingly, the MS Windows NETBIOS work group, is also referred to as the domain name in MS Windows documentation.  The NETBIOS work group is actually used more often than the real domain name, so when in doubt, use the NETBIOS work group, since it will usually be the correct one for the occasion.   
 
This illustrates some weird points.  Rather confusingly, the MS Windows NETBIOS work group, is also referred to as the domain name in MS Windows documentation.  The NETBIOS work group is actually used more often than the real domain name, so when in doubt, use the NETBIOS work group, since it will usually be the correct one for the occasion.   
  
Line 57: Line 58:
 
Kerberos is configured in the file /etc/krb5.conf.  Verify the following lines and not the UPPERCASE domain name:
 
Kerberos is configured in the file /etc/krb5.conf.  Verify the following lines and not the UPPERCASE domain name:
  
 +
<pre>
 
[libdefaults]
 
[libdefaults]
 
default_realm = EXAMPLE.COM
 
default_realm = EXAMPLE.COM
Line 66: Line 68:
 
[domain_realms]
 
[domain_realms]
 
.kerberos.server = EXAMPLE.COM
 
.kerberos.server = EXAMPLE.COM
 +
</pre>
  
 
Note that Kerberos requires that the clocks of the machines in the domain are synchronized in time. The default maximum skew allowed is 5 minutes.  Windows and Linux handle times differently. UNIX is UTC based, and Windows is local time zone based, so be careful.  Configuring NTP is necessary, but is also beyond the scope of this document.
 
Note that Kerberos requires that the clocks of the machines in the domain are synchronized in time. The default maximum skew allowed is 5 minutes.  Windows and Linux handle times differently. UNIX is UTC based, and Windows is local time zone based, so be careful.  Configuring NTP is necessary, but is also beyond the scope of this document.
Line 72: Line 75:
  
 
Verify the following lines in /etc/nsswitch.conf:
 
Verify the following lines in /etc/nsswitch.conf:
 
+
<pre>
 
passwd: files winbind
 
passwd: files winbind
 
shadow: files winbind
 
shadow: files winbind
 
group: files winbind
 
group: files winbind
 
+
</pre>
 
You may need to run ldconfig to set up the winbind libraries:
 
You may need to run ldconfig to set up the winbind libraries:
  
# ldconfig -v |grep winbind
+
user@comp# ldconfig -v |grep winbind
  
 
Since nothing was working at the time, I cannot tell whether that was really a required step.
 
Since nothing was working at the time, I cannot tell whether that was really a required step.
Line 87: Line 90:
 
Here's the [global] section from smb.conf:
 
Here's the [global] section from smb.conf:
  
 +
<pre>
 
[global]
 
[global]
 
workgroup = YOURWORKGROUPNAME
 
workgroup = YOURWORKGROUPNAME
Line 106: Line 110:
 
add machine script = /usr/sbin/useradd -d /var/lib/nobody -g 100 -s /bin/false -M %u
 
add machine script = /usr/sbin/useradd -d /var/lib/nobody -g 100 -s /bin/false -M %u
 
password server = msads.example.com
 
password server = msads.example.com
 
+
</pre>
 
The /bin/false shell will prevent foreign domain users from opening a command shell and is recommended for security.
 
The /bin/false shell will prevent foreign domain users from opening a command shell and is recommended for security.
  
Line 119: Line 123:
 
First restart the network and Samba:
 
First restart the network and Samba:
  
# service network restart
+
user@comp # service network restart<br />
# service smb restart
+
user@comp # service smb restart<br />
  
 
Verify that smbd and nmbd are running with
 
Verify that smbd and nmbd are running with
  
# ps e
+
user@comp # ps e
  
 
Try to join the Windows Domain:
 
Try to join the Windows Domain:
  
# net ads join -S msads.example.com -U administrator%Supersecret
+
user@comp # net ads join -S msads.example.com -U administrator%Supersecret
  
 
You should get the message: "Joined LINUXMACHINE to realm EXAMPLE.COM", at which point most joyful celebrations are in order.
 
You should get the message: "Joined LINUXMACHINE to realm EXAMPLE.COM", at which point most joyful celebrations are in order.
Line 134: Line 138:
 
You can now start the Winbind daemon with the maximum debug information:
 
You can now start the Winbind daemon with the maximum debug information:
  
# winbindd -d 10
+
user@comp # winbindd -d 10
  
 
  Watch /var/log/messages for errors:
 
  Watch /var/log/messages for errors:
  
# tail -f /var/log/messages
+
user@comp # tail -f /var/log/messages
  
 
You can investigate the domain records with:
 
You can investigate the domain records with:
  
# wbinfo -u
+
user@comp # wbinfo -u<br />
# whinfo -g
+
user@comp # whinfo -g<br />
# getent password
+
user@comp # getent password<br />
# getent group
+
user@comp # getent group<br />
  
With those utilities, you should be able to see the user names and groups in the domain that you just  
+
With those utilities, you should be able to see the user names and groups in the domain that you just joined.  User YOURWORKGROUPNAME+jdoe and the group  
joined.  User YOURWORKGROUPNAME+jdoe and the group  
 
 
YOURWORKGROUPNAME+winusergrp should be listed.
 
YOURWORKGROUPNAME+winusergrp should be listed.
  

Revision as of 16:40, 26 October 2009

Linux Active Directory How-To:

1. Document scope

This document briefly describes how to configure a GNU/Linux machine to authenticate users against a Microsoft Windows Server 2003 Active Directory Server.

The idea behind this is to use Windows 2003 ADS (and possibly later versions) to authenticate a foreign user and allow him/her to use a Linux machine which is a member of the Windows domain, without having to create a user account manually on the Linux machine. This is very useful when you have large numbers of machines and users.

If everything works as it should, then you only need to configure the users on the Active Directory Server. The users can then walk up to any machine on the network and log on. If a user never used that machine before, a user account will be magically created. The magic trick is known as Single Sign-On (SSO).

The whole process is rather complicated and relies on a number of subsystems working together:

  • Pluggable Authentication Modules (PAM)
  • Server Message Block (SMB, Samba)
  • WinBIND (part of Samba)
  • Kerberos 5 (By MIT, with Microsoft compatibility hacks)

The biggest problem is configuring Samba and determining exactly what identifiers and spelling to use where, since Kerberos and NETBIOS are fond of uppercase, while everything else prefers lowercase.

Of course, nothing works, until every last little detail is correct, so these and other subtleties can lead to many hours of happy debugging and experimenting before everything suddenly begins to work. Just about every imaginable error message was discovered the hard way and they were all documented in the references below. Of course, since you will be following this great guide, you wont ever see them - let's hope anyway.

Note that everything here was tested on Linux, but it should also apply almost directly to Solaris, since Samba is cross platform.

2. Referenced Documents

Chapter 6. Domain membership part II, Server configuration basics: HTTP://us4.samba.org/samba/docs/man/samba-howto-collection/domain-member.html#ads-member

Chapter 24. Winbind: Use of Domain Accounts Part III. Advanced Configuration, HTTP://us4.samba.org/samba/docs/man/samba-howto-collection/winbind.html

Kerberos Administration Guide, HTTP://web.mit.edu/kerberos/krb5-1.3/krb5-1.3/doc/krb5-admin.html

Linux PAM, HTTP://www.kernel.org/pub/linux/libs/pam3.

3. Configuration

We want to use the Windows 2003 Active Directory Server (ADS) to authenticate a foreign user and allow him or her to use a Linux machine which is a member of the Windows domain. Initially, the user jdoe doesn't exist on the Linux machine. We want to use Winbind and Samba to assign a UID and GID from a pool of reserve numbers and create a home directory automatically under /home/winnt for this foreign user. This will (hopefully) allow jdoe to walk up to the Linux machine, log in and use it to run X applications, without ever having been manually configured on it.

This guide assumes that you already have a Windows ADS running. First verify a few things on the Windows ADS machine and note that the NETBIOS work group must be uppercase:

NETBIOS Workgroup:  YOURWORKGROUPNAME
Domain name: example.com
Fully qualified domain host name: msads.example.com
User name defined in ADS: jdoe
User password: jdoe123
User primary group: winusergrp
Administrator name: Administrator
Administrator password: Supersecret

This illustrates some weird points. Rather confusingly, the MS Windows NETBIOS work group, is also referred to as the domain name in MS Windows documentation. The NETBIOS work group is actually used more often than the real domain name, so when in doubt, use the NETBIOS work group, since it will usually be the correct one for the occasion.

The MS Windows user name, will become work group+user name on Linux, and the Windows primary group, will become the work group+group name on Linux.

3.1 Kerberos

Kerberos is configured in the file /etc/krb5.conf. Verify the following lines and not the UPPERCASE domain name:

[libdefaults]
default_realm = EXAMPLE.COM
[realms]
EXAMPLE.COM = 
  {
  kdc = msads.example.com>
  }
[domain_realms]
.kerberos.server = EXAMPLE.COM

Note that Kerberos requires that the clocks of the machines in the domain are synchronized in time. The default maximum skew allowed is 5 minutes. Windows and Linux handle times differently. UNIX is UTC based, and Windows is local time zone based, so be careful. Configuring NTP is necessary, but is also beyond the scope of this document.

3.2 Nsswitch Configuration

Verify the following lines in /etc/nsswitch.conf:

passwd: files winbind
shadow: files winbind
group: files winbind

You may need to run ldconfig to set up the winbind libraries:

user@comp# ldconfig -v |grep winbind

Since nothing was working at the time, I cannot tell whether that was really a required step.

3.3 Samba configuration

Here's the [global] section from smb.conf:

[global]
workgroup = YOURWORKGROUPNAME
realm = EXAMPLE.COM
preferred master = no
server string = Samba Server
security = ADS
encrypt passwords = yes
log level = 3
log file = /var/log/samba/%m
max log size = 50
winbind separator = +
printcap name = cups
printing = cups
idmap uid = 10000-20000
idmap gid = 10000-20000
template homedir /home/winnt/%D/%U
template shell = /bin/false
add machine script = /usr/sbin/useradd -d /var/lib/nobody -g 100 -s /bin/false -M %u
password server = msads.example.com

The /bin/false shell will prevent foreign domain users from opening a command shell and is recommended for security.

The default Windind separator is a backslash, but that doesn't work well, since it is a reserve character on UNIX/Linux. The general rule is to change it to a '+'.

3.4 Ethernet configuration

You have to set the ADS machine as (one of) the DNS in /etc/resolv.conf, to enable the Linux machine to find the Kerberos and LDAP servers on the ADS. Verify the ethernet and DNS setting with ifconfig and nslookup.

3.5 Join the Domain

First restart the network and Samba:

user@comp # service network restart
user@comp # service smb restart

Verify that smbd and nmbd are running with

user@comp # ps e

Try to join the Windows Domain:

user@comp # net ads join -S msads.example.com -U administrator%Supersecret

You should get the message: "Joined LINUXMACHINE to realm EXAMPLE.COM", at which point most joyful celebrations are in order.

You can now start the Winbind daemon with the maximum debug information:

user@comp # winbindd -d 10

Watch /var/log/messages for errors:

user@comp # tail -f /var/log/messages

You can investigate the domain records with:

user@comp # wbinfo -u
user@comp # whinfo -g
user@comp # getent password
user@comp # getent group

With those utilities, you should be able to see the user names and groups in the domain that you just joined. User YOURWORKGROUPNAME+jdoe and the group YOURWORKGROUPNAME+winusergrp should be listed.

3.6 Kerberos and error messages

If you get the message: Cannot find KDC for requested realm, then either the password server in smb.conf is wrong, or the DNS setting in resolv.conf is wrong.

If you get the message: KRB5 error code 68 while getting the initial credentials, then the Linux machine can talk to the ADS machine, but your Kerberos realm name in smb.conf is wrong.

If you get the message: The workgroup in smb.conf does not match the short domain name obtained from the server, then you did not specify the NETBIOS name properly.

--
Butch Whitby