apache: An einer mySQL Datenbank authentifizieren

Die Methode mit .htaccess/.htpasswd ist vielen bekannt um ein Verzeichnis per passwort zu schützen – Und dies geht mit dem apache-modul: mod_auth_mysql auch über eine mysql Datenbank!

Die Möglichkeiten dieser Methode sind fast unerschröpflich, so kann z.B. ein Forum einen Verzeichnisschutz implementiert haben, bei dem man sich automatisch mit seinem normalen Foren-Login anmelden kann, usw.

Und so gehts:

Erst mal muss das mod_auth_mysql installiert werden, z.B. bei CentOS mittels:

yum install mod_auth_mysql

Dann legt man im zu schützenden Verzeichnis einfach ein normales .htaccess file an mit folgendem Inhalt:

AuthName "SeitenName"
AuthType Basic
AuthMySQLHost <DB_HOST>
AuthMySQLUser <DB_USER>
AuthMySQLPassword <DB_PASSWORT>
 
AuthMySQLDB <DB>
AuthMySQLUserTable <USER_TABELLE>
AuthMySQLNameField <FELD_NAME>
AuthMySQLPasswordField <FELD_PASSWORT>
AuthMySQLPwEncryption <passwort Verschlüsselung, z.B. md5>
AuthMySQLEnable On
AuthMySQLUserCondition "<ggf. weitere Kontitionen>"
require valid-user

Hier ist noch ein Beispiel, wie man das ganze auch auf Gruppenberechtigungen ausdehnen kann:

AuthName "YourSite"
AuthType Basic
 
# Database settings:
AuthMySQLHost localhost
AuthMySQLUser dbuser
AuthMySQLPassword dbpass
AuthMySQLDB dbname
 
# User table
AuthMySQLUserTable users
AuthMySQLNameField users.name
AuthMySQLPasswordField users.pass
 
# User Roles tables
AuthMySQLGroupTable "users, users_roles"
AuthMySQLGroupField users_role.rid
 
# Where clauses
AuthMySQLUserCondition "users.status = 1 and users.access <> 0"
AuthMySQLGroupCondition "users.uid = users_roles.uid AND users_roles.rid > 2"
 
# Do it to it!
AuthMySQLPwEncryption md5
AuthMySQLEnable On
require valid-user

Und wenn alles klappt kann man sich dann mit den Login-Daten aus der Datenbank anmelden! 😉

Quelle: [http://drupal.org/node/156547|drupal.org: Sharing authentication with HTTP-Auth]

BIND: Sag mir von wo du kommst und ich sage dir wohin du gehen sollst

bind hat ein sehr praktisches Feature, dass allerdings nur wenigen bekannt ist: anhand einer ACL kann man verschiedene "Sichten" erstellen; so kann man z.B. sagen, dass jemand der von einer Adresse vom internen Netzwerk kommt die interne Adresse eines Server erhält und jemand der von "draussen" kommt die externe, öffentlich zugängliche Adresse.

Und so gehts: Erstmal definieren wir in /etc/named/named.conf die entsprechende Zone für das interne Netz:

acl internal-network
{
  // Local
  127.0.0.0/8;
 
  // 10.1.1.0 - 10.1.1.255 (Internal Network)
  10.1.1.0/24;
};

Dann definieren wir je für die interne Zone und für den „rest“ eine view und includen das entsprechende Zonefile:

view "internal"
{
  match-clients { internal-network; };
  include "/etc/bind/zones.conf.int";
};
 
view "external"
{
  match-clients { any; };
  include "/etc/bind/zones.conf";
};

amavis/clamav: Fehler bei DB-Updates (connect(): Permission denied)

Falls man auf einmal von cron mails bekommt wie:

/etc/cron.daily/freshclam:
 
connect(): Permission denied

Und im freshclam.log:

WARNING: Clamd was NOT notified: Can't connect to clamd through /var/spool/amavisd/clamd.sock

Dann kann das unter anderem daran liegen, dass die Verzeichnisberechtigungen vom Verzeichnis in dem das file clamd.sock liegt (in diesem Falle: /var/spool/amavisd) falsch eingestellt sind.

Diese müssen chmod 770 sein. Falls sie z.B. 700 sind löst ein Umstellen der Berechtigungen das Problem:

chmod -v 770 /var/spool/amavisd

Weitere Infos: [https://bugzilla.redhat.com/show_bug.cgi?id=548234|Red Hat: Bug 548234 – Freshclam cannot notify clamd of database updates due to permission denied]

Suchen und Ersetzen in mehreren Dateien

Manchmal will man in mehreren Datei ein „Suchen & Ersetzten machen.
Dies geht mit folgendem sed Konstrukt ganz einfach:

sed -e 's/search/replace/g' -i *.txt

Die Option bedeuten:
-e Führe den folgenden code (expression) aus
-i editiere das file

[stextbox id=“tip“ caption=“Tip: Ersetzten von Strings mit slash (/)“]Falls man einen String mit slash (z.B. einen Pfad) ersetzten will, kann man % als alternatives Trennungszeichen verwenden. Z.B.

sed -e 's%/alter/pfad%/neuer/pfad%g' -i *.txt

[/stextbox]

Will man in einem Verzeichnis und allen Unterverzeichnissen in allen Dateien einen String ersetzen, so kann man noch find miteinbeziehen:

find ./ -type f -exec sed -i 's/search/replace/g' {} \;

Quelle: http://www.liamdelahunty.com/tips/linux_search_and_replace_multiple_files.php

iTunes Album gesplittet

Unter itunes (iphone) oder auch dem Windows Media Center (mce) kann es vorkommen, dass manche Alben als Alben angezeigt werden, andere jedoch sind gesplittet, d.h. für jeden Track wird ein eigenes Album erstellt (mit nur diesem Track drin), was natürlich sehr suboptimal ist. Continue reading iTunes Album gesplittet

DSH auf CentOS installieren

[http://www.netfort.gr.jp/~dancer/software/dsh.html.en|DSH] (Dancer’s shell) ist ein exzellenter weg um Shell Kommandos auf verschiedenen Linux-Systemen gleichzeitig abzusetzen.
Bevor es jedoch los geht braucht es unter CentOS ein wenig "Handarbeit".

Zuerst muss man compiler, make, usw. installieren, dann erst [http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz|libdshconfig] kompilieren und dann [http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz|dsh] selbst.

Zum Schluss muss man noch einen neuen library pfad hinzufügen:

yum install gcc make cpp gcc-c++ wget
 
wget <a href="http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz" target="blank">http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.9.tar.gz</a>
wget <a href="http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz" target="blank">http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.25.9.tar.gz</a>
 
tar -xvzf libdshconfig-0.20.9.tar.gz
cd libdshconfig-0.20.9
./configure
make install
 
tar -xvzf dsh-0.25.9.tar.gz
cd ../dsh-0.25.9/
./configure
make install
 
echo "/usr/local/lib/" >> /etc/ld.so.conf.d/dsh.conf
ldconfig -v |grep dsh

stdout und stderr gleichzeitig umleiten

Häufig möchte man bei Script- oder Programm Ausgaben, diese komplett, also stdout und stder in ein file oder /dev/null Umleiten.

Dazu existieren häufig falsche annahmen, wie z.B. script.sh 2>&1 /dev/null, was falsch ist.

Richtigerweise muss man zuerst die Ausgabe Umleiten und dann stderr auf stdout schreiben lassen, was mit dem & in der Form: 2>&1 geht.

Praktisch sieht das dann so aus:

script.sh > /dev/null 2>&1

Es gibt aber sogar noch einen eleganteren Weg mit &> um stdout und stderr gleichzeitig umzuleiten:

script.sh &> combined.log

Soft-RAID nachträglich auf LVM System hinzufügen

Die Situation: Man hat mal ein Linux System mit einer Festplatte und LVM aufgesetzt und möchte jetzt durch das hinzufügen einer zweiten Platte ein soft-raid darauf machen, ohne das System neu installieren zu müssen. – Und mit den richtigen Handgriffen geht das ganz einfach! 😉

[stextbox id=“note“ caption=“Mehr Platz gefällig?“]Meistens ist eine nachträglich hinzugefügte Platte grösser als die erste. – Möchte man dies gerade nutzen um mehr Platz zu bekommen kann man einfach zwei grosse Platten einbauen und nach der RAID-Migration der zweiten Platte, die erste auch noch ersetzen.
Die dazu nötigen Schritte werden an unten an passender Stelle beschrieben.[/stextbox]

Situation

Wir gehen davon aus, dass das system zwei Partitionen hat:
/dev/sda1 (100MB): /boot
/dev/sda2 (rest) : LVM
(bei mehr partionen die Schritte einfach entsprechend für alle wiederholen)

Migration

Zuerst mal wird das System herunter gefahren und die zweite Festplatte eingebaut.
Dann wieder hochfahren und die zweite Platte so formatiert, dass die Partitionen mindestens so gross sind wie die bisherigen (dürfen auch grösser sein, wenn es Sinn macht (z.B. beim LVM) und man evtl. vorhat später die kleinere Platte auch durch eine grössere zu ersetzen.

Nun migrieren wir /boot; dies ist besonders einfach, da /boot im laufenden Betrieb problemlos unmounted werden kann:

umount /boot
mdadm --create /dev/md1 --level=1 --raid-disks=2 /dev/sda1 missing

Nun muss gewartet werden bis

cat /proc/mdstat

beide Partitionen als synchron anzeigt. Danach wird die alte Partition erstmal wieder entfernt:

mdadm --manage /dev/md1 --fail /dev/sda1
mdadm --manage /dev/md1 --remove /dev/sda1
mdadm --zero-superblock /dev/sda1

Wir haben hier zuerst ein sog. "degraded" RAID-Array mit der bisherigen Partition erstellt.

Nun ändern wir in: /etc/fstab den Eintrag für boot wie folgt um:

/dev/md1                /boot                   ext3    defaults        1 2

Jetzt kann /boot wieder gemounted werden:

mount /boot/

Nun muss auch noch die: "#boot=" Zeile in: /boot/grub/menu.lst angepasst werden:

#boot=/dev/md1

Als nächstes stellen wir sicher, dass grub auf beiden Festplatten installiert ist:

grub
grub> device (hd0) /dev/sda
grub> root (hd0,0)
grub> setup (hd0)
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> setup (hd0)
grub> find /grub/stage1
grub> quit

Jetzt folgt die Migration des LVMs. Dazu erstellen wir wieder ein degraded raid-array, fügen dass als PV den LVM hinzu verschieben dann all die Daten von der alten Partition auf das neue md-drive und können danach das alte PV aus der VG entfernen:

mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb2
pvcreate /dev/md2
vgextend rootvg /dev/md2
pvmove /dev/sda2 /dev/md2
vgreduce rootvg /dev/sda2
pvremove /dev/sda2

Zu guter letzt muss jetzt noch ein neues initrd erstellt werden:

mkinitrd -v -f /boot/initrd-$(uname -r).img $(uname -r)

[stextbox id=“warning“ caption=“Achtung“]Das erstellen des initrd’s ist ganz wichtig und selbst dann, wenn man bereits vorher vom LVM gebootet- und CentOS am laufen hat! – Denn CentOS fügt bei der initialen initrd erstellung jeweils nur die Treiber-Module hinzu, die auch benötigt werden; so fehlt aber der raid-treiber und das System wird nicht booten![/stextbox]

Nun kann man das System neu starten und wenn alles geklappt hat die Partitionen der alten Platte dem neuen RAID-Array hinzufügen:

mdadm --manage /dev/md1 --add /dev/sda1
mdadm --manage /dev/md2 --add /dev/sda2
cat /proc/mdstat

[stextbox id=“tip“ caption=“Tip“]Will man nun die alte Platte auch gleich mit einer grösseren ersetzen, so kann man diese vor dem obigen Schritt durch eine grössere ersetzen, entsprechend Partitionieren und gleich wie im obigen Schritt einbinden.[/stextbox]

Drupal: Cache manuell löschen

Bei Problemen mit drupal wird es manchmal sogar nötig den Cache manuell in der Datenbank zu löschen.

Dies kann mit folgendem Query gemacht werden:

TRUNCATE TABLE drupal_cache;
TRUNCATE TABLE drupal_cache_block;
TRUNCATE TABLE drupal_cache_browscap;
TRUNCATE TABLE drupal_cache_content;
TRUNCATE TABLE drupal_cache_filter;
TRUNCATE TABLE drupal_cache_form;
TRUNCATE TABLE drupal_cache_menu;
TRUNCATE TABLE drupal_cache_page;
TRUNCATE TABLE drupal_cache_uc_price;
TRUNCATE TABLE drupal_cache_update;
TRUNCATE TABLE drupal_cache_views;
TRUNCATE TABLE drupal_cache_views_data;
DELETE FROM drupal_variable WHERE name="cron_semaphore";
DELETE FROM drupal_variable WHERE name="cron_last";

FTP-Server

In diesem Tutorial wollen wir einen „ISP-Fähigen“ FTP-Server aufsetzen, bei dem die Benutzer nicht auf dem System selbst sondern nur virtuell in einer mySQL Datenbank existieren.

Selbstverständlich gehört auch Quota-Support dazu.

Als besonderes Schmankerl werden wir noch SSL hinzufügen um verschlüsseltes FTPS zu realisieren.

Einleitung

Als Software kommt proftd unter einem CentOS System zum Einsatz, die Konfiguration auf anderen Systemen dürfte aber nahezu identisch sein.

Bei den grafischen Frontends ist es häufig so, dass diese nicht wirklich schön sind, man kann aber, besonders bei FTP auch ganz einfach selbst was darum programmieren. Für den start dürfte proftp administrator aber ausreichen.

Installation

[stextbox id=“note“ caption=“Hinweis“]Die Texte: GEHEIMES_PASSWORT, so wie GEHEIMES_USER_PASSWORT müssen natürlich mit deinem Passwort ersetzt werden![/stextbox]

Als erstes installieren wir die benötigen Komponenten (letztere dürfte in den meisten Fällen schon vorhanden sein:

yum install proftd mysql-server openssl

Nun legen wir noch einen Benutzer und eine Gruppe an, unter dem dann die virtuellen Benutzer laufen:

groupadd -g 10021 ftpusers
useradd -c 'Virtual FTP users' -m -d /home/ftp/ -g 10021 -u 10021 -s /bin/false -r vftp
[stextbox id=“warning“ caption=“Achtung“]Bitte zuerst abchecken ob die UID/GID: 10021 noch frei ist![/stextbox]

mySQL/Frontend

Nun muss proftd-administrator auf einem webserver installiert werden. Wie das geht sollte klar sein, wenn nicht einfach der Beschreibung auf der proftpd administrator Webseite folgen. – Dieser Schritt ist optional, im prinzip kann man die user auch direkt in die Tabelle Eintragen, z.B. mit phpmyadmin.

Dann führt man folgende SQL Kommandos auf der Datenbank aus:

mysql -u root -p
mysql> create database proftpd;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'proftpd'@'localhost' IDENTIFIED BY '<GEHEIMES_PASSWORT>';
mysql> FLUSH PRIVILEGES;
mysql> use proftpd;
 
CREATE TABLE usertable (
  userid text,
  passwd text,
  homedir text,
  shell text,
  uid int(11) NOT NULL auto_increment,
  gid int(11) default NULL,
  count int(11) NOT NULL default '0',
  lastlogin datetime NOT NULL default '0000-00-00 00:00:00',
  lastlogout datetime NOT NULL default '0000-00-00 00:00:00',
  expiration datetime NOT NULL default '0000-00-00 00:00:00',
  disabled tinyint(4) default '0',
  det_name tinytext,
  det_mail tinytext,
  det_adress tinytext,
  det_notes tinytext,
  PRIMARY KEY  (uid)
) TYPE=MyISAM;
 
CREATE TABLE grouptable (
  groupname text,
  gid int(11) NOT NULL auto_increment,
  members text,
  description tinytext,
  PRIMARY KEY  (gid),
  UNIQUE KEY gid_2 (gid),
  KEY gid (gid)
) TYPE=MyISAM;
 
CREATE TABLE xfer_stat (
  userid text,
  file text,
  size bigint(20) default '0',
  address_full text,
  address_ip text,
  command text,
  timespent text,
  time text,
  cmd text,
  dunno text
) TYPE=MyISAM;
 
CREATE TABLE `ftpquotalimits` (
  `name` varchar(30) NOT NULL default '',
  `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  `per_session` enum('false','true') NOT NULL default 'false',
  `limit_type` enum('soft','hard') NOT NULL default 'hard',
  `bytes_in_avail` float NOT NULL default '0',
  `bytes_out_avail` float NOT NULL default '0',
  `bytes_xfer_avail` float NOT NULL default '0',
  `files_in_avail` int(10) unsigned NOT NULL default '0',
  `files_out_avail` int(10) unsigned NOT NULL default '0',
  `files_xfer_avail` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`name`)
) TYPE=MyISAM;
 
CREATE TABLE `ftpquotatallies` (
  `name` varchar(30) NOT NULL default '',
  `quota_type` enum('user','group','class','all') NOT NULL default 'user',
  `bytes_in_used` float NOT NULL default '0',
  `bytes_out_used` float NOT NULL default '0',
  `bytes_xfer_used` float NOT NULL default '0',
  `files_in_used` int(10) unsigned NOT NULL default '0',
  `files_out_used` int(10) unsigned NOT NULL default '0',
  `files_xfer_used` int(10) unsigned NOT NULL default '0'
) TYPE=MyISAM;
 
INSERT INTO grouptable (gid, groupname, description) VALUES (10021, "users", "Ordinary users");
INSERT INTO usertable (userid, passwd, homedir, shell, uid, gid ) VALUES (10021, <GEHEIMES_USER_PASSWORT>, "/home/ftp/vftp", "/bin/false", 10021, 10021);
quit

proFTPd

Nun konfigurieren wir die Datei /etc/proftpd.conf wie folgt:

### Load Modules
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_quotatab.c
LoadModule mod_quotatab_sql.c
 
 
### Global Options
ServerName                   "FTP Server"
ServerIdent                  on "example.org FTP service ready." 
ServerType                   standalone
DefaultServer                on
Port                         21
User                         ftp
Group                        ftp
MaxInstances                 30                                 # To prevent DoS attacks, set the maximum number of child processes to 30
DeferWelcome                 off
MasqueradeAddress            PUBLIC_IP_DES_SERVERS
PassivePorts                 60000 60010
 
MultilineRFC2228             on                                 # For compatibility with certain clients
 
TimeoutNoTransfer            600
TimeoutStalled               600
TimeoutIdle                  1200
 
DisplayLogin                 /home/ftp/welcome.msg
DisplayChdir                 .message
#ListOptions                 "-lh"
ListOptions                  "+a"
 
DenyFilter                   \*.*/
#PathDenyFilter              "\\.ftp)|\\.ht)[a-z]+$" 
PathDenyFilter               "(^|/)[-.]"
 
### FTPS/SSL connections
<IfModule mod_tls.c>
  TLSEngine                  on
  TLSLog                     /var/log/proftpd/tls.log
  TLSProtocol                SSLv3 TLSv1
  TLSRequired                off                                # Are clients required to use FTP over TLS when talking to this server?
 
  # Server's certificate
  TLSRSACertificateFile      /usr/local/share/ssl/default.crt
  TLSRSACertificateKeyFile   /usr/local/share/ssl/default.key
  TLSCACertificateFile       /usr/local/share/ssl/default.ca    # CA the server trusts
 
  TLSVerifyClient            off                                # Authenticate clients that want to use FTP over TLS?
 
  # Allow SSL/TLS renegotiations when the client requests them, but
  # do not force the renegotations.  Some clients do not support
  # SSL/TLS renegotiations; when mod_tls forces a renegotiation, these
  # clients will close the data connection, or there will be a timeout
  # on an idle data connection.
  TLSRenegotiate             none
 
  TLSOptions                 NoCertRequest
</IfModule>
 
 
### User Options
DefaultRoot                  ~ ftpusers                         # chroot for members of the users group
# Umask 022 prevents new files and dirs (second parm) from being group and world writable.
Umask                        027  027
AllowOverwrite               on                                 # Normally, we want files to be overwriteable.
 
# Only members of the users grou are allowd to login
<Limit LOGIN>
  DenyGroup                  !ftpusers
</Limit>
 
# Deny root-login, but do not persist of a valid shell as we use virtual users
<Global>
  RootLogin                  off
  RequireValidShell          off
</Global>
 
 
### Authentication
#PersistentPasswd            off                                # Uncomment this if you are using NIS or LDAP to retrieve passwords
AuthOrder                    mod_sql.c
SQLAuthTypes                 Backend
SQLConnectInfo               proftpd@localhost proftpd secret
SQLUserInfo                  usertable userid passwd uid gid homedir shell 
SQLGroupInfo                 grouptable groupname gid members 
SQLUserWhereClause           "disabled=0 and (NOW()<=expiration or expiration=-1 or expiration=0)"
 
# Log the user logging in
SQLLog 	                     PASS counter
SQLNamedQuery                counter UPDATE "lastlogin=now(), count=count+1 WHERE userid='%u'" usertable
 
# logout log
SQLLog 	                     EXIT time_logout
SQLNamedQuery                time_logout UPDATE "lastlogout=now() WHERE userid='%u'" usertable
 
# display last login time when PASS command is given
SQLNamedQuery                login_time SELECT "lastlogin from usertable where userid='%u'"
SQLShowInfo                  PASS "230" "Last login was: %{login_time}"
 
# xfer Log in mysql
SQLLog 	                     RETR,STOR transfer1
SQLNamedQuery                transfer1 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'c', NULL" xfer_stat
SQLLOG 	                     ERR_RETR,ERR_STOR transfer2
SQLNamedQuery                transfer2 INSERT "'%u', '%f', '%b', '%h', '%a', '%m', '%T', now(), 'i', NULL" xfer_stat
 
 
### User quotas
QuotaEngine                  on
QuotaDirectoryTally          on
QuotaDisplayUnits            Mb
QuotaShowQuotas              on
 
SQLNamedQuery                get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery                get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery                update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies
SQLNamedQuery                insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies
 
QuotaLimitTable              sql:/get-quota-limit
QuotaTallyTable              sql:/get-quota-tally/update-quota-tally/insert-quota-tally
 
 
### Logging
# Define logging formats
LogFormat                    default "%h %l %u %t \"%r\" %s %b"
LogFormat                    auth "%v [%P] %h %t \"%r\" %s"
LogFormat                    write "%h %l %u %t \"%r\" %s %b"
 
 
# alle logins
ExtendedLog                  /var/log/proftpd/ftp_auth.log AUTH auth
 
# file/dir access
ExtendedLog                  /var/log/proftpd/ftp_access.log WRITE,READ write
 
# paranoid log (large logfiles!)
ExtendedLog                  /var/log/proftpd/ftp.log ALL default
 
 
### Directories
<Directory /srv/ftp/upload>
  AllowOverwrite             off
  <Limit DELE RMD>
    DenyAll
  </Limit>
</Directory>
[stextbox id=“note“ caption=“Hinweis“]Für FTPS musst du nun noch eine SSL Zertifikat erstellen und als:
/etc/ssl/default.key
/etc/ssl/default.crt
abspeichern.

Wie man solche Zertifikate erstellt wird im Workshop: ((Mit OpenVPN zwei Netzwerke verbinden|Mit OpenVPN zwei Netzwerke verbinden)) im Abschnitt: „Zertifizierungsstelle einrichten“ behandelt.
Falls du dies nicht möchtest, lösche einfach den SSL-Teil aus der Konfiguration heraus.[/stextbox]

Abschliessender Test

[stextbox id=“note“ caption=“Hinweis: Firewall“]Falls du Probleme beim Zugriff auf den FTP-Server hast: Vor allem bei „passive FTP“ muss man das iptables-Modul: nf_conntrack_ftp verwenden!

Bei Red Hat Systmen kannst du das unter: /etc/sysconfig/iptables-config Eintragen:

IPTABLES_MODULES="nf_conntrack_ftp"

[/stextbox]

Starte nun den proftpd Server:

/etc/init.d/proftd start

Nun kannst di dich mit dem FTP verbinden:

ftp localhost
Connected to localhost (127.0.0.1).
220 ProFTPD 1.3.3c Server (CentOS) [78.46.19.250]
Name (localhost:root): vftp
331 Password required for vftp
Password: <GEHEIMES_USER_PASSWORT>
ftp> dir