piątek, 25 lipca 2008 
Start arrow FreeBSD arrow WWW arrow Squid + sqmgrlog
Menu BSD4u
FreeBSD
OpenBSD
NetBSD
Dla *BSD
FAQ BSD4u
Forum BSDGuru.org
Security Advisory
Licencje
Images BSD
Menu ogólne
Start
Aktualności
Download
Sondy
Szukaj
Linki
Książki
About BSD4u
Info
Team BSD4u
Regulamin
Kanał #BSD4u
Kontakt
Sondy
Co sądzisz o naszym nowym Projekcie, i jak oceniasz zmianę koncepcji Projektu?
 
Popularne
Kompilacja i konfigu...
SQUID - najpopularni...
Neostrada+ i modem ...
NATowanie czyli jak ...
Upgrade systemu
Samba - serwer plikó...
Apache (konfiguracja...
Praktyczne IPFW
MRTG - statystyki ru...
CVSup - pomocny podc...
Neostrada na modemie...
Postfix z autoryzacj...
System Portów (Kolek...
Postfix - bezpieczny...
Dummynet - dzielenie...
Top Download
File icon Postfix - "Krok po kroku" v1.06556
File icon Postfix - "Krok po kroku" v1.16243
File icon PPTPd - "Prosty i szybki VPN" v1.0b4874
File icon sdi.sh3834
File icon uEagle 1.0p12960
File icon named.sh2903
File icon uEagle 0.99b2861
File icon cs.sh2776
File icon uEagle 1.02752
File icon uEagle 1.12554
Ostatnie komentarze
transparent a virus...
Dodał: grzywka18
Dnia: 2008-05-13 11:19:58
hmm
Dodał: dzibi
Dnia: 2007-12-12 10:01:14
Bez tytułu
Dodał: grzywka18
Dnia: 2007-12-11 17:46:06
Bez tytułu
Dodał: termid
Dnia: 2007-05-09 18:01:11
Bez tytułu
Dodał: sarelo33
Dnia: 2006-12-30 23:50:14
Jest ok ale..
Dodał: theviant
Dnia: 2006-11-16 08:10:05
Google

Google


Newsletter
Zapisz się na nasz newsletter, jeżeli chcesz być na bieżąco informowany o aktualnościach..




System dodawania vhost'ów do Apache'a przez WWW Drukuj E-mail
Oceny: / 21
KiepskiBardzo dobry 
piątek, 30 stycznia 2004 - Napisał: Krzysztof Pawłowski (20558 odsłon)

Naszym celem jest zrobienie systemu, który zapewni nam tworzenie vhost'ow (wirtualnych adresów) do Apache przy użyciu www. Wszystkie dane na temat użytkownika są trzymane w bazie danych MySQL. Dodanie vhost'a obejmuje dodanie wpisu do httpd.conf, utworzenie domeny w PowerDNS'ie oraz ustawienie dostępu do strony przez ftp (PereFTPd). Wpis w cronie natomiast zaczytuje nową konfigurację vhost'ów i powiadamia o tym Apache'a wysyłając do niego HUP'a.

Co będziemy potrzebować ?

Do tego celu skorzystamy z następujących pakietów oprogramowania:

  * mysql - baza danych
  * apache - server www
  * mod_php4 - obsluga php4 dla apache'a
  * mod_sqlinclude - wczytywanie vhost'ow z bazy sql
  * powerdns - server dns
  * pure-ftpd - server ftp

Wszystkie te aplikacje znajdują się w portach, więc nie powinno być problemu z
ich instalacja.

PowerDNS + MySQL

Na początku przygotowujemy współpracę mysql i powerdns. Stworzymy odpowiednią bazę oraz użytkownika.

mysql> use mysql
Database changed

---
Dodajemy użytkownika 'dns' i ustawiamy mu hasło 'dupa.8'

mysql> insert into user (Host, User, Password) values("localhost","dns",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)

---
Tworzymy bazę o nazwie 'dns'

mysql> create database dns;
Query OK, 1 row affected (0.02 sec)

mysql> use dns
Database changed

---
Tworzymy tabele, która będzie zawierać informacje o naszych domenach. Z naszego punktu widzenia interesować nas będą 4 pola:
* id - identyfikator domeny
* name - nazwa naszej domeny
* master - adres IP server'a MASTER jeśli tak owy jest
* type - typ naszej domeny MASTER / SLAVE

mysql> create table domains (
  -> id INT auto_increment,
  -> name VARCHAR(255) NOT NULL,
  -> master VARCHAR(20) DEFAULT NULL,
  -> last_check INT DEFAULT NULL,
  -> type VARCHAR(6) NOT NULL,
  -> notified_serial INT DEFAULT NULL,
  -> account VARCHAR(40) DEFAULT NULL,
  -> primary key (id)
  -> )type=InnoDB;
Query OK, 0 rows affected (0.04 sec)

---
Tworzymy tablicę rekordów, która będzie zawierać poddomeny. Tu jednak potrzebne będą nam wszystkie pola:
* id - identyfikator poddomeny
* domain_id - identyfikator domeny nadrzędnej
* name - nazwa domeny
* type - typ domeny
* contest - zawartość
* ttl - czas życia
* prio - priorytet dla poczty
* change_date - ostatnia zmiana

mysql> CREATE TABLE records (
  -> id INT auto_increment,
  -> domain_id INT DEFAULT NULL,
  -> name VARCHAR(255) DEFAULT NULL,
  -> type VARCHAR(6) DEFAULT NULL,
  -> content VARCHAR(255) DEFAULT NULL,
  -> ttl INT DEFAULT NULL,
  -> prio INT DEFAULT NULL,
  -> change_date INT DEFAULT NULL,
  -> primary key(id)
  -> )type=InnoDB;
Query OK, 0 rows affected (0.03 sec)

---
Tworzymy dodatkowe indeksy dla tabeli

mysql> CREATE INDEX rec_name_index ON records(name);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX nametype_index ON records(name,type);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> CREATE INDEX domain_id ON records(domain_id);
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

---
Tworzymy tabele dla supermasters. Nam to nie jest do niczego potrzebne, ale opis tego cuda jest pod adresem : http://doc.powerdns.com/slave.html#SUPERMASTER

mysql> create table supermasters (
  -> ip VARCHAR(25) NOT NULL,
  -> nameserver VARCHAR(255) NOT NULL,
  -> account VARCHAR(40) DEFAULT NULL
  -> );
Query OK, 0 rows affected (0.03 sec)

---
Ustawiamy odpowiednie prawa dostępu do bazy

mysql> GRANT SELECT ON supermasters TO dns;
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL ON domains TO dns;
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL ON records TO dns;
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

W tym momencie mamy już bazę przygotowana do współpracy z powerdns'em.

Teraz klepiemy konfig od powerdns'a /usr/local/etc/pdns.conf

# Uruchamianie jako daemon
daemon=yes

# Default'owa domena dla której jesteśmy authorative
default-soa-name=test.org

# Ustawiamy korzystanie z bazy do trzymania wpisów.
launch=gmysql

# Wyłączamy rekursje
lazy-recursion=yes

# Zapytania rekursywne ślemy do xxx.xxx.xxx.xxx
recursor=xxx.xxx.xxx.xxx

# Pracujemy jako master
master=yes

# Nazwa bazy
gmysql-dbname=dns

# IP server'a, ktory trzyma baze
gmysql-host=127.0.0.1

# Hasło do bazy
gmysql-password=dupa.8

# User do bazy
gmysql-user=dns

PowerDNS odpalamy poleceniem pdns_server. Warto też dodać go skrytów startowych w /usr/local/etc/rc.d ale tak żeby był odpalany przed apache'em bo inaczej nam apache'a nie wczyta vhost'ow bez działającego dns'a.

Apache + mod_sqlinclude

Najpierw zajmiemy się skonfigurowaniem apache'a a potem stworzymy odpowiednia baze.Klepiemy więc httpd.conf.

# Odkomentowywujemy linijki:
LoadModule sqlinclude_module libexec/apache/mod_sqlinclude.so
AddModule mod_sqlinclude.c
# Dodajemy nastepujacy wpisy:
SQL_ServerName 127.0.0.1
SQL_SQLUser apache
SQL_SQLPassword dupa.8
SQL_SQLDB apache
SQL_Include "SELECT data FROM vhosts"

Wyjaśnienia wymaga jedynie ostatnia linijka , która zawiera zapytanie sql, którym mamy uzyskiwać wpisy.

Teraz stworzymy odpowiedniego user'a oraz base.

---
Dodajemy user'a 'apache' z hasłem 'dupa.8'

mysql> use mysql
Database changed

mysql> insert into user (Host, User, Password) values("localhost","apache",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)

---
Tworzymy bazę 'apache'

mysql> create database apache;
Query OK, 1 row affected (0.01 sec)

mysql> use apache
Database changed

---
Tworzymy tabelę 'vhosts', która będzie zawierać nasze wpisy do vhost'ow.

mysql> CREATE TABLE vhosts (
  -> data text,
  -> name varchar(32) default 'Unnamed'
  -> );
Query OK, 0 rows affected (0.03 sec)

---
Ustawiamy odpowiednie prawa dla bazy

mysql> GRANT SELECT ON apache.* TO apache;
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

No i ten etap mamy również w tym momencie zakończony.

Pureftpd + sql

Na początek zrobimy plik konfiguracyjny a następnie stworzymy odpowiednią bazę.

Klepiemy wiec /usr/local/etc/pureftpd-mysql.conf:

# Myślę, że tych opcji już nie trzeba wyjaśniać.
MYSQLServer 127.0.0.1
MYSQLSocket /tmp/mysql.sock
MYSQLUser ftp
MYSQLPassword dupa.8
MYSQLDatabase ftp

# Hasla trzymamy jako zwykle pola tekstowe
MYSQLCrypt cleartext

# Zapytanie do uzyskiwania hasel z bazy
MYSQLGetPW SELECT Password FROM users WHERE User="L"

# UID i GID z jakim bedzie pracowal user po autoryzacji
MYSQLDefaultUID 80
MYSQLDefaultGID 80

# Zapytania do uzyskiwania katalogu domowego user'a.
MYSQLGetDir SELECT Dir FROM users WHERE User="L"

Pureftpd odpalamy poleceniem:

# pure-ftpd -j -A -l mysql:/usr/local/etc/pureftpd-mysql.conf

 -j - tworzenie katalogu domowego przy pierwszym logowaniu
 -A
- chroot'owanie do katalogu domowego
 -l
- rodzaj autoryzacji oraz plik konfiguracyjny

Tworzymy jeszcze katalog /howe/www gdzie będziemy trzymać strony user'ow.
Nadajemy mu odpowiedni GID, UID oraz prawa.

# chown www:www /home/www
# chmod 755 /home/www

Teraz tworzymy odpowiednia bazę.

---
Dodajemy user'a 'ftp' z hasłem 'dupa.8'

mysql> use mysql
Database changed

mysql> insert into user (Host, User, Password) values("localhost","ftp",PASSWORD("dupa.8"));
Query OK, 1 row affected (0.02 sec)

---
Tworzymy bazę 'ftp'

mysql> create database ftp;
Query OK, 1 row affected (0.02 sec)

---
Tworzymy tabelę, która będzie zawierać informacje na temat user'ów.

mysql> use ftp
Database changed

mysql> CREATE TABLE users (
  -> User varchar(16) NOT NULL default '',
  -> Password varchar(64) NOT NULL default '',
  -> Dir varchar(128) NOT NULL default '',
  -> PRIMARY KEY (User) );

---
Ustawiamy odpowiednie prawa

mysql> grant SELECT on users to ftp;
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

Podsumowanie engine'u

W tej chwili mamy już skonfigurowane zaplecze sprzężone z bazą mysql.
Odpalamy więc:

# pdns_server
# apachectl start
# pure-ftpd -j -A -l mysql:/usr/local/etc/pureftpd-mysql.conf

Dodajemy jeszcze wpis do cron'a aby np. co 15 minut apache ponownie odczytywał informacje z bazy. Klepiemy więc:

# crontab -e

*/15 * * * * killall -HUP httpd

Interfejs WWW

Teraz zabierzemy się za za zrobienie prostego interfejsu www, który umożliwi nam dodawanie vhost'ow. Tego etapu nie będę szczegółowo opisywał tylko umieszczę odpowiednie pliki. Potrzebne będą nam config.php, index.php oraz vhost.php.

config.php
-----------

<?php
$server = "127.0.0.1";
$home = "/home/www";
$uid = 80;
$gid = 80;

$dns_db = "dns";
$dns_db_user = "dns";
$dns_db_pass = "dupa.8";

$apache_db = "apache";
$apache_db_user = "apache";
$apache_db_pass = "dupa.8";

$ftp_db = "ftp";
$ftp_db_user = "ftp";
$ftp_db_pass = "dupa.8";
?>

index.php
----------

<?php
include "config.php";

$link = mysql_connect($server, $dns_db_user, $dns_db_pass );

mysql_select_db( $dns_db ) or die(mysql_error());

$query = "SELECT name,id FROM domains WHERE type="MASTER"";

$result = mysql_query( $query );

print '<form action="vhost.php" method="POST"><BR>';
print 'Uzytkownik:'.' <input type="text" name="user"><BR>';
print 'Haslo:'.'<input type="text" name="passwd"><BR>';
print 'Vhost:'.' <input type="text" name="vhost"><BR>';

while ($row = mysql_fetch_row ($result))
{
print "<INPUT TYPE="radio" NAME="domena" VALUE="$row[1]">" . $row[0]."<BR>";
}
mysql_close($link);

print '<INPUT TYPE="submit" VALUE="Dodaj">';
?>

vhost.php
----------

<?php
include "config.php";

$id = $_POST["domena"];
$vhost = $_POST["vhost"];

print "Connecting to database...<BR>";
$link = mysql_connect($server, $dns_db_user, $dns_db_pass ) or die(mysql_error());
print "<B>Connected<BR></B>";

print "Selecting database...<BR>";
mysql_select_db( $dns_db ) or die(mysql_error());
print "<B>Selected<BR></B>";

$query = "SELECT name FROM domains WHERE id=".$_POST["domena"];

$result = mysql_query( $query ) or die(mysql_error());

$row = mysql_fetch_row ($result);

$domain = $row[0];

print "Adding DNS entry... $vhost.$domain<BR>";

$query = "INSERT INTO records (domain_id, name, type, content, ttl) VALUES($id, "$vhost.$domain","CNAME","$domain", 3600)";

mysql_query($query) or die(mysql_error());

mysql_close($link);

print "<B>DNS entry added<BR></B>";

print "Connecting to database...<BR>";
$link = mysql_connect($server, $apache_db_user, $apache_db_pass ) or die(mysql_error());
print "<B>Connected<BR></B>";

print "Selecting database...<BR>";
mysql_select_db( $apache_db ) or die(mysql_error());
print "<B>Selected<BR></B>";

print "Adding Virtual Host entry<BR>";

$full = $vhost.".".$domain;

$query = "INSERT INTO vhosts VALUES ("<VirtualHost $full> ServerName $full DocumentRoot $home/$full </VirtualHost>","$full")";
mysql_query($query) or die(mysql_error());
mysql_close($link);
print "<B>Virtual Host entry added<B><BR>";

print "Enabling ftp access...<BR>";
print "Connecting to database...<BR>";
$link = mysql_connect($server, $ftp_db_user, $ftp_db_pass ) or die(mysql_error());
print "<B>Connected<BR></B>";
print "Selecting database...<BR>";
mysql_select_db( $ftp_db ) or die(mysql_error());
print "<B>Selected<BR></B>";

$path = $home."/".$full;
$query = "INSERT INTO users (User,Password,Dir) VALUES("".$_POST["user"]."","".$_POST["passwd"]."","$path")";

mysql_query($query) or die(mysql_error());
mysql_close($link);

print "<B>Ftp access enabled</B><BR>";
?>

Wrzucamy sobie te pliki np do /usr/local/www/data i odpalamy lynx 127.0.0.1 :)

Podsumowanie

I to by było wszystko.

Od autora

Opis ten powstał podczas tworzenia tak owego systemu. Ponieważ mi się udało tak zrobić i system ten działa, więc bardzo możliwe jest , że może jeszcze komuś innemu się uda jeśli będzie czegoś takiego potrzebował. Jestem otwarty na wszelkie kreatywne formy krytyki oraz pytania. Jeśli moje
powyższe wypociny się komuś do czegoś przydadzą będzie mi miło.

Krzysztof "msciciel" Pawłowski

Źródła

* http://downloads.powerdns.com/documentation/html/
* /usr/local/share/doc/mod_sqlinclude/README.txt
* http://www.pureftpd.org/README.MySQL


Autor: Krzysztof "msciciel" Pawłowski
msciciel(at)darkzone.ma.cx

Komentarze:

Tylko zarejestrowani użytkownicy mogą pisać komentarze.
Prosze zaloguj się i dodaj komentarz.

Powered by AkoComment!

Ostatnio aktualizowany ( piątek, 11 listopada 2005 )

« wstecz   dalej »
Ciekawostki
Możesz automatycznie ściągać i instalować pakiety binarne poprzez
pkg_add -r
gdzie URL to adres pod którym dostępny jest pakiet. Pakiety potrzebne do prawidłowego działania instalowanej aplikacji również zostaną zainstalowane.
Pobierz
FreeBSD
OpenBSD
NetBSD
DragonFlyBSD
PC-BSD
FreeSBIE LiveCD
4.4BSD Lite
Reklama M3M.pl
Domeny
Książki

FreeBSD. Księga eksperta

FreeBSD. Księga eksperta

Cena: 125.00 zł
Dodaj do koszyka


FreeBSD. Podstawy administracji systemem

FreebBSD

Cena: 64.90 zł
Dodaj do koszyka


OpenBSD. Podstawy administracji systemem

OpenBSD

Cena: 84.90 zł
Dodaj do koszyka


OpenBSD. Tworzenie firewalla za pomocą PF

Firewall PF

Cena: 44.90 zł
Dodaj do koszyka

Licznik odwiedzin
Odwiedziło już nas
2319165
Internautów od lutego 2003

Korzystamy ze statysyk