如何在Debian Wheezy为你和你的朋友建立自己的云

这里概述我们将做什么:获取一个虚拟私人服务器,一个域名,并设置,设置postfix和dovecot发送和接收电子邮件...

在短短几个小时内恢复您的隐私并控制您的数据:为您和您的朋友构建自己的云

由Roudy Jhausse提供< aboutlinux@free.fr >

超过8年的40'000+搜索! 这是我的Google搜索记录。 那你的怎么样? (你可以在这里找到自己)在这么长时间内有这么多数据点,Google对您感兴趣的内容有一个非常精确的想法,你在想什么,你担心什么,以及如何自从你第一次获得Google帐户以来,这些年来都发生了变化。

您身份中最独特的部分内容存储在世界各地的服务器上,无法控制

假设您在2006年至2013年期间一直是Gmail用户,就像我一样,意味着您收到了30,000个电子邮件,并在7年内写了大约5000封电子邮件。 您发送或接收的一些电子邮件非常个人化,也许如此个人化,您甚至可能不想让一些家庭成员或亲密的朋友系统地通过他们。 也许你也起草了一些你从来没有发送过的电子邮件,因为你最后一刻改变了主意。 但即使您没有发送它们,这些电子邮件仍然存储在服务器上的某个位置。 因此,Google服务器比您最亲密的朋友或家人更了解您的个人生活,这是公平的。

在统计上,考虑到你有一个智能手机是一个安全的赌注。 默认情况下,您几乎无法使用手机,而不使用在Google服务器上将联系人存储在Google联系人中的联系人应用程序。 因此,Google不仅可以了解您的电子邮件,还可以了解您的离线联系人:您喜欢打电话的人,谁打电话给你,你的文字,以及你的文字。 您不需要采取我的措辞,您可以通过查看您给Google Apps等应用程式的权限来查看您所呼叫的人员列表以及您收到的短信,来验证自己。 您还使用手机附带的日历应用程序吗? 除非您在设置日历时明确选择退出,否则Google会精确地了解您每天的每一天,每年的每一天。 如果您通过Android手机选择了iPhone,则同样适用,除​​非Apple了解您的对话,联系人和计划而不是Google。

您是否也非常小心保持您的目录中的联系人是最新的,当他们移动到新工作或更改运营商时,更新朋友的同事和家人的电子邮件地址和电话号码? 这为Google提供了非常准确,最新的社交网络照片。 而且,您也喜欢使用智能手机的GPS与Google地图一起使用。 这意味着Google不仅可以从您的日历中了解您所做的工作,还可以了解您的位置,居住地点,工作地点。 通过将用户的GPS位置数据相关联,Google也可以告诉您现在可以与谁进行社交活动。

发布自己最常见的个人信息的日常习惯会影响到你的生活,没有人能够看到

总而言之,如果您是平均互联网用户,Google将会在近10年内提供有关您的兴趣,忧虑,激情和问题的最新信息。 它收集了一些最私人的信息(电子邮件,短信),一个一小时的日常活动和位置细节,以及您社交网络的高质量图片。 对你的这种亲密的了解可能超出了你最亲密的朋友,家人或你的爱人对你的了解。

不要想到这个大量的深刻的个人信息来完成陌生人,例如把它全部放在一个USB钥匙上,并把它放在一个随机的咖啡馆的桌子上,并附有一个“Olivier Martin的个人资料”请你随时使用。 谁知道谁会找到它,他们会怎么做? 然而,我们对于IT公司的陌生人,对我们的数据(即他们如何制作面包)和世界级的数据分析专家感兴趣的陌生人,我们没有问题,也许只是因为默认情况下发生,当我们点击绿色的“接受”按钮时,我们会考虑它。

有了这么多高质量的信息,多年来,Google可能会比以前希望了解自己更好地认识你:呃,现在爬过我的数字过去,我不记得写了一半的电子邮件我五年前发了 我感到惊讶和高兴的是,在2005年再次发现我对马克思主义的兴趣,并且我加入了ATTAC (一个努力通过对金融交易征税来限制投机和改善社会正义的组织)。 而上帝知道为什么我2007年真的很喜欢跳舞的鞋子。这些是非常无害的信息(你不会期望我在这里露出令人尴尬的东西,你会吗? 但是,通过将这些时间跨度的不同方面的高质量数据之间的点连接起来(在什么时间,何时,在哪里,在哪里,...)可以推断出关于你的预测性陈述。 例如,从17岁的女孩的购物习惯来看,超级市场可以告诉她,怀孕之前,爸爸甚至听到这个故事真实的故事 )。 谁知道Google可以使用高质量的数据成为可能,这远远超出了购物习惯? 通过连接点,也许可以预测未来几年您的口味或政治观点会如何变化。 今天, 你从未听说过有关你的500个数据点的公司 ,包括宗教,性取向和政治观点。 谈到政治,如果你决定在10年后进入政治呢? 你的生活可能会改变,你的意见也是可以,甚至可能会忘记,但Google不会。 您是否必须担心您的对手可以与有权访问Google数据的人联系,并可以从多年以来提供的个人资料的无底洞中挖掘出令人尴尬的事情? 直到Google或Facebook被黑客攻击,就像索尼最近遭到黑客入侵一样 ,所有的个人数据永远在公共领域?

我们大多数人将这些个人资料委托给这些公司的原因之一是他们免费提供他们的服务。 但是真的有多免费 Google帐户的平均值根据用于估算的方法而有所不同: 1000美元/年帐户用于投资撰写邮件的时间,而您的广告行业帐户的价值在220美元/年之间和500美元/年 。 所以服务不是完全免费的:您通过广告付款,以及我们的数据在未来可能会发现的未知用途。

我一直在写关于谷歌,主要是因为这是我委托我的大部分数字识别公司到目前为止,因此我最了解的公司。 但我可能已经写了苹果或Facebook。 这些公司真正改变了世界,他们在设计,工程和我们喜欢(d)使用的每一天的梦幻般的进步。 但这并不意味着我们应该把我们所有的个人数据放在他们的服务器上,并且委托他们进行数码生活:伤害的可能性太大了。

在5小时内回覆您的隐私和您所关心的人的隐私

它不一定是这样的。 您可以住在21世纪,每天都有智能手机,使用电子邮件和GPS,还可以保留您的隐私。 您需要做的只是控制您的个人数据:电子邮件,日历,联系人,文件等。Prism-Break.org网站列出了有助于控制个人资料命运的软件。 除了这些选项,最安全和最强大的方式来控制您的个人数据是通过构建自己的服务器来自己托管云。 但是,您可能没有时间和精力来研究如何做到这一点,并使其顺利进行。

这就是本文所在。在短短5个小时内,我们将为您,您的朋友和家人安装一个服务器来托管您的电子邮件,联系人,日历和文件。 服务器旨在充当您的个人数据的集线器或云端,以便您始终保持对其的完全控制。 您的PC /笔记本电脑,手机和平板电脑之间的数据将自动同步。 基本上, 我们将设置一个系统来替代Gmail,Google Drive / Dropbox,Google Contacts,Google Calendar和Picasa

只是为自己做这件事已经是一大步了。 但是,随着您的个人信息的很大一部分仍然会泄漏出来,最终会在硅谷的一些服务器上出现,只因为您每天互动的许多人都使用Gmail并拥有智能手机。 所以这是一个好主意,让一些你最亲密的人加入冒险。

我们将建立一个系统

  1. 支持任意数量的域和用户 。 这样可以轻松地与家人和朋友分享您的服务器,从而也可以控制他们的个人数据,并可以与您分享服务器的成本。 共享您的服务器的人可以使用自己的域名或分享您的。
  2. 让您可以在成功登录到服务器之后从任何网络发送和接收电子邮件 。 这样,您可以从任何电子邮件地址(PC,手机,平板电脑)和任何网络(家庭,工作中,公共网络...)发送您的电子邮件。
  3. 在发送和接收电子邮件时加密网络流量 ,因此不信任的人不会删除您的密码,也无法读取您的私人电子邮件。
  4. 提供最先进的反垃圾邮件 ,结合已知垃圾邮件发送者的黑名单,自动灰名单和适应性垃圾邮件过滤。 如果电子邮件被错误分类,则重新训练适应性垃圾邮件过滤器只需将垃圾邮件移入或移出垃圾邮件文件夹即可。 此外,服务器将为基于社区的垃圾邮件斗争做出贡献。
  5. 只需要几分钟的维护一段时间 ,基本上是安装安全更新,并简要检查服务器日志。 添加新的电子邮件地址归结为向数据库添加一条记录。 除此之外,你可以忘记它,并且过着自己的生活。 我建立了14个月前在这篇文章描述的系统,事情从那以后一直运行顺利。 所以我完全忘记了,直到我最近笑了一下,随便按下我手机上的“检查电子邮件”按钮的想法,导致电子一路走到冰岛(我的服务器坐在那里),然后回来。

要了解这篇文章,您将需要最少的技术能力。 如果您知道SMTP和IMAP有什么区别,什么是DNS,并且对TCP / IP有一个基本的了解,您就可以了解足够的跟踪。 您还需要Unix的基本工作知识(使用命令行中的文件,基本系统管理)。 而且你需要总共5个小时的时间来设置它。

这里概述我们将做什么:

  1. 获取一个虚拟专用服务器,一个域名,并设置它们
  2. 设置Postfix和dovecot发送和接收电子邮件
  3. 防止垃圾邮件到达您的INBOX
  4. 确保您发送的电子邮件通过垃圾邮件过滤器
  5. 主持人日历,联系人,文件与Owncloud并设置webmail
  6. 将您的设备同步到云端

本文受到以前工作的启发和启发

这篇文章大量从另外两篇文章中,分别是Xavier ClaudeDrew Crawford的电子邮件自主介绍。

该文章包括了Xavier和Draw的文章的所有功能,除了Drew已经和我不需要的三个功能,即推送电子邮件支持(我只想在我决定时检查电子邮件,否则我会分心所有的时间),电子邮件中的全文搜索(我没有用),并以加密的形式存储电子邮件(我的电子邮件和数据对于我必须在服务器本地加密的点)不重要。 如果您需要任何这些功能,请随时按照Drew的文章相应的部分进行添加,该部分与当前的相容。

与Xavier和Drew的工作相比,本文在几个方面有所改进:

  • 它根据我对Drew的文章的经验和对他的原始文章的许多评论来修复错误和打字错误。 我还经历了本文,从头几次设置服务器来复制它,并确保它可以正常工作。
  • 低维护:与Xavier的工作相比,本文增加了对服务器上多个电子邮件域的支持。 这样做是通过要求最少的服务器维护成为可能:基本上,添加一个域或一个用户,只需添加一行到一个mysql表,就是这样(不需要添加筛选脚本,...)。
  • 我添加了webmail。
  • 我添加了一个关于设置云的部分,不仅托管您的电子邮件,还可以托管您的文件,您的地址簿/联系人(电子邮件,电话号码,生日,...),日历和图片,以便在您的设备上使用。

获取一个虚拟专用服务器,一个域名,并设置它们

我们首先设置基本的基础设施:我们的虚拟专用服务器和我们的域名。

我对1984年的虚拟专用服务器(VPS)和Linode很好的经验 。 在本文中,我们将使用Debian Wheezy ,其中1984和Linode都提供了现成的图像来部署在您的VPS上。 我喜欢1984年,因为服务器在冰岛主办,专门从事可再生能源(地热和水电),因此不会对气候变化做出贡献,而不像大多数美国数据中心当前运行的煤电厂 。 此外,他们强调公民自由,透明度,自由自由软件

启动文件来存储我们需要在服务器上设置的各种密码(用户帐户,邮件帐户,云端帐户,数据库帐号)可能是个好主意。 加密这个文件(可能使用GnuPG )绝对是个好主意,因此即使您用来设置服务器的计算机被盗或受到攻击,攻击服务器也不容易。

对于注册域名,我一直在使用gandi服务已有十多年了,也满意。 对于这篇文章,我们将设置一个名为jhausse.net的区域。 然后,我们添加一个名为cloud.jhausse.net的主机,将MX记录设置为该主机。 当您处于这种状态时,请将300秒内的短时间生命(TTL)设置为记录,以便您可以在设置服务器时快速更改您的区域并测试结果。

最后,设置 PTR记录(反向DNS),使主机的IP地址映射回其名称。 如果您不明白上一句话,请阅读本文获取背景知识。 如果使用Linode,您可以在远程访问部分的控制面板中设置PTR记录。 与1984年,联系技术支持谁将帮助您。

在服务器上,我们将首先添加一个非私有用户,这样我们最终不会以root身份工作。 另外,以root身份登录将需要额外的安全层。

adduser roudy

然后,在/ etc / ssh / sshd_config中 ,我们设置

PermitRootLogin no

并重新加载ssh服务器

service ssh reload

然后,我们需要更改服务器的主机名。 编辑/ etc / hostname ,以便它与您的主机名只有一行,在我们的例子中

cloud

然后,编辑ssh服务器的公共密钥文件/etc/ssh/ssh_host_rsa_key.pub /etc/ssh/ssh_host_dsa_key.pub,/etc/ssh/ssh_host_ecdsa_key.pub ,以便文件的结尾反映您的主机名或实例root @云 然后重新启动系统,以确保主机名是固定的,应该在哪里

reboot

我们将更新系统并删除我们不需要的服务,以减少远程攻击的风险。

apt-get update
apt-get dist-upgrade
service exim4 stop
apt-get remove exim4 rpcbind
apt-get autoremove
apt-get install vim

我喜欢使用vim远程编辑配置文件。 为此,它有助于自动打开语法高亮。 我们通过添加来做

syn on

〜/ .vimrc

设置Postfix和dovecot发送和接收电子邮件

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-mysql mysql-server dovecot-lmtpd postgrey

Postfix配置菜单中,我们选择Internet站点 ,并将系统邮件名称设置为jhausse.net

我们现在将设置一个数据库来存储我们服务器上托管的域列表,每个这些域的用户列表(及其密码)以及一个邮件别名列表(将邮件从给定地址转发到另一个域)一)。

mysqladmin -p create mailserver
mysql -p mailserver
mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailuserpass';
mysql> FLUSH PRIVILEGES;
mysql> CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们将主持jhausse.net域名。 如果您想要托管其他域名,还可以添加它们。 我们还为每个域设置了一个postmaster地址,转发到roudy@jhausse.net

mysql> INSERT INTO virtual_domains (`name`) VALUES ('jhausse.net');
mysql> INSERT INTO virtual_domains (`name`) VALUES ('otherdomain.net');
mysql> INSERT INTO virtual_aliases (`domain_id`, `source`, `destination`) VALUES ('1', 'postmaster', 'roudy@jhausse.net');
mysql> INSERT INTO virtual_aliases (`domain_id`, `source`, `destination`) VALUES ('2', 'postmaster', 'roudy@jhausse.net');

我们现在添加一个本地托管的电子邮件帐户roudy@jhausse.net 。 首先,我们为它生成密码哈希值:

doveadm pw -s SHA512-CRYPT

然后将哈希添加到数据库

mysql> INSERT INTO `mailserver`.`virtual_users` (`domain_id`, `password`, `email`) VALUES ('1', '$6$YOURPASSWORDHASH', 'roudy@jhausse.net');

现在我们的域名,别名和用户列表已经到位,我们将设置Postfix(SMTP服务器,用于传出邮件)。 用/etc/postfix/main.cf替换以下内容:

myhostname = cloud.jhausse.net
myorigin = /etc/mailname
mydestination = localhost.localdomain, localhost
mynetworks_style = host

# We disable relaying in the general case
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
# Requirements on servers that contact us: we verify the client is not a
# known spammer (reject_rbl_client) and use a graylist mechanism
# (postgrey) to help reducing spam (check_policy_service)
smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023
disable_vrfy_command = yes
inet_interfaces = all
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/cloud.crt
smtpd_tls_key_file=/etc/ssl/private/cloud.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level=may
smtp_tls_loglevel = 1
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# Delivery
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
message_size_limit = 50000000
recipient_delimiter = +

# The next lines are useful to set up a backup MX for myfriendsdomain.org
# relay_domains = myfriendsdomain.org
# relay_recipient_maps =

# Virtual domains
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
local_recipient_maps = $virtual_mailbox_maps

现在我们需要教postfix来弄清楚我们希望哪些域接受电子邮件来使用我们刚刚设置的数据库。 创建一个新文件/etc/postfix/mysql-virtual-mailbox-domains.cf并添加以下内容:

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'

我们教postfix,通过使用以下内容创建/etc/postfix/mysql-virtual-mailbox-maps.cf来确定是否存在给定的电子邮件帐户

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

最后,postfix将使用/etc/postfix/mysql-virtual-alias-maps.cf来查找邮件别名

user = mailuser
password = mailuserpass
hosts = 127.0.0.1
dbname = mailserver
query = SELECT virtual_aliases.destination as destination FROM virtual_aliases, virtual_domains WHERE virtual_aliases.source='%u' AND virtual_aliases.domain_id = virtual_domains.id AND virtual_domains.name='%d'

有了这一切,现在是测试postfix是否可以正确查询我们的数据库的时候了。 我们可以使用postmap来做到这一点:

postmap -q jhausse.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
postmap -q roudy@jhausse.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
postmap -q postmaster@jhausse.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf
postmap -q bob@jhausse.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf

如果你正确设置了一切,前两个查询应该返回1 ,第三个查询应该返回roudy@jhausse.net ,最后一个应该返回什么。

现在,我们设置dovecot(IMAP服务器,从我们的设备获取服务器上的传入邮件)。 编辑/etc/dovecot/dovecot.conf来设置以下参数:

# Enable installed protocol
# !include_try /usr/share/dovecot/protocols.d/*.protocol 
protocols = imap lmtp

这将仅使imap(让我们获取电子邮件)和lmtp(哪些Postfix将用于传入传入的电子邮件到dovecot)。 编辑/etc/dovecot/conf.d/10-mail.conf来设置以下参数:

mail_location = maildir:/var/mail/%d/%n
[...]
mail_privileged_group = mail
[...]
first_valid_uid = 0

这将在/ var / mail / domainname / username中存储电子邮件。 请注意,这些设置在文件中的不同位置传播,有时我们可以设置:我们只需要注释它们。 已经在文件中的其他设置,可以按原样离开。 我们将不得不这样做来更新本文剩余部分中更多文件中的设置。 在/etc/dovecot/conf.d/10-auth.conf中 ,设置参数:

disable_plaintext_auth = yes
auth_mechanisms = plain
#!include auth-system.conf.ext
!include auth-sql.conf.ext

/etc/dovecot/conf.d/auth-sql.conf.ext中 ,设置以下参数:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=mail gid=mail home=/var/mail/%d/%n
}

在那里我们刚刚教授了用户在/ var / mail / domainname / username中使用电子邮件的dovecot,并从刚刚创建的数据库中查找密码。 现在我们还需要教dovecot如何使用数据库。 为此,请将以下内容放入/etc/dovecot/dovecot-sql.conf.ext中

driver = mysql
connect = host=localhost dbname=mailserver user=mailuser password=mailuserpass
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

我们现在修改配置文件的权限

chown -R mail:dovecot /etc/dovecot
chmod -R o-rwx /etc/dovecot

差不多了! 我们只需要编辑几个文件。 在/etc/dovecot/conf.d/10-master.conf中 ,设置以下参数:

service imap-login {
  inet_listener imap {
    #port = 143
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
 inet_listener pop3 {
    #port = 110
    port = 0
  }
  inet_listener pop3s {
    #port = 995
    #ssl = yes
    port = 0
  }
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0666
    group = postfix
    user = postfix
  }
  user = mail
}

service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = mail
    #group = 
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
  user = dovecot
}

service auth-worker {
  user = mail
}

请注意,我们为所有服务设置端口,但是将其映射为0,这有效地禁用它们。 然后,在/etc/dovecot/conf.d/15-lda.conf中 ,指定postmaster的电子邮件地址:

postmaster_address = postmaster@jhausse.net

最后但并非最不重要的是,我们需要为服务器生成一对公钥和私钥,我们将在dovecot和postfix中使用它们:

openssl req -new -newkey rsa:4096 -x509 -days 365 -nodes -out "/etc/ssl/certs/cloud.crt" -keyout "/etc/ssl/private/cloud.key"

在我们的情况下,请确保指定服务器的完全限定域名(FQDN):

Common Name (e.g. server FQDN or YOUR name) []:cloud.jhausse.net

如果没有,我们的客户可能会抱怨SSL证书中的服务器名称与其连接的服务器的名称不匹配。 我们告诉dovecot通过在/etc/dovecot/conf.d/10-ssl.conf中设置以下参数来使用这些键:

ssl = required
ssl_cert = </etc/ssl/certs/cloud.crt
ssl_key = </etc/ssl/private/cloud.key

而已! 现在来测试postfix和dovecot服务器!

service dovecot restart
service postfix restart

从服务器本身,尝试向本地用户发送电子邮件:

telnet localhost 25
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:roudy@jhausse.net
data
Subject: Hallo!

This is a test, to check if cloud.jhausse.net is ready to be an MX!

Cheers, Roudy
.
QUIT

服务器应该接收我们的电子邮件,像一个消息

250 2.0.0 Ok: queued as 58D54101DB

检查/var/log/mail.log中的日志,如果一切正常。 应该有线说话

Nov 14 07:57:06 cloud dovecot: lmtp(4375, roudy@jhausse.net): ... saved mail to INBOX

到现在为止还挺好? 好。 现在,让我们从不同的机器上尝试一样的,就像我们用来设置服务器的计算机一样。 这次我们会通过加密(TLS)与服务器通话:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:roudy@jhausse.net
rcpt to:bob@gmail.com

服务器应该响应

554 5.7.1 <bob@gmail.com>: Relay access denied

这很好:如果服务器接受了邮件,这意味着我们将postfix设置为世界上所有垃圾邮件发送者的开放式继电器,并且无需使用。 而不是“中继访问被拒绝”消息,您可以取而代之的消息

554 5.7.1 Service unavailable; Client host [87.68.61.119] blocked using zen.spamhaus.org; http://www.spamhaus.org/query/bl?ip=87.68.61.119

这意味着您尝试从被认为是垃圾邮件发送者地址的IP地址联系服务器。 尝试通过我的常规Internet服务提供商(ISP)连接到服务器时,我收到此消息。 要解决此问题,您可以尝试从另一台主机连接,也可能是通过SSH访问的另一台服务器。 或者,您可以重新配置Postfix的main.cf,不要使用Spamhaus的RBL,重新加载Postfix,并验证上述测试是否有效。 在这两种情况下,重要的是找到适合您的解决方案,因为我们会在一分钟内测试其他事情。 如果您选择重新配置Postfix不使用RBL,不要忘记将RBL重新载入并在完成文章后重新加载Postfix,以避免获得比必要更多的垃圾邮件。

现在我们来吧 尝试在端口25上通过SMTP发送有效的电子邮件,这些邮件服务器用于彼此通话:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:roudy@jhausse.net

服务器应该响应

Client host rejected: Greylisted, see http://postgrey.schweikert.ch/help/jhausse.net.html

这表明postgrey正在努力工作。 如果发件人以前从未见过,Postgrey会如何拒绝电子邮件发生临时错误。 电子邮件的技术规则要求邮件服务器再次尝试发送电子邮件。 五分钟后,postgrey将接受电子邮件。 世界各地的Legit电子邮件服务器将会重新尝试重新向我们发送电子邮件,但大多数垃圾邮件发送者不会。 所以,等待5分钟,尝试使用上面的命令再次发送电子邮件,并验证Postfix现在接受电子邮件。

之后,我们会检查一下,我们可以通过IMAP来获取我们刚刚发送的两封电子邮件:

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
4 UID fetch 1:1 (UID RFC822.SIZE FLAGS BODY.PEEK[])
5 LOGOUT

您应该使用为此电子邮件帐户设置的密码替换mypassword。 如果这样工作,我们基本上有一个功能性的电子邮件服务器,可以接收我们收到的电子邮件,并从我们的设备(PC /笔记本电脑,平板电脑,手机,...)获取这些电子邮件。 但是我们不能给我们发送电子邮件,除非我们从服务器本身发送它们。 我们现在允许Postfix转发我们的电子邮件,但只有在成功的身份验证后,才能确保电子邮件来自在服务器上具有有效帐户的人。 为此,我们将开启一个特殊的,仅限SSL的SASL认证的电子邮件提交服务。 在/etc/postfix/master.cf中设置以下参数

submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_non_fqdn_recipient,reject_unauth_destination

并重新加载Postfix

service postfix reload

现在,我们尝试从不同于服务器的机器使用此服务,以验证postfix现在将中继我们的电子邮件,没有其他人:

openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
EHLO cloud.jhausse.net

注意服务器发布的“250-AUTH PLAIN”功能,当我们连接到端口25时不会出现。

MAIL FROM:asdf@jkl.net
rcpt to:bob@gmail.com
554 5.7.1 <bob@gmail.com>: Relay access denied
QUIT

这很好,如果他不认识我们,postfix不会传递我们的电子邮件。 所以让我们先来认证一下自己。 为此,我们首先需要生成一个验证字符串:

echo -ne '\000roudy@jhausse.net\000mypassword'|base64

我们再次尝试通过服务器发送电子邮件:

openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
EHLO cloud.jhausse.net
AUTH PLAIN DGplYW5AMTk4NGNsb3VQLm5ldAA4bmFmNGNvNG5jOA==
MAIL FROM:asdf@jkl.net
rcpt to:bob@gmail.com

哪个Postfix现在应该接受。 要完成测试,我们通过发送电子邮件至postmaster@jhausse.net来验证我们的虚拟别名是否正常工作,并确保它到roudy@jhausse.net:

telnet cloud.jhausse.net 25
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:postmaster@jhausse.net
data
Subject: Virtual alias test

Dear postmaster,
Long time no hear! I hope your MX is working smoothly and securely.
Yours sincerely, Roudy
.
QUIT

让我们检查邮件一直到右边的收件箱:

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
* 2 EXISTS
* 2 RECENT
4 LOGOUT

在这一点上,我们有一个功能性的电子邮件服务器,用于传入和传出邮件。 我们可以设置我们的设备来使用它。

PS:你是否记得尝试通过端口25再次向服务器托管的帐户发送电子邮件 ,以验证您是否不再被postgrey阻止?

防止垃圾邮件到达您的INBOX

为了进行垃圾邮件过滤,我们已经有了实时黑名单(RBL)和灰名单(postgrey)。 我们现在将通过添加适应性垃圾邮件过滤功能,将垃圾邮件的攻击能力提升一倍。 这意味着我们会向我们的电子邮件服务器添加人工智能,以便从经验中学到什么是垃圾邮件,什么是垃圾邮件。 我们将使用dspam

apt-get install dspam dovecot-antispam postfix-pcre dovecot-sieve

dovecot-antispam是一个包,它允许dovecot重新训练垃圾邮件过滤器,如果我们发现由dspam错误分类的电子邮件。 基本上,我们需要做的就是将垃圾邮件/垃圾邮件文件夹中的电子邮件移出。 然后,dovecot-antispam将负责调用dspam重新进行过滤。 对于postfix-pcre和dovecot-sieve,我们将分别使用它们来传递垃圾邮件过滤器的传入邮件,并自动将垃圾邮件移动到用户的垃圾邮件/垃圾邮件文件夹。

/etc/dspam/dspam.conf中 ,将以下参数设置为这些值:

TrustedDeliveryAgent "/usr/sbin/sendmail"
UntrustedDeliveryAgent "/usr/lib/dovecot/deliver -d %u"
Tokenizer osb
IgnoreHeader X-Spam-Status
IgnoreHeader X-Spam-Scanned
IgnoreHeader X-Virus-Scanner-Result
IgnoreHeader X-Virus-Scanned
IgnoreHeader X-DKIM
IgnoreHeader DKIM-Signature
IgnoreHeader DomainKey-Signature
IgnoreHeader X-Google-Dkim-Signature
ParseToHeaders on
ChangeModeOnParse off
ChangeUserOnParse full
ServerPID               /var/run/dspam/dspam.pid
ServerDomainSocketPath  "/var/run/dspam/dspam.sock"
ClientHost      /var/run/dspam/dspam.sock

然后,在/etc/dspam/default.prefs中 ,将以下参数更改为:

spamAction=deliver         # { quarantine | tag | deliver } -> default:quarantine
signatureLocation=headers  # { message | headers } -> default:message
showFactors=on

现在我们需要通过在/etc/postfix/master.cf的末尾添加这两行来连接dspam到postfix和dovecot:

dspam     unix  -       n       n       -       10      pipe
  flags=Ru user=dspam argv=/usr/bin/dspam --deliver=innocent,spam --user $recipient -i -f $sender -- $recipient
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=mail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

现在我们将告诉postfix,通过dspam过滤每个通过端口25提交给服务器的新电子邮件(通常的SMTP流量),除非电子邮件是从服务器本身(permit_mynetworks)提交的。 请注意,我们使用SASL身份验证提交给Postfix的电子邮件不会通过dspam进行过滤,因为我们为上一节中的内容设置了单独的提交服务。 编辑/etc/postfix/main.cfsmtpd_client_restrictions更改为以下内容:

smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023, check_client_access pcre:/etc/postfix/dspam_filter_access

在文件末尾,还添加:

# For DSPAM, only scan one mail at a time
dspam_destination_recipient_limit = 1

我们现在需要指定我们定义的过滤器。 基本上,我们将告诉postfix通过unix套接字发送所有的电子邮件(/./)到dspam。 创建一个新的文件/ etc / postfix / dspam_filter_access并放入以下行:

/./   FILTER dspam:unix:/run/dspam/dspam.sock

这就是Postfix部分。 现在让我们设置dovecot进行垃圾邮件过滤。 在/etc/dovecot/conf.d/20-imap.conf中 ,编辑imap mail_plugins插件参数:

mail_plugins = $mail_plugins antispam

并为lmtp添加一个部分:

protocol lmtp {
# Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}

我们现在配置dovecot-antispam插件。 编辑/etc/dovecot/conf.d/90-plugin.conf将以下内容添加到插件部分:

plugin {
  ...
  # Antispam (DSPAM)
  antispam_backend = dspam
  antispam_allow_append_to_spam = YES
  antispam_spam = Junk;Spam
  antispam_trash = Trash;trash
  antispam_signature = X-DSPAM-Signature
  antispam_signature_missing = error
  antispam_dspam_binary = /usr/bin/dspam
  antispam_dspam_args = --user;%u;--deliver=;--source=error
  antispam_dspam_spam = --class=spam
  antispam_dspam_notspam = --class=innocent
  antispam_dspam_result_header = X-DSPAM-Result
}

并在/etc/dovecot/conf.d/90-sieve.conf中指定一个默认的筛选脚本,该脚本将适用于服务器的所有用户:

sieve_default = /etc/dovecot/default.sieve

什么是筛,为什么我们需要所有用户的默认脚本? Sieve可让我们自动化IMAP服务器上的任务。 在我们的情况下,我们不会将所有被识别为垃圾邮件的邮件都放入垃圾邮件夹而不是收件箱。 我们希望这是服务器上所有用户的默认行为; 这就是为什么我们将此脚本设置为默认脚本。 现在让我们创建一个这个脚本,通过创建一个新文件/etc/dovecot/default.sieve ,其中包含以下内容:

require ["regex", "fileinto", "imap4flags"];
# Catch mail tagged as Spam, except Spam retrained and delivered to the mailbox
if allof (header :regex "X-DSPAM-Result" "^(Spam|Virus|Bl[ao]cklisted)$",
          not header :contains "X-DSPAM-Reclassified" "Innocent") {
  # Mark as read
  # setflag "\\Seen";
  # Move into the Junk folder
  fileinto "Junk";
  # Stop processing here
  stop;
}

现在我们需要编译这个脚本,以便dovecot可以运行它。 我们还需要给予适当的权限。

cd /etc/dovecot
sievec .
chown mail.dovecot default.siev*
chmod 0640 default.sieve
chmod 0750 default.svbin

最后,我们需要修复dspam需要读取的两个postfix配置文件的权限:

chmod 0644 /etc/postfix/dynamicmaps.cf /etc/postfix/main.cf

而已! 我们重新启动dovecot和postfix

service dovecot restart
service postfix restart

并通过从远程主机(例如我们用于设置服务器的计算机)联系服务器来测试反垃圾邮件:

openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
EHLO cloud.jhausse.net
MAIL FROM:youremail@domain.com
rcpt to:roudy@jhausse.net
DATA
Subject: DSPAM test

Hi Roudy, how'd you like to eat some ham tonight? Yours, J
.
QUIT

我们检查邮件是否到达:

openssl s_client -crlf -connect cloud.jhausse.net:993
1 login roudy@jhausse.net "mypassword"
2 LIST "" "*"
3 SELECT INBOX
4 UID fetch 3:3 (UID RFC822.SIZE FLAGS BODY.PEEK[])

哪些应该返回一些电子邮件与由SPAM设置的标志集合,如下所示:

X-DSPAM-Result: Innocent
X-DSPAM-Processed: Sun Oct  5 16:25:48 2014
X-DSPAM-Confidence: 1.0000
X-DSPAM-Probability: 0.0023
X-DSPAM-Signature: 5431710c178911166011737
X-DSPAM-Factors: 27,
	Received*Postfix+with, 0.40000,
	Received*with+#+id, 0.40000,
	like+#+#+#+ham, 0.40000,
	some+#+tonight, 0.40000,
	Received*certificate+requested, 0.40000,
	Received*client+certificate, 0.40000,
	Received*for+roudy, 0.40000,
	Received*Sun+#+#+#+16, 0.40000,
	Received*Sun+#+Oct, 0.40000,
	Received*roudy+#+#+#+Oct, 0.40000,
	eat+some, 0.40000,
	Received*5+#+#+16, 0.40000,
	Received*cloud.jhausse.net+#+#+#+id, 0.40000,
	Roudy+#+#+#+to, 0.40000,
	Received*Oct+#+16, 0.40000,
	to+#+#+ham, 0.40000,
	Received*No+#+#+requested, 0.40000,
	Received*jhausse.net+#+#+Oct, 0.40000,
	Received*256+256, 0.40000,
	like+#+#+some, 0.40000,
	Received*ESMTPS+id, 0.40000,
	how'd+#+#+to, 0.40000,
	tonight+Yours, 0.40000,
	Received*with+cipher, 0.40000
5 LOGOUT

好! 您现在已经为服务器的用户设置了自适应垃圾邮件过滤功能。 当然,每个用户将需要在头几个星期内训练过滤器。 要将邮件列为垃圾邮件,请使用您的任何设备(PC,平板电脑,手机)将其移动到名为“垃圾邮件”或“垃圾邮件”的文件夹。 否则将训练为火腿。

确保您发送的电子邮件通过垃圾邮件过滤器

我们在本节中的目标是使我们的邮件服务器尽可能地清晰地显示在世界上,并使垃圾邮件发送者更难以我们的名字发送电子邮件。 作为副作用,这将有助于我们通过其他邮件服务器的垃圾邮件过滤器获取电子邮件。

发件人政策框架

发件人策略框架(SPF)是一个记录,您添加到您的区域,声明整个互联网上的哪些邮件服务器可以发送您的域名的电子邮件。 设置它非常容易,使用microsoft.com上的SPF向导生成您的SPF记录,然后将其作为TXT记录添加到您的区域。 它将如下所示:

jhausse.net.	300 IN	TXT	v=spf1 mx mx:cloud.jhausse.net -all

反向PTR

我们在本文前面讨论了这一点,最好为您的服务器正确设置反向DNS,以便在服务器的IP地址上进行反向查找返回服务器的实际名称。

OpenDKIM

当我们激活OpenDKIM时,postfix将使用加密密钥对每个传出的电子邮件进行签名。 然后我们将该密钥存入我们的区域,在DNS上。 这样一来,世界上的每个邮件服务器就可以验证邮件是否真的来自我们,或者是垃圾邮件发送者伪造的。 我们来安装opendkim:

apt-get install opendkim opendkim-tools

并通过编辑/etc/opendkim.conf来设置它,使其看起来像这样:

##
## opendkim.conf -- configuration file for OpenDKIM filter
##
Canonicalization        relaxed/relaxed
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
LogWhy                  Yes
MinimumKeyBits          1024
Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SigningTable            refile:/etc/opendkim/SigningTable
Socket                  inet:8891@localhost
Syslog                  Yes
SyslogSuccess           Yes
TemporaryDirectory      /var/tmp
UMask                   022
UserID                  opendkim:opendkim

我们需要几个我们将在/ etc / opendkim中存储的其他文件:

mkdir -pv /etc/opendkim/
cd /etc/opendkim/

我们创建一个新的文件/ etc / opendkim / TrustedHosts ,具有以下内容

127.0.0.1

和一个名为/ etc / opendkim / KeyTable的新文件,具有以下内容

cloudkey jhausse.net:mail:/etc/opendkim/mail.private

这告诉OpenDKIM,我们要使用名为“cloudkey”的加密密钥,其内容可以在/etc/opendkim/mail.private中找到。 我们将创建另一个名为/ etc / opendkim / SigningTable的文件 ,并添加以下行:

*@jhausse.net cloudkey

这告诉OpenDKIM,jhausse.net域的每个电子邮件应该使用密钥“cloudkey”进行签名。 如果我们有其他要签署的域名,我们也可以在这里加入。

下一步是生成该密钥并修复OpenDKIM的配置文件的权限。

opendkim-genkey -r -s mail [-t]
chown -Rv opendkim:opendkim /etc/opendkim
chmod 0600 /etc/opendkim/*
chmod 0700 /etc/opendkim

首先,最好使用-t将向您正在测试模式的其他邮件服务器发出信号,并且不应该根据您的OpenDKIM签名丢弃电子邮件。 您可以从mail.txt文件获取您的OpenDKIM密钥:

cat mail.txt

然后将其添加到您的区域文件作为TXT记录,应该是这样的

mail._domainkey.cloud1984.net.	300	IN TXT	v=DKIM1; k=rsa; p=MIGfMA0GCSqG...

最后,我们需要告诉postfix签署外发电子邮件。 在/etc/postfix/main.cf的末尾添加:

# Now for OpenDKIM: we'll sign all outgoing emails
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

并重新加载相应的服务

service postfix reload
service opendkim restart

现在我们来测试一下OpenDKIM公钥是否可以找到并匹配私钥:

opendkim-testkey -d jhausse.net -s mail -k mail.private -vvv

应该返回

opendkim-testkey: key OK

为此,您可能需要稍等一下,直到Nameservers重新加载该区域(在Linode上,每15分钟发生一次)。 您可以使用dig来检查该区域是否已重新加载。

如果这样,我们来测试其他服务器是否可以验证我们的OpenDKIM签名和SPF记录。 为此,我们可以使用Brandon Checkett的电子邮件测试 。 要发送电子邮件到布兰登网页上给我们的测试地址,我们可以在服务器上运行以下命令

mail -s CloudCheck ihAdmTBmUH@www.brandonchecketts.com

在Brandon的网页上,您应该在“DKIM签名”部分中看到result = pass结果:传入 “SPF信息”部分。 如果我们的电子邮件通过此测试,只需重新生成不带-t开关的OpenDKIM密钥,将新密钥上传到区域文件,如果仍然通过测试,则重新测试。 如果是这样,恭喜! 您刚刚在您的服务器上成功设置了OpenDKIM和SPF!

主持人日历,联系人,拥有Owncloud的文件,并与Roundcube建立一个网络邮件

现在我们有一个顶级的电子邮件服务器,让我们可以将您的联系人,日历和文件存储在云中。 这些是Owncloud提供开箱即用的服务。 在我们这样做的时候,我们也会设置一个网络邮件,所以你可以检查电子邮件,即使你没有电子产品旅行,或者如果你的手机和笔记本电脑耗尽电池。

这里安装Owncloud是一个很好的例子。 在Debian上,它归结为将owncloud存储库添加到您的apt源,下载owncloud的发行版密钥并将其添加到您的apt密钥环,然后使用apt-get安装owncloud本身:

echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /' >> /etc/apt/sources.list.d/owncloud.list
wget http://download.opensuse.org/repositories/isv:ownCloud:community/Debian_6.0/Release.key
apt-key add - < Release.key 
apt-get update
apt-get install apache2 owncloud roundcube

当提示它时,选择dbconfig ,然后说你想要圆形立方体使用mysql 。 然后,提供mysql root密码,并为roundcube mysql用户设置好的密码。 然后,编辑roundcube配置文件/etc/roundcube/main.inc.php ,以便登录roundcube将默认使用您的IMAP服务器:

$rcmail_config['default_host'] = 'ssl://localhost';
$rcmail_config['default_port'] = 993;

现在我们将使用SSL设置apache2网络服务器,以便我们可以使用加密密码和数据与Owncloud和Roundcube聊天。 我们来打开Apache的ssl模块:

a2enmod ssl

并编辑/etc/apache2/ports.conf来设置以下参数:

NameVirtualHost *:80
Listen 80
ServerName www.jhausse.net

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

我们将在/ var / www下https://www.jhausse.net设置一个默认网站,以加密连接到网络服务器。 编辑/ etc / apache2 / sites-available / default-ssl

<VirtualHost _default_:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        ServerName www.jhausse.net
        [...]
        <Directory /var/www/owncloud>
          Deny from all
        </Directory>
        [...]
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key
        [...]
</VirtualHost>

并且我们还在/ var / www下设置了一个与http://www.jhausse.net的未加密连接的网站 。 编辑/ etc / apache2 / sites-available / default

<VirtualHost _default_:443>
        DocumentRoot /var/www
        ServerName www.jhausse.net
        [...]
        <Directory /var/www/owncloud>
          Deny from all
        </Directory>
</VirtualHost>

这样,我们可以通过将它们放在/ var / www中来为www.jhausse.net提供页面。 “拒绝所有”指令阻止通过www.jhausse.net访问Owncloud:我们将设置它通过https://cloud.jhausse.net访问它。

我们现在将设置网络邮件(圆形立方体),以便通过https://webmail.jhausse.net访问。 编辑/ etc / apache2 / sites-available / roundcube具有以下内容:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/lib/roundcube
	# The host name under which you'd like to access the webmail
        ServerName webmail.jhausse.net
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        # do not allow unsecured connections
        # SSLRequireSSL
        SSLCipherSuite HIGH:MEDIUM

        #   A self-signed (snakeoil) certificate can be created by installing
        #   the ssl-cert package. See
        #   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
        #   If both key and certificate are stored in the same file, only the
        #   SSLCertificateFile directive is needed.
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key

        # Those aliases do not work properly with several hosts on your apache server
        # Uncomment them to use it or adapt them to your configuration
        Alias /program/js/tiny_mce/ /usr/share/tinymce/www/

        # Access to tinymce files
        <Directory "/usr/share/tinymce/www/">
                Options Indexes MultiViews FollowSymLinks
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        <Directory /var/lib/roundcube/>
                Options +FollowSymLinks
                # This is needed to parse /var/lib/roundcube/.htaccess. See its
                # content before setting AllowOverride to None.
                AllowOverride All
                order allow,deny
                allow from all
        </Directory>

        # Protecting basic directories:
        <Directory /var/lib/roundcube/config>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/lib/roundcube/temp>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        <Directory /var/lib/roundcube/logs>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
        #   SSL Protocol Adjustments:
        #   The safe and default but still SSL/TLS standard compliant shutdown
        #   approach is that mod_ssl sends the close notify alert but doesn't wait for
        #   the close notify alert from client. When you need a different shutdown
        #   approach you can use one of the following variables:
        #   o ssl-unclean-shutdown:
        #     This forces an unclean shutdown when the connection is closed, i.e. no
        #     SSL close notify alert is send or allowed to received.  This violates
        #     the SSL/TLS standard but is needed for some brain-dead browsers. Use
        #     this when you receive I/O errors because of the standard approach where
        #     mod_ssl sends the close notify alert.
        #   o ssl-accurate-shutdown:
        #     This forces an accurate shutdown when the connection is closed, i.e. a
        #     SSL close notify alert is send and mod_ssl waits for the close notify
        #     alert of the client. This is 100% SSL/TLS standard compliant, but in
        #     practice often causes hanging connections with brain-dead browsers. Use
        #     this only for browsers where you know that their SSL implementation
        #     works correctly.
        #   Notice: Most problems of broken clients are also related to the HTTP
        #   keep-alive facility, so you usually additionally want to disable
        #   keep-alive for those clients, too. Use variable "nokeepalive" for this.
        #   Similarly, one has to force some clients to use HTTP/1.0 to workaround
        #   their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
        #   "force-response-1.0" for this.
        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

并在DNS中声明服务器,例如:

webmail.jhausse.net.	300	IN	CNAME	cloud.jhausse.net.

现在让我们启用这三个网站

a2ensite default default-ssl roundcube
service apache2 restart

而基于https://webmail.jhausse.net的网页邮件基本可以正常工作。 使用完整的电子邮件(例如roudy@jhausse.net)和在本文开头的mailserver DB中设置的密码登录。 您第一次连接时,浏览器将会向您发出警告,证书未由证书颁发机构签署。 没关系,只是添加一个例外。

最后但并非最不重要的是,我们将通过将以下内容放在/ etc / apache2 / sites-available / owncloud中来为owncloud创建一个虚拟主机:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/owncloud
        ServerName cloud.jhausse.net
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/owncloud>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

        #   SSL Engine Switch:
        #   Enable/Disable SSL for this virtual host.
        SSLEngine on

        # do not allow unsecured connections
        # SSLRequireSSL
        SSLCipherSuite HIGH:MEDIUM
        SSLCertificateFile    /etc/ssl/certs/cloud.crt
        SSLCertificateKeyFile /etc/ssl/private/cloud.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>

并通过运行激活owncloud

a2ensite owncloud
service apache2 reload

然后通过在Web浏览器中连接到https://cloud.jhausse.net/进行配置owncloud。

而已! 现在,您拥有自己的Google云端硬盘,日历,联系人,Dropbox和Gmail! 享受您刚刚恢复的隐私! :-)

将您的设备同步到云端

要同步您的电子邮件,您只需使用您最喜爱的电子邮件客户端:Android或iOS上的标准电子邮件程序, k9mail或电脑上的Thunderbird。 或者你也可以使用我们设置的webmail。

如何将日历和联系人与云进行同步,这在自己的文档中有所描述。 在Android上,我正在使用CalDAV同步和CardDAV同步应用程序,作为Android日历和手机的联系人应用程序和owncloud服务器之间的桥梁。

对于文件,有一个名为Owncloud的Android应用程序可以从您的手机访问您的文件,并自动将您拍摄的图片和视频上传到云端。 在OwnCloud文档中很容易地描述访问Mac / PC上的文件。

最后的提示

在头几个星期,最好每天监控/ var / log / syslog/var/log/mail.log ,并确保一切顺利运行。 在邀请其他人(朋友,家人,...)在您的服务器上托管之前,请务必这样做 您可能会放弃对自我托管的信任,如果他们信任您的数据,并且服务器完全不可用。

要添加另一个电子邮件用户,只需向mailserver DB的virtual_users表添加一行。

要添加域,只需将一行添加到virtual_domains表。 然后更新/ etc / opendkim / SigningTable以发送签名的电子邮件,将OpenDKIM密钥上传到该区域,然后重新加载OpenDKIM。

Owncloud拥有自己的用户数据库,可以通过以管理员身份登录Owncloud进行管理。

最后,如果您的服务器暂时不可用,请务必考虑一下解决方案。 例如,您的邮件将在哪里,直到您的服务器返回? 一个解决方案是找到一个可以充当您的备份MX的朋友,同时充当其备份MX(请参阅Postfix的main.cf文件中的relay_domainsrelay_recipient_maps设置)。 同样,如果您的服务器遭到入侵,恶意的个人会将所有文件擦除,该怎么办? 为此,重要的是要考虑一个常规的备份系统。 Linode提供备份作为选项。 在1984年,我设置了一个基本但足够的自动备份系统,使用crontabs和scp。