Huh! Ez nagy menet volt! Nagy nehezen sikerült összelőnöm az egészet! Íme a hányattatásaim stációinak tömör összefoglalója. Előre elárulom, hogy a végén "heppiend lesz és elnyeri majd szerelmét" (Fonográf : Álomszép regény).
Alap probléma: W7 gépen cygwin van és szeretnék egy apache szervert felhúzni rajta, ami ntlm-mel authentikál a domain-hoz, hogy ne kelljen külön jelszavak gyűjtögetésével bíbelődni. Firefox a cél böngésző.
Először is ott a dilemma, hogy apache, vagy apache2. Persze az apache2 lenne a jobb (színesebb, szagosabb, modernebb), de esetemben az határozta meg, hogy melyiket használom, hogy melyik alá tudom behákolni az ntlm authentikációt. Mindkét nyomon elindultam. Végül is az apache2 nyert...
Megpróbáltam a mod_auth_sspi modult is feltenni, de az csak a windows-os apache-hoz van. Bár megvan a forráskódja, de csak Visual Studioval fordítható. Nem kezdtem el áttenni gcc alá.
Induláshoz tegyük fel a szükséges cygwin csomagokat:
- apache2 (2.2.22-2)
- apache2-devel (2.2.22-2)
- git-svn (1.7.9-1)
- libapr1 (1.4.6-1)
- libapr1-devel (1.4.6-1)
- libaprautil1 (1.4.1-1)
- libaprautil1-devel (1.4.1-1)
- openldap (2.3.43-3)
- patch (2.5.8-9)
Ha ez megvan, akkor kell töltenünk a mod_ntlm csomagot.
svn co https://modntlm.svn.sourceforge.net/svnroot/modntlm/trunk
Ez létrehoz a trunk alá egy mod_ntlm és egy mod_ntlm2 könyvtárat. Menjünk be ez utóbbiba. A trunk/.svn, trunk/mod_ntlm le is törölhető. Nem lesz szükségünk rájuk.
Másoljuk be az alábbi file-t (mondjuk) mod_ntlm2_cygwin.patch néven a /tmp könyvtárba. Vigyázzunk, a képernyőn egyes sorok meg lehetnem törve, így értelemszerűen próbáljuk az eltört sorokat visszahúzni. Bocs, de a patch file-t nem rakom ki a blog.hu szerverre, mert úgy is meg akarják szüntetni ezt a lehetőséget. Próbáljunk kisebb betűket használni, ha nagyon nem megy másként.
diff -ru ../trunk/mod_ntlm2/Makefile ./Makefile
A mod_ntlm2 könyvtárban adjuk ki:
--- ../trunk/mod_ntlm2/Makefile 2012-04-21 11:18:37.284092400 +0200
+++ ./Makefile 2012-04-21 11:24:49.456094100 +0200
@@ -5,7 +5,8 @@
## $Id: Makefile 44 2006-12-08 01:18:18Z mbaltaks $
# the used tools
-APXS=apxs
+#APXS=apxs
+APXS=/usr/sbin/apxs2
APACHECTL=apachectl
# the default target
diff -ru ../trunk/mod_ntlm2/mod_ntlm.c ./mod_ntlm.c
--- ../trunk/mod_ntlm2/mod_ntlm.c 2012-04-21 11:18:37.282092400 +0200
+++ ./mod_ntlm.c 2012-04-21 11:28:36.390785300 +0200
@@ -254,7 +254,9 @@
crec->ntlm_domain = "DOMAIN";
crec->ntlm_grpfile = NULL; /* rit, group file added */
crec->ntlm_lockfile = "/tmp/ntlm.lck";
+#if APR_HAS_THREADS
apr_thread_mutex_create(&crec->ntlm_mutex, APR_THREAD_MUTEX_DEFAULT, p);
+#endif
return crec;
}
@@ -769,7 +771,9 @@
/* If this is the first request with this connection, then create
* a ntlm_connection entry for it. It will be cleaned up when the
* connection is dropped */
+#if APR_HAS_THREADS
apr_thread_mutex_lock(crec->ntlm_mutex);
+#endif
ntlm_connection = get_ntlm_connection(r->connection);
if (ntlm_connection == NULL) {
ntlm_connection = apr_pcalloc(r->connection->pool, sizeof(ntlm_connection_rec));
@@ -780,7 +784,9 @@
log(r, APLOG_INFO, "NTLMXX-Creating new ntlm_connection: %s", key);
apr_pool_userdata_set(ntlm_connection, key, NULL, r->connection->pool);
}
+#if APR_HAS_THREADS
apr_thread_mutex_unlock(crec->ntlm_mutex);
+#endif
if ((ntlmssp = get_ntlm_header(r, crec)) == NULL) {
note_ntlm_auth_failure(r);
log(r, APLOG_NOERRNO | APLOG_ERR, "missing/corrupt NTLM header");
diff -ru ../trunk/mod_ntlm2/mod_ntlm.h ./mod_ntlm.h
--- ../trunk/mod_ntlm2/mod_ntlm.h 2012-04-21 11:18:37.166092400 +0200
+++ ./mod_ntlm.h 2012-04-21 11:27:39.933140100 +0200
@@ -42,7 +42,9 @@
char *ntlm_backup;
char *ntlm_grpfile;
char *ntlm_lockfile;
+#if APR_HAS_THREADS
apr_thread_mutex_t *ntlm_mutex; /* Protect ntlm_connection variable */
+#endif
} ntlm_config_rec;
typedef struct ntlm_connection_struct {
diff -ru ../trunk/mod_ntlm2/ntlmssp.inc.c ./ntlmssp.inc.c
--- ../trunk/mod_ntlm2/ntlmssp.inc.c 2012-04-21 11:18:37.280092400 +0200
+++ ./ntlmssp.inc.c 2012-04-21 11:28:00.343180900 +0200
@@ -304,7 +304,7 @@
return 16;
else {
/* Win9x client leave username in uppercase...fix it: */
- while (*username!=(unsigned char)NULL) {
+ while (*username!=0) {
c=tolower((int)*username);
*username=(unsigned char)c;
username++;
patch </tmp/mod_ntlm2_cygwin.patch
4 filet patch-el meg. Most már készen állunk a fordításra.
make
Ez egyetlen warning-ot produkál:
"mod_ntlm.c:66:13: warning: conflicting types for built-in function 'log'"
Nem volt kedvem megkeresni, hogy mivel konfliktál. Nem is értem a built-in function-t. Ez mi lehet?
Ne próbálkozzunk a make install, vagy make test-tel, mert a mod_ntlm.so file el van bújtatva. Kézzel dolgozzunk innentől!
cp .libs/mod_ntlm.so .libs/mod_ntlm.la /usr/lib/apache2
Most jön az apache2 config file megpatkolása, de előtte egy kis környezet ismereti óra. Adjuk ki az alábbi parancsot:
echo -e "$USERDOMAIN\n$LOGONSERVER"
Ez kell az NTLM authetikáció beállításához. Az első érték lesz a "NTLMDomain", a második a bevezető "\\" nélkül a "NTLMServer". Most akkor rávethetjük magunkat a config file-ra:
vim /etc/apache2/httpd.conf
Keressük meg a LoadModule sorok legvégét és adjuk hozzá a mi modulunkat:
LoadModule ntlm_module lib/apache2/mod_ntlm.so
Most akkor hozzá kell adni a saját cgi-bin könyvtárunkat is. Az NTLM részbe beírtam a forráskódból származó megjegyzéseket is. Hátha valakinek mondanak valamit. Ismét vigyázzunk a sortörésekre!
<Directory "/srv/www/htdocs/my_dir/cgi-bin">
Kitartás, már nagyon közel járunk! Most el kellene indítani a szerverünket. Ha simán nekiállunk, akkor egy rusnya hibaüzenetet kapunk ("/usr/sbin/apachectl2: line 78: 5864 Bad system call $HTTPD -k $ARGV"). A cygserver szervizt is fel kell éleszteni előtte.
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Options +ExecCGI
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#AllowOverride None
# Controls who can get stuff from this server.
Order allow,deny
Allow from all
AuthName NTAuth
AuthType NTLM
#set to 'on' to activate NTLM authentication here
NTLMAuth on
#text file containing (NT) group names and member user IDs
#AuthNTGroups /valahol/group
#set to 'on' to allow Basic authentication too
#NTLMBasicAuth on
#realm to use for Basic authentication
#NTLMBasicRealm
#set to 'off' to allow access control to be passed along to lower
#modules if the UserID is not known to this module
NTLMAuthoritative on
#set to the domain you want users authenticated against for cleartext
#authentication - if not specified, the local machine, then all trusted
#domains are checked
NTLMDomain <echo első sora>
#set to the NT server to contact to authenticate users
NTLMServer <echo második sora "\\" nélkül>
#set to the alternate NT server to contact to authenticate users
#NTLMBackup <backup domain controller>
#set to the lock file that is used to prevent simutaneous contacts to DC
NTLMLockFile /var/run/apache2/ntlm.lock
Require valid-user
#Require user user1 user2
</Directory>
/usr/sbin/cygserver.exe &
/usr/sbin/apachectl2 start
A ps kiadása után egy cygserver és jópár httpd2 programot kell látnunk futni. A futás közbeni kéréseket és hibákat a /var/log/apache2 könyvtárban tárolja az access_log és error_log file-okban. Ha egyszerre szeretnénk nézni, akkor ajánlom a [Hájtek] Két file listázása egyszerre Linuxon cikket.
A működéshez a firefox-ot is meg kell hákolni egy picikét. Nyissunk egy új ablakot és írjuk be azt, hogy "about:config". Szűrjünk rá arra, hogy "network.automatic-ntlm-auth.trusted-uris". Ide beírhatjuk vesszővel elválasztva azokat a szervereket, amiket ntlm authentikálni szeretnénk. Mivel a cygwin a firefox-os gépen fut, ezért én a "http://localhost"-ot írtam be. De ez még nem elég. Nem működött és ez eléggé idegesítő. Rászűrtem arra, hogy ntlm és találtam egy másik tulajdonságot is: "network.auth.force-generic-ntlm". Ezt beállítottam true-ra és láss csodát, működik!
Nem állítom, hogy betonbiztos! Menet közben egy csomó hibát dob és néha újra kéri a jelszót is. De demózási célra teljesen megfelel! Ha egy picit biztosabban működő megoldás kell, akkor indíthatjuk kézzel a /usr/sbin/httpd2-t -X opvióval. Ekkor csak 1 szálon fog kiszolgálni.
Authetikáljunk minden nap!
+jegyzések