GNU/Linux >> Belajar Linux >  >> Ubuntu

Hosting Virtual Dengan Proftpd Dan MySQL (Termasuk Kuota) Di Ubuntu 12.10

Dokumen ini menjelaskan cara menginstal server Proftpd yang menggunakan pengguna virtual dari database MySQL alih-alih pengguna sistem nyata. Ini jauh lebih berkinerja dan memungkinkan untuk memiliki ribuan pengguna ftp pada satu mesin. Selain itu saya akan menunjukkan penggunaan kuota dengan pengaturan ini. Tutorial ini didasarkan pada Ubuntu 12.10.

Untuk administrasi database MySQL Anda dapat menggunakan alat berbasis web seperti phpMyAdmin yang juga akan diinstal di howto ini. phpMyAdmin adalah antarmuka grafis yang nyaman yang berarti Anda tidak perlu dipusingkan dengan baris perintah.

Howto ini dimaksudkan sebagai panduan praktis; itu tidak mencakup latar belakang teoretis. Mereka diperlakukan di banyak dokumen lain di web.

Dokumen ini datang tanpa jaminan apapun! Saya ingin mengatakan bahwa ini bukan satu-satunya cara untuk mengatur sistem seperti itu. Ada banyak cara untuk mencapai tujuan ini tetapi ini adalah cara yang saya ambil. Saya tidak memberikan jaminan apa pun bahwa ini akan berhasil untuk Anda!

1 Catatan Awal

Dalam tutorial ini saya menggunakan hostname server1.example.com dengan alamat IP 192.168.0.100. Pengaturan ini mungkin berbeda untuk Anda, jadi Anda harus menggantinya jika perlu.

Pastikan Anda login sebagai root:

sudo su

1.1 Ubah Shell Default

/bin/sh adalah symlink ke /bin/dash, namun kita membutuhkan /bin/bash, bukan /bin/dash. Oleh karena itu kami melakukan ini:

dpkg-reconfigure dash

Instal tanda hubung sebagai /bin/sh? <-- Tidak

1.2 Nonaktifkan AppArmor

AppArmor adalah ekstensi keamanan (mirip dengan SELinux) yang seharusnya memberikan keamanan yang diperluas. Menurut pendapat saya Anda tidak memerlukannya untuk mengkonfigurasi sistem yang aman, dan biasanya menyebabkan lebih banyak masalah daripada keuntungan (pikirkan setelah Anda melakukan pemecahan masalah selama seminggu karena beberapa layanan tidak berfungsi seperti yang diharapkan, dan kemudian Anda mengetahui bahwa semuanya baik-baik saja, hanya AppArmor yang menyebabkan masalah). Oleh karena itu saya menonaktifkannya.

Kita dapat menonaktifkannya seperti ini:

/etc/init.d/apparmor stop
update-rc.d -f apparmor hapus
apt-get hapus apparmor apparmor-utils

2 Instal MySQL Dan phpMyAdmin

Ini semua dapat diinstal dengan satu perintah:

apt-get install mysql-server mysql-client phpmyadmin apache2

Anda akan diminta untuk memberikan kata sandi untuk pengguna root MySQL - kata sandi ini berlaku untuk pengguna [dilindungi email] serta [dilindungi email], jadi kami tidak perlu menentukan kata sandi root MySQL secara manual nanti:

Kata sandi baru untuk pengguna "root" MySQL:<-- yourrootsqlpassword
Ulangi kata sandi untuk pengguna "root" MySQL:<-- yourrootsqlpassword

Selain itu, Anda akan melihat pertanyaan berikut:

Server web untuk mengkonfigurasi ulang secara otomatis:<-- apache2
Konfigurasi database untuk phpmyadmin dengan dbconfig-common? <-- Tidak

3 Instal Proftpd Dengan Dukungan MySQL

Untuk Ubuntu tersedia paket proftpd-mod-mysql yang telah dikonfigurasi sebelumnya. Instal sebagai daemon mandiri seperti ini:

apt-get install proftpd-mod-mysql

Anda akan ditanya pertanyaan berikut:

Jalankan proftpd:<-- standalone

Kemudian kami membuat grup ftp (ftpgroup) dan pengguna (ftpuser) tempat semua pengguna virtual kami akan dipetakan. Ganti group- dan userid 2001 dengan nomor yang gratis di sistem Anda:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd pengguna" -g ftpgroup ftpuser

4 Membuat Database MySQL Untuk Proftpd

Sekarang kita membuat database bernama ftp dan pengguna MySQL bernama proftpd yang nantinya akan digunakan daemon proftpd untuk terhubung ke database ftp:

mysql -u root -p

BUAT DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* UNTUK 'proftpd'@'localhost' DIIDENTIFIKASI DENGAN 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* UNTUK 'proftpd'@'localhost.localdomain' DIIDENTIFIKASI DENGAN 'sandi';
HAK ISTIMEWA FLUSH;

Ganti kata sandi string dengan kata sandi apa pun yang ingin Anda gunakan untuk proftpd pengguna MySQL. Masih di shell MySQL, kita membuat tabel database yang kita butuhkan:

USE ftp;

CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';

CREATE TABLE ftpquotalimits (
nama varchar(30) default NULL,
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 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned 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'
) ENGINE=MyISAM;

CREATE TABLE ftpquotatallies (
nama varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned 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'
) ENGINE=MyISAM;

CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
diakses datetime NOT NULL default '0000-00-00 00:00:00 ',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE =MyISAM COMMENT='ProFTP user table';

quit;

Seperti yang mungkin Anda perhatikan, dengan berhenti; perintah kami telah meninggalkan shell MySQL dan kembali ke shell Linux.

BTW, (Saya berasumsi bahwa nama host sistem server ftp Anda adalah server1.example.com), Anda dapat mengakses phpMyAdmin di http://server1.example.com/phpmyadmin/ (Anda dapat menggunakan alamat IP alih-alih server1. example.com) di browser dan masuk sebagai proftpd. Kemudian Anda dapat melihat database. Nanti Anda dapat menggunakan phpMyAdmin untuk mengelola server Proftpd Anda.

5 Konfigurasikan Proftpd

Buka /etc/proftpd/modules.conf...

vi /etc/proftpd/modules.conf

... dan aktifkan tiga modul berikut:

[...]
# Install one of proftpd-mod-mysql, proftpd-mod-pgsql or any other
# SQL backend engine to use this module and the required backend.
# This module must be mandatory loaded before anyone of
# the existent SQL backeds.
LoadModule mod_sql.c [...] # Install proftpd-mod-mysql and decomment the previous
# mod_sql.c module to use this.
LoadModule mod_sql_mysql.c [...] # Install one of the previous SQL backends and decomment
# the previous mod_sql.c module to use this
LoadModule mod_quotatab_sql.c [...]

Kemudian buka /etc/proftpd/proftpd.conf dan beri komentar pada baris berikut:

vi /etc/proftpd/proftpd.conf
[...]
#<IfModule mod_quotatab.c>
#QuotaEngine off
#</IfModule>
[...]

Lebih jauh ke bawah dalam file, tambahkan baris berikut:

[...]
#
# Alternative authentication frameworks
#
#Include /etc/proftpd/ldap.conf
#Include /etc/proftpd/sql.conf

DefaultRoot ~

SQLBackend              mysql
# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            Plaintext Crypt
SQLAuthenticate         users groups


# used to connect to the database
# [email protected] database_user user_password
SQLConnectInfo  [email protected] proftpd password


# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        500

# create a user's home directory on demand if it doesn't exist
CreateHome on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# 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

RootLogin off
RequireValidShell off
[...]

Pastikan Anda mengganti kata sandi string dengan kata sandi asli untuk proftpd pengguna MySQL di baris SQLConnectInfo!

Kemudian restart Proftpd:

/etc/init.d/proftpd restart

6 Mengisi Database Dan Menguji

Untuk mengisi database Anda dapat menggunakan shell MySQL:

mysql -u root -p
USE ftp;

Pertama kita buat entri di tabel ftpgroup. Ini berisi nama grup, grupid, dan nama pengguna grup/pengguna ftp yang kami buat di akhir langkah kedua (ganti ID grup dengan tepat jika Anda menggunakan yang lain selain 2001):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

Sekarang kita selesai dengan tabel ftpgroup. Kami tidak perlu membuat entri lebih lanjut di sini. Setiap kali Anda membuat pengguna ftp virtual baru, Anda melakukannya di tabel ftpquotalimits dan ftpuser. Jadi mari kita buat contoh pengguna pertama kita dengan kuota 15MB dan rahasia kata sandi (kita masih di shell MySQL):

INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', '');
quit;

(Jangan lupa untuk mengganti groud- dan userid 2001 dengan tepat di pernyataan INSERT terakhir jika Anda menggunakan nilai selain dalam tutorial ini!)

Sekarang buka program klien FTP Anda di stasiun kerja Anda (seperti FileZilla, WS_FTP, SmartFTP atau gFTP) dan coba sambungkan. Sebagai nama host, Anda menggunakan server1.example.com (atau alamat IP sistem), nama pengguna adalah pengguna contoh, dan kata sandinya rahasia.

Jika Anda dapat terhubung - selamat! Jika tidak, ada yang tidak beres.

Sekarang, jika Anda menjalankan

ls -l /home/

Anda akan melihat bahwa direktori /home/www.example.com (direktori home pengguna example) telah dibuat secara otomatis, dan direktori tersebut dimiliki oleh ftpuser dan ftpgroup (pengguna/grup yang kita buat di akhir langkah kedua):

[dilindungi email]:~# ls -l /home/
total 8
drwxr-xr-x 3 administrator administrator 4096 Okt 19 13:08 administrator
drwx------ 2 ftpuser       ftpgroup      4096 18 Apr 18:13 www.example.com
[email protected]:~#

7 Administrasi Basis Data

Bagi kebanyakan orang akan lebih mudah jika mereka memiliki front-end grafis ke MySQL; oleh karena itu Anda juga dapat menggunakan phpMyAdmin (dalam contoh ini di bawah http://server1.example.com/phpmyadmin/) untuk mengelola database ftp.

Setiap kali Anda membuat pengguna baru, Anda hanya perlu membuat entri di tabel ftpquotalimits dan ftpuser, jadi saya akan menjelaskan kolom tabel ini di sini:

tabel ftpuser:

Kolom penting adalah ini (yang lain ditangani oleh MySQL atau Proftpd secara otomatis, jadi jangan mengisinya secara manual!):

  • userid:Nama pengguna Proftpd virtual (misalnya pengguna contoh).
  • passwd:Kata sandi pengguna yang tidak terenkripsi (yaitu teks yang jelas).
  • uid:Userid dari pengguna ftp yang Anda buat di akhir langkah kedua (mis. 2001).
  • gid:Groupid dari grup ftp yang Anda buat di akhir langkah kedua (mis. 2001).
  • homedir:Direktori home dari pengguna Proftpd virtual (mis. /home/www.example.com). Jika tidak ada, maka akan dibuat saat pengguna baru login pertama kali melalui FTP. Pengguna virtual akan di-jail ke dalam direktori home ini, yaitu, dia tidak dapat mengakses direktori lain di luar direktori home-nya.
  • shell:Tidak apa-apa jika Anda mengisi /sbin/nologin di sini secara default.

Tabel ftpquotalimits:

Kolom penting adalah ini (yang lain ditangani oleh MySQL atau Proftpd secara otomatis, jadi jangan mengisinya secara manual!):

  • name:Nama pengguna Proftpd virtual (misalnya pengguna contoh).
  • quota_type:pengguna atau grup. Biasanya, kami menggunakan pengguna di sini.
  • per_session:benar atau salah. true artinya batas kuota hanya berlaku untuk satu sesi. Misalnya, jika pengguna memiliki kuota 15 MB, dan dia telah mengunggah 15 MB selama sesi saat ini, maka dia tidak dapat mengunggah apa pun lagi. Tetapi jika dia logout dan masuk lagi, dia kembali memiliki 15 MB yang tersedia. false artinya, pengguna memiliki 15 MB, tidak peduli apakah dia logout dan login lagi.
  • limit_type:keras atau lunak. Batas kuota keras adalah batas yang tidak boleh terlampaui, sedangkan kuota lunak dapat dilampaui untuk sementara. Biasanya Anda menggunakan hard di sini.
  • bytes_in_avail:Batas upload dalam byte (mis. 15728640 untuk 15 MB). 0 berarti tidak terbatas.
  • byte_out_avail:Batas unduhan dalam byte. 0 berarti tidak terbatas.
  • byte_xfer_avail:Batas transfer dalam byte. Jumlah unggahan dan unduhan yang boleh dilakukan pengguna. 0 berarti tidak terbatas.
  • files_in_avail:Batas upload dalam file. 0 berarti tidak terbatas.
  • files_out_avail:Batas unduhan dalam file. 0 berarti tidak terbatas.
  • files_xfer_avail:Batas transfer dalam file. 0 berarti tidak terbatas.

Tabel ftpquotatallies digunakan oleh Proftpd secara internal untuk mengelola kuota sehingga Anda tidak perlu membuat entri di sana!

8 FTP Anonim

Jika Anda ingin membuat akun ftp anonim (akun ftp yang dapat digunakan semua orang untuk masuk tanpa kata sandi), Anda dapat melakukannya seperti ini:

Pertama kita buat user dan group dengan nama anonymous_ftp. Pengguna memiliki direktori home /home/anonymous_ftp:

groupadd -g 2002 anonymous_ftp
useradd -u 2002 -s /bin/false -d /home/anonymous_ftp -m -c "Pengguna FTP Anonim" -g anonymous_ftp anonymous_ftp

(Ganti 2002 dengan grup-/userid yang gratis di sistem Anda.)

Beberapa file yang dimulai dengan . telah dibuat dengan perintah terakhir (useradd) di direktori /home/anonymous_ftp. Kami tidak membutuhkannya, jadi kami menghapusnya:

cd /home/anonymous_ftp
rm -f .bash_logout
rm -f .profile
rm -f .bashrc

Kemudian kita buat direktori /home/anonymous_ftp/incoming yang memungkinkan pengguna anonim untuk mengupload file:

mkdir /home/anonymous_ftp/incoming
chown anonymous_ftp:nogroup /home/anonymous_ftp/incoming

Dan terakhir, buka /etc/proftpd/proftpd.conf dan tambahkan arahan berikut ke dalamnya:

vi /etc/proftpd/proftpd.conf
[...]
<Anonymous ~anonymous_ftp>
  User                                anonymous_ftp
  Group                               nogroup
  # We want clients to be able to login with "anonymous" as well as "ftp"
  UserAlias                        anonymous anonymous_ftp
  # Cosmetic changes, all files belongs to ftp user
  DirFakeUser        on anonymous_ftp
  DirFakeGroup on anonymous_ftp

  RequireValidShell                off

  # Limit the maximum number of anonymous logins
  MaxClients                        10

  # We want 'welcome.msg' displayed at login, and '.message' displayed
  # in each newly chdired directory.
  DisplayLogin                        welcome.msg
  DisplayChdir                        .message

  # Limit WRITE everywhere in the anonymous chroot
  <Directory *>
    <Limit WRITE SITE_CHMOD>
      DenyAll
    </Limit>
  </Directory>

  # Uncomment this if you're brave.
  <Directory incoming>
    # Umask 022 is a good standard umask to prevent new files and dirs
    # (second parm) from being group and world writable.
    Umask                                022  022
             <Limit READ WRITE SITE_CHMOD>
             DenyAll
             </Limit>
             <Limit STOR>
             AllowAll
             </Limit>
  </Directory>

</Anonymous>

Akhirnya restart Proftpd:

/etc/init.d/proftpd restart

Sekarang pengguna anonim dapat masuk, dan mereka dapat mengunduh file dari /home/anonymous_ftp, tetapi unggahan dibatasi ke /home/anonymous_ftp/incoming (dan setelah file diunggah ke /home/anonymous_ftp/incoming, file tersebut tidak dapat dibaca atau diunduh dari di sana; admin server harus memindahkannya ke /home/anonymous_ftp terlebih dahulu agar tersedia untuk orang lain).

(Harap diperhatikan:Anda hanya dapat memiliki satu akun ftp anonim per alamat IP!)

9 Referensi

Mandrake 10.1 - Proftpd + otentikasi MySQL + Cara Kuota:http://www.khoosys.net/single.htm?ipg=848

  • Proftpd:http://www.proftpd.org/
  • MySQL:http://www.mysql.com/
  • phpMyAdmin:http://www.phpmyadmin.net/
  • Ubuntu:http://www.ubuntu.com/

Ubuntu
  1. Pengguna dan Domain Virtual Dengan Postfix, Courier, MySQL, dan SquirrelMail (Ubuntu 14.04LTS)

  2. Hosting Virtual Dengan Proftpd Dan MySQL (Termasuk Kuota) Di Ubuntu 14.04LTS

  3. Pengguna dan Domain Virtual Dengan Postfix, Courier, MySQL, dan SquirrelMail (Ubuntu 13.10)

  1. Hosting Virtual Dengan PureFTPd Dan MySQL (Termasuk Kuota Dan Manajemen Bandwidth) Pada CentOS 7.0

  2. Hosting Virtual Dengan PureFTPd Dan MySQL (Termasuk Kuota Dan Manajemen Bandwidth) Di Ubuntu 7.10 (Gutsy Gibbon)

  3. Hosting Virtual Dengan Proftpd Dan MySQL (Termasuk Kuota) Di Ubuntu 8.04 LTS

  1. Hosting Virtual Dengan PureFTPd Dan MySQL (Termasuk Kuota Dan Manajemen Bandwidth) Di Ubuntu 8.10 (Intrepid Ibex)

  2. Hosting Virtual Dengan Proftpd Dan MySQL (Termasuk Kuota) Di Ubuntu 8.10

  3. Hosting Virtual Dengan PureFTPd Dan MySQL (Termasuk Kuota Dan Manajemen Bandwidth) Di Ubuntu 9.04 (Jaunty Jackalope)