分享

国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(2)

howtodown 发表于 2015-3-30 21:46:54 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 19395
本帖最后由 nettman 于 2015-4-3 22:03 编辑
导读
发现很多人都是被迫的生活,我们从来不谈及爱好,同时也存在很多伪爱好,当然我也是其中一个爱好者,经常强迫自己学习一些知识,就如同满满的麻袋,硬生生里面塞东西,但是却塞不了多少。

真正的爱好者,在见到新知识、新思想会兴奋。既然是做技术,肯定是有所擅长,如何挖掘、培养自己的爱好,那么需要必须不断的刨析自己。
下面同样一位国外爱好者,所搭建的私有云。





接上篇
构建个人私有云,保护数据隐私的控制权(1)


这篇文章是受之前工作的启发并以之为基础
本文很大程度参考了两篇文章,由Xavier ClaudeDrew Crawford写的关于架设私有邮件服务器的介绍。
本文覆盖了Xavier和Drew的文章里所描述的所有功能,除了3个地方Drew有而我没有:邮件推送支持(我喜欢由我主动检查邮件,而其他时候都不会被打扰),邮件全文检索(我一直都没用过),以及使用加密方式存储邮件(我的邮件和数据还没那么重要到要把它们加密后再存到本地服务器上)。如果你需要这些功能,只需要按照Drew的文章里相应部分的说明做就好了,和本文的内容兼容。
和Xavier和Drew的成果比起来,本文有下面几个主要改进:
  • 根据我自己按Drew文章操作的经验以及原文的大量回复,修改了一些问题和文字错误。我也把本文所介绍的内容仔细检查了几遍,从头开始设定了几次服务器做重复验证以确保能正常工作。
  • 低维护:和Xavier的方式比起来,本文增加了在服务器上支持多个邮件域名。这样做是为了尽可能地减少服务器维护工作:基本上,要添加一个域名或用户,只需要往mysql数据库表里增加一行就好了(不需要增加过滤脚本,等等)。
  • 我增加了webmail。
  • 我增加了设定云服务器的部分,不仅能收发邮件还能管理文件,地址本/联系人(邮件地址,电话号码,生日,等等等),日程表和图片,供所有设备访问使用。

申请一个虚拟私人服务器,一个域名,并把它们配置好
让我们从设置基础设施开始:我们的虚拟私人主机和我们的域名。
我用过1984.isLinode提供的虚拟私人主机(VPS),体验非常好。在本文中,我们将使用Debian Wheezy,这个在1984和Linode都提供了已经做好的映像文件可以直接布置到你的VPS上。我喜欢1984是因为它的服务器在冰岛,也是唯一使用可再生能源(地热和水力发电)的地方,目前还没有影响过气候变化,不像大多数美国数据中心目前大多数依赖于烧煤的火力发电站。而且,他们注重民权,透明,自由以及免费软件
最好是在服务器上创建一个文件用来保存后面要用到的各种密码(用户账号、邮件账号、云帐号、数据库帐号)。当然最好是加密一下(可以用GnuPG),这样就算用来设定服务器的电脑被偷了或被入侵了,你的服务器就不会那么容易被攻击。
关于注册域名,我已经使用grandi的服务超过10年了,也很满意。在本文中,我们将开辟一个叫jhausse.net的域名。然后在上面增加一个叫cloud.jhausse.net的二级域名,并绑定MX纪录。在完成之后,设置比较短的纪录生存时间(TTL)比如300秒,这样你在设置服务器的时候,可以修改你的域并很快测试到结果。

最后,设置PTR纪录(反向DNS),这样IP地址可以反向映射回它的域名。如果你不理解前面这句话,看下这篇文章来获得相关背景知识。如果你使用Linode的服务,你可以在远程访问这一栏的控制面板里设置PTR纪录。如果是1984,联系一下技术支持来帮你搞定。
在服务器上,我们从添加一个普通用户开始,这样我们不用从头到尾一直用root账号。另外,用root登陆也需要额外多一层安全措施。
  1. adduser roudy
复制代码
然后,在文件/etc/ssh/sshd_config中设置:
  1. ermitRootLogin no
复制代码
然后重启ssh服务:
  1. service ssh reload
复制代码
然后,我们要修改服务器的主机名。编辑文件/etc/hostname,只有一行就是自己的主机名,我们这个例子中是:
  1. cloud
复制代码
然后,编辑ssh服务的公钥文件/etc/ssh/ssh_host_rsa_key.pub, /etc/ssh/ssh_host_dsa_key.pub, /etc/ssh/ssh_host_ecdsa_key.pub,这样文件末尾可以反映你的主机名,比如root@cloud。然后重启系统保证主机名在系统的每个需要它的角落都生效了。
  1. reboot
复制代码
我们将更新系统并移除不必要的服务以降低远程攻击的风险。

  1. apt-get update
  2. apt-get dist-upgrade
  3. service exim4 stop
  4. apt-get remove exim4 rpcbind
  5. apt-get autoremove
  6. apt-get install vim
复制代码
我喜欢使用vim远程编辑配置文件。打开vim 的自动语法高亮会很有帮助。添加下面这一行到~/.vimrc文件中。
  1. syn on
复制代码



设置postfix和dovecot来收发电子邮件

postfix

  1. apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-mysql mysql-server dovecot-lmtpd postgrey
复制代码


在Postfix的配置菜单里,选择Internet Site,设置这个系统的邮件名称为jhausse.net。

现在开始添加一个数据库用于保存主机上管理的域名列表,和每个域名下的用户列表(同时也包括他们各自的密码),以及邮件别名列表(用于从一个地址往另一个地址转发邮件)。


  1. mysqladmin -p create mailserver
  2. mysql -p mailserver
  3. mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailuserpass';
  4. mysql> FLUSH PRIVILEGES;
  5. mysql> CREATE TABLE `virtual_domains` (
  6.   `id` int(11) NOT NULL auto_increment,
  7.   `name` varchar(50) NOT NULL,
  8.   PRIMARY KEY (`id`)
  9.   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  10. mysql> CREATE TABLE `virtual_users` (
  11.   `id` int(11) NOT NULL auto_increment,
  12.   `domain_id` int(11) NOT NULL,
  13.   `password` varchar(106) NOT NULL,
  14.   `email` varchar(100) NOT NULL,
  15.   PRIMARY KEY (`id`),
  16.   UNIQUE KEY `email` (`email`),
  17.   FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  18.   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  19. mysql> CREATE TABLE `virtual_aliases` (
  20.   `id` int(11) NOT NULL auto_increment,
  21.   `domain_id` int(11) NOT NULL,
  22.   `source` varchar(100) NOT NULL,
  23.   `destination` varchar(100) NOT NULL,
  24.   PRIMARY KEY (`id`),
  25.   FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  26.   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
这里我们为jhausse.net域名提供邮件服务。如果还需要加入其他域名,也没问题。我们也会为每个域名设置一个邮件管理地址(postmaster),转寄给roudy@jhausse.net

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


现在已经添加了一个本地邮件账号roudy@jhausse.net。首先,为它生成一个密码的哈希串:
  1. doveadm pw -s SHA512-CRYPT
复制代码
然后把哈希值加入到数据库中:

  1. mysql> INSERT INTO `mailserver`.`virtual_users` (`domain_id`, `password`, `email`) VALUES ('1', '$6$YOURPASSWORDHASH', 'roudy@jhausse.net');
复制代码
现在我们的域名、别名和用户列表都设置好了,然后开始设置postfix(这是一个SMTP服务器,用来发送邮件)。把文件/etc/postfix/main.cf替换为下面的内容:
  1. myhostname = cloud.jhausse.net
  2. myorigin = /etc/mailname
  3. mydestination = localhost.localdomain, localhost
  4. mynetworks_style = host
  5. # We disable relaying in the general case
  6. smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
  7. # Requirements on servers that contact us: we verify the client is not a
  8. # known spammer (reject_rbl_client) and use a graylist mechanism
  9. # (postgrey) to help reducing spam (check_policy_service)
  10. smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023
  11. disable_vrfy_command = yes
  12. inet_interfaces = all
  13. smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
  14. biff = no
  15. append_dot_mydomain = no
  16. readme_directory = no
  17. # TLS parameters
  18. smtpd_tls_cert_file=/etc/ssl/certs/cloud.crt
  19. smtpd_tls_key_file=/etc/ssl/private/cloud.key
  20. smtpd_use_tls=yes
  21. smtpd_tls_auth_only = yes
  22. smtp_tls_security_level=may
  23. smtp_tls_loglevel = 1
  24. smtpd_tls_loglevel = 1
  25. smtpd_tls_received_header = yes
  26. smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  27. smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  28. # Delivery
  29. alias_maps = hash:/etc/aliases
  30. alias_database = hash:/etc/aliases
  31. message_size_limit = 50000000
  32. recipient_delimiter = +
  33. # The next lines are useful to set up a backup MX for myfriendsdomain.org
  34. # relay_domains = myfriendsdomain.org
  35. # relay_recipient_maps =
  36. # Virtual domains
  37. virtual_transport = lmtp:unix:private/dovecot-lmtp
  38. virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  39. virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  40. virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  41. local_recipient_maps = $virtual_mailbox_maps
复制代码
现在我们要让postfix知道如何从我们设定的数据库里找出需要接收邮件的域名。建立一个新文件/etc/postfix/mysql-virtual-mailbox-domains.cf并添加以下内容:

  1. user = mailuser
  2. password = mailuserpass
  3. hosts = 127.0.0.1
  4. dbname = mailserver
  5. query = SELECT 1 FROM virtual_domains WHERE name='%s'
复制代码


我们可以让postfix判断给定的电子邮件账号是否存在,创建文件/etc/postfix/mysql-virtual-mailbox-maps.cf并写入以下内容:
  1. user = mailuser
  2. password = mailuserpass
  3. hosts = 127.0.0.1
  4. dbname = mailserver
  5. query = SELECT 1 FROM virtual_users WHERE email='%s'
复制代码


最后,postfix会根据文件/etc/postfix/mysql-virtual-alias-maps.cf的内容来查找邮件别名
  1. user = mailuser
  2. password = mailuserpass
  3. hosts = 127.0.0.1
  4. dbname = mailserver
  5. 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命令测试:

  1. postmap -q jhausse.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  2. postmap -q [email]roudy@jhausse.net[/email] mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  3. postmap -q [email]postmaster@jhausse.net[/email] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  4. postmap -q [email]bob@jhausse.net[/email] mysql:/etc/postfix/mysql-virtual-alias-maps.cf
复制代码
如果一切都正常配置了的话,头两个查询应该输出1,第3个查询应该输出roudy@jhausse.net,而最后一个应该什么都不输出。



dovecot


现在,让我们设置一下dovecot(一个IMAP服务程序,用来在我们的设备上从服务器获取收到的邮件)。编辑文件/etc/dovecot/dovecot.conf设置以下参数:
  1. # Enable installed protocol
  2. # !include_try /usr/share/dovecot/protocols.d/*.protocol
  3. protocols = imap lmtp
复制代码
这样将只打开imap(让我们可以获取邮件)和lmtp(postfix用来将收件箱里的邮件转给dovecot)。编辑/etc/dovecot/conf.d/10-mail.conf并设置以下参数:
  1. mail_location = maildir:/var/mail/%d/%n
  2. [...]
  3. mail_privileged_group = mail
  4. [...]
  5. first_valid_uid = 0
复制代码
这样邮件将被保存到目录 /var/mail/domainname/username 下。注意下这几个选项散布在配置文件的不同位置,有时已经在那里写好了:我们只需要取消注释即可。文件里的其他设定选项,可以维持原样。在本文后面还有很多文件需要用同样的方式更新设置。在文件/etc/dovecot/conf.d/10-auth.conf里,设置以下参数:
  1. disable_plaintext_auth = yes
  2. auth_mechanisms = plain
  3. #!include auth-system.conf.ext
  4. !include auth-sql.conf.ext
复制代码
在文件/etc/dovecot/conf.d/auth-sql.conf.ext里,设置以下参数:
  1. passdb {
  2.   driver = sql
  3.   args = /etc/dovecot/dovecot-sql.conf.ext
  4. }
  5. userdb {
  6.   driver = static
  7.   args = uid=mail gid=mail home=/var/mail/%d/%n
  8. }
复制代码


这是告诉dovecot用户的邮件保存在目录/var/mail/domainname/username下,以及如何从我们刚建立的数据库里查找密码。现在我们还需要告诉dovecot具体如何使用数据库。这样需要把下面的内容加入/etc/dovecot/dovecot-sql.conf.ext文件:

  1. driver = mysql
  2. connect = host=localhost dbname=mailserver user=mailuser password=mailuserpass
  3. default_pass_scheme = SHA512-CRYPT
  4. password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
复制代码


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

  1. chown -R mail:dovecot /etc/dovecot
  2. chmod -R o-rwx /etc/dovecot
复制代码
基本差不多了!只是还需要再多编辑几个文件。在文件/etc/dovecot/conf.d/10-master.conf里,设置以下参数:

  1. service imap-login {
  2.   inet_listener imap {
  3.     #port = 143
  4.     port = 0
  5.   }
  6.   inet_listener imaps {
  7.     port = 993
  8.     ssl = yes
  9.   }
  10. }
  11. service pop3-login {
  12. inet_listener pop3 {
  13.     #port = 110
  14.     port = 0
  15.   }
  16.   inet_listener pop3s {
  17.     #port = 995
  18.     #ssl = yes
  19.     port = 0
  20.   }
  21. }
  22. service lmtp {
  23.   unix_listener /var/spool/postfix/private/dovecot-lmtp {
  24.     mode = 0666
  25.     group = postfix
  26.     user = postfix
  27.   }
  28.   user = mail
  29. }
  30. service auth {
  31.   unix_listener auth-userdb {
  32.     mode = 0600
  33.     user = mail
  34.     #group =
  35.   }
  36.   # Postfix smtp-auth
  37.   unix_listener /var/spool/postfix/private/auth {
  38.     mode = 0666
  39.     user = postfix
  40.     group = postfix
  41.   }
  42.   # Auth process is run as this user.
  43.   #user = $default_internal_user
  44.   user = dovecot
  45. }
  46. service auth-worker {
  47.   user = mail
  48. }
复制代码


注意下我们把除了imaps之外所有服务的端口都设置成了0,这样可以有效地禁止这些服务。然后,在文件/etc/dovecot/conf.d/15-lda.conf里,指定一个邮箱管理地址:
  1. postmaster_address = [email]postmaster@jhausse.net[/email]
复制代码


最后但很重要的一点,我们为服务器需要生成一对公钥和私钥,可以同时用于dovecot和postfix:

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


请确保你指定了服务器的完全限定域名(FQDN),在本文的例子里:
  1. Common Name (e.g. server FQDN or YOUR name) []:cloud.jhausse.net
复制代码
如果没有的话,我们的客户端会抱怨在SSL证书里的服务器名字和所连接的服务器名字不一致。我们将通过修改配置文件/etc/dovecot/conf.d/10-ssl.conf里的如下选项来告诉dovecot使用刚生成的密钥:
  1. ssl = required
  2. ssl_cert = </etc/ssl/certs/cloud.crt
  3. ssl_key = </etc/ssl/private/cloud.key
复制代码






相关内容:

国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(1)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(2)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(3)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(4)











没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条