summaryrefslogtreecommitdiff
path: root/docs/htmldocs/winbind.html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/htmldocs/winbind.html')
-rw-r--r--docs/htmldocs/winbind.html721
1 files changed, 721 insertions, 0 deletions
diff --git a/docs/htmldocs/winbind.html b/docs/htmldocs/winbind.html
new file mode 100644
index 0000000000..1ee1de9f2f
--- /dev/null
+++ b/docs/htmldocs/winbind.html
@@ -0,0 +1,721 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Chapter 21. Winbind: Use of Domain Accounts</title><link rel="stylesheet" href="samba.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.60.1"><link rel="home" href="samba-doc.html" title="SAMBA Project Documentation"><link rel="up" href="optional.html" title="Part III. Advanced Configuration"><link rel="previous" href="VFS.html" title="Chapter 20. Stackable VFS modules"><link rel="next" href="AdvancedNetworkManagement.html" title="Chapter 22. Advanced Network Management"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Chapter 21. Winbind: Use of Domain Accounts</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="VFS.html">Prev</a> </td><th width="60%" align="center">Part III. Advanced Configuration</th><td width="20%" align="right"> <a accesskey="n" href="AdvancedNetworkManagement.html">Next</a></td></tr></table><hr></div><div class="chapter" lang="en"><div class="titlepage"><div><div><h2 class="title"><a name="winbind"></a>Chapter 21. Winbind: Use of Domain Accounts</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Tim</span> <span class="surname">Potter</span></h3><div class="affiliation"><span class="orgname">Samba Team<br></span><div class="address"><p><tt class="email">&lt;<a href="mailto:tpot@linuxcare.com.au">tpot@linuxcare.com.au</a>&gt;</tt></p></div></div></div><div class="author"><h3 class="author"><span class="firstname">Andrew</span> <span class="surname">Tridgell</span></h3><div class="affiliation"><span class="orgname">Samba Team<br></span><div class="address"><p><tt class="email">&lt;<a href="mailto:tridge@samba.org">tridge@samba.org</a>&gt;</tt></p></div></div></div><div class="author"><h3 class="author"><span class="firstname">Naag</span> <span class="surname">Mummaneni</span></h3><span class="contrib">Notes for Solaris</span><div class="affiliation"><div class="address"><p><tt class="email">&lt;<a href="mailto:getnag@rediffmail.com">getnag@rediffmail.com</a>&gt;</tt></p></div></div></div><div class="author"><h3 class="author"><span class="firstname">John</span> <span class="surname">Trostel</span></h3><div class="affiliation"><span class="orgname">SNAP<br></span><div class="address"><p><tt class="email">&lt;<a href="mailto:jtrostel@snapserver.com">jtrostel@snapserver.com</a>&gt;</tt></p></div></div></div><div class="author"><h3 class="author"><span class="firstname">Jelmer</span> <span class="othername">R.</span> <span class="surname">Vernooij</span></h3><div class="affiliation"><span class="orgname">The Samba Team<br></span><div class="address"><p><tt class="email">&lt;<a href="mailto:jelmer@samba.org">jelmer@samba.org</a>&gt;</tt></p></div></div></div><div class="author"><h3 class="author"><span class="firstname">John</span> <span class="othername">H.</span> <span class="surname">Terpstra</span></h3><div class="affiliation"><span class="orgname">Samba Team<br></span><div class="address"><p><tt class="email">&lt;<a href="mailto:jht@samba.org">jht@samba.org</a>&gt;</tt></p></div></div></div></div></div><div><p class="pubdate">27 June 2002</p></div></div><div></div></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><a href="winbind.html#id2941150">Features and Benefits</a></dt><dt><a href="winbind.html#id2941246">Introduction</a></dt><dt><a href="winbind.html#id2941324">What Winbind Provides</a></dt><dd><dl><dt><a href="winbind.html#id2941400">Target Uses</a></dt></dl></dd><dt><a href="winbind.html#id2941431">How Winbind Works</a></dt><dd><dl><dt><a href="winbind.html#id2941460">Microsoft Remote Procedure Calls</a></dt><dt><a href="winbind.html#id2941493">Microsoft Active Directory Services</a></dt><dt><a href="winbind.html#id2941516">Name Service Switch</a></dt><dt><a href="winbind.html#id2941652">Pluggable Authentication Modules</a></dt><dt><a href="winbind.html#id2941724">User and Group ID Allocation</a></dt><dt><a href="winbind.html#id2941757">Result Caching</a></dt></dl></dd><dt><a href="winbind.html#id2941785">Installation and Configuration</a></dt><dd><dl><dt><a href="winbind.html#id2941792">Introduction</a></dt><dt><a href="winbind.html#id2941859">Requirements</a></dt><dt><a href="winbind.html#id2941953">Testing Things Out</a></dt></dl></dd><dt><a href="winbind.html#id2943561">Conclusion</a></dt><dt><a href="winbind.html#id2943580">Common Errors</a></dt><dd><dl><dt><a href="winbind.html#id2943633">NSCD Problem Warning</a></dt></dl></dd></dl></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2941150"></a>Features and Benefits</h2></div></div><div></div></div><p>
+ Integration of UNIX and Microsoft Windows NT through a unified logon has
+ been considered a &quot;holy grail&quot; in heterogeneous computing environments for
+ a long time.
+ </p><p>
+ There is one other facility without which UNIX and Microsoft Windows network
+ interoperability would suffer greatly. It is imperative that there be a
+ mechanism for sharing files across UNIX systems and to be able to assign
+ domain user and group ownerships with integrity.
+ </p><p>
+ <span class="emphasis"><em>winbind</em></span> is a component of the Samba suite of programs
+ solves the unified logon problem. Winbind uses a UNIX implementation of Microsoft
+ RPC calls, Pluggable Authentication Modules, and the Name Service Switch to
+ allow Windows NT domain users to appear and operate as UNIX users on a UNIX
+ machine. This chapter describes the winbind system, explaining the functionality
+ it provides, how it is configured, and how it works internally.
+ </p><p>
+ Winbind provides three separate functions:
+ </p><div class="itemizedlist"><ul type="disc"><li><p>
+ Authentication of user credentials (via PAM)
+ </p></li><li><p>
+ Identity resolution (via NSS)`
+ </p></li><li><p>
+ Windindd maintains a database called winbind_idmap.tdb in which it stores
+ mappings between UNIX UIDs / GIDs and NT SIDs. This mapping is used only
+ for users and groups that do not have a local UID/GID. It stored the UID/GID
+ allocated from the idmap uid/gid range that it has mapped to the NT SID.
+ If <i class="parameter"><tt>idmap backend</tt></i> has been specified as ldapsam:url
+ then instead of using a local mapping winbindd will obtain this information
+ from the LDAP database.
+ </p></li></ul></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+ If winbindd is not running, then smbd (which calls winbindd) will fall back to
+ using purely local information from /etc/passwd and /etc/group and no dynamic
+ mapping will be used.
+ </p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2941246"></a>Introduction</h2></div></div><div></div></div><p>It is well known that UNIX and Microsoft Windows NT have
+ different models for representing user and group information and
+ use different technologies for implementing them. This fact has
+ made it difficult to integrate the two systems in a satisfactory
+ manner.</p><p>One common solution in use today has been to create
+ identically named user accounts on both the UNIX and Windows systems
+ and use the Samba suite of programs to provide file and print services
+ between the two. This solution is far from perfect however, as
+ adding and deleting users on both sets of machines becomes a chore
+ and two sets of passwords are required both of which
+ can lead to synchronization problems between the UNIX and Windows
+ systems and confusion for users.</p><p>We divide the unified logon problem for UNIX machines into
+ three smaller problems:</p><div class="itemizedlist"><ul type="disc"><li><p>Obtaining Windows NT user and group information
+ </p></li><li><p>Authenticating Windows NT users
+ </p></li><li><p>Password changing for Windows NT users
+ </p></li></ul></div><p>Ideally, a prospective solution to the unified logon problem
+ would satisfy all the above components without duplication of
+ information on the UNIX machines and without creating additional
+ tasks for the system administrator when maintaining users and
+ groups on either system. The winbind system provides a simple
+ and elegant solution to all three components of the unified logon
+ problem.</p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2941324"></a>What Winbind Provides</h2></div></div><div></div></div><p>Winbind unifies UNIX and Windows NT account management by
+ allowing a UNIX box to become a full member of a NT domain. Once
+ this is done the UNIX box will see NT users and groups as if
+ they were native UNIX users and groups, allowing the NT domain
+ to be used in much the same manner that NIS+ is used within
+ UNIX-only environments.</p><p>The end result is that whenever any
+ program on the UNIX machine asks the operating system to lookup
+ a user or group name, the query will be resolved by asking the
+ NT domain controller for the specified domain to do the lookup.
+ Because Winbind hooks into the operating system at a low level
+ (via the NSS name resolution modules in the C library) this
+ redirection to the NT domain controller is completely
+ transparent.</p><p>Users on the UNIX machine can then use NT user and group
+ names as they would use &quot;native&quot; UNIX names. They can chown files
+ so that they are owned by NT domain users or even login to the
+ UNIX machine and run a UNIX X-Window session as a domain user.</p><p>The only obvious indication that Winbind is being used is
+ that user and group names take the form DOMAIN\user and
+ DOMAIN\group. This is necessary as it allows Winbind to determine
+ that redirection to a domain controller is wanted for a particular
+ lookup and which trusted domain is being referenced.</p><p>Additionally, Winbind provides an authentication service
+ that hooks into the Pluggable Authentication Modules (PAM) system
+ to provide authentication via a NT domain to any PAM enabled
+ applications. This capability solves the problem of synchronizing
+ passwords between systems since all passwords are stored in a single
+ location (on the domain controller).</p><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941400"></a>Target Uses</h3></div></div><div></div></div><p>Winbind is targeted at organizations that have an
+ existing NT based domain infrastructure into which they wish
+ to put UNIX workstations or servers. Winbind will allow these
+ organizations to deploy UNIX workstations without having to
+ maintain a separate account infrastructure. This greatly
+ simplifies the administrative overhead of deploying UNIX
+ workstations into a NT based organization.</p><p>Another interesting way in which we expect Winbind to
+ be used is as a central part of UNIX based appliances. Appliances
+ that provide file and print services to Microsoft based networks
+ will be able to use Winbind to provide seamless integration of
+ the appliance into the domain.</p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2941431"></a>How Winbind Works</h2></div></div><div></div></div><p>The winbind system is designed around a client/server
+ architecture. A long running <b class="command">winbindd</b> daemon
+ listens on a UNIX domain socket waiting for requests
+ to arrive. These requests are generated by the NSS and PAM
+ clients and processed sequentially.</p><p>The technologies used to implement winbind are described
+ in detail below.</p><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941460"></a>Microsoft Remote Procedure Calls</h3></div></div><div></div></div><p>Over the last few years, efforts have been underway
+ by various Samba Team members to decode various aspects of
+ the Microsoft Remote Procedure Call (MSRPC) system. This
+ system is used for most network related operations between
+ Windows NT machines including remote management, user authentication
+ and print spooling. Although initially this work was done
+ to aid the implementation of Primary Domain Controller (PDC)
+ functionality in Samba, it has also yielded a body of code which
+ can be used for other purposes.</p><p>Winbind uses various MSRPC calls to enumerate domain users
+ and groups and to obtain detailed information about individual
+ users or groups. Other MSRPC calls can be used to authenticate
+ NT domain users and to change user passwords. By directly querying
+ a Windows PDC for user and group information, winbind maps the
+ NT account information onto UNIX user and group names.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941493"></a>Microsoft Active Directory Services</h3></div></div><div></div></div><p>
+ Since late 2001, Samba has gained the ability to
+ interact with Microsoft Windows 2000 using its 'Native
+ Mode' protocols, rather than the NT4 RPC services.
+ Using LDAP and Kerberos, a domain member running
+ winbind can enumerate users and groups in exactly the
+ same way as a Win2k client would, and in so doing
+ provide a much more efficient and
+ effective winbind implementation.
+ </p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941516"></a>Name Service Switch</h3></div></div><div></div></div><p>The Name Service Switch, or NSS, is a feature that is
+ present in many UNIX operating systems. It allows system
+ information such as hostnames, mail aliases and user information
+ to be resolved from different sources. For example, a standalone
+ UNIX workstation may resolve system information from a series of
+ flat files stored on the local filesystem. A networked workstation
+ may first attempt to resolve system information from local files,
+ and then consult a NIS database for user information or a DNS server
+ for hostname information.</p><p>The NSS application programming interface allows winbind
+ to present itself as a source of system information when
+ resolving UNIX usernames and groups. Winbind uses this interface,
+ and information obtained from a Windows NT server using MSRPC
+ calls to provide a new source of account enumeration. Using standard
+ UNIX library calls, one can enumerate the users and groups on
+ a UNIX machine running winbind and see all users and groups in
+ a NT domain plus any trusted domain as though they were local
+ users and groups.</p><p>The primary control file for NSS is
+ <tt class="filename">/etc/nsswitch.conf</tt>.
+ When a UNIX application makes a request to do a lookup
+ the C library looks in <tt class="filename">/etc/nsswitch.conf</tt>
+ for a line which matches the service type being requested, for
+ example the &quot;passwd&quot; service type is used when user or group names
+ are looked up. This config line specifies which implementations
+ of that service should be tried and in what order. If the passwd
+ config line is:</p><pre class="programlisting">
+passwd: files example
+ </pre><p>then the C library will first load a module called
+ <tt class="filename">/lib/libnss_files.so</tt> followed by
+ the module <tt class="filename">/lib/libnss_example.so</tt>. The
+ C library will dynamically load each of these modules in turn
+ and call resolver functions within the modules to try to resolve
+ the request. Once the request is resolved the C library returns the
+ result to the application.</p><p>This NSS interface provides a very easy way for Winbind
+ to hook into the operating system. All that needs to be done
+ is to put <tt class="filename">libnss_winbind.so</tt> in <tt class="filename">/lib/</tt>
+ then add &quot;winbind&quot; into <tt class="filename">/etc/nsswitch.conf</tt> at
+ the appropriate place. The C library will then call Winbind to
+ resolve user and group names.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941652"></a>Pluggable Authentication Modules</h3></div></div><div></div></div><p>Pluggable Authentication Modules, also known as PAM,
+ is a system for abstracting authentication and authorization
+ technologies. With a PAM module it is possible to specify different
+ authentication methods for different system applications without
+ having to recompile these applications. PAM is also useful
+ for implementing a particular policy for authorization. For example,
+ a system administrator may only allow console logins from users
+ stored in the local password file but only allow users resolved from
+ a NIS database to log in over the network.</p><p>Winbind uses the authentication management and password
+ management PAM interface to integrate Windows NT users into a
+ UNIX system. This allows Windows NT users to log in to a UNIX
+ machine and be authenticated against a suitable Primary Domain
+ Controller. These users can also change their passwords and have
+ this change take effect directly on the Primary Domain Controller.
+ </p><p>PAM is configured by providing control files in the directory
+ <tt class="filename">/etc/pam.d/</tt> for each of the services that
+ require authentication. When an authentication request is made
+ by an application the PAM code in the C library looks up this
+ control file to determine what modules to load to do the
+ authentication check and in what order. This interface makes adding
+ a new authentication service for Winbind very easy, all that needs
+ to be done is that the <tt class="filename">pam_winbind.so</tt> module
+ is copied to <tt class="filename">/lib/security/</tt> and the PAM
+ control files for relevant services are updated to allow
+ authentication via winbind. See the PAM documentation
+ for more details.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941724"></a>User and Group ID Allocation</h3></div></div><div></div></div><p>When a user or group is created under Windows NT
+ is it allocated a numerical relative identifier (RID). This is
+ slightly different to UNIX which has a range of numbers that are
+ used to identify users, and the same range in which to identify
+ groups. It is winbind's job to convert RIDs to UNIX id numbers and
+ vice versa. When winbind is configured it is given part of the UNIX
+ user id space and a part of the UNIX group id space in which to
+ store Windows NT users and groups. If a Windows NT user is
+ resolved for the first time, it is allocated the next UNIX id from
+ the range. The same process applies for Windows NT groups. Over
+ time, winbind will have mapped all Windows NT users and groups
+ to UNIX user ids and group ids.</p><p>The results of this mapping are stored persistently in
+ an ID mapping database held in a tdb database). This ensures that
+ RIDs are mapped to UNIX IDs in a consistent way.</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941757"></a>Result Caching</h3></div></div><div></div></div><p>An active system can generate a lot of user and group
+ name lookups. To reduce the network cost of these lookups winbind
+ uses a caching scheme based on the SAM sequence number supplied
+ by NT domain controllers. User or group information returned
+ by a PDC is cached by winbind along with a sequence number also
+ returned by the PDC. This sequence number is incremented by
+ Windows NT whenever any user or group information is modified. If
+ a cached entry has expired, the sequence number is requested from
+ the PDC and compared against the sequence number of the cached entry.
+ If the sequence numbers do not match, then the cached information
+ is discarded and up to date information is requested directly
+ from the PDC.</p></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2941785"></a>Installation and Configuration</h2></div></div><div></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941792"></a>Introduction</h3></div></div><div></div></div><p>
+This section describes the procedures used to get winbind up and
+running. Winbind is capable of providing access
+and authentication control for Windows Domain users through an NT
+or Win2K PDC for 'regular' services, such as telnet a nd ftp, as
+well for SAMBA services.
+</p><div class="itemizedlist"><ul type="disc"><li><p>
+ <span class="emphasis"><em>Why should I to this?</em></span>
+ </p><p>This allows the SAMBA administrator to rely on the
+ authentication mechanisms on the NT/Win2K PDC for the authentication
+ of domain members. NT/Win2K users no longer need to have separate
+ accounts on the SAMBA server.
+ </p></li><li><p>
+ <span class="emphasis"><em>Who should be reading this document?</em></span>
+ </p><p>
+ This HOWTO is designed for system administrators. If you are
+ implementing SAMBA on a file server and wish to (fairly easily)
+ integrate existing NT/Win2K users from your PDC onto the
+ SAMBA server, this HOWTO is for you. That said, I am no NT or PAM
+ expert, so you may find a better or easier way to accomplish
+ these tasks.
+ </p></li></ul></div></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941859"></a>Requirements</h3></div></div><div></div></div><p>
+If you have a Samba configuration file that you are currently
+using... <span class="emphasis"><em>BACK IT UP!</em></span> If your system already uses PAM,
+<span class="emphasis"><em>back up the <tt class="filename">/etc/pam.d</tt> directory
+contents!</em></span> If you haven't already made a boot disk,
+<span class="emphasis"><em>MAKE ONE NOW!</em></span>
+</p><p>
+Messing with the PAM configuration files can make it nearly impossible
+to log in to your machine. That's why you want to be able to boot back
+into your machine in single user mode and restore your
+<tt class="filename">/etc/pam.d</tt> back to the original state they were in if
+you get frustrated with the way things are going. ;-)
+</p><p>
+The latest version of SAMBA (version 3.0 as of this writing), now
+includes a functioning winbindd daemon. Please refer to the
+<a href="http://samba.org/" target="_top">main SAMBA web page</a> or,
+better yet, your closest SAMBA mirror site for instructions on
+downloading the source code.
+</p><p>
+To allow Domain users the ability to access SAMBA shares and
+files, as well as potentially other services provided by your
+SAMBA machine, PAM (pluggable authentication modules) must
+be setup properly on your machine. In order to compile the
+winbind modules, you should have at least the pam libraries resident
+on your system. For recent RedHat systems (7.1, for instance), that
+means <tt class="filename">pam-0.74-22</tt>. For best results, it is helpful to also
+install the development packages in <tt class="filename">pam-devel-0.74-22</tt>.
+</p></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2941953"></a>Testing Things Out</h3></div></div><div></div></div><p>
+Before starting, it is probably best to kill off all the SAMBA
+related daemons running on your server. Kill off all <span class="application">smbd</span>,
+<span class="application">nmbd</span>, and <span class="application">winbindd</span> processes that may
+be running. To use PAM, you will want to make sure that you have the
+standard PAM package which supplies the <tt class="filename">/etc/pam.d</tt>
+directory structure, including the pam modules are used by pam-aware
+services, several pam libraries, and the <tt class="filename">/usr/doc</tt>
+and <tt class="filename">/usr/man</tt> entries for pam. Winbind built better
+in SAMBA if the pam-devel package was also installed. This package includes
+the header files needed to compile pam-aware applications.
+</p><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942015"></a>Configure <tt class="filename">nsswitch.conf</tt> and the
+winbind libraries on Linux and Solaris</h4></div></div><div></div></div><p>
+The libraries needed to run the <span class="application">winbindd</span> daemon
+through nsswitch need to be copied to their proper locations, so
+</p><p>
+</p><pre class="screen">
+<tt class="prompt">root# </tt><b class="userinput"><tt>cp ../samba/source/nsswitch/libnss_winbind.so /lib</tt></b>
+</pre><p>
+</p><p>
+I also found it necessary to make the following symbolic link:
+</p><p>
+<tt class="prompt">root# </tt> <b class="userinput"><tt>ln -s /lib/libnss_winbind.so /lib/libnss_winbind.so.2</tt></b>
+</p><p>And, in the case of Sun Solaris:</p><pre class="screen">
+<tt class="prompt">root# </tt><b class="userinput"><tt>ln -s /usr/lib/libnss_winbind.so /usr/lib/libnss_winbind.so.1</tt></b>
+<tt class="prompt">root# </tt><b class="userinput"><tt>ln -s /usr/lib/libnss_winbind.so /usr/lib/nss_winbind.so.1</tt></b>
+<tt class="prompt">root# </tt><b class="userinput"><tt>ln -s /usr/lib/libnss_winbind.so /usr/lib/nss_winbind.so.2</tt></b>
+</pre><p>
+Now, as root you need to edit <tt class="filename">/etc/nsswitch.conf</tt> to
+allow user and group entries to be visible from the <span class="application">winbindd</span>
+daemon. My <tt class="filename">/etc/nsswitch.conf</tt> file look like
+this after editing:
+</p><pre class="programlisting">
+ passwd: files winbind
+ shadow: files
+ group: files winbind
+</pre><p>
+The libraries needed by the winbind daemon will be automatically
+entered into the <b class="command">ldconfig</b> cache the next time
+your system reboots, but it
+is faster (and you don't need to reboot) if you do it manually:
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>/sbin/ldconfig -v | grep winbind</tt></b>
+</p><p>
+This makes <tt class="filename">libnss_winbind</tt> available to winbindd
+and echos back a check to you.
+</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942224"></a>NSS Winbind on AIX</h4></div></div><div></div></div><p>(This section is only for those running AIX)</p><p>
+The winbind AIX identification module gets built as libnss_winbind.so in the
+nsswitch directory of the samba source. This file can be copied to
+/usr/lib/security, and the AIX naming convention would indicate that it
+should be named WINBIND. A stanza like the following:
+</p><pre class="programlisting">
+WINBIND:
+ program = /usr/lib/security/WINBIND
+ options = authonly
+</pre><p>can then be added to
+<tt class="filename">/usr/lib/security/methods.cfg</tt>. This module only
+supports identification, but there have been success reports using the
+standard winbind pam module for authentication. Use caution configuring
+loadable authentication modules as it is possible to make it impossible
+to logon to the system. More information about the AIX authentication
+module API can be found at &quot;Kernel Extensions and Device Support
+Programming Concepts for AIX&quot;: <a href="http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/kernextc/sec_load_mod.htm" target="_top">
+Chapter 18. Loadable Authentication Module Programming Interface</a>
+and more information on administering the modules at <a href="http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixbman/baseadmn/iandaadmin.htm" target="_top">
+&quot;System Management Guide: Operating System and Devices&quot;</a>.
+</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942302"></a>Configure smb.conf</h4></div></div><div></div></div><p>
+Several parameters are needed in the smb.conf file to control
+the behavior of <span class="application">winbindd</span>. Configure
+<tt class="filename">smb.conf</tt> These are described in more detail in
+the <a href="winbindd.8.html"><span class="citerefentry"><span class="refentrytitle">winbindd</span>(8)</span></a> man page. My
+<tt class="filename">smb.conf</tt> file was modified to
+include the following entries in the [global] section:
+</p><div class="example"><a name="id2942349"></a><p class="title"><b>Example 21.1. smb.conf for winbind set-up</b></p><table class="simplelist" border="0" summary="Simple list"><tr><td> </td></tr><tr><td><i class="parameter"><tt>[global]</tt></i></td></tr><tr><td>...</td></tr><tr><td># separate domain and username with '+', like DOMAIN+username</td></tr><tr><td><i class="parameter"><tt>winbind separator = +</tt></i></td></tr><tr><td># use uids from 10000 to 20000 for domain users</td></tr><tr><td><i class="parameter"><tt>idmap uid = 10000-20000</tt></i></td></tr><tr><td># use gids from 10000 to 20000 for domain groups</td></tr><tr><td><i class="parameter"><tt>winbind gid = 10000-20000</tt></i></td></tr><tr><td># allow enumeration of winbind users and groups</td></tr><tr><td><i class="parameter"><tt>winbind enum users = yes</tt></i></td></tr><tr><td><i class="parameter"><tt>winbind enum groups = yes</tt></i></td></tr><tr><td># give winbind users a real shell (only needed if they have telnet access)</td></tr><tr><td><i class="parameter"><tt>template homedir = /home/winnt/%D/%U</tt></i></td></tr><tr><td><i class="parameter"><tt>template shell = /bin/bash</tt></i></td></tr></table></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942460"></a>Join the SAMBA server to the PDC domain</h4></div></div><div></div></div><p>
+Enter the following command to make the SAMBA server join the
+PDC domain, where <i class="replaceable"><tt>DOMAIN</tt></i> is the name of
+your Windows domain and <i class="replaceable"><tt>Administrator</tt></i> is
+a domain user who has administrative privileges in the domain.
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>/usr/local/samba/bin/net rpc join -S PDC -U Administrator</tt></b>
+</p><p>
+The proper response to the command should be: &quot;Joined the domain
+<i class="replaceable"><tt>DOMAIN</tt></i>&quot; where <i class="replaceable"><tt>DOMAIN</tt></i>
+is your DOMAIN name.
+</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942516"></a>Start up the winbindd daemon and test it!</h4></div></div><div></div></div><p>
+Eventually, you will want to modify your smb startup script to
+automatically invoke the winbindd daemon when the other parts of
+SAMBA start, but it is possible to test out just the winbind
+portion first. To start up winbind services, enter the following
+command as root:
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>/usr/local/samba/bin/winbindd</tt></b>
+</p><p>
+Winbindd can now also run in 'dual daemon mode'. This will make it
+run as 2 processes. The first will answer all requests from the cache,
+thus making responses to clients faster. The other will
+update the cache for the query that the first has just responded.
+Advantage of this is that responses stay accurate and are faster.
+You can enable dual daemon mode by adding <tt class="option">-B</tt> to the commandline:
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>/usr/local/samba/bin/winbindd -B</tt></b>
+</p><p>
+I'm always paranoid and like to make sure the daemon
+is really running...
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>ps -ae | grep winbindd</tt></b>
+</p><p>
+This command should produce output like this, if the daemon is running
+</p><pre class="screen">
+3025 ? 00:00:00 winbindd
+</pre><p>
+Now... for the real test, try to get some information about the
+users on your PDC
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>/usr/local/samba/bin/wbinfo -u</tt></b>
+</p><p>
+This should echo back a list of users on your Windows users on
+your PDC. For example, I get the following response:
+</p><pre class="screen">
+ CEO+Administrator
+ CEO+burdell
+ CEO+Guest
+ CEO+jt-ad
+ CEO+krbtgt
+ CEO+TsInternetUser
+</pre><p>
+ Obviously, I have named my domain 'CEO' and my <a class="indexterm" name="id2942662"></a><i class="parameter"><tt>winbind separator</tt></i> is '+'.
+</p><p>
+You can do the same sort of thing to get group information from
+the PDC:
+</p><pre class="screen">
+<tt class="prompt">root# </tt><b class="userinput"><tt>/usr/local/samba/bin/wbinfo -g</tt></b>
+ CEO+Domain Admins
+ CEO+Domain Users
+ CEO+Domain Guests
+ CEO+Domain Computers
+ CEO+Domain Controllers
+ CEO+Cert Publishers
+ CEO+Schema Admins
+ CEO+Enterprise Admins
+ CEO+Group Policy Creator Owners
+</pre><p>
+The function 'getent' can now be used to get unified
+lists of both local and PDC users and groups.
+Try the following command:
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>getent passwd</tt></b>
+</p><p>
+You should get a list that looks like your <tt class="filename">/etc/passwd</tt>
+list followed by the domain users with their new uids, gids, home
+directories and default shells.
+</p><p>
+The same thing can be done for groups with the command
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>getent group</tt></b>
+</p></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2942766"></a>Fix the init.d startup scripts</h4></div></div><div></div></div><div class="sect4" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="id2942773"></a>Linux</h5></div></div><div></div></div><p>
+The <span class="application">winbindd</span> daemon needs to start up after the
+<span class="application">smbd</span> and <span class="application">nmbd</span> daemons are running.
+To accomplish this task, you need to modify the startup scripts of your system.
+They are located at <tt class="filename">/etc/init.d/smb</tt> in RedHat and
+<tt class="filename">/etc/init.d/samba</tt> in Debian.
+script to add commands to invoke this daemon in the proper sequence. My
+startup script starts up <span class="application">smbd</span>, <span class="application">nmbd</span>, and <span class="application">winbindd</span> from the
+<tt class="filename">/usr/local/samba/bin</tt> directory directly. The 'start'
+function in the script looks like this:
+</p><pre class="programlisting">
+start() {
+ KIND=&quot;SMB&quot;
+ echo -n $&quot;Starting $KIND services: &quot;
+ daemon /usr/local/samba/bin/smbd $SMBDOPTIONS
+ RETVAL=$?
+ echo
+ KIND=&quot;NMB&quot;
+ echo -n $&quot;Starting $KIND services: &quot;
+ daemon /usr/local/samba/bin/nmbd $NMBDOPTIONS
+ RETVAL2=$?
+ echo
+ KIND=&quot;Winbind&quot;
+ echo -n $&quot;Starting $KIND services: &quot;
+ daemon /usr/local/samba/bin/winbindd
+ RETVAL3=$?
+ echo
+ [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 -a $RETVAL3 -eq 0 ] &amp;&amp; \
+ touch /var/lock/subsys/smb || RETVAL=1
+ return $RETVAL
+}
+</pre><p>If you would like to run winbindd in dual daemon mode, replace
+the line
+</p><pre class="programlisting">
+ daemon /usr/local/samba/bin/winbindd
+</pre><p>
+
+in the example above with:
+
+</p><pre class="programlisting">
+ daemon /usr/local/samba/bin/winbindd -B
+</pre><p>.
+</p><p>
+The 'stop' function has a corresponding entry to shut down the
+services and looks like this:
+</p><pre class="programlisting">
+stop() {
+ KIND=&quot;SMB&quot;
+ echo -n $&quot;Shutting down $KIND services: &quot;
+ killproc smbd
+ RETVAL=$?
+ echo
+ KIND=&quot;NMB&quot;
+ echo -n $&quot;Shutting down $KIND services: &quot;
+ killproc nmbd
+ RETVAL2=$?
+ echo
+ KIND=&quot;Winbind&quot;
+ echo -n $&quot;Shutting down $KIND services: &quot;
+ killproc winbindd
+ RETVAL3=$?
+ [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 -a $RETVAL3 -eq 0 ] &amp;&amp; \
+ rm -f /var/lock/subsys/smb
+ echo &quot;&quot;
+ return $RETVAL
+}
+</pre></div><div class="sect4" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="id2942942"></a>Solaris</h5></div></div><div></div></div><p>Winbind doesn't work on Solaris 9, see the <a href="Portability.html#winbind-solaris9" title="Winbind on Solaris 9">Portability</a> chapter for details.</p><p>On Solaris, you need to modify the
+<tt class="filename">/etc/init.d/samba.server</tt> startup script. It usually
+only starts smbd and nmbd but should now start winbindd too. If you
+have samba installed in <tt class="filename">/usr/local/samba/bin</tt>,
+the file could contains something like this:
+</p><pre class="programlisting">
+ ##
+ ## samba.server
+ ##
+
+ if [ ! -d /usr/bin ]
+ then # /usr not mounted
+ exit
+ fi
+
+ killproc() { # kill the named process(es)
+ pid=`/usr/bin/ps -e |
+ /usr/bin/grep -w $1 |
+ /usr/bin/sed -e 's/^ *//' -e 's/ .*//'`
+ [ &quot;$pid&quot; != &quot;&quot; ] &amp;&amp; kill $pid
+ }
+
+ # Start/stop processes required for samba server
+
+ case &quot;$1&quot; in
+
+ 'start')
+ #
+ # Edit these lines to suit your installation (paths, workgroup, host)
+ #
+ echo Starting SMBD
+ /usr/local/samba/bin/smbd -D -s \
+ /usr/local/samba/smb.conf
+
+ echo Starting NMBD
+ /usr/local/samba/bin/nmbd -D -l \
+ /usr/local/samba/var/log -s /usr/local/samba/smb.conf
+
+ echo Starting Winbind Daemon
+ /usr/local/samba/bin/winbindd
+ ;;
+
+ 'stop')
+ killproc nmbd
+ killproc smbd
+ killproc winbindd
+ ;;
+
+ *)
+ echo &quot;Usage: /etc/init.d/samba.server { start | stop }&quot;
+ ;;
+ esac
+</pre><p>
+Again, if you would like to run samba in dual daemon mode, replace
+</p><pre class="programlisting">
+ /usr/local/samba/bin/winbindd
+</pre><p>
+
+in the script above with:
+
+</p><pre class="programlisting">
+ /usr/local/samba/bin/winbindd -B
+</pre><p>
+</p></div><div class="sect4" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="id2943053"></a>Restarting</h5></div></div><div></div></div><p>
+If you restart the <span class="application">smbd</span>, <span class="application">nmbd</span>, and <span class="application">winbindd</span> daemons at this point, you
+should be able to connect to the samba server as a domain member just as
+if you were a local user.
+</p></div></div><div class="sect3" lang="en"><div class="titlepage"><div><div><h4 class="title"><a name="id2943089"></a>Configure Winbind and PAM</h4></div></div><div></div></div><p>
+If you have made it this far, you know that winbindd and samba are working
+together. If you want to use winbind to provide authentication for other
+services, keep reading. The pam configuration files need to be altered in
+this step. (Did you remember to make backups of your original
+<tt class="filename">/etc/pam.d</tt> files? If not, do it now.)
+</p><p>
+You will need a pam module to use winbindd with these other services. This
+module will be compiled in the <tt class="filename">../source/nsswitch</tt> directory
+by invoking the command
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>make nsswitch/pam_winbind.so</tt></b>
+</p><p>
+from the <tt class="filename">../source</tt> directory. The
+<tt class="filename">pam_winbind.so</tt> file should be copied to the location of
+your other pam security modules. On my RedHat system, this was the
+<tt class="filename">/lib/security</tt> directory. On Solaris, the pam security
+modules reside in <tt class="filename">/usr/lib/security</tt>.
+</p><p>
+<tt class="prompt">root# </tt><b class="userinput"><tt>cp ../samba/source/nsswitch/pam_winbind.so /lib/security</tt></b>
+</p><div class="sect4" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="id2943196"></a>Linux/FreeBSD-specific PAM configuration</h5></div></div><div></div></div><p>
+The <tt class="filename">/etc/pam.d/samba</tt> file does not need to be changed. I
+just left this file as it was:
+</p><pre class="programlisting">
+ auth required /lib/security/pam_stack.so service=system-auth
+ account required /lib/security/pam_stack.so service=system-auth
+</pre><p>
+The other services that I modified to allow the use of winbind
+as an authentication service were the normal login on the console (or a terminal
+session), telnet logins, and ftp service. In order to enable these
+services, you may first need to change the entries in
+<tt class="filename">/etc/xinetd.d</tt> (or <tt class="filename">/etc/inetd.conf</tt>).
+RedHat 7.1 uses the new xinetd.d structure, in this case you need
+to change the lines in <tt class="filename">/etc/xinetd.d/telnet</tt>
+and <tt class="filename">/etc/xinetd.d/wu-ftp</tt> from
+</p><pre class="programlisting">
+ enable = no
+</pre><p>
+to
+</p><pre class="programlisting">
+ enable = yes
+</pre><p>
+For ftp services to work properly, you will also need to either
+have individual directories for the domain users already present on
+the server, or change the home directory template to a general
+directory for all domain users. These can be easily set using
+the <tt class="filename">smb.conf</tt> global entry
+<a class="indexterm" name="id2943302"></a><i class="parameter"><tt>template homedir</tt></i>.
+</p><p>
+The <tt class="filename">/etc/pam.d/ftp</tt> file can be changed
+to allow winbind ftp access in a manner similar to the
+samba file. My <tt class="filename">/etc/pam.d/ftp</tt> file was
+changed to look like this:
+</p><pre class="programlisting">
+ auth required /lib/security/pam_listfile.so item=user sense=deny \
+ file=/etc/ftpusers onerr=succeed
+ auth sufficient /lib/security/pam_winbind.so
+ auth required /lib/security/pam_stack.so service=system-auth
+ auth required /lib/security/pam_shells.so
+ account sufficient /lib/security/pam_winbind.so
+ account required /lib/security/pam_stack.so service=system-auth
+ session required /lib/security/pam_stack.so service=system-auth
+</pre><p>
+The <tt class="filename">/etc/pam.d/login</tt> file can be changed nearly the
+same way. It now looks like this:
+</p><pre class="programlisting">
+ auth required /lib/security/pam_securetty.so
+ auth sufficient /lib/security/pam_winbind.so
+ auth sufficient /lib/security/pam_unix.so use_first_pass
+ auth required /lib/security/pam_stack.so service=system-auth
+ auth required /lib/security/pam_nologin.so
+ account sufficient /lib/security/pam_winbind.so
+ account required /lib/security/pam_stack.so service=system-auth
+ password required /lib/security/pam_stack.so service=system-auth
+ session required /lib/security/pam_stack.so service=system-auth
+ session optional /lib/security/pam_console.so
+</pre><p>
+In this case, I added the </p><pre class="programlisting">auth sufficient /lib/security/pam_winbind.so</pre><p>
+lines as before, but also added the </p><pre class="programlisting">required pam_securetty.so</pre><p>
+above it, to disallow root logins over the network. I also added a
+</p><pre class="programlisting">sufficient /lib/security/pam_unix.so use_first_pass</pre><p>
+line after the <b class="command">winbind.so</b> line to get rid of annoying
+double prompts for passwords.
+</p></div><div class="sect4" lang="en"><div class="titlepage"><div><div><h5 class="title"><a name="id2943437"></a>Solaris-specific configuration</h5></div></div><div></div></div><p>
+The /etc/pam.conf needs to be changed. I changed this file so that my Domain
+users can logon both locally as well as telnet.The following are the changes
+that I made.You can customize the pam.conf file as per your requirements,but
+be sure of those changes because in the worst case it will leave your system
+nearly impossible to boot.
+</p><pre class="programlisting">
+ #
+ #ident &quot;@(#)pam.conf 1.14 99/09/16 SMI&quot;
+ #
+ # Copyright (c) 1996-1999, Sun Microsystems, Inc.
+ # All Rights Reserved.
+ #
+ # PAM configuration
+ #
+ # Authentication management
+ #
+ login auth required /usr/lib/security/pam_winbind.so
+ login auth required /usr/lib/security/$ISA/pam_unix.so.1 try_first_pass
+ login auth required /usr/lib/security/$ISA/pam_dial_auth.so.1 try_first_pass
+ #
+ rlogin auth sufficient /usr/lib/security/pam_winbind.so
+ rlogin auth sufficient /usr/lib/security/$ISA/pam_rhosts_auth.so.1
+ rlogin auth required /usr/lib/security/$ISA/pam_unix.so.1 try_first_pass
+ #
+ dtlogin auth sufficient /usr/lib/security/pam_winbind.so
+ dtlogin auth required /usr/lib/security/$ISA/pam_unix.so.1 try_first_pass
+ #
+ rsh auth required /usr/lib/security/$ISA/pam_rhosts_auth.so.1
+ other auth sufficient /usr/lib/security/pam_winbind.so
+ other auth required /usr/lib/security/$ISA/pam_unix.so.1 try_first_pass
+ #
+ # Account management
+ #
+ login account sufficient /usr/lib/security/pam_winbind.so
+ login account requisite /usr/lib/security/$ISA/pam_roles.so.1
+ login account required /usr/lib/security/$ISA/pam_unix.so.1
+ #
+ dtlogin account sufficient /usr/lib/security/pam_winbind.so
+ dtlogin account requisite /usr/lib/security/$ISA/pam_roles.so.1
+ dtlogin account required /usr/lib/security/$ISA/pam_unix.so.1
+ #
+ other account sufficient /usr/lib/security/pam_winbind.so
+ other account requisite /usr/lib/security/$ISA/pam_roles.so.1
+ other account required /usr/lib/security/$ISA/pam_unix.so.1
+ #
+ # Session management
+ #
+ other session required /usr/lib/security/$ISA/pam_unix.so.1
+ #
+ # Password management
+ #
+ #other password sufficient /usr/lib/security/pam_winbind.so
+ other password required /usr/lib/security/$ISA/pam_unix.so.1
+ dtsession auth required /usr/lib/security/$ISA/pam_unix.so.1
+ #
+ # Support for Kerberos V5 authentication (uncomment to use Kerberos)
+ #
+ #rlogin auth optional /usr/lib/security/$ISA/pam_krb5.so.1 try_first_pass
+ #login auth optional /usr/lib/security/$ISA/pam_krb5.so.1 try_first_pass
+ #dtlogin auth optional /usr/lib/security/$ISA/pam_krb5.so.1 try_first_pass
+ #other auth optional /usr/lib/security/$ISA/pam_krb5.so.1 try_first_pass
+ #dtlogin account optional /usr/lib/security/$ISA/pam_krb5.so.1
+ #other account optional /usr/lib/security/$ISA/pam_krb5.so.1
+ #other session optional /usr/lib/security/$ISA/pam_krb5.so.1
+ #other password optional /usr/lib/security/$ISA/pam_krb5.so.1 try_first_pass
+</pre><p>
+I also added a try_first_pass line after the winbind.so line to get rid of
+annoying double prompts for passwords.
+</p><p>
+Now restart your Samba and try connecting through your application that you
+configured in the pam.conf.
+</p></div></div></div></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2943561"></a>Conclusion</h2></div></div><div></div></div><p>The winbind system, through the use of the Name Service
+ Switch, Pluggable Authentication Modules, and appropriate
+ Microsoft RPC calls have allowed us to provide seamless
+ integration of Microsoft Windows NT domain users on a
+ UNIX system. The result is a great reduction in the administrative
+ cost of running a mixed UNIX and NT network.</p></div><div class="sect1" lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2943580"></a>Common Errors</h2></div></div><div></div></div><p>Winbind has a number of limitations in its current
+ released version that we hope to overcome in future
+ releases:</p><div class="itemizedlist"><ul type="disc"><li><p>Winbind is currently only available for
+ the Linux, Solaris, AIX and IRIX operating systems, although ports to other operating
+ systems are certainly possible. For such ports to be feasible,
+ we require the C library of the target operating system to
+ support the Name Service Switch and Pluggable Authentication
+ Modules systems. This is becoming more common as NSS and
+ PAM gain support among UNIX vendors.</p></li><li><p>The mappings of Windows NT RIDs to UNIX ids
+ is not made algorithmically and depends on the order in which
+ unmapped users or groups are seen by winbind. It may be difficult
+ to recover the mappings of rid to UNIX id mapping if the file
+ containing this information is corrupted or destroyed.</p></li><li><p>Currently the winbind PAM module does not take
+ into account possible workstation and logon time restrictions
+ that may be been set for Windows NT users, this is
+ instead up to the PDC to enforce.</p></li></ul></div><div class="sect2" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="id2943633"></a>NSCD Problem Warning</h3></div></div><div></div></div><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>
+ Do NOT under ANY circumstances run <b class="command">nscd</b> on any system
+ on which <b class="command">winbind</b> is running.
+ </p></div><p>
+ If <b class="command">nscd</b> is running on the UNIX/Linux system, then
+ even though NSSWITCH is correctly configured it will NOT be possible to resolve
+ domain users and groups for file and directory controls.
+ </p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="VFS.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="optional.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="AdvancedNetworkManagement.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Chapter 20. Stackable VFS modules </td><td width="20%" align="center"><a accesskey="h" href="samba-doc.html">Home</a></td><td width="40%" align="right" valign="top"> Chapter 22. Advanced Network Management</td></tr></table></div></body></html>