VirtualBoxを使ってSinatraアプリを動かしてみる - AlmaLinux

パッケージのアップデート

sudo dnf -y update

EPELリポジトリのインストール

EPELリポジトリをインストールするには以下のようにします。

sudo dnf -y install epel-release

Gitのインストール

Gitをインストールします。

sudo dnf -y install git

# インストールされたかバージョンで確認
git -v

Apacheのインストール

Apacheをインストールするには、以下のコマンドを実行します。

sudo dnf -y install httpd httpd-devel

Apacheの起動と自動起動の設定を有効にしておきます。

sudo systemctl enable httpd
sudo systemctl start httpd

ファイアウォールの設定

ファイアウォールの設定を変更します。以下のページを参考にしてください。

httpの80番ポートを許可する設定を追加します。

sudo firewall-cmd --permanent --add-service=http --zone=public
sudo firewall-cmd --reload
sudo systemctl enable firewalld
sudo systemctl start httpd

Rubyのインストール

Rubyのバージョン管理ツールであるrbenvを利用してインストールします。

インストールについては、以下を参考にしてください。

Sinatraアプリ

Sinatraアプリのサンプルを利用する場合は、以下のコマンドを実行してください。

git clone https://github.com/beginnerP765/stapp.git

stapp内で利用するrubyを指定します。

cd stapp
rbenv local 3.3.6

ディレクトリのパーミッションを変更します。

sudo chmod 755 /home/rbuser
sudo chmod -R 755 /home/rbuser/stapp

Gemのインストール

Gemfileに記載されているgemをインストールします。

bundle config set path vendor/bundle
bundle install

Sinatraアプリが起動できるか、以下のコマンドを実行して確認します。

bundle exec rackup

起動することが確認できれば、「 Ctr+c 」で終了します。

Passengerの設定

Phusion Passengerとは、Sinatraアプリケーションを実行するためのApacheモジュールです。

gem install passenger

インストールが終われば、以下のコマンドを実行しApacheモジュールのビルドとインストールを行います。

passenger-install-apache2-module

上記コマンドを実行すると、まず必要なライブラリをチェックします。

もしインストールされていないライブラリがあれば、足りないライブラリのインストール方法を表示して終了します。

足りないライブラリをインストールし、「 passenger-install-apache2-module 」を再度、実行します。

最後に、Apacheにする設定が表示されるため、コピーしておきます。

もしコピーし忘れても以下のコマンドで確認することができます。

passenger-install-apache2-module --snippet

passenger-install-apache2-moduleを実行した際に、追加でインストールが必要になったライブラリは、「 gcc-c++ 」、「 libcurl-devel 」でした。

sudo dnf -y install gcc-c++ libcurl-devel

Apacheの設定

Passengerの設定のためのファイルを「 /etc/httpd/conf.d 」に作成します。ファイル名は「 passenger.conf 」にしておきます。

ファイル名は自由に決めることができますが「 *.conf 」形式で作成してください。

/etc/httpd/conf.d/passenger.conf

LoadModule passenger_module /home/rbuser/.rbenv/versions/3.3.6/lib/ruby/gems/3.3.0/gems/passenger-6.0.23/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/rbuser/.rbenv/versions/3.3.6/lib/ruby/gems/3.3.0/gems/passenger-6.0.23
  PassengerDefaultRuby /home/rbuser/.rbenv/versions/3.3.6/bin/ruby
</IfModule>

# virtualhostの設定
<VirtualHost *:80>
  # IPアドレスもしくは、ドメイン名、FQDNを指定します
  ServerName xxx.xxx.xxx.xxx
  # アプリのルート
  DocumentRoot "/home/rbuser/stapp/public"
  RackEnv production

  <Directory /home/rbuser/stapp/public>
      AllowOverride All
      Options -MultiViews
      Require all granted
  </Directory>

  PassengerRuby /home/rbuser/.rbenv/versions/3.3.6/bin/ruby
</VirtualHost>

audit2allowを利用してSELinuxのポリシーを設定する

ページが表示されない原因には、パーミッション・所有者・SELinuxの設定などが考えられます。

SELinuxが「 Enforcing 」になっていることが原因の場合は、「 Permissive 」に変更してページが表示されるか確認してみます。

「 Permissive 」の状態でページが表示されれば、SELinuxのポリシーの設定していきます。

audit2allowユーティリティーは、拒否された操作のログから情報を収集し、SELinuxポリシーの許可ルールを生成します。

audit2allowを使って設定するには、まずSELinuxを「 Permissive 」に設定し、Aacheを再起動します。

sudo setenforce 0
sudo systemctl restart httpd

ブラウザでSinatraアプリを表示していろいろ操作(ページ遷移、リンククリックなど)して監査ログを採取します。一通り操作が終われば、監査ログからSELinuxのポリシーの設定を作成します。

ユーザーディレクトリで以下のコマンドを実行します。

sudo grep httpd /var/log/audit/audit.log | audit2allow -M passenger

ユーザーディレクトリに「 passenger.pp 」と「 passenger.te 」というファイルが作成されます。作成された設定ファイルを以下のコマンドを実行して、設定を反映させます。

sudo semodule -i passenger.pp

SELinuxの設定を「 Enforcing 」に変更して、Apacheを再起動します。

sudo setenforce 1
sudo systemctl restart httpd

SELinuxが「 Enforcing 」でもページが表示されるか「 http://xxx.xxx.xxx.xxx/content 」にブラウザでアクセスしページが表示されるか確認します。

udit2allowを利用しても表示されない場合

audit2allowを利用しても表示されない場合、ポリシーの設定を変更するのではなく、SELinuxによるドメインに対する制限を無くしてみます。

以下のコマンドを実行します。

sudo semanage permissive -a httpd_t