# virtuelle FTP-User mit pam gegen eine AD authetifizieren

## tazinblack

Hallo zusammen,

ich würde gerne einen FTP-Server aufbauen, der folgendes können soll :

 User die sich anmelden, müssen nicht lokal auf dem System vorhanden sein

 der FTP-Server soll die User gegen eine Windoof-Domäne authentifizieren (ich dachte dabei an pam_krb5), um zusätzliche Userpasswörter zu vermeiden 

 es soll ein Verzeichnis im Filesystem geben, das als FTPROOT dient. 

 wenn sich ein User anmeldet, soll sein oberstes Verzeichnis /$FTPROOT/$USER sein und falls nicht vorhanden, dort angelegt werden.

 es soll ein Logfile geben, wo man nachvollziehen kann, welcher User wann welche Datei in welche Richtig geladen hat (up- oder download)

Als FTP-Server dachte ich an den vsftpd. Dieser soll laut google secure und bewährt sein.

Als Ziel wäre natürlich ein kleines Howto schön, falls ihr das wünscht, denn das können bestimmt noch andere brauchen.

Leider hab ich zu dieser Kombination an Wünschen nichts passendes gefunden.

Also ist Kreativität gefragt. Bisher waren meine Berührungspunkte zu pam und auch zu kerberos recht begrenzt, aber ich lerne ja gerne dazu.

----------

## tazinblack

so, Schritt 1 :

vsftpd beibringen, dass er virtuelle User zulässt, diese entsprechend dem Usernamen in ein Verzeichnis unter dem FTP-Root lässt.

Da die Anbindung an die AD zu diesem Zeitpunkt  noch nicht funktioniert, versuche ich mein Glück mit einem lokalen Passwortfile.

Die Konfiguration in der vsftpd.conf sieht dann so aus:

```

listen=YES

dirmessage_enable=YES

guest_enable=YES

guest_username=ftpuser

user_sub_token=$USER

write_enable=YES

anon_mkdir_write_enable=YES

anon_upload_enable=YES

ftpd_banner="Welcome to MuppetShow! Applause applause applause"

hide_ids=YES

local_enable=YES

chroot_local_user=YES

anonymous_enable=NO

anon_world_readable_only=YES

pam_service_name=vsftpd

```

Vsftpd verwendet wie hier zu sehen den pam-Service "vsftpd"

Unter /etc/pam.d/vsftpd ist bisher folgendes eingerichtet :

```

auth    required pam_pwdfile.so pwdfile /etc/vsftpd/users

account required pam_permit.so

```

Bemerkung : pam_pwdfile ist in Portage enthalten

/etc/passwd enhält für den FTP-User die folgende Zeile :

```

ftpuser:x:1001:1001:virtueller FTP User:/data/ftp/$USER:/bin/false

```

Damit gibt es einen User, welcher der Besitzer der Dateien ist, welche unter virtuellen Usern abgelegt werden.

Die Datei /etc/vsftpd/users ist ein einfaches mit htpasswd2 (apache-tools in portage) generiertes apachekompatibles Passwortfile.

Was geht bis jetzt :

 * man kann sich mit einem virtuellen User, welcher im Passwortfile angelegt ist anmelden

 * man landet unter /data/ftp/$USER im chroot.

Was geht noch nicht :

 * der Ordner /data/ftp/$USER muss manuell angelegt werden, sonst kann man sich am FTP nicht anmelden

 * die Authentifizierung gegen die AD geht noch nicht.

 * Es wird noch nicht geloggt, was hoch- bzw. runtergeladen wird.

Jetzt wäre etwas Hilfe super! Ich hab jetzt diverse Stunden mit pam und pam_krb5 rumgespielt, und steige nicht ganz durch.

Was noch fehlt :

 * Eine Möglichkeit, on-the-fly bei der Useranmeldung das ftp-Heimatverzeichnis anlegen zu können

 * Das Logging der Files

 * Keine Ahnung, was ich überhaupt brauche, um mich anmelden zu können. Die Authentifizierung gegen die AD scheint jedenfalls zu tun, bloß anmelden kann ich mich deswegen noch nicht. 

   Ich denke ich muss das irgendwie hinbekommen, dass er sich zwar mit AD-Credentials gegen die AD authentifiziert, aber lokal mit dem Account des FTP-Hausherren zufrieden gibt.

Euro Ideen sind herzlich willkommen

----------

## think4urs11

 *tazinblack wrote:*   

>  * Es wird noch nicht geloggt, was hoch- bzw. runtergeladen wird.

 

Das ist der leichteste Teil  :Smile: 

```
log_ftp_protocol=YES
```

 *tazinblack wrote:*   

>  * Eine Möglichkeit, on-the-fly bei der Useranmeldung das ftp-Heimatverzeichnis anlegen zu können

 

Wenn du in die PAM-Config folgendes einbaust (ungetestet!) sollte der Homefolder automatisch angelegt werden sofern nicht vorhanden (Kopie von /etc/skel)

```
session   required   pam_mkhomedir.so skel=/etc/skel/ umask=0022
```

Generelle Frage:

Warum ausgerechnet das 'trivial' zu konfigurierende Kerberos wenn sich die User dann via plaintext ftp am Server anmelden? Da würde es LDAP auch tun und das ist ggf. etwas einfacher zu konfigurieren. Soll heißen du gewinnst mit Kerberos hier eh keine Sicherheit; wenn dann solltest du wenigstens auch auf FTP/SSL wechseln.

----------

## tazinblack

Danke für den Tipp. Hab jetzt noch folgendes eingebaut:

```

log_ftp_protocol=YES

xferlog_enable=YES

xferlog_file=/var/log/vsftpd/vsftpd_xfer.log

```

Das xferlog. da ich gerne ein Datei hätte, in der explizit nur die up- und downloads geloggt werden mir Zeit und User.

Das "log_ftp" kann ich wenn alles sauber funktioniert ja evtl. abschalten, wenn ichs nicht brauche.

 *think4urs11 wrote:*   

>  *tazinblack wrote:*    * Eine Möglichkeit, on-the-fly bei der Useranmeldung das ftp-Heimatverzeichnis anlegen zu können 
> 
> Wenn du in die PAM-Config folgendes einbaust (ungetestet!) sollte der Homefolder automatisch angelegt werden sofern nicht vorhanden (Kopie von /etc/skel)
> 
> ```
> ...

 

Da frage ich mich, ob ich bei virtuellen Usern überhaupt ein Heimatverzeichnis brauch? Momentan kann ich mich mit nem vitr. User ja anmelden, sofern der in der /etc/vsftpd/users drin ist.

Eigentlich möchte ich beim Anmeldevorgang ja nur das kucken in der /etc/vsftpd/users durch die Anfrage bei der AD ersetzen.

Es soll so wenig wie möglich gepflegt werden müssen.

 *Quote:*   

> 
> 
> Generelle Frage:
> 
> Warum ausgerechnet das 'trivial' zu konfigurierende Kerberos wenn sich die User dann via plaintext ftp am Server anmelden? Da würde es LDAP auch tun und das ist ggf. etwas einfacher zu konfigurieren. Soll heißen du gewinnst mit Kerberos hier eh keine Sicherheit; wenn dann solltest du wenigstens auch auf FTP/SSL wechseln.

 

Guter Einwand. Bisher hab ich noch nix mit LDAP gemacht. Aber sollte ich das Ganze nicht bei Verwendung der pam transpasrent gegeneinander austauschen können?

Ich versuchs jetzt erstmal mit Kerberos, komme aber gern auf Deine Idee zurück, wenns nicht geht.

Also, jetzt Kerberos und damit die /etc/krb5.conf.

Ich hab die Namen ersetzt, aber ich denke das sollte es verständlich veranschaulichen:

```
[libdefaults]

   default_realm = <Domain>

[realms]

   <Domain> = {

                kdc = DC1.<Domain>

#                kdc = DC2.<Domain>

      admin_server = DC1.<Domain>

      default_domain = <Domain>

        }

```

So, jetzt die pam umbiegen in /etc/pam.d/vsftpd.

Bisher steht ja das drin:

```
auth    required pam_pwdfile.so pwdfile /etc/vsftpd/users

account required pam_permit.so

```

100%-ig verstanden hab ichs noch nicht (vor allem die zweite Zeile).

Leider war Pam für mich bisher etwas unsympathisches kopflastiges Blondes. *g*

Jedenfalls muss ich wohl die erste Zeile gegen eine kerberos-Variante austauschen.

Ich versuchs mal so :

```
auth    required   pam_krb5.so debug

#auth    required pam_pwdfile.so pwdfile /etc/vsftpd/users

account required pam_permit.so

```

Leider gehts auf Anhieb nicht  :Smile: 

Die Option debug am Ende der ersten Zeile soll mal zum Testen für etwas Klarheit schaffen. 

Sonnst könnten wir auch gleich eine Glaskugel fragen.

Jetzt teste ich erst mal, ob kerberos generell funktioniert.

```
kinit <AD-User>

Password for <AD-User>@<Domain>:

```

Sieht gut aus, mal sehen, ob wir ein Ticket bekommen haben:

```
klist -f

Ticket cache: FILE:/tmp/krb5cc_0

Default principal: <AD-User>@<DOMAIN>

Valid starting     Expires            Service principal

02/19/10 08:05:32  02/19/10 18:05:35  krbtgt/<DOMAIN>@<DOMAIN>

   renew until 02/20/10 08:05:32, Flags: RIA

```

sieht eigentlich gut aus.

Später mehr.

----------

## apraxas

Evtl. ist es für dich leichter samba zu benutzen? http://wiki.samba.org/index.php/Samba_%26_Active_Directory - Damit habe ich vor Jahren mal einen Gentoo Mailserver mit AD-Anbindung gebastelt.

----------

## tazinblack

 *apraxas wrote:*   

> Evtl. ist es für dich leichter samba zu benutzen? http://wiki.samba.org/index.php/Samba_%26_Active_Directory - Damit habe ich vor Jahren mal einen Gentoo Mailserver mit AD-Anbindung gebastelt.

 

Hallo und danke für die Idee. Ich brauch leider ein Protokoll, wo ich genau die Dateibewegungen loggen kann. Das Logfile des vsftpd liefert genau das, was ich brauch.

----------

## tazinblack

So, weiter im Text.

Nachdem kinit <AD-User> nach Eingabe eines Passworts keinen Fehler bringt und klist -f ein Ticket anzeigt, scheint kerberos grundsätzlich zu funktionieren.

Um erstmal langsam anzufangen versuche ich mal das folgende in /etc/pam.d/vsftpd :

```
auth     sufficient     pam_krb5.so debug

```

Dann versuche ich mich mal anzumelden per ftp mit einem AD-Account.

Dabei beobachte ich die /var/log/messages:

```
Feb 19 14:35:17 li176x20 vsftpd: (pam_krb5): none: pam_sm_authenticate: entry (0x0)

Feb 19 14:35:17 li176x20 vsftpd: (pam_krb5): <AD-USER>: attempting authentication as <AD-USER>@<Domain>

Feb 19 14:35:17 li176x20 vsftpd: (pam_krb5): <AD-USER>: pam_sm_authenticate: exit (success)

```

Na das sieht doch auch gar nicht so falsch aus.

Leider klappt die Anmeldung nicht und im vsftpd.log steht :

```
Fri Feb 19 14:33:12 2010 [pid 6704] CONNECT: Client "192.168.xxx.yyy"

Fri Feb 19 14:33:14 2010 [pid 6703] [<AD-User>] FAIL LOGIN: Client "192.168.xxx.yyy"

```

Es sieht also so aus, als ob kerberos mich als User zwar gegen die AD Authentifizieren kann, mich vsftpd aber dennoch nicht reinlassen will.

Leider kann ich aus diesen Infos nicht erkennen, warum das nicht geht. Sehr unschön.

Hat irgendjemand Erfahrung mit der pam und kann mir ein paar Tipps geben?

Brauch ich noch weitere Regeln in der pam-config oder muss ich noch auf was Anderes achten?

Jetzt wäre ein pam-Profi hilfreich

----------

## tazinblack

so, jetzt versuch ich mal was anderes in /etc/pam.d/vsftpd :

```

auth     required       pam_krb5.so ignore_root debug

account  optional       pam_permit.so

```

Das bringt mir die Meldungen:

```
Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): none: pam_sm_authenticate: entry (0x0)

Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): <AD-User>: attempting authentication as <AD-User>@<Domain>

Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): <AD-User>: pam_sm_authenticate: exit (success)

Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): <AD-User>: pam_sm_setcred: entry (0x2)

Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): <AD-User>: getpwnam failed for <AD-User>

Feb 19 15:07:25 li176x20 vsftpd: (pam_krb5): <AD-User>: pam_sm_setcred: exit (failure)

```

Ein wenig Recherche zeigt:

```
The getpwnam() function returns a pointer to a structure containing the broken-out fields of the record in the password database (e.g., the local password file /etc/passwd, NIS, and LDAP) that matches the user name name. 
```

Also sucht er irgendwas im passwordfile. 

Lege ich jetzt einen lokalen user mit gleichem Namen an, kann ich mich anmelden.

D.h. der user muss lokal vorhanden sein, dass Passwort prüft er aber gegen die AD.

Also das muss doch auch noch voll zu machen sein.

Jetzt ist aber erst mal Wochenende.

Ein schönes selbiges!

----------

## apraxas

 *tazinblack wrote:*   

>  *apraxas wrote:*   Evtl. ist es für dich leichter samba zu benutzen? http://wiki.samba.org/index.php/Samba_%26_Active_Directory - Damit habe ich vor Jahren mal einen Gentoo Mailserver mit AD-Anbindung gebastelt. 
> 
> Hallo und danke für die Idee. Ich brauch leider ein Protokoll, wo ich genau die Dateibewegungen loggen kann. Das Logfile des vsftpd liefert genau das, was ich brauch.

 

Ja - äh nein - also in dem Link geht es weniger um samba als Windows Dateifreigabe und mehr um winbindd und das koppeln von AD mit Linux...  :Smile: 

----------

## think4urs11

 *tazinblack wrote:*   

>  *think4urs11 wrote:*    *tazinblack wrote:*    * Eine Möglichkeit, on-the-fly bei der Useranmeldung das ftp-Heimatverzeichnis anlegen zu können 
> 
> Wenn du in die PAM-Config folgendes einbaust (ungetestet!) sollte der Homefolder automatisch angelegt werden sofern nicht vorhanden (Kopie von /etc/skel)
> 
> ```
> ...

 

Ja wie nun? Mit oder doch lieber ohne /$user?  :Wink: 

----------

## tazinblack

 *think4urs11 wrote:*   

>  *tazinblack wrote:*    *think4urs11 wrote:*    *tazinblack wrote:*    * Eine Möglichkeit, on-the-fly bei der Useranmeldung das ftp-Heimatverzeichnis anlegen zu können 
> 
> Wenn du in die PAM-Config folgendes einbaust (ungetestet!) sollte der Homefolder automatisch angelegt werden sofern nicht vorhanden (Kopie von /etc/skel)
> 
> ```
> ...

 

Sorry für die Verwirrung!

Ich hab als erstes versucht mal zum Testen mit ner lokalen Passwortdatei virtuelle User umzusetzen.

Als Ziel möchte die FTP-User nicht lokal anlegen müssen. D.h. aus meiner Sicht -> virtuelle User.

Diese möchte ich aber anstatt in einer lokalen Passwortdatei zu pflegen über die AD authentifizieren.

So, wenn ich die Variante mit den virt. Usern und der lokalen Passwortdatei versuche umzubiegen auf kerberos.

Also die /etc/pam.d/vsftpd ändere, bekomme ich Fehler, obwohl das so aussieht, als würde die Authentifizierung mit dem virtuellen User klappen. 

Nachdem ich dann die Fehlermeldung mal etwas gegooglet habe, stelle ich fest, dass er wohl versucht den User in /etc/passwd zu finden.

Lege ich dann den User lokal in /etc/passwd an, kann ich mich anmelden, obwohl es für ihn kein lokales Passwort gibt.

Das Passwort prüft er gegen die AD.

Und da liegt wohl der Hund begraben: Ich habe keine Ahnung, wie ich der Kiste das mit pam-Mitteln abgewöhnt kriege.

Es reicht ja, wenn er User und Passwort gegen die AD prüft. Ab da ist es ja ein virtueller FTP-User dessen Dateien auf dem FTP-root dann dem ftpuser gehören.

Jetzt könnte es einerseits sein, dass pam_krb5 einfach den User in der /etc/passwd vorraussetzt und man da nix konfigurieren kann. Dann müsste ich mir das anderes einfallen lassen.

Oder aber, dass ich zu blöd bin, dass pam-seitig richtig zu konfigurieren. Immerhin bin ich ja "pam-Neuling".

Ich hoffe schwer auf die zweitere Konstellation. Alternativ müsste ich doch was über samba versuchen, wie apraxas das vorgeschlagen hat.

Nach Möglichkeit möchte ich weder User pflegen noch Verzeichnisse anlegen müssen bei neuen Usern. 

Ich hoffe jetzt ist es klar geworden, wo ich hin will.

Gibts denn hier niemanden, der ein wenig tiefer von pam ne Ahnung hat und der da mal nen Tipp geben könnte?

Was brauch ich überhaupt in /etc/pam.d/vsftpd?

----------

## think4urs11

Also alle User ins gleiche Verzeichnis zu packen sollte sich mit folgendem erledigen lassen:

```
local_root=/mnt/ftproot
```

d.h. allen authenticated users wird der gleiche root-folder zugewiesen

----------

## py-ro

Leider habe ich selber bisher keine Erfahrung mit Kerberos, aber in der Manpage von pam_krb5 steht zum Beispiel folgender Parameter:

```
no_user_check

    tells pam_krb5.so to not check if a user exists on the local system, to skip authorization checks using the user's .k5login file, and to create ccache files owned by the current process's UID. This is useful for situations where a non-privileged server process needs to use Kerberized services on behalf of remote users who may not have local access. Note that such a server should have an encrypted connection with its client in order to avoid allowing the user's password to be eavesdropped. 
```

Klingt nach einer möglichen Ursache.

Py

----------

## Evildad

Ähm kurze Frage wieso eigentlich nicht Proftp mit mod_ldap für die AD-Anbindung. 

Virtuelle User kanns auch und die Sache mit dem Home-Folder sollte auch möglich sein.

Ein Logfile mit übertragenen Dateien, auch kein Problem.

Hab ich was vergessen?

Grüsse

----------

## tazinblack

 *py-ro wrote:*   

> Leider habe ich selber bisher keine Erfahrung mit Kerberos, aber in der Manpage von pam_krb5 steht zum Beispiel folgender Parameter:
> 
> ```
> no_user_check
> 
> ...

 

Jetzt, wo Du das sagst ist mir aufgefallen, dass man pam_krb5 mit USE="doc" installieren kann. Und ich hab mich schon gewundert, warum es keine manpage gibt. Sorry, schwerer Anfängerfehler   :Embarassed: 

Die manpage stammt aber nicht von nem aktuellen gentoo, oder? Bei mir gibts keine Option "no_user_check". Aber Du hast Recht. Das ist wohl das, was mir fehlt.

Ich hab die Version 

```
li176x20 pam.d # equery l pam_krb5

[ Searching for package 'pam_krb5' in all categories among: ]

 * installed packages

[I--] [  ] sys-auth/pam_krb5-3.12 (0)

li176x20 pam.d #
```

 installiert.

----------

## tazinblack

 *Evildad wrote:*   

> Ähm kurze Frage wieso eigentlich nicht Proftp mit mod_ldap für die AD-Anbindung. 
> 
> Virtuelle User kanns auch und die Sache mit dem Home-Folder sollte auch möglich sein.
> 
> Ein Logfile mit übertragenen Dateien, auch kein Problem.
> ...

 

Hallo evildad. 

Das wäre sicher auch ne Alternative. Leider hab ich mit ldap noch nichts gemacht. Ist das aufwendig gegen ein AD?

Wobei es gerade danach aussieht, als ob nur die pam bzw. pam_krb5 Probleme macht. D.h. ich sollte also auch vsftpd mit mod_ldap machen können, falls ich nicht ne Lösung fürs kerberos finde.

Kannst Du mir nen Tipp geben mit pam_ldap gegen AD?

----------

## tazinblack

 *tazinblack wrote:*   

>  *py-ro wrote:*   Leider habe ich selber bisher keine Erfahrung mit Kerberos, aber in der Manpage von pam_krb5 steht zum Beispiel folgender Parameter:
> 
> ```
> no_user_check
> 
> ...

 

Nachdem mir das jetzt schon spanisch vorgekommen ist, dass es manpages in google gibt, wo die option "no_user_check" enthalten ist, hab ich mir mal diesen Sourcecode hier gezogen http://people.redhat.com/nalin/pam_krb5/pam_krb5-2.3.1-1.tar.gz (die Hauptseite gibts hier http://people.redhat.com/nalin/pam_krb5/)

Kurz mal ein ./configure gefolgt von make und am Ende das neu gebaute pam_krb5.so umgenannt nach pam_krb5_2.3.1-1.so und schließlich nach /lib/security kopiert.

Noch mal die Rechte geprüft die /etc/pam.d/vsftpd geändert:

```
auth     required       pam_krb5_2.3.1-1.so ignore_root debug no_user_check

account  required       pam_krb5_2.3.1-1.so ignore_root debug no_user_check

```

Und ich traue meine Augen nicht, es geht: Ich kann mich damit anmelden!

Scheint wohl entweder in aktuellen Versionen nicht mehr gewollt zu sein, oder die Version in portage ist ne andere.

So ne richtig offizielle Homepage wo man pam_krb5 downloaden kann hab ich bisher auch nicht gefunden.

So, dann will ich mal den übrigen Punkte anschauen.

Abschließend bekommt ihr natürlich noch die Konfiguration der einzelnen Pakete!

Danke schon mal für die Unterstützung!   :Wink: 

----------

