Efektywne zarządzanie bazą danych serwera wirtualnego z backendem MySQL (część 1)

Wielu osobom nieobce jest zagadnienie instalacji usług serwera wirtualnego (pDNS, Postfix, SASL, Dovecot, Pureftpd, Amavis, GPS, Apache) w oparciu backend na bazie danych MySQL. Rozwiązanie takie jest bardzo elastyczne i bezpieczne stanowiąc jednocześnie punkt wyjścia do efektywnego zarządzania usługą.

Do w/w integracji często stosuje się następujące oprogramowanie:

  • pDNS jako serwer DNS (1)
  • Postfix wraz z SASL jako MTA
  • Dovecot jako serwer usług POP3/IMAP
  • Apache
  • pureFTPd (2)

1) Bind jest najczęściej stosowanym serwerem DNS, jednakże pDNS oferuje natywne wsparcie MySQL oraz bardzo łatwą (gotowe programy) migrację

2) Zazwyczaj stosuje się proFTPd, którego przez długi czas i ja byłem zwolennikiem - jednakże z uwagi na problematyczną konfigurację z MySQL (problemy z quota) zrezygnowałem z niego.

Dodatkowo stosuję oprogramowanie
- GPS - wspierający MySQL grey-list policy server dla Postfixa
- Amavis jako SMTP proxy wspierające skanowanie antyvirusowe (clamav) i antyspamowe (spamassasin)

Integracja całości jest przedmiotem wielu FAQ oraz całej masy dokumentacji którą można znaleźć w googlach, tak więc nie na tym będę się skupiał. Skupie się na samej strukturze bazy danych.

Otóż zauważyć można podczas integracji pewną nadmiarowość i duplikowanie informacji w wielu tabelach podczas konfigurowania różnych usług dla tego samego klienta.

I tak aby zgodnie z większością znanych opisów integracji metodą dodać klientowi pełną obsługę wszystkich usług musimy:

  • dodać wpisy w 2 tabelach pDNS
  • dodać wpisy w 3 tabelach postfixa
  • dodać wpisy w tabeli dla Dovecot jeśli nie używamy tabeli Postfixa
  • dodać 1 wpis w tabeli pureFTPd
  • dodać 2(?) wpisy w tabeli amavis

Większość z informacji, które dodajemy do tych tabel jest duplikowana. W przypadku potrzeby zarządzania tą informacją mamy problem. Co zrobić aby nie duplikować niepotrzebnie informacji. Otóż z pomocą przychodzą nam tutaj mechanizmy view (w dalszej części będę używał nazwy widok) dostępne w MySQL od wersji 5.

Przyjrzyjmy się najpierw tabelą pDNS. Tutaj uwaga. Wszystkie tabele mają format zgodny z powszechnie stosowanymi opisami integracji usługi z MySQL. Różnią się tylko nazwą, którą dla własnej wygody prefixowałem nazwą usługi.

mysql> desc pdns_domains;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(11)          | NO   | PRI | NULL    | auto_increment |
| name            | varchar(255)     | NO   | UNI |         |                |
| master          | varchar(20)      | YES  |     | NULL    |                |
| last_check      | int(11)          | YES  |     | NULL    |                |
| type            | varchar(6)       | NO   |     |         |                |
| notified_serial | int(11) unsigned | YES  |     | NULL    |                |
| account         | varchar(40)      | YES  |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
mysql> desc pdns_records;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| domain_id   | int(11)      | YES  | MUL | NULL    |                |
| name        | varchar(255) | YES  | MUL | NULL    |                |
| type        | varchar(6)   | YES  |     | NULL    |                |
| content     | varchar(255) | YES  |     | NULL    |                |
| ttl         | int(11)      | YES  |     | NULL    |                |
| prio        | int(11)      | YES  |     | NULL    |                |
| change_date | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
8 rows in set (0.01 sec)

Otóż tabel pDNS zmieniać nie możemy z tej oto przyczyny, iż pDNS zapisuje samodzielnie informacje do obu tabel, tak więc nie mogą być one przekonwertowane do widoku. Tabela pdns_domains zawiera jednakże istotne informacje, mianowicie AKTYWNE w naszym systemie domeny podstawowe i zapasowe.

Rzućmy okiem na tabele używane przez Postfixa:

mysql> show tables like 'postfix%';
+------------------------------+
| Tables_in_vserver (postfix%) |
+------------------------------+
| postfix_alias                |
| postfix_domains              |
| postfix_mailbox              |
+------------------------------+
3 rows in set (0.00 sec)
mysql> desc postfix_domains;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| domain   | varchar(255) | NO   |     |         |       |
| backupmx | tinyint(1)   | NO   |     | 0       |       |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> desc postfix_mailbox;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(255) | NO   | PRI |         |       |
| password | varchar(255) | NO   |     |         |       |
| maildir  | varchar(255) | NO   |     |         |       |
| quota    | int(10)      | NO   |     | 0       |       |
| domain   | varchar(255) | NO   | MUL |         |       |
| active   | tinyint(1)   | NO   | MUL | 1       |       |
+----------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

Otóż w tabeli postfix_domains znajduje się lista domen obsługiwanych przez nasz system. Dodatkowo znajdują się tam domeny których backup MX utrzymujemy. Z dużym prawdopodobieństwem założyć można, iż będzie to lista domen których DNS utrzymujemy w pDNS. W tabeli postfix_mailbox znajdują się konta użytkowników, tabela ta może być współdzielona przez SASL oraz Dovecot, aczkolwiek jest to nieefektywne z uwagi do różnego sposobu podejścia do tematu blokowania kont.
Zazwyczaj blokada tymczasowa ma na celu zablokowanie możliwości wysyłania i odbierania poczty przy jednoczesnym braku blokady na pocztę przychodzącą.

Tabela serwera FTP, poniższy schemat jest schematem pochodzącym z dokumentacji:

mysql> desc ftpd_users;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| User     | varchar(16)  | NO   | PRI |         |       |
| Password | varchar(64)  | NO   |     |         |       |
| Uid      | int(11)      | NO   |     | -1      |       |
| Gid      | int(11)      | NO   |     | -1      |       |
| Dir      | varchar(128) | NO   |     |         |       |
+----------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

Do rzeczy: założenia:

  • projektowany schemat danych ma mieć zastosowanie w serwerze wirtualnym, który może obsługiwać sporą ilość domen i być punktem wyjścia do zarządzania przy pomocy interfejsu WWW.
  • podstawową jednostką przyporządkowania użytkowników do grup będzie domena
  • Chcemy mieć na tyle elastyczny system, aby jednym wpisem w odpowiedniej tabeli dało się uaktywnić użytkownikowi cały zestaw usług.
  • Chcemy dodatkowo zapewnić minimalną duplikację danych w całym systemie oraz pewne mechanizmy weryfikacji danych na poziomie bazy.

Cdn...

Post a Comment

Security Code: