diff options
| -rw-r--r-- | fripost-docs.org | 386 | 
1 files changed, 250 insertions, 136 deletions
| diff --git a/fripost-docs.org b/fripost-docs.org index afff34a..09ca536 100644 --- a/fripost-docs.org +++ b/fripost-docs.org @@ -136,7 +136,7 @@ sudo aptitude install logcheck syslog-summary      ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel:( \[[[:digit:]]+\.[[:digit:]]+\])? imklog [0-9.]+, log source = /proc/kmsg started.$      ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ rsyslogd: \[origin software="rsyslogd" swVersion="[0-9.]+" x-pid="[0-9]+" x-info="http://www.rsyslog.com"\] restart$ -    ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: Kernel logging (proc) stopped.$ +    ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ kernel: Kernel logging \(proc\) stopped.$  /etc/logcheck/ignore.d.server/ddclient  :HIDDEN: @@ -322,9 +322,9 @@ smarthost = the server receiving email from the internet (configured as MX)     THE_PUBLIC_KEY="ssh-rsa xxxxxxxxxxx" -   sudo -u $TUNNEL_USER mkdir $TUNNEL_HOME/.ssh -   echo "command=\"nc localhost $DEST_PORT\",no-X11-forwarding,no-agent-forwarding,\ -no-port-forwarding $THE_PUBLIC_KEY" | sudo -u $TUNNEL_USER tee $TUNNEL_HOME/.ssh/authorized_keys2 +      sudo -u $TUNNEL_USER mkdir -p $TUNNEL_HOME/.ssh +      echo "command=\"nc localhost $DEST_PORT\",no-X11-forwarding,no-agent-forwarding,\ +no-port-forwarding $THE_PUBLIC_KEY" | sudo -u $TUNNEL_USER tee -a $TUNNEL_HOME/.ssh/authorized_keys2  **** Set up the tunnel @@ -353,120 +353,81 @@ telnet localhost $ORIGIN_PORT  *** Installing MySQL       - sudo apt-get install mysql-server       - generate a long (25 characters) password for the mysql root user -     - /etc/mysql/my.cnf -:HIDDEN: -skip-innodb -:END: -*** Configuring the MySQL replication -***** Overview -     [[http://dev.mysql.com/doc/refman/5.0/en/replication.html][MySQL 5.0 Reference Manual :: 16 Replication]] - -     We will use MySQL replication to keep the MySQL user data on the smarthosts -     in sync with the data held on the main IMAP server. - -     We begin by setting up an SSH tunnel, as described above.  The rest is -     fairly straight-forward.  Here are instructions adapted from the MySQL -     manual. - -     - Set up the SSH tunnel. - -***** Configure the master - -     - Add this to my.cnf: -:HIDDEN: -server-id		= 1 -log_bin			= /var/log/mysql/mysql-bin.log -expire_logs_days	= 10 -max_binlog_size         = 100M -binlog_do_db		= mail -:END: - -     - /etc/init.d/mysql restart - -     - Enter MySQL shell and create user with replication privileges: -       mysql -u root -p - -       # use only ASCII for <password> - -       GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'localhost' IDENTIFIED BY '<password>'; -       FLUSH PRIVILEGES; - -       USE mail; -       FLUSH TABLES WITH READ LOCK; - -       # Save the output of this command: -       SHOW MASTER STATUS; - -       unlock tables; -       quit; - -       # Copy this file to the slave: -       mysqldump -u root -p --opt mail > mydump.sql -        -***** Configure the slave - -      - Enter the MySQL shell and create the database: +     - /etc/mysql/my.cnf: skip-innodb +*** MySQL on the main IMAP server +**** Overview -        mysql -u root -p -        CREATE DATABASE mail; -        quit; -   -        mysql -u root -p --database=mail < mydump.sql +We will use four tables `alias', `domain', `log' and `mailbox'. -      - create a new temporary directory: -         -        sudo mkdir /var/lib/mysql/tmp -        sudo chown mysql:mysql !$ -        sudo chmod 0750 !$ - -      - /etc/mysql/my.cnf -:HIDDEN: -tmpdir		= /var/lib/mysql/tmp -# Note that the server-id must be different on all hosts -server-id		= 2 -:END: -      - /etc/init.d/mysql restart - -      SLAVE STOP; -      # [[http://dev.mysql.com/doc/refman/5.0/en/change-master-to.html][12.5.2.1. CHANGE MASTER TO Syntax]] -      # NOTE: fill in these values using output from SHOW MASTER STATUS; above - -      CHANGE MASTER TO -      MASTER_HOST='127.0.0.1', -      MASTER_PORT=1949, -      MASTER_USER='slave_user', -      MASTER_PASSWORD='<password>', MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=98; - -      START SLAVE; -      quit; - -***** Useful commands while debugging -       start slave; stop slave; -       show slave status\G - -*** Configuring the main IMAP server -**** /etc/postfix/main.cf - -**** MySQL on the main IMAP server - -     - create database mail; - -     We will use four tables `alias', `domain', `log' and `mailbox'. -      -     // FIXME; add description of tables -     :HIDDEN: -mysql> show tables; - -mysql> describe alias; - -mysql> describe domain; - -mysql> describe log; +***** mysql> show tables; ++----------------+ +| Tables_in_mail | ++----------------+ +| alias          |  +| domain         |  +| log            |  +| mailbox        |  ++----------------+ +4 rows in set (0.00 sec) + +***** mysql> describe alias; ++-------------+--------------+------+-----+---------------------+-------+ +| Field       | Type         | Null | Key | Default             | Extra | ++-------------+--------------+------+-----+---------------------+-------+ +| address     | varchar(255) | NO   | PRI |                     |       |  +| goto        | text         | NO   |     | NULL                |       |  +| domain      | varchar(255) | NO   |     |                     |       |  +| create_date | datetime     | NO   |     | 0000-00-00 00:00:00 |       |  +| change_date | timestamp    | NO   |     | CURRENT_TIMESTAMP   |       |  +| active      | tinyint(4)   | NO   |     | 1                   |       |  ++-------------+--------------+------+-----+---------------------+-------+ +6 rows in set (0.00 sec) + +***** mysql> describe domain; ++-------------+--------------+------+-----+---------------------+-------+ +| Field       | Type         | Null | Key | Default             | Extra | ++-------------+--------------+------+-----+---------------------+-------+ +| domain      | varchar(255) | NO   | PRI |                     |       |  +| description | varchar(255) | NO   |     |                     |       |  +| create_date | datetime     | NO   |     | 0000-00-00 00:00:00 |       |  +| change_date | timestamp    | NO   |     | CURRENT_TIMESTAMP   |       |  +| active      | tinyint(4)   | NO   |     | 1                   |       |  ++-------------+--------------+------+-----+---------------------+-------+ +5 rows in set (0.00 sec) + +***** mysql> describe log; ++-------+-------------+------+-----+-------------------+----------------+ +| Field | Type        | Null | Key | Default           | Extra          | ++-------+-------------+------+-----+-------------------+----------------+ +| id    | int(11)     | NO   | PRI | NULL              | auto_increment |  +| user  | varchar(20) | NO   |     |                   |                |  +| event | text        | NO   |     | NULL              |                |  +| date  | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |  ++-------+-------------+------+-----+-------------------+----------------+ +4 rows in set (0.00 sec) + +***** mysql> describe mailbox; ++-------------+--------------+------+-----+---------------------+-------+ +| Field       | Type         | Null | Key | Default             | Extra | ++-------------+--------------+------+-----+---------------------+-------+ +| username    | varchar(255) | NO   | PRI |                     |       |  +| password    | varchar(255) | NO   |     |                     |       |  +| name        | varchar(255) | NO   |     |                     |       |  +| maildir     | varchar(255) | NO   |     |                     |       |  +| domain      | varchar(255) | NO   |     |                     |       |  +| create_date | datetime     | NO   |     | 0000-00-00 00:00:00 |       |  +| change_date | timestamp    | NO   |     | CURRENT_TIMESTAMP   |       |  +| active      | tinyint(4)   | NO   |     | 1                   |       |  ++-------------+--------------+------+-----+---------------------+-------+ +8 rows in set (0.00 sec) + +**** Steps to produce it +mysql -u root -p -mysql> describe mailbox; -     :END: +   create database mail; -     - sudo mysql -u root -p --database=mail +sudo mysql -u root -p --database=mail +FIXME: Not 100 % up to date         :HIDDEN:  DROP TABLE IF EXISTS `alias`;  SET @saved_cs_client     = @@character_set_client; @@ -523,23 +484,137 @@ CREATE TABLE `mailbox` (  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Virtual Mailboxes - mysql_virtua\nl_mailbox_maps';  SET character_set_client = @saved_cs_client;          :END: -     - mysql -u root -p -       CREATE USER 'mail'@'localhost' IDENTIFIED BY 'secret'; + +mysql -u root -p + +# Create triggers + +       use mail; + +       DELIMITER $$ +       CREATE TRIGGER alias_set_created_on_insert before insert on alias +         for each row begin set new.create_date = current_timestamp; end$$ +       CREATE TRIGGER domain_set_created_on_insert before insert on domain +         for each row begin set new.create_date = current_timestamp; end$$ +       CREATE TRIGGER mailbox_set_created_on_insert before insert on mailbox  +         for each row begin set new.create_date = current_timestamp; end$$ +       DELIMITER ; +        +# Create mail user + +       CREATE USER 'mail'@'localhost' IDENTIFIED BY 'mijhl9hniiMu5WxvvtdgsacxZ';         GRANT SELECT ON mail.alias   TO 'mail'@'localhost';         GRANT SELECT ON mail.domain  TO 'mail'@'localhost';         GRANT SELECT ON mail.mailbox TO 'mail'@'localhost'; -**** Test delivery +*** Configuring the MySQL replication +***** Overview +[[http://dev.mysql.com/doc/refman/5.0/en/replication.html][MySQL 5.0 Reference Manual :: 16 Replication]] -- /etc/postfix/main.cf -:HIDDEN: -# Not really needed until we switch to using Courier maildrop -maildrop_destination_recipient_limit = 1 +We will use MySQL replication to keep the MySQL user data on the smarthosts +in sync with the data held on the main IMAP server. -virtual_mailbox_base = /home/mail/virtual -:END: +These instructions are mainly adapted from the MySQL manual. + +***** Configure the master + + :: /etc/mysql/my.cnf: + +    server-id		= 1 +    log_bin		= /var/log/mysql/mysql-bin.log +    expire_logs_days	= 10 +    max_binlog_size	= 100M +    binlog_do_db	= mail +     + +/etc/init.d/mysql restart + +***** Configure the slave +****** Set up an SSH tunnel  + +We begin by setting up an SSH tunnel from the slave to the master, as described [[Configuring an SSH tunnel between two hosts][above]]. + +****** Preparing steps to take on master + +# Enter MySQL shell and create a user with replication privileges. +# NB: Use only ASCII for the <password> +mysql -u root -p + +    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'localhost' IDENTIFIED BY '<password>'; +    FLUSH PRIVILEGES; +    USE mail; +    FLUSH TABLES WITH READ LOCK; +    quit; +     +# Make a database dump. + +mysqldump -u root -p --opt mail > mydump.sql + +# Now, copy this file to the slave. + +# Save the output of the SHOW MASTER STATUS COMMAND. +mysql -u root -p + +    SHOW MASTER STATUS; +    unlock tables; +    quit; + +****** Slave configuration + +# Create a new temporary directory. +# NOTE: It has to be outside of /tmp so the replication is not screwed up on e.g. power outage. +         +TMP_DIR=/var/lib/mysql/tmp +sudo mkdir $TMP_DIR +sudo chown mysql:mysql $TMP_DIR +sudo chmod 0750 $TMP_DIR + + :: /etc/mysql/my.cnf + +    tmpdir		= /var/lib/mysql/tmp +    # Note that the server-id must be different on all hosts +    server-id		= 2 + +/etc/init.d/mysql restart + +# Enter the MySQL shell and create the database: -sudo mkdir -p /home/mail/virtual/fripost.org/example/ +mysql -u root -p + +    CREATE DATABASE mail; +    quit; +   +mysql -u root -p --database=mail < mydump.sql +   +# [[http://dev.mysql.com/doc/refman/5.0/en/change-master-to.html][12.5.2.1. CHANGE MASTER TO Syntax]] +# NOTE: fill in these values using output from SHOW MASTER STATUS; above +# NOTE: filling this in my.cnf is deprecated + +mysql -u root -p + +    SLAVE STOP; + +    CHANGE MASTER TO +    MASTER_HOST='127.0.0.1', +    MASTER_PORT=1949, +    MASTER_USER='slave_user', +    MASTER_PASSWORD='<password>', MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=98; + +    START SLAVE; +    show slave status\G + +# If it seems OK, just: + +    quit; + +*** Configuring the main IMAP server +**** /etc/postfix/main.cf + +TODO: add file contents + +**** Test delivery + +sudo mkdir -p /home/mail/virtual/fripost.org/  mysql -u root -p      INSERT INTO mailbox (username,password,name,maildir,domain) @@ -612,25 +687,64 @@ sudo /etc/init.d/dovecot restart  # client.  *** Configuring a new smarthost to relay e-mail to the main IMAP server +**** Overview + +We relay mail from our smarthosts to the main IMAP server. + +This is to avoid having a single poin of failure and to separate concerns. The +IMAP server then only needs to deal with authenticated clients and the +smarthosts. + +**** Prerequisites  + +Before this can work we must make sure that: +- the MySQL replication is working +- there is an SSH tunnel for the smtp + +If they are both setup, we can configure postfix on the smarthost to relay +emails through the tunnel. + +**** Configuration files + +TODO: add the necessary configuration files -First setup an SSH tunnel between the hosts according to instructions given -above. -Next, we need to configure postfix on the smarthost to relay emails through the -tunnel: -    -   One quick-and-dirty example to try it out is: -   - /etc/postfix/main.cf -     relay_domains  = fripost.org -     transport_maps = hash:/etc/postfix/transport -   - /etc/postfix/transport -     fripost.org smtp:localhost:1917 -   - sudo postmap hash:/etc/postfix/transport  ** Configuring the webserver     - sudo apt-get install apache2 +** Logging +*** Overview +We want to limit how much we log for privacy reasons. At the same time we want +to be able to debug technical problems and detect intrusions. + +For the webmail, we only log messages of priority warn or higher. +*** Configuration + +  :: /etc/rsyslog.conf + +    *.*;auth,authpriv.none;mail.err	-/var/log/syslog + +# NOTE: /var/log/mail.{err,warn} can be kept at the default +# values since they do not contain any sensitive information. +  :: /etc/logrotate.d/rsyslog + +    /var/log/mail.log +    /var/log/mail.info +    { +    	rotate 3 +    	daily +    	missingok +    	ifempty +    	compress +    	delaycompress +    	sharedscripts +    	postrotate +    		invoke-rc.d rsyslog reload > /dev/null +    	endscript +    } +  ** Necessary stuff to fix for security  *** Bacula for backups  Also has tripwire-like capabilities. | 
