介绍
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
,一个启动 unicorn
和 sidekiq
的脚本,这是我们 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
上的 https
和smtp
在端口 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 新手,可以参考以下一系列教程以获取更多信息:
- CentOS 7 上的 SELinux 简介 - 第 1 部分:基本概念
- CentOS 7 上的 SELinux 简介 - 第 2 部分:文件和进程
- CentOS 7 上的 SELinux 简介 - 第 3 部分:用户
启用 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 故障排除
如果欢迎页面加载但显示损坏的图像占位符而不是实际图像,请执行以下步骤:
- 对
grep
到audit.log
运行以下命令,并将新的 Denied 条目添加到 Nginx 策略。
grep nginx /var/log/audit/audit.log | audit2allow -M nginx_diaspora
- 重新加载策略模块。
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 列表,以便其他人可以从您的安装中受益。