Chạy mạng xã hội phân tán mã nguồn mở với Diaspora trên CentOS 7

Diaspora là mạng xã hội phân tán mã nguồn mở. Khác với hầu hết các mạng xã hội khác, Diaspora là mạng không trung tâm - một mạng thực sự không có cơ sở trung tâm. Có các máy chủ (gọi là pods) trên khắp thế giới, mỗi pods chứa dữ liệu của người dùng đã đăng ký với nó. 

Những pods này liên lạc với nhau một cách mượt mà để bạn có thể đăng ký với bất kỳ pod nào và giao tiếp tự do với các liên hệ của bạn, dù họ ở đâu trên mạng.

Trong hướng dẫn này, chúng ta sẽ thiết lập và cấu hình một pod Diaspora. Trong đó có các bước như:

  • Cách thiết lập ứng dụng Rails để triển khai
  • Cách cấu hình MariaDB
  • Cách thiết lập Nginx như một máy chủ proxy đảo ngược
  • Các nguyên tắc tốt nhất cho cấu hình SSL Nginx
  • Cách viết các tệp đơn vị systemd tùy chỉnh để sử dụng trong ứng dụng Rails
  • Với những người quan tâm đến bảo mật, có một phần thưởng về cách cấu hình SELinux để hoạt động tốt với Diaspora.

Khác biệt so với hướng dẫn cài đặt chính thức của Diaspora

Các hướng dẫn cài đặt của wiki đề xuất sử dụng trình quản lý phiên bản Ruby (RVM). Mặc dù bạn có thể làm vậy nhưng thay vào đó, chúng ta sẽ sử dụng Ruby được đóng gói hệ thống. Bằng cách này, chúng ta tránh cài đặt Ruby từ nguồn và lo lắng về sự phụ thuộc khác như RVM.

Hướng dẫn chính thức cũng đề xuất sử dụng script/server, một tập lệnh khởi động unicorn và sidekiq, hai ứng dụng chúng ta cần cho Diaspora. Vì CentOS 7 sử dụng systemd, chúng ta sẽ viết các tệp init riêng cho các dịch vụ này thay vì sử dụng script/server.

Yêu cầu tiên quyết trước khi chạy mạng xã hội phân tán mã nguồn mở với Diaspora

Trước khi bắt đầu hướng dẫn, hãy hoàn tất các điều kiện tiên quyết sau.

  • CentOS 7 với 1GB RAM

RAM tối thiểu cần thiết cho một cộng đồng nhỏ là 1GB, vì vậy chúng ta sẽ sử dụng Droplet 1 GB/1 CPU.

  • Tài khoản sudo

Hầu hết các lệnh dưới đây đều cần quyền root. Tài khoản người dùng này sẽ được thêm vào tài khoản diaspora mà chúng ta sẽ tạo sau đó, và các dịch vụ sẽ chạy dưới đây với các quyền hạn hẹp hơn.

  • Chứng chỉ SSL

Mặc dù có thể chạy mà không cần chứng chỉ SSL, cơ chế của Diaspora để kết nối với các pods khác yêu cầu một chứng chỉ SSL hợp lệ. Đối với môi trường sản xuất, bạn nên có một chứng chỉ SSL trả phí. Chúng ta chỉ cần hai tệp chứng chỉ đã tạo trong bài viết này (tệp công khai và tư nhân), vì vậy bạn có thể bỏ qua phần cấu hình máy chủ web của hướng dẫn đó. Chúng ta sẽ tự thực hiện việc đó.

Ngoài ra, với mục đích thử nghiệm, bạn có thể tạo một chứng chỉ tự ký hoặc chỉ cần chạy lệnh này từ thư mục home của bạn: [lệnh sẽ được cung cấp trong phiên dịch tiếp theo].

openssl req \
   -newkey rsa:2048 -nodes -keyout ssl.key \
   -x509 -days 365 -out ssl.crt
  • Tên miền đã đăng ký trỏ đến địa chỉ IP của Droplet.
  • Tệp swap
  • Đối với máy chủ 1GB, bạn cần tệp swap có dung lượng ít nhất 1GB.

Cách chạy mạng xã hội phân tán mã nguồn mở với Diaspora trên CentOS 7

Bước 1 - Cài đặt công cụ hỗ trợ (Utilities)

Hãy cài đặt một số gói công cụ (utilities) mà sau này sẽ hữu ích:

$ sudo yum install deltarpm yum-cron vim

Tiếp theo, cập nhật hệ thống của bạn:

$ sudo yum update

Bước 2 - Kích hoạt kho lưu trữ EPEL (EPEL Repository)

EPEL là viết tắt của Extra Packages for Enterprise Linux, nó chứa một số gói cần thiết cho việc cài đặt mà không có trong các kho cơ bản của CentOS.

Hãy kích hoạt EPEL bằng cách cài đặt gói epel-release và kiểm tra các cập nhật gói:

$ sudo yum install epel-release
$ sudo yum update

Nếu bạn được hỏi nhập khẩu EPEL 7 gpg key như dưới đây, hãy trả lời "yes":

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

Bước 3 - Cài đặt các gói cho Ruby và C

Các gói sau đây cần thiết cho Diaspora và các gem của nó có phần mở rộng C bên trong.

Cài đặt các gói:

$ 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 là một kho lưu trữ dữ liệu key-value mã nguồn mở mà Diaspora sử dụng làm cơ sở dữ liệu. Bây giờ khi Redis đã được cài đặt, hãy cấu hình nó để được kích hoạt khi khởi động và khởi động dịch vụ:

$ sudo systemctl enable redis
$ sudo systemctl start redis

Bước 4 - Thêm một người dùng chuyên dụng

Tạo một tài khoản người dùng để chạy Diaspora. Bạn có thể đặt tên cho tài khoản này tùy ý, nhưng trong hướng dẫn này, chúng ta sẽ giả định tên người dùng là "diaspora".

$ sudo useradd diaspora

Bước 5 - Cấu hình tường lửa

Cấu hình và tăng cường tường lửa là rất quan trọng khi thiết lập môi trường sản xuất. Công cụ chúng ta sẽ sử dụng là firewalld, giúp đơn giản hóa so với các lệnh iptables thuần túy.

Trước tiên, hãy khởi động dịch vụ firewalld và cho phép nó tự động khởi động khi boot hệ thống:

$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld

Bây giờ chúng ta sẽ cho phép các dịch vụ ssh trên cổng 22, http trên cổng 80, https trên cổng 443 và smtp trên cổng Với tư cách là người dùng có quyền sudo, hãy thêm các dịch vụ này:

$ 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

Tải lại các quy tắc tường lửa:

$ sudo firewall-cmd --reload

Bước 6 - Cài đặt và bảo mật MariaDB

Bước tiếp theo quan trọng là thiết lập cơ sở dữ liệu. Trong hướng dẫn này, chúng ta sẽ sử dụng MariaDB, tuy nhiên sẽ bao gồm một số thông tin cho PostgreSQL trong suốt hướng dẫn.

Cài đặt các gói yêu cầu:

$ sudo yum install mariadb-server mariadb-devel

Đảm bảo rằng MariaDB đã được khởi động và kích hoạt để khởi động cùng hệ thống:

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb

Bảo mật cài đặt MariaDB bằng cách chạy lệnh sau:

$ sudo mysql_secure_installation

Trả lời các câu hỏi như sau (các câu trả lời được hiển thị bằng màu đỏ) và đặt một mật khẩu root mạnh khi được yêu cầu:

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

Bước 7 - Tạo người dùng và cơ sở dữ liệu

Tiếp theo, chúng ta sẽ đăng nhập vào MariaDB để tạo người dùng diaspora. Khi được yêu cầu, hãy nhập mật khẩu root mà bạn đã tạo ở trên:

$ mysql -u root -p

Tạo một người dùng cho Diaspora. Thay đổi mật khẩu trong lệnh dưới đây thành một mật khẩu thực tế. Mật khẩu này không nên giống với mật khẩu root mà bạn đã cung cấp trong quá trình mysql_secure_installation.

MariaDB [(none)]> CREATE USER 'diaspora'@'localhost' IDENTIFIED BY 'password';

Tạo cơ sở dữ liệu sản xuất:

MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS `diaspora_production` DEFAULT CHARACTER SET `utf8mb4` COLLATE `utf8mb4_bin`;

Cấp quyền cần thiết cho người dùng diaspora trên cơ sở dữ liệu:

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `diaspora_production`.* TO 'diaspora'@'localhost';

Thoát khỏi phiên làm việc với cơ sở dữ liệu:

MariaDB [(none)]> \q

Hãy thử kết nối vào cơ sở dữ liệu mới với người dùng vừa tạo (sử dụng mật khẩu bạn đã nhập cho IDENTIFIED BY 'mật_khẩu' ở trên):

$ mysql -u diaspora -p -D diaspora_production

Bây giờ bạn nên thấy dấu nhắc: MariaDB [diaspora_production]>. Thoát khỏi phiên làm việc với cơ sở dữ liệu bằng cách nhập:

MariaDB [diaspora_production]> \q

Chúng ta đã hoàn thành việc cài đặt cơ sở dữ liệu MariaDB.

Tiếp theo, chúng ta sẽ lấy mã nguồn Diaspora và cấu hình để chạy trên máy chủ ảo của bạn.

Bước 8 - Cài đặt Bundler

Bundler là trình quản lý gói cho các gem Ruby. Chúng ta sẽ cài đặt Bundler để có sẵn trên toàn cầu.

$ sudo gem install bundler

Vì chương trình thực thi "bundle" được cài đặt trong đường dẫn /usr/local/bin/bundle, hãy tạo một liên kết tượng trưng để đưa nó vào biến PATH của người dùng:

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

Bước 9 - Lấy mã nguồn Diaspora 

Diaspora được phát triển trên ba nhánh chính. Nhánh "stable" chứa mã nguồn được coi là ổn định và sẽ được phát hành, nhánh "master" có các phiên bản đã được gắn thẻ là ổn định và chúng ta sẽ sử dụng, trong khi nhánh "develop" có mã nguồn mới nhất và có thể bị lỗi.

Chuyển sang tài khoản người dùng "diaspora":

$ sudo su - diaspora

Kiểm tra nhánh "master". Tại thời điểm viết bài này, nó chứa phiên bản Diaspora 0.5.1.1.

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

Bước 10 - Cấu hình cơ sở dữ liệu cho Diaspora 

Bây giờ hãy chuyển vào thư mục làm việc của Diaspora.

$ cd ~/diaspora/

Sao chép tệp cấu hình cơ sở dữ liệu ví dụ và mở tệp database.yml bằng trình soạn thảo ưa thích của bạn.

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

Bây giờ chúng ta sẽ chỉnh sửa tệp cấu hình để phù hợp với các thiết lập cơ sở dữ liệu đã tạo trước đó.

Chú ý: Hãy cẩn thận khi chỉnh sửa các tệp yaml (.yml). Luôn sử dụng khoảng trắng thay vì tab để giữ định dạng.

Chỉnh sửa các dòng đầu tiên trong tệp, nơi adapter mysql2 được xác định. (MariaDB là một sự thay thế hoàn toàn cho MySQL.) Thay thế "root" bằng "diaspora" và thay đổi mật khẩu thành mật khẩu cho người dùng cơ sở dữ liệu "diaspora" bạn đã tạo trước đó. Không xóa dấu ngoặc kép. Khi hoàn thành, lưu và đóng tệp.

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

Lưu ý: Nếu bạn đang sử dụng cơ sở dữ liệu PostgreSQL thay vì MariaDB, bạn sẽ cần điền vào phần PostgreSQL và thay đổi cơ sở dữ liệu thành PostgreSQL.

Bước 11 - Cấu hình các thiết lập cơ bản 

Bắt đầu bằng cách sao chép tệp cấu hình mẫu.

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

Bạn sẽ cần chỉnh sửa một số thiết lập trong tệp này để nó hoạt động đúng cách. Đọc kỹ toàn bộ tệp để hiểu cách nó hoạt động và cấu hình. Nó khá dễ hiểu, nhưng hãy cùng nhìn vào một số thiết lập quan trọng nhất.

Mở tệp này bằng trình soạn thảo văn bản. 

$ vim config/diaspora.yml

Line 39 - Uncomment the url line so it looks like the following:

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

Thay thế https://example.org/ bằng tên miền của riêng bạn. URL mà bạn sử dụng ở đây sẽ được lưu cứng vào cơ sở dữ liệu, vì vậy hãy chắc chắn rằng nó chính xác. Đọc các chú thích phía trên dòng cấu hình này để biết thêm chi tiết.

Dòng 47 - Bỏ chú thích (uncomment) dòng certificate_authorities để nó trông như sau:

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

Lưu ý: Có hai dòng certificate_authorities, hãy đảm bảo rằng bạn bỏ chú thích (uncomment) dòng dành cho CentOS.

Dòng 166 - Bỏ chú thích (uncomment) dòng rails_environment và thay development bằng production để nó trông như sau:

rails_environment: 'production'

Lưu và đóng tập tin lại.

Những thay đổi trên là những thay đổi tối thiểu cần thiết để có một Diaspora pod hoạt động. Còn rất nhiều tùy chọn khác để khám phá và cấu hình theo ý muốn của bạn, chẳng hạn như kết nối với các mạng xã hội khác (Twitter, WordPress, Tumblr, Facebook). Hãy đọc qua tập tin và thực hiện các thay đổi cấu hình mong muốn của bạn.

Bước 12 - Cài đặt các Gems và thiết lập cơ sở dữ liệu

Cài đặt các Gems cần thiết, thiết lập cơ sở dữ liệu và biên dịch tài nguyên. Đảm bảo rằng bạn đang ở trong thư mục chính:

$ cd /home/diaspora/diaspora/

Trước tiên, chúng ta sẽ chỉ định cho gem nokogiri sử dụng thư viện libxml2 của hệ thống mà chúng ta đã cài đặt trước đó:

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

Tiếp theo, sử dụng bundler để cài đặt các gems cần thiết:

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

Thiết lập cơ sở dữ liệu:

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

Biên dịch tài sản (assets):

$ RAILS_ENV=production bin/rake assets:precompile

Bây giờ, bạn có thể thoát khỏi tài khoản người dùng diaspora và chuyển lại tài khoản sudo mà bạn đã tạo khi làm theo các điều kiện tiên quyết trong phần đầu tiên.

$ exit

Bước 13 - Cấu hình các dịch vụ hệ thống

Diaspora bao gồm hai dịch vụ chính cần chạy:

  • Unicorn, máy chủ ứng dụng.
  • Sidekiq, xử lý các công việc nền.

Một script đã được cung cấp trong trường hợp này, nằm trong thư mục script/server nhưng chúng ta sẽ sử dụng systemd để thay thế. systemd là hệ thống init được sử dụng trong CentOS 7.

Tạo thư mục tmpfiles

Tạo thư mục để chứa socket Unix của unicorn.

$ sudo mkdir /run/diaspora

Thay đổi quyền sở hữu cho người dùng diaspora và đặt quyền truy cập.

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

Vì thư mục /run và /var/run có tính chất tạm thời, thư mục /run/diaspora mà chúng ta vừa tạo sẽ không tồn tại sau khi khởi động lại hệ thống. Với systemd, chúng ta có thể sử dụng tmpfiles để duy trì thư mục này giữa các lần khởi động lại.

Mở tệp /etc/tmpfiles.d/diaspora.conf để chỉnh sửa.

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

Hãy dán dòng sau vào tệp:

d /run/diaspora 0750 diaspora diaspora - -

Định dạng cấu hình là một dòng cho mỗi đường dẫn, bao gồm các trường loại, đường dẫn, chế độ, quyền sở hữu, tuổi thọ và các trường tham số tương ứng. Bạn có thể tìm hiểu thêm về tmpfiles.d tại trang web chính thức hoặc trang man của nó.

Unicorn

Đầu tiên, chúng ta sẽ chỉnh sửa tập tin diaspora.yml để dịch vụ lắng nghe một Unix socket. Chúng ta sẽ đổi lại sang người dùng diaspora để thực hiện việc này.

$ sudo su - diaspora

Mở tập tin cấu hình để chỉnh sửa:

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

Bỏ chú thích dòng 157 để nó trở thành:

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

Lưu và thoát khỏi tập tin.

Bây giờ quay lại tài khoản sudo của bạn.

$ su - username

Tạo tệp tin unicorn.service.

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

Dán nội dung sau vào để tạo script. Hãy xem các liên kết trước đó về systemd nếu bạn cần giúp đỡ để hiểu nội dung trong tệp này:

[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

Lưu ý: Hãy bỏ dấu chấm phẩy ở dòng Environment=DB=postgres nếu bạn đang sử dụng PostgreSQL. Đối với MariaDB, không cần thay đổi gì.

Bắt đầu dịch vụ unicorn và kích hoạt nó khi khởi động:

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

Kiểm tra trạng thái của dịch vụ:

$ systemctl status diaspora-unicorn

Nếu mọi thứ diễn ra suôn sẻ, lệnh trên sẽ trả về kết quả tương tự như sau:

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

Tương tự như với sidekiq, chúng ta sẽ tạo file sidekiq.service.

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

Dán nội dung sau vào file:

[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

Lưu ý: Hãy bỏ dấu chấm phẩy và bỏ comment (mở ghi chú) trên dòng Environment=DB=postgres nếu bạn đang sử dụng PostgreSQL. Đối với MariaDB, không cần thay đổi gì.

Khởi động dịch vụ sidekiq và cho phép nó tự động khởi động cùng hệ thống:

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

Bây giờ hãy chạy lệnh:

$ systemctl status diaspora-sidekiq

Bạn có thể nhìn thấy đầu ra tương tự như sau:

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]

Bước 14 - Cài đặt Nginx

Nginx sẽ phục vụ như một reverse proxy để gửi gần như tất cả các yêu cầu đến Unicorn. Chỉ có các tệp trong thư mục public/ sẽ được Nginx phục vụ trực tiếp.

Đầu tiên, chúng ta sẽ cài đặt máy chủ web Nginx.

$ sudo yum install nginx

Khởi động dịch vụ và kích hoạt tự động khởi động cùng với hệ thống:

$ sudo systemctl start nginx
$ sudo systemctl enable nginx

Bước 15 - Cấp quyền cho Nginx

Để Nginx có thể truy cập vào thư mục home của người dùng diaspora, chúng ta cần thêm người dùng nginx vào nhóm diaspora:

$ sudo usermod -a -G diaspora nginx

Cuối cùng, chúng ta sẽ thay đổi quyền truy cập vào thư mục home của người dùng diaspora để cho phép nhóm đọc và thực thi:

$ sudo chmod 750 /home/diaspora/

Bước 16 - Tải lên chứng chỉ SSL và bật Forward Secrecy

Bạn sẽ cần các tệp chứng chỉ SSL từ cơ quan chứng chỉ. Trong ví dụ cấu hình dưới đây, chúng ta sử dụng /etc/ssl/diaspora/ssl.crt cho chứng chỉ công khai và /etc/ssl/diaspora/ssl.key cho khóa riêng tư.

Tiến hành tạo một thư mục để lưu trữ các tệp chứng chỉ:

$ sudo mkdir /etc/ssl/diaspora

Bạn cần tải lên hoặc di chuyển các tệp chứng chỉ và khóa đến máy chủ, đặt chúng trong thư mục chúng ta vừa tạo. Bạn có thể sử dụng SFTP hoặc SCP để thực hiện việc này. Xem hướng dẫn này để biết chi tiết.

Lưu ý: Nếu bạn đã tạo một chứng chỉ tự ký, hãy di chuyển đến thư mục đó và sao chép các tệp vào /etc/ssl/diaspora bằng lệnh sudo cp ssl.crt ssl.key /etc/ssl/diaspora.

Tiếp theo, hãy quay lại người dùng gốc của hệ thống:

$ sudo su -

Tạo tệp dhparam.pem.

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

Tệp dhparam có thể mất vài phút để hoàn thành. Khi hoàn thành, đăng nhập lại vào tài khoản sudo của bạn.

# su - username

Bước 17 - Vô hiệu hóa trang web mặc định trong tệp nginx.conf

Chúng ta sẽ chỉnh sửa tệp /etc/nginx/nginx.conf để thông báo chào mừng mặc định của Nginx không gây xung đột với tệp cấu hình Diaspora mà chúng ta sẽ tạo.

$ sudo vim /etc/nginx/nginx.conf

Tìm trong khối server các dòng bao gồm default_server;. Loại bỏ default_server khỏi các mục này để khu vực của khối server trông như sau:

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

Chú ý: Bạn có thể bình luận toàn bộ khối server nếu muốn, điều đó cũng sẽ hiệu quả.

Bước 18 - Tạo tệp cấu hình riêng cho Nginx 

Tạo một tệp cấu hình Nginx mới cho pod Diaspora của chúng ta.

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

Dưới đây là nội dung cấu hình Nginx cho pod. Các giải thích được đưa ra ngay bên dưới mã:

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;
  }
}

Hãy thay thế các biến sau đây:

  • example.com bằng tên miền đã đăng ký của bạn, bạn cần làm điều này ở hai nơi
  • /etc/ssl/diaspora/ssl.crt bằng đường dẫn đến chứng chỉ công cộng của bạn
  • /etc/ssl/diaspora/ssl.key bằng đường dẫn đến khóa riêng của bạn

Giải thích:

  • Khối upstream là nơi chúng ta thiết lập Unix socket mà Diaspora lắng nghe (chúng ta cũng đã cài đặt trong Unicorn ở trên). Điều này được sử dụng sau này như là chỉ thị proxy_pass.
  • Khối server đầu tiên lắng nghe cổng HTTP tiêu chuẩn 80 và chuyển hướng bất kỳ yêu cầu nào đến HTTPS.
  • Khối server thứ hai lắng nghe cổng 443 (SSL) và thiết lập một số tham số SSL mạnh được lấy từ trang wiki của Mozilla.

Sau khi đã hoàn tất tất cả các thay đổi, kiểm tra tệp cấu hình để kiểm tra lỗi.

$ sudo nginx -t

Nếu mọi thứ đã diễn ra suôn sẻ, điều này sẽ trả về: 

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

Khởi động lại Nginx để áp dụng các thay đổi.

$ sudo systemctl restart nginx

Nếu bạn truy cập vào tên miền của pod trên trình duyệt (ví dụ: https://example.com), bạn sẽ đến trang chào mừng. Xin chúc mừng!

Chạy mạng xã hội phân tán mã nguồn mở Diaspora trên CentOS 7

Lưu ý: Nếu bạn sử dụng chứng chỉ tự ký, hãy bấm qua cảnh báo của trình duyệt.

Bước 19 - Tạo người dùng Diaspora

Hãy tạo người dùng Diaspora đầu tiên của bạn bằng cách nhấp vào liên kết "Start by creating an account".

Điền thông tin để tạo một người dùng mới. Sau đó, bạn sẽ có thể xem trang chủ của người dùng và bắt đầu sử dụng mạng xã hội.

Bước 20 - Cấu hình SELinux (Tùy chọn)

Cảnh báo: Nếu bạn không quen thuộc với SELinux, hãy nhớ rằng việc cấu hình có thể gây lỗi hệ thống. Bạn có thể bỏ qua phần này và bắt đầu sử dụng.

Mặc định, các Droplet trên CentOS 7 không có SELinux. Để tăng cường bảo mật, bạn có thể bật SELinux và cấu hình nó để hoạt động với các dịch vụ của pod. 

Bật SELinux

Mở file /etc/selinux/config bằng trình soạn thảo văn bản:

$ sudo vim /etc/selinux/config

Thay đổi giá trị của SELINUX từ disabled sang permissive như dưới đây. Cần phải đặt trạng thái permissive trước vì mỗi tệp trong hệ thống cần có nhãn ngữ cảnh trước khi SELinux có thể được áp dụng.

# 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

Lưu và đóng file sau khi đã thay đổi. Sau thay đổi này, khởi động lại Droplet để áp dụng cài đặt. Chỉ cần gõ:

$ sudo reboot

Nhập mật khẩu của người dùng sudo để khởi động lại hệ thống. Sau đó, SSH lại vào Droplet và chuyển đổi trở lại tài khoản người dùng sudo bằng câu lệnh:

$ su - username

Tiếp tục chỉnh sửa tệp /etc/selinux/config và đặt giá trị SELINUX thành "enforcing".

$ sudo vim /etc/selinux/config

Khi hoàn thành, dòng này sẽ có dạng như sau:

SELINUX=enforcing

Lưu và đóng tệp. Khởi động lại Droplet một lần nữa.

$ sudo reboot

Sau khi Droplet của bạn khởi động lại, SSH lại vào Droplet của bạn.

SELinux Nginx Policy

Từ đây, bạn nên vẫn là người dùng root. Nếu bạn truy cập vào tên miền của mình, bạn sẽ nhận được lỗi Trong trường hợp của chúng ta, SELinux đang chặn socket của Nginx và truy cập vào thư mục home của người dùng diaspora.

Bạn có thể kiểm tra các nhật ký với lệnh sau:

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

Bạn nên thấy các thông báo như dưới đây:

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

Để bắt đầu khắc phục vấn đề, hãy cài đặt các công cụ sau đây:

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

Chúng ta sẽ lọc qua tệp audit.log và cho phép các mục bị từ chối trong chính sách SELinux. Chạy lệnh sau:

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

Chính sách SELinux được tạo ra sẽ được lưu trong tệp nginx_diaspora.te trong thư mục /home của người dùng root (tuy nhiên bạn có thể tổ chức các chính sách SELinux ở bất kỳ vị trí nào). Tệp nhị phân nginx_diaspora.pp nên được chuyển đến lệnh semodule để nhập chính sách. Mở tệp nginx_diaspora.te để xem những gì SELinux hiện đã cho phép.

# vim nginx_diaspora.te

Nếu tệp nginx_diaspora.te không chứa các mục sau đây, hãy thay nội dung của tệp đó bằng những gì được hiển thị dưới đây:

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;

Có thể hạn chế nhiều ngữ cảnh được cho phép, nhưng đây là một điểm bắt đầu phù hợp. Tiếp theo, hãy nhập module chính sách:

# semodule -i nginx_diaspora.pp

Nếu bạn làm mới trang trong trình duyệt, bạn lại thấy trang chào mừng. Xin chúc mừng bạn đã cấu hình một pod được bảo vệ bởi SELinux và chạy trên CentOS 7.

Khắc phục sự cố SELinux

Nếu trang chào mừng tải lên nhưng hiển thị các địa chỉ hình ảnh hỏng thay vì hình ảnh thực tế, làm theo các bước sau:

Chạy lệnh dưới đây để tìm kiếm các thông báo từ tập tin audit.log và thêm các mục Denied mới vào chính sách Nginx:

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

Tải lại module chính sách bằng lệnh:

# semodule -i nginx_diaspora.pp

Bạn có thể lặp lại các bước này một vài lần.

Lưu ý: Bạn có thể sử dụng lệnh dưới đây để mở một luồng xuất ra thời gian thực từ tập tin /var/log/messages. Điều này sẽ hiển thị thông báo lỗi SELinux dễ đọc và đề xuất các cách khắc phục.

# tail -f /var/log/messages

Dưới đây là một ví dụ về đầu ra:

. . .

*****  Plugin catchall ( 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

. . .

Bây giờ bạn đã cài đặt xong pod, bạn có thể bắt đầu mời bạn bè và gia đình của mình tham gia. Mặc dù mạng xã hội này thiếu một số tính năng có mặt trong các mạng xã hội thương mại lớn và đóng cửa mã nguồn nhưng một trong những ưu điểm của Diaspora là bạn sở hữu dữ liệu của mình.

Từ đây, bạn có thể đọc Wiki cho người duy trì pod và đăng ký pod của bạn vào danh sách pod toàn cầu để mọi người có thể hưởng lợi từ việc cài đặt.

Mọi người cũng tìm kiếm: diaspora là gì, diaspora pod, diaspora github

Các gói dịch vụ Cloud VPS của KDATA mang đến cho bạn nhiều lựa chọn về hiệu suất cũng như khả năng lưu trữ, mọi nhu cầu về doanh nghiệp đều được đáp ứng. KDATA đảm bảo khả năng uptime lên đến 99,99%, toàn quyền quản trị và free backup hằng ngày. Tham khảo ngay các gói dịch vụ Cloud VPS:

https://kdata.vn/cloud-vps

👉 Liên hệ ngay KDATA hỗ trợ tận tình, support tối đa, giúp bạn trải nghiệm dịch vụ giá hời chất lượng tốt nhất