Erinevus lehekülje "Cyrus kasutamine Gentooga" redaktsioonide vahel

Allikas: Kuutõrvaja
(Kasutaja)
269. rida: 269. rida:
  
 
  saslpasswd2 -c cyrus
 
  saslpasswd2 -c cyrus
 +
 +
Parool salvestadakse kausta /etc/sasl2 faili sasldb2
  
 
Nüüd võib logida cyruse konsoolile.
 
Nüüd võib logida cyruse konsoolile.

Redaktsioon: 18. märts 2010, kell 18:01

Sissejuhatus

Cyrus IMAP is named after Cyrus the Great (559 - 530 BC), founder of the Persian kingdom, and King of the World. Cyrus the great is remembered for his tolerance of the various minorities and generally benevolant leadership.

Antud näide on kirjutatud seletamaks kuidas gentoole ehitada cyruse abil võimas mysql ja openmailadminiga hallatav mailiserver.

cyrus kasutab üsna maildir laadset formaati kuid lisanud sellele andmebaasi muutes nii kõike tunduvalt kiiremaks. Seetõttu on cyrus üsna hea valik väga suurte emaili süsteemide tarbeks. Netis väidetakse ,et ka meie kodumaine hot.ee http://www.hot.ee (The Hotmail of Estonia) kasutab cyrust ning sellel hetkel 300,000 users.

Cyruse poolt toetatud protokollid on IMAP, IMAPS, POP3, POP3S, KPOP, LMTP

Süsteemi kirjeldus

Tähele tasub panna ,et cyruse juures postfix ise failide kettale kirjutamisega ei tegele. See on usaldatud täielikult cyrusele endale. Peale kirja saamist posfix kontrollib mysql tabelitest domeeni olemasolu ning annab selle edasi cyruse teenusele mis. Kontrollib taaskord kasutajat mysql'ist pam_mysql abil ning salvestab kirja enda modifitseeritud maildir++ laadsesse formaati ning samuti peab kõikide kirjade kohta enda sisemist andmebaasi. Cyrusel eelnevalt luua vastav mailbox mis on samanimeline kui kasutaja süsteemis. Automaatselt seda ei tehta.

Cyrus töö käigus kasutatakse mitmeid nö andmebaase

  • kirjade andmebaas - failisüsteemis salvestatakse iga kiri eraldi faili, vaikimisi asub see kataloogis /var/spool/cyrus/mail; igas postkasti kataloogis on lisaks kirjadele alati kolm faili, cyrus.cache, cyrus.index ja cyrus.header
  • postkastide andmebaas - failis /var/lib/cyrus/mailboxes.db on kirjas süsteemi Cyrus kasutajate ja nende postkastide andmebaas ning mida redigeeritakse cyradmin programmiga
  • duplikaatide andmebaas - failis /var/lib/cyrus/deliver.db on andmebaas, mida Cyrus kasutab topelt-sõnumite avastamiseks (nt kui saabub sama message id ja ümbriku väärtusega kiri mitu korda; käsuga '/usr/sbin/ctl_deliver -d' näeb selle baasi sisu)
  • Cyruse kasutajate andmebaas - antud juhul asub Mysql andmebaasis

Tarkvara install gentool

  emerge postfix
  emerge net-mail/cyrus-imapd
  emerge pam_mysql
  emerge cyrus-imap-admin
  emerge cyrus-sasl

Lisaks vaja installida mysql juhul kui ei ole eraldiseisvat mysql serverit. Mysql install on kirjeldatud teises õpetuses.

 rc-update add cyrus default
 rc-update add postfix default
 rc-update add saslauthd default

Cyruse seadistus

Kõik cyruse poolt starditavad teenused ja nende startimine tuleb defineerida failis cyrus.conf.

Näitekonfis stardime teenused imap, imaps, pop3 ja pop3s ning sieve.

/etc/cyrus.conf

START {
  recover       cmd="ctl_cyrusdb -r"
}

SERVICES {
  imap          cmd="imapd" listen="imap" prefork=5
  imaps           cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100 

  pop3          cmd="pop3d" listen="pop3" prefork=25 maxchild=-1
  pop3s         cmd="pop3d -s" listen="pop3s" prefork=25 maxchild=-1

  sieve         cmd="timsieved" listen="192.168.10:sieve" prefork=0

  lmtpunix      cmd="lmtpd" listen="/mail/imap/socket/lmtp" prefork=0
}
 
EVENTS {
  checkpoint    cmd="ctl_cyrusdb -c" period=30
  delprune      cmd="ctl_deliver -E 3" period=1440
  tlsprune      cmd="tls_prune" period=1440
}

lmtp peaks olema kindlasti samas kaustas kus configdirectory suunatud

Kõigi teenuste täpsemaks häälestamiseks on fail imapd.conf mis asub kaustas /etc

Sellest toimib kaustade paikamääramine. Sertifikaatide seadistamine. Imap, pop3, sieve täpsem häälestus jpm.

configdirectory:        /mail/imap
partition-default:     /mail/spool/imap
tls_ca_path:            /etc/imap
tls_cert_file:          /etc/imap/mail.crt
tls_key_file:           /etc/imap/mail.key
postmaster: postmaster

sievedir:              /mail/sieve
sieve_maxscriptsize: 64
sieve_maxscripts: 5

sendmail: /usr/sbin/sendmail
admins: cyrus
allowanonymouslogin: no
allowplaintext: yes
autocreatequota: 10000
reject8bit: no
quotawarn: 90
timeout: 30
poptimeout: 10

allowapop: no
popminpoll: 0

sasl_pwcheck_method: saslauthd
sasl_mech_list: PLAIN

lmtp_overquota_perm_failure: no

Cyruse administratiivse kasutaja kasutajanimi võiks näiteks selleks olla 'cyrus'

Loome samuti kaustad /mail/imap ja /mail/spool/imap

Cyruse seadistus mysql baasi kasutama

postfixi konf

järgnevad seaded teeme /etc/postfix kaustas

Esiteks on vaja lisada peamisse konfifaili järgnevad read, postfix on põhimõtteliselt vaid kirjade vastuvõtja ning edasi cyrusele andja, muid ülesandeid ta ei täida.

main.cf

mailbox_transport = cyrus
virtual_alias_domains = mysql:/etc/postfix/mydestination.mysql
virtual_alias_maps = mysql:/etc/postfix/virtual.mysql
sender_canonical_maps = mysql:/etc/postfix/canonical.mysql

mysql kasutamiseks failid

/etc/postfix/mydestination.mysql

mydestination.mysql

hosts = localhost
user = database
password = parool
dbname = mail
table = domains
select_field = domain
where_field = domain

/etc/postfix/virtual.mysql

virtual.mysql

hosts = localhost
user = baas
password = parool
dbname = mail
table = virtual
select_field = dest
where_field = address
additional_conditions = and active = '1'

/etc/postfix/canonical.mysql

canonical.mysql

hosts = host
user = baas
password = parool
dbname = mail
table = user
select_field = canonical
where_field = mbox
additional_conditions = and active = '1' limit 1

Mysql baasi seadistus

Loome baasi mail. Seadistame sellele kasutaja ning parooli.

Vajalikud on kolm tabelit

  • domains kus hoitakse domeene
  • users kus loomulikult kasutajate info
  • virtual mis täidab põhimõtteliselt sama ülesannet mis alias fail /mail kataloogis

Loome baasi mail tabelid. Järgneva info võib otse sql'is käivitada

--
-- Table structure for table `domains`
--

DROP TABLE IF EXISTS `domains`;
CREATE TABLE `domains` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `domain` varchar(64) collate utf8_estonian_ci NOT NULL default ,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1206 DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;

--
-- Table structure for table `user`
--

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `mbox` varchar(16) collate utf8_estonian_ci NOT NULL default ,
  `person` varchar(150) collate utf8_estonian_ci NOT NULL,
  `canonical` varchar(100) collate utf8_estonian_ci NOT NULL default ,
  `password` varchar(40) collate utf8_estonian_ci NOT NULL default ,
  `active` tinyint(1) NOT NULL default '0',
  `created` int(10) unsigned NOT NULL default '0',
  `last_login` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`mbox`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;

--
-- Table structure for table `virtual`
--

DROP TABLE IF EXISTS `virtual`;
CREATE TABLE `virtual` (
  `address` varchar(255) collate utf8_estonian_ci NOT NULL default ,
  `dest` text collate utf8_estonian_ci,
  `active` tinyint(1) NOT NULL default '1',
  PRIMARY KEY  (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci;

Seejärel võime lisada tabelisse domeeni, kasutaja ning mõne aliase

Pam häälestus mysql tarbeks

teeme imap pam konfiguratsiooni

# /etc/pam.d/imap
#auth       required     pam_nologin.so
#auth       include      system-auth
#account    include      system-auth
#session    include      system-auth

auth    sufficient pam_mysql.so user=mailedu passwd=parool host=localhost db=baas table=user usercolumn=mbox passwdcolumn=password crypt=1 sqlLog=0
account required   pam_mysql.so user=mailedu passwd=parool host=localhost db=baas table=user usercolumn=mbox passwdcolumn=password crypt=1 sqlLog=0

Juhul kui pam autentimine mingil põhjusel tõrgubnvõb auto ja account ridade lõppu lisada verbose ,et saada rohkem infot /var/log/auth.log'i

Lisada võib samuti where=mailboxes.active=1 mis puhul disabletud kasutajate ligipääsu piiratakse.

Teeme loodud imap failist symlingid teistele pam failidele.

 ln /etc/pam.d/imap  /etc/pam.d/pop
 ln /etc/pam.d/imap  /etc/pam.d/sieve
 ln /etc/pam.d/imap  /etc/pam.d/smtp
 ln /etc/pam.d/imap  /etc/pam.d/nntp
 mkdir /var/lib/amavis

cyruse haldus käsurealt

Kõik cyruse tööd toimuvad cyradm utiliidi vahendusel

Serveri administraatoriks on kasutaja Cyrus. Selleks ,et saaks cyradm abil cyruse shelli kasutada on vaja esimesena seada cyrus kasutajale parool. muudame cyruse parooli ja testime selle toimimist

saslpasswd2 -c cyrus

Parool salvestadakse kausta /etc/sasl2 faili sasldb2

Nüüd võib logida cyruse konsoolile.

cyradm -user cyrus 127.0.0.1

Nimekiri peamistest vajalikest cyruse käskudest

cm Loob mailbox'i
dm kustutabmailbox
exit väljumiseks cyradm'ist
lm nimekiri mailbox'idest
lq Näitab quota informatsiooni
lqm Quota info etteantud mailboxi kohta
renm Muudab mailboxi nime
sq Quota seadistamiseks

Cyruses kasutajale mailboxi luues tuleb pidada meeles ,et see tuleb luua kujul user.kasutajanimi

näiteks cyrus.mart

cm user.mart

Olemas on veel hulk käsurea abivahendeid näiteks

/usr/lib/cyrus/quota

mis näitab kasutajate nimistut koos quotaga ja näiteks /usr/lib/cyrus/deliver mailide saatmiseks viisil

echo tekst |  /usr/lib/cyrus/deliver -q kasutajanimi

Kasutaja

Loome test domeeni test.ee ja kasutaja mart

echo test | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -
INSERT INTO `domains` VALUES (0,'test.ee')
INSERT INTO `user` VALUES (0,'mart','mart metsast','mart@test.ee','d8e8fca2dc0f896fd7cb4cb0031ba249',1162296952,1189589660)
INSERT INTO `virtual` VALUES (0,'test@test.ee','mart',1)
cyradm -user cyrus 127.0.0.1
cm cyrus.mart

Testimine

emerge net-misc/netkit-telnetd
telnet 192.168.1.10 143
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
* OK gentoo20070412 Cyrus IMAP4 v2.2.12-Gentoo server ready
1 LOGIN mart parool
1 OK User logged in

Testime mailisaatmist

mail käsk tuleb gentoosse paketist nail

emerge nail

ja edasi kasutada kujul ehco "kiri" | mail mart@zoo.tartu.ee

Cyruse veebiadministreerimine

Kõigi puhul tuleks uurida mis kujul nad soovivad tabeleid ja vastavaid muudatusi läbiviia

http://openmailadmin.ossdl.de/

http://email.uoa.gr/projects/cyrusmaster/index.php

http://www.web-cyradm.org/

Openmailadmin vajab järgnevaid pakette gentool

  emerge php
  emerge dev-php/PEAR-Log
  emerge dev-php/adodb

Kirjade automaatne jagamine postkastidesse

Avaliku IP peal TCP portil 2000 kuulab programm sieve, tegemist Cyrus tarkvara koosseisu kuuluv deemoniga (ingk. k. sõel) mis võimaldab nt kirja päise ridade alusel korraldada kirjade salvestamist kasutaja postkasti erinevatesse kataloogidesse (ingl. k. folder). põhimõtteliselt procmail analoog imapi jaoks.

Selleks tuleb esmalt moodustada tekstifail, nt

$ cat /var/spool/sieve/m/mart/default
require "fileinto";
      if header :contains "List-Id" "debian-mirrors.lists.debian.org" {
              fileinto "INBOX.d-m";}
      elsif header :contains "To" "mart.kask@loomaaed.tartu.ee" {
              fileinto "INBOX.@loomaaed.tartu.ee";}
      else {
              fileinto "INBOX";}

Antud juhul ütleb sieve fail, et

  • kirjad, mille päises List-Id: rida sisaldab väärtust debian-mirrors.lists.debian.org tuleb kopeerida kataloogi d-m
  • kirjad, mille päises To: rida sisaldab väärtust mart.kast@loomaaed.ee tuleb kopeerida kataloogi @loomaaed.ee
  • ülejäänud kirjad kopeeritakse lihtsalt inboxi

Tööks tuleb tekstifaili alusel moodustada nn byte-code fail öeldes

$ /usr/lib/cyrus/bin/sievec /var/spool/sieve/m/mart/default /var/spool/sieve/m/mart/defaultbc

Puhkuseteadete saatmiseks e vacationiks tuleb tekidada järgneva sisuga sieve

true
 {
  vacation :days 7 :addresses ["test@zoo.edu.ee"] text:
  This is an automated reply; I am away and will not be able to reply to you immediately.I will get back to you as soon as I return. 
 . 
 ;
}

Automaatselt reeglite loomiseks on veebimailile nimega squirrelmail loodud näiteks komonent nimeg avelsieve http://email.uoa.gr/avelsieve/ Seda pole juba uuendatud küll mõnda aega. Ka on olemas plugin IMPile nimega Ingo

Neil mõlemal pluginal on aga see puudus, et nad ise ei parsi sieve skripte, vaid hoiavad andmebaasis oma versiooni skriptist ja muutmisel uuendavad ühesuunaliselt serverit. See tähendab, et korraga tohibki ainult üks taoline plugin aktiivne olla, muidu ei näksi siga ka enam, mis reeglid serveris aktiivsed on. Graafilisi sieve parsereid eriti pole. Ainukene rohkem universaalsem tundub olevat SmartSieve, mis vähemalt ei eira serveris juba olevaid skripte ja lubab neid toorel kujul muuta, pakkudes ise Avelsievele sarnast funktsionaalsust.

Tooret skriptimist võimaldab ka Thunderbirdi add-on: http://sieve.mozdev.org/

Suurema mailisüstemi haldajale abiks olevat käsurea skriptid

sql'ist rubyga kasutajate nimekirja saamine

#!/usr/bin/env ruby
#
# skript kõikide postkastide loendamiseks

require 'dbi'

dbh = DBI.connect("DBI:Mysql:andmebaas:hostname","kasutaja","parool")
dbh.execute("SET NAMES latin1")

ret = dbh.select_all("select * from user where active = 1")

ret.each{|row|
  puts row['mbox']
}

Ööpäev vanemate kirjade kustutamiseks

#!/usr/bin/env ruby

piir = Time.now - 86400 # Ööpäevajagu sekundeid

cmd = "/usr/bin/mailq | /usr/bin/cleanq"

pipe = IO.popen(cmd)

pipe.each_line{|line|
  # mingi probleem edastusega
  if line =~ /^([A-F0-9]{11})\s+\d+\s+(... ... .. ..:..:..).*\(delivery temporarily suspended/
    id = $1
    aeg = Time.parse($2)
    if aeg < piir
      #puts id
      puts line
    end
  end
}

Soovides tabelit ,et näha palju kettaruumi kasutajad tarbivad sobib selline skript /mail/spool/imap/user tuleb asendada failisüsteemis kohaga kus asuvad kasutajate mailid

#!/bin/bash

for g in $( ls /mail/spool/imap/user ) ; do

hgd=`du -s /mail/spool/imap/user/$g`
vbd=`echo $hgd | awk '{print $1}'`

if [ $vbd -lt 92160 ]; then
 echo "v2iksem" > /dev/null
 else
du -sh /mail/spool/imap/user/$g
fi
done

Kasutajate otseseks tuvastamiseks kes üle quota läinud aga

#!/bin/bash

for i in `/usr/lib/cyrus/quota | tr -s ' '| awk '{print($2","$1","$4)}' | sed -e's/user\.//' |egrep "(^9[5-9])|(^digit:{3})"`;
do

protsent=`echo $i | cut -f1 -d',' `
limiit=`echo $i | cut -f2 -d','`
kasutaja=`echo $i | cut -f3 -d','`
echo "p: $protsent l: $limiit k: $kasutaja";

done

Ning kõigi kasutajate quota muutmiseks korraga taaskord tuleb muuta kataloogi rada kus asuvad failid kasutajatel näites antakse igale kasutale 500M

#!/bin/bash

for g in $( ls /mail/spool/imap/user ) ; do
 echo "setquota user.$g 512000;quit" | cyradm -user cyrus -server 127.0.0.1 --pass parool

done

Vead ja nende prandamine

Logisse tekivad näiteks read.

Sep  3 03:43:43 mail lmtpunix[10604]: DBERROR db4: Logging region out of memory; you may need to increase its size
Sep  3 03:43:43 mail lmtpunix[10604]: DBERROR: opening /var/imap/deliver.db: Cannot allocate memory
Sep  3 03:43:43 mail lmtpunix[10604]: DBERROR: opening /var/imap/deliver.db: cyrusdb error
Sep  3 03:43:43 mail lmtpunix[10604]: FATAL: lmtpd: unable to init duplicate delivery database
Sep  3 03:43:43 mail master[5498]: service lmtpunix pid 10604 in READY state: terminated abnormally

Probleem on berkeleydb'ga ning parandada saab asja järgneva käsuga andes ette cyruse andme failide asukoha

db4.2_recover -v -h /var/imap/db

Sasl testimiseks saab kasutada käsku

# testsaslauthd -u mart -p parool -s imap
0: OK "Success."

Kui cyrus ei tööta on erroriks (temporary failure. Command output: couldn't connect to lmtpd: Connection refused_ 421 4.3.0 deliver: couldn't connect to lmtpd_) ja kõik kirjad paigutatakse sabasse /var/spool/postfix/deferred/

Cyruse maildir formaat

kasutajal näiteks mart on seen file kohaks kus asub info kas loetud meili või ei /var/imap/user/e/eenet.seen

mailq  | cleanq | grep "temporary failure" | less

Cyryse migreerimine 32 bitilt 64 bitile

32 bitisel platformil anda käsud

su -cyrus
/usr/lib/cyrus/ctl_mboxlist -d > mailboxes.txt

seejärel 64 bitisel platformil kustutada kaustades vanad andmebaasifailid

rm /var/imap/db/*
rm -rf /var/imap/db.backup*
rm /var/imap/*.db

Cyrus kasutana seejärel anda käsud

Rekonstrueerime mailboxes.db faili

/usr/lib/cyrus/ctl_mboxlist -u < mailboxes.txt

Ehitame uuesti kõik andmebaasid tekitades /var/imap/user ja /var/imap/quota failid kuid kaovad annotations.db, deliver.db ja tls_sessions.db

Seda võib teha kiirelt käsuga

/usr/lib/cyrus/reconstruct -r -f user

Võib aegamööda alloleva skriptiga, et mitte tekitada töötavale serverile liiga suurt koormust

#!/bin/sh
for g in $(cat mailboxes.txt | awk '{ print $1 }' ) ; do
 echo $g
 /usr/lib/cyrus/reconstruct $g
 sleep 1
done

fatal region error detected; run recovery Vahel kui esineb sarmaseid db4 erroreid näiteks on tark kustutada .db failid imap ja imap/db kaustades

Viimase käsu täitmine võib suurte mailiserveritega võtta kaua aega

Veidi juttu imapist

http://oreilly.com/catalog/mimap/chapter/ch09.html

Kaunis näide tõeliselt suurest mailisüsteemist

https://docs.rice.edu/confluence/display/ITTUT/Cyrus+Email+Service+Design

Veel suurtest mailiserveritest

http://ebusiness.gbdirect.co.uk/case_studies/active_directory_imap_authentication.html