如何在CentOS7上使用Diaspora运行开源分布式社交网络

来自菜鸟教程
跳转至:导航、​搜索

介绍

Diaspora 是一个开源的分布式社交网络。

它与大多数其他社交网络不同,因为它是去中心化的——一个没有中央基础的真正网络。 世界各地都有服务器(称为 pods),每个服务器都包含选择注册的用户的数据。 这些 pod 彼此无缝通信,因此您可以在任何 pod 上注册并与您的联系人自由通信,无论他们在网络上的何处。 您可以在 Diaspora 的 关于页面 上阅读更多信息。

在本教程中,我们将设置和配置 Diaspora pod。 除其他外,您将学习:

  • 如何为生产设置 Rails 应用程序 (Diaspora)
  • 如何使用 Diaspora 配置 MariaDB
  • 如何将 Nginx 设置为 Diaspora 的反向代理服务器
  • Nginx SSL 配置的最佳实践
  • 如何编写自定义 systemd 单元文件以在 Rails 应用程序中使用
  • 对于有安全意识的人,有一个奖励部分是关于如何配置 SELinux 以与 Diaspora 配合使用

与官方 Diaspora 安装指南的偏差

Diaspora wiki 安装指南建议我们使用 Ruby 版本管理器。 虽然您可以这样做,但我们将改用系统打包的 Ruby。 这样我们就可以避免从源代码安装 Ruby 并担心 RVM 等其他依赖项。

官方指南还建议使用 script/server,一个启动 unicornsidekiq 的脚本,这是我们 Diaspora 需要的两个应用程序。 由于 CentOS 7 使用 systemd,我们将为这些服务编写自己的 init 文件。

先决条件

请在开始本教程之前完成这些先决条件。

  • 带有 1 GB RAM 的 CentOS 7

    小型社区所需的最低 RAM 为 1 GB,因此我们将使用 1 GB / 1 CPU Droplet。

  • 须藤用户

    下面的大多数命令都需要 root 权限。 查看 如何添加用户 指南以添加您的用户并为其赋予 sudo 权限。 此用户帐户将是我们稍后将创建的 diaspora 用户帐户的补充,Diaspora 的服务将以更有限的权限运行。

  • SSL证书

    尽管 Diaspora 可以在没有 SSL 证书的情况下运行,但 Diaspora 连接到其他 pod 的机制需要有效的 SSL 证书。 对于生产,您应该拥有 付费 SSL 证书。 我们只需要本文中创建的两个证书文件(公共的、私有的),因此您可以跳过该教程的 Web 服务器配置部分。 我们会自己做。

    或者,出于测试目的,您可以生成自签名证书。 有关详细信息,请参阅 本教程 ,或者只需从您的主目录运行此命令:

    openssl req \
       -newkey rsa:2048 -nodes -keyout ssl.key \
       -x509 -days 365 -out ssl.crt
  • 注册的域名指向你的 Droplet 的 IP

  • 交换文件

    对于 1 GB 的服务器,至少需要 1 GB 的交换文件。 按照 Add swap on CentOS 7 教程进行设置。

  • 按照 使用 CentOS 7 的初始服务器设置指南

  • 按照 新 CentOS 7 服务器的额外推荐步骤 指南

第 1 步 — 安装实用程序

让我们为以后派上用场的实用程序安装几个包:

sudo yum install deltarpm yum-cron vim

然后更新我们的系统:

sudo yum update

第 2 步 — 启用 EPEL 存储库

EPEL 代表企业 Linux 的额外软件包,它有一些我们需要安装的软件包,它们不属于基本 CentOS 存储库的一部分。

让我们通过安装 epel-release 包并检查任何包更新来启用它:

sudo yum install epel-release
sudo yum update

如果您被要求导入如下所示的 EPEL 7 gpg 密钥,请回答是:

Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
Importing GPG key 0x352C64E5:
  Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
  Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
  Package    : epel-release-7-5.noarch (@extras)
  From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
  Is this ok [y/N]: y

第 3 步 — 为 Ruby 和 C 安装软件包

Diaspora 及其具有本机 C 扩展的 gem 需要以下软件包。

安装软件包:

sudo yum install git ruby ruby-devel libxslt-devel libxml2-devel gcc gcc-c++ automake net-tools libcurl-devel libffi-devel make redis nodejs ImageMagick-devel

Redis 是 Diaspora 用作其数据库的开源键值数据存储。 现在已经安装了 Redis,让我们将其配置为在启动时启用,并启动服务:

sudo systemctl enable redis
sudo systemctl start redis

第 4 步 — 添加专门的侨民用户

创建一个用户帐户来运行 Diaspora。 您可以随意命名此帐户,但本教程将假定此用户名为 diaspora

sudo useradd diaspora

第 5 步 — 配置防火墙

在设置生产环境时,配置和收紧防火墙非常重要。 我们将使用的工具是 firewalld,与纯 iptables 命令相比,它简化了一些事情。

首先,启动 firewalld 服务并使其在启动时启动:

sudo systemctl start firewalld
sudo systemctl enable firewalld

现在我们将允许端口 22 上的 ssh、端口 80 上的 http、端口 443 上的 httpssmtp 在端口 25 上。 作为您的 sudo 用户,添加以下服务:

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=smtp

重新加载防火墙规则:

sudo firewall-cmd --reload

有关使用 firewalld 的更多信息,请阅读 新 CentOS 7 服务器的附加推荐步骤 教程。

第 6 步 — 安装和保护 MariaDB

下一个重要步骤是为 Diaspora 建立一个数据库。 在本教程中,我们将使用 MariaDB,尽管我们将在整个教程中包含一些关于 PostgreSQL 的花絮。

安装所需的软件包:

sudo yum install mariadb-server mariadb-devel

确保 MariaDB 在启动时启动并启用:

sudo systemctl start mariadb
sudo systemctl enable mariadb

通过运行以下命令来保护 MariaDB 安装:

sudo mysql_secure_installation

red 文本中回答如下所示的问题,并在出现提示时添加强根密码:

Enter current password for root (enter for none): ENTER
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

第 7 步 — 创建 Diaspora 用户和数据库

接下来我们将登录 MariaDB 以创建 diaspora 用户。 出现提示时,输入您在上面创建的 root 密码:

mysql -u root -p

为 Diaspora 创建一个用户。 将以下命令中的 password 更改为真实密码。 这不应与您在 mysql_secure_installation 期间提供的 root 密码相同。

CREATE USER 'diaspora'@'localhost' IDENTIFIED BY 'password';

创建 Diaspora 生产数据库:

CREATE DATABASE IF NOT EXISTS `diaspora_production` DEFAULT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_bin`;

授予 MariaDB diaspora 用户对数据库的必要权限:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `diaspora_production`.* TO 'diaspora'@'localhost';

退出数据库会话。

\q

尝试使用用户 diaspora 连接到新数据库(使用您在上面为 IDENTIFIED BY 'password' 输入的密码)。

mysql -u diaspora -p -D diaspora_production

您现在应该会看到提示:MariaDB [diaspora_production]>。 通过输入以下命令退出数据库会话:

\q

我们现在已经完成了 MariaDB 数据库的安装。

如需额外的安全性,请查看有关 如何保护 MySQL 和 MariaDB 数据库 的详细文章。

接下来,我们将获取 Diaspora 源代码并将其配置为在您的 VPS 上运行。

第 8 步 — 安装 Bundler

Bundler 是 Ruby gem 的包管理器。 我们将安装它以供全球使用。

sudo gem install bundler

由于 bundle 可执行文件安装在 /usr/local/bin/bundle 中,请创建符号链接以将其包含在用户的 PATH 中。

sudo ln -sf /usr/local/bin/bundle /usr/bin/bundle

第 9 步 — 获取 Diaspora 源代码

侨民在三个主要分支中发展。 stable 包含被认为稳定且即将发布的代码,master 具有我们将使用的稳定标记版本,而 develop 具有可能存在错误的最新代码。

更改为 diaspora 用户帐户。

sudo su - diaspora

查看主分支。 在撰写本文时,它包含 Diaspora 版本 0.5.1.1

git clone -b master https://github.com/diaspora/diaspora.git

第 10 步 — 配置散居数据库

现在切换到工作目录。

cd ~/diaspora/

复制示例数据库配置文件并使用您喜欢的编辑器打开 database.yml

cp config/database.yml.example config/database.yml
vim config/database.yml

现在我们将编辑配置文件以匹配之前创建的数据库设置。

注意: 编辑 yaml (.yml) 文件时要非常小心,不要破坏缩进。 始终使用空格而不是制表符。


编辑定义 mysql2 适配器的第一行。 (MariaDB 是 MySQL 的直接替代品。)将 root 替换为 diaspora 并将 password 更改为数据库用户 diaspora 的密码] 你之前创建的。 不要删除引号。 完成后,保存并关闭文件。

mysql: &mysql
  adapter: mysql2
  host: "localhost"
  port: 3306
  username: "diaspora"
  password: "password"
  encoding: utf8mb4
  collation: utf8mb4_bin

注意: 如果您使用该数据库,则需要填写 PostgreSQL 部分,并将数据库更改为 PostgreSQL。


第 11 步 — 配置 Diaspora 的基本设置

让我们从复制示例配置文件开始。

cp config/diaspora.yml.example config/diaspora.yml

您将需要编辑此文件中的一些设置,以使 Diaspora 正常工作。 仔细阅读整个文件,了解它的作用和方式。 这是不言自明的,但让我们看一些最关键的设置。

在文本编辑器中打开文件。

vim config/diaspora.yml

第 39 行 — 取消注释 url 行,使其如下所示:

url: "https://example.org/"

https://example.org/ 替换为您自己的域名。 您在此处使用的 URL 将被硬编码到数据库中,因此请确保其准确无误。 详情请阅读本配置行上方的注释

第 47 行 — 取消注释 certificate_authorities 行,使其如下所示:

certificate_authorities: '/etc/pki/tls/certs/ca-bundle.crt'

注:有两条certificate_authorities线; 确保取消注释 CentOS 的注释。


第 166 行 — 取消注释 rails_environment 行并将 development 替换为 production,如下所示:

rails_environment: 'production'

保存并关闭文件。

这些是拥有一个正常工作的 Diaspora pod 所需的最小更改。 还有更多选项可供您根据自己的喜好进行探索和配置,例如连接其他社交网络(Twitter、WordPress、Tumblr、Facebook)。 请通读该文件并进行所需的配置更改。

第 12 步 — 安装 Gems 并设置数据库

安装所需的 gem,设置数据库,并预编译资产。

确保您位于正确的目录中:

cd /home/diaspora/diaspora/

首先我们告诉 nokogiri gem 使用我们之前安装的系统 libxm2 库:

bundle config build.nokogiri --use-system-libraries

接下来,使用 bundler 安装所需的 gem:

RAILS_ENV=production bin/bundle install --without test development --deployment

设置数据库:

RAILS_ENV=production bin/rake db:create db:schema:load

预编译资产:

RAILS_ENV=production bin/rake assets:precompile

此时,您可以离开 diaspora 用户帐户并切换回按照本教程的先决条件创建的 sudo 用户。

exit

第 13 步 — 配置 Diaspora systemd 服务

Diaspora 包含两个需要运行的主要服务:

  • 独角兽,应用服务器
  • sidekiq,用于后台作业处理

为这种情况提供了一个脚本,它位于 script/server 中,但我们将使用 systemd 代替。 systemd 是 CentOS 7 中使用的初始化系统。

为了更好地理解 systemd 的工作原理,请阅读以下文章:

创建 tmpfiles 目录

创建将保存 unicorn Unix 套接字的目录。

sudo mkdir /run/diaspora

将所有权更改为 diaspora 用户并设置权限。

sudo chown diaspora:diaspora /run/diaspora
sudo chmod 750 /run/diaspora

由于 /run/var/run 目录是易失的,我们刚刚创建的 /run/diaspora 目录在系统重新启动后将无法生存。 使用 systemd,我们可以使用 tmpfiles 在重新启动之间保留此目录。

打开/etc/tmpfiles.d/diaspora.conf进行编辑。

sudo vim /etc/tmpfiles.d/diaspora.conf

粘贴到以下行:

/etc/tmpfiles.d/diaspora.conf

d /run/diaspora 0750 diaspora diaspora - -

配置格式为每条路径一行,分别包含类型、路径、模式、所有权、年龄和参数字段。 您可以在其 官方网页 或其手册页上了解有关 tmpfiles.d 的更多信息。

独角兽

首先,我们将编辑 diaspora.yml 以便服务侦听 Unix 套接字。 为此,我们将改回 diaspora 用户。

sudo su - diaspora

打开配置文件进行编辑:

vim /home/diaspora/diaspora/config/diaspora.yml

取消注释第 157 行,使其显示为:

/home/diaspora/diaspora/config/diaspora.yml

listen: 'unix:/run/diaspora/diaspora.sock'

保存并退出文件。

现在回到你的 sudo 用户。

su - username

创建 unicorn.service 文件。

sudo vim /etc/systemd/system/diaspora-unicorn.service

准确粘贴以下内容以创建脚本。 如果您需要帮助了解此文件中的内容,请记住查看有关 systemd 的早期链接:

/etc/systemd/system/diaspora-unicorn.service

[Unit]
Description=Diaspora Unicorn Server
Requires=redis.service
After=redis.service network.target

[Service]
User=diaspora
Group=diaspora
SyslogIdentifier=diaspora-unicorn
WorkingDirectory=/home/diaspora/diaspora
Environment=RAILS_ENV=production
## Uncomment if postgres is installed
#Environment=DB=postgres

PIDFile=/run/diaspora/unicorn.pid
Restart=always

CPUAccounting=true
emoryAccounting=true
BlockIOAccounting=true
CapabilityBoundingSet=
PrivateTmp=true
NoNewPrivileges=true

ExecStart=/usr/bin/bundle exec "unicorn_rails -c config/unicorn.rb -E production"

[Install]
WantedBy=multi-user.target

注意: 如果您使用的是 PostgreSQL,请取消注释 Environment=DB=postgres 行。 对于 MariaDB,不需要进行任何更改。


启动独角兽服务并在启动时启用它。

sudo systemctl start diaspora-unicorn
sudo systemctl enable diaspora-unicorn

现在检查服务状态:

systemctl status diaspora-unicorn

如果一切顺利,该命令应返回类似于以下内容的输出:

diaspora-unicorn.service - Diaspora Unicorn Server
Loaded: loaded (/etc/systemd/system/diaspora-unicorn.service; enabled)
Active: active (running) since Tue 2015-06-23 10:18:25 EDT; 16s ago
Main PID: 16658 (ruby)
CGroup: /system.slice/diaspora-unicorn.service
└─16658 ruby /home/diaspora/diaspora/vendor/bundle/ruby/bin/unicorn_rails -c config/unicorn.rb -E production

西德基克

sidekiq 类似,让我们创建 sidekiq.service 文件。

sudo vim /etc/systemd/system/diaspora-sidekiq.service

粘贴以下内容:

/etc/systemd/system/diaspora-sidekiq.service

[Unit]
Description=Diaspora Sidekiq Worker
Requires=redis.service
After=redis.service network.target

[Service]
User=diaspora
Group=diaspora
SyslogIdentifier=diaspora-sidekiq
WorkingDirectory=/home/diaspora/diaspora
Environment=RAILS_ENV=production
## Uncomment if postgres is installed
#Environment=DB=postgres

Restart=always

CPUAccounting=true
emoryAccounting=true
BlockIOAccounting=true
CapabilityBoundingSet=
PrivateTmp=true

ExecStart=/usr/bin/bundle exec "sidekiq -e production -L log/sidekiq.log >> log/sidekiq.log 2>&1"

[Install]
WantedBy=multi-user.target

注意: 如果您使用的是 PostgreSQL,请取消注释 Environment=DB=postgres 行。 对于 MariaDB,不需要进行任何更改。


启动 sidekiq 服务并在启动时启用它:

sudo systemctl start diaspora-sidekiq
sudo systemctl enable diaspora-sidekiq

现在运行:

systemctl status diaspora-sidekiq

输出应该与此类似:

diaspora-sidekiq.service - Diaspora Sidekiq Worker
   Loaded: loaded (/etc/systemd/system/diaspora-sidekiq.service; enabled)
   Active: active (running) since Mon 2014-12-29 08:21:45 UTC; 44s ago
 Main PID: 18123 (sh)
   CGroup: /system.slice/diaspora-sidekiq.service
           ├─18123 sh -c sidekiq -e production -L log/sidekiq.log >> log/sidekiq.log 2>&1
           └─18125 sidekiq 2.17.7 diaspora [0 of 5 busy]

第 14 步 — 安装 Nginx

Nginx 将作为我们的反向代理,因此几乎所有请求都将发送到 Unicorn。 只有 public/ 中的文件将由 Nginx 直接提供服务。

让我们首先安装 Web 服务器。

sudo yum install nginx

启动服务并在启动时启用它:

sudo systemctl start nginx
sudo systemctl enable nginx

第 15 步 — 授予 Nginx 权限

为了让 Nginx 能够访问 diaspora 用户的主文件夹,我们需要将 nginx 用户添加到 diaspora 组

sudo usermod -a -G diaspora nginx

最后,我们将放宽 diaspora 用户的主目录权限,允许对 diaspora 组的读取和执行权限:

sudo chmod 750 /home/diaspora/

第 16 步 — 上传 SSL 证书并启用前向保密

您现在需要来自您的证书颁发机构的 SSL 证书文件。 在下面的配置示例中,我们使用 /etc/ssl/diaspora/ssl.crt 作为公共证书,使用 /etc/ssl/diaspora/ssl.key 作为私钥。

创建一个目录来存储证书文件。

sudo mkdir /etc/ssl/diaspora

将证书和密钥文件上传或移动到服务器,并将它们放在我们刚刚创建的目录下。 可以使用 SFTP 或 SCP 来执行此操作; 参见本教程

注意: 如果您创建了自签名证书,请移至该目录并使用 sudo cp ssl.crt ssl.key /etc/ssl/diaspora 命令将文件复制到 /etc/ssl/diaspora


前向保密已成为 SSL/TLS 加密通信的重要组成部分。 有关前向保密的更详细说明,请参阅此 Mozilla 服务器安全 wiki 条目

再次更改为系统的 root 用户。

sudo su -

创建 dhparam.pem 文件。

openssl dhparam 2048 > /etc/ssl/dhparam.pem

dhparam 文件可能需要几分钟才能完成。 完成后,重新登录到您的 sudo 用户帐户。

su - username

第 17 步 — 禁用 nginx.conf 中的默认站点

我们现在将修改 /etc/nginx/nginx.conf 以便默认的 Welcome to Nginx 消息不会干扰我们将创建的 Diaspora 配置文件。

sudo vim /etc/nginx/nginx.conf

server 块下搜索包括 default_server; 的行。 从这些条目中删除 default_server 以便服务器块的区域如下所示:

/etc/nginx/nginx.conf

server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/share/nginx/html;

注意: 如果你愿意,你甚至可以注释掉整个 server 块; 那也行。


第 18 步 — 创建 Diaspora 自己的 Nginx 配置文件

为我们的 Diaspora pod 创建一个新的 nginx 配置文件:

sudo vim /etc/nginx/conf.d/diaspora.conf

粘贴以下内容; 代码下方给出了解释:

/etc/nginx/conf.d/diaspora.conf

upstream diaspora {
  server unix:/run/diaspora/diaspora.sock fail_timeout=0;
}
server {
  listen [::]:80;
  listen 80;
  server_name _;
  return 301 https://example.com$request_uri;
}
server {
  listen [::]:443 ssl spdy;
  listen 443 ssl spdy;
  server_name example.com;
  root /home/diaspora/diaspora/public;
  server_tokens off;
  error_log /var/log/nginx/diaspora_error.log;

  # Configure maximum picture size
  # Note that Diaspora has a client side check set at 4M
  client_max_body_size 4M;

  ## SSL settings
  ssl_certificate /etc/ssl/diaspora/ssl.crt;
  ssl_certificate_key /etc/ssl/diaspora/ssl.key;

  # https://wiki.mozilla.org/Security/Server_Side_TLS
  ssl_dhparam /etc/ssl/dhparam.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
  ssl_session_timeout 5m;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:50m;
  add_header Strict-Transport-Security "max-age=31536000";

  location / {
    # Proxy if requested file not found
    try_files $uri $uri/index.html $uri.html @diaspora;
  }

  location @diaspora {
    gzip off;
    proxy_set_header  X-Forwarded-Ssl   on;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  Host              $http_host;
    proxy_set_header  X-Frame-Options   SAMEORIGIN;
    proxy_redirect                      off;
    proxy_pass http://diaspora;
  }
}

替换以下变量:

  • example.com 用自己注册的域名; 您需要在 两个 地方执行此操作
  • /etc/ssl/diaspora/ssl.crt 带有您自己的公共证书的路径
  • /etc/ssl/diaspora/ssl.key 带有你自己的私钥的路径

解释:

  • upstream 块是我们设置 Diaspora 监听的 Unix 套接字的地方(我们之前也在 Unicorn 中设置过)。 这稍后用作 proxy_pass 指令。
  • 第一个 server 块侦听标准 HTTP 端口 80 并将任何请求重定向到 HTTPS。
  • 第二个 server 块侦听端口 443 (SSL) 并设置一些来自 Mozilla wiki 的强 SSL 参数。

有关 Nginx 服务器块的更多信息,请阅读本教程

完成所有修改后,检查配置文件是否有任何错误。

sudo nginx -t

如果一切顺利,这应该返回:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重新启动 Nginx 以应用更改。

sudo systemctl restart nginx

如果您现在在浏览器中访问 Diaspora pod 的域名(例如 https://example.com),您应该会到达 Diaspora 欢迎页面。 恭喜!

注意: 如果您使用自签名证书,请单击浏览器警告。


第 19 步 — 创建散居用户

让我们创建您的第一个 Diaspora 用户。 点击【X18X】中的链接,开始创建账号。【X51X】

填写详细信息以创建新的 Diaspora 用户。 然后,您应该能够查看用户的主页并开始使用 Diaspora 社交网络。

第 20 步 — 配置 SELinux(可选)

警告:如果你不熟悉SELinux,请注意这可能会破坏。 您可以跳过本节并开始使用 Diaspora。

CentOS 7 Droplets 默认禁用 SELinux。 为了获得最大的安全性,您可以启用 SELinux 并将其配置为与 Diaspora pod 的服务一起使用。 如果您是 SELinux 新手,可以参考以下一系列教程以获取更多信息:

启用 SELinux

在文本编辑器中打开 /etc/selinux/config

sudo vim /etc/selinux/config

SELINUX 设置从 disabled 更改为 permissive,如下所示。 有必要首先设置一个许可状态,因为系统中的每个文件都需要在 SELinux 可以强制执行之前标记其上下文。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

保存并关闭文件。

进行此更改后,重新启动 Droplet 以使设置生效。 只需键入:

sudo reboot

输入您的 sudo 用户密码以重新启动系统。 然后 SSH 回到 Droplet 并更改回您的 sudo 用户帐户:

su - username

现在,再次编辑 /etc/selinux/config 并将 SELINUX 设置为 enforcing

sudo vim /etc/selinux/config

完成后,该行应该这样说:

SELINUX=enforcing

保存并关闭文件。 再次重启Droplet。

sudo reboot

然后在 Droplet 重新联机后通过 SSH 连接到您的 Droplet。

SELinux Nginx 政策

从这里开始,您希望保留为 root 用户。 如果您现在访问您的域,您将看到 502 错误。 在我们的例子中,SELinux 正在阻止 Nginx 的套接字和访问 diaspora 用户的主目录。

您可以通过以下方式检查审核日志:

grep denied /var/log/audit/audit.log

您应该会看到如下消息:

type=AVC msg=audit(1424394514.632:385): avc:  denied  { search } for  pid=1114 comm="nginx" name="diaspora" dev="vda1" ino=783369 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:user_home_dir_t:s0 tclass=dir
type=AVC msg=audit(1424394514.632:386): avc:  denied  { write } for  pid=1114 comm="nginx" name="diaspora.sock" dev="tmpfs" ino=21382 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file

安装以下工具以开始解决问题:

yum install policycoreutils-{python,devel} setroubleshoot-server

我们将遍历 audit.log 文件并在我们的 SELinx 策略中允许 Denied 条目。 跑:

grep nginx /var/log/audit/audit.log | audit2allow -M nginx_diaspora

生成的 SELinux 策略存储在根目录 /home 中的文件 nginx_diaspora.te 中(尽管您可以在任何位置组织 SELinux 策略)。 应将二进制 nginx_diaspora.pp 传递给 semodule 命令以导入策略。 打开 nginx_diaspora.te 查看 SELinux 现在允许的内容。

vim nginx_diaspora.te

它应包含以下条目。 如果不是,请将 nginx_diaspora.te 的内容替换为如下所示。

module nginx_diaspora 1.0;

require {
        type var_run_t;
        type httpd_t;
        type user_home_t;
        type init_t;
        class sock_file write;
        class unix_stream_socket connectto;
        class file { read open };
}


#============= httpd_t ==============
allow httpd_t init_t:unix_stream_socket connectto;

#!!!! This avc can be allowed using the boolean 'httpd_read_user_content'
allow httpd_t user_home_t:file { read open };
allow httpd_t var_run_t:sock_file write;

许多允许的上下文可能会被缩小,但这是一个合适的起点。 然后让我们导入策略模块。

semodule -i nginx_diaspora.pp

如果您现在在浏览器中刷新页面,您应该会再次看到 Diaspora 欢迎页面。 恭喜您配置了在 CentOS 7 上运行的 SELinux 强化的 Diaspora pod!

简要 SELinux 故障排除

如果欢迎页面加载但显示损坏的图像占位符而不是实际图像,请执行以下步骤:

  1. grepaudit.log 运行以下命令,并将新的 Denied 条目添加到 Nginx 策略。
grep nginx /var/log/audit/audit.log | audit2allow -M nginx_diaspora
  1. 重新加载策略模块。
semodule -i nginx_diaspora.pp

您可以重复这些步骤几次。

注意:你可以使用下面的命令从/var/log/messages打开一个实时输出流。 这将向您显示人类可读的 SELinux 错误消息并提供建议的修复。


tail -f /var/log/messages

这是一个示例读数:

. . .

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that nginx should be allowed write access on the  sock_file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep nginx /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

. . .

结论

现在您已经设置了 Diaspora pod,您可以开始邀请您的朋友和家人连接到它。 虽然它确实缺乏大型商业闭源社交网络中存在的一些功能,但 Diaspora 的优势之一是您可以拥有自己的数据。

从这里,您可以阅读 pod 维护者 的 Diaspora wiki,并将您的 pod 注册到全局 pod 列表,以便其他人可以从您的安装中受益。