authbind+Tomcatで80ポートを使用する
社内WikiとしてknowledgeというOSSを立ち上げる用事があったので、久しぶりにTomcatの構築をしましたが、その際にrootユーザー以外でTomcatの受付ポートを80にしたかったので、authbindという少し変わったミドルウェアを使用しました。
同じ様な悩みを持っている方も居ると思うので、メモとして残しておきます。
一応Tomcatのセットアップからになるので、authbindの設定については後半に飛んでください。
環境
- AlmaLinux 8.7
- Tomcat 8.5.84(java-1.8.0-openjdk)
- authbind 2.1.2
OpenJDK 1.8をインストールする
今回はtomcatを動かす土台にopenjdkの1.8を使用します。
dnf install java-1.8.0-openjdk
Tomcatを配置する
Tomcatは8.5を利用します、公式からtar.gz形式のファイルを任意の場所に落としてきます。
cd /usr/local/
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.84/bin/apache-tomcat-8.5.84.tar.gz
今回は/usr/local/の配下に落としました、解凍した後名前を短くしておきます、そのままだとバージョンも入っていて綺麗じゃないと思うので。
※完全に個人の好みだと思います
tar zxvf apache-tomcat-8.5.84.tar.gz
mv apache-tomcat-8.5.84 tomcat
Tomcatを実行する専用のユーザーを作成します、ログインはしないのでnologinを入れておきます。
useradd -s /sbin/nologin tomcat
試しにそのまま80ポートをlistenさせてみます、tomcat/conf/server.xmlファイルを開き、8080ポートで受けている部分の設定を80に書き換えます。
nano /usr/local/tomcat/conf/server.xml
この状態でTomcatを起動してみますが、先にサービスの登録を済ませておきます。
サービスとして登録するには、/etc/systemd/system/配下のディレクトリに.service形式のファイルを作成し、サービスとしての内容を記述します。
nano /etc/systemd/system/tomcat.service
内容は今回以下の通りに記述しておきました。
[Unit]
Description=Apache Tomcat 8
After=syslog.target network.target
[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/usr/local/tomcat/tomcat.pid
RemainAfterExit=yes
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReStart=/usr/local/tomcat/bin/shutdown.sh;/usr/local/tomcat/bin/startup.sh
[Install]
WantedBy=multi-user.target
serviceファイルを作成後、一旦試しに起動してみます。
systemctl start tomcat
この状態でlocalhostの80ポートに接続をしてみても、延々とロード画面になるだけです、まあ今回はここからが本番なんですけどね。
authbindのインストールと設定
Tomcatは一旦置いといて、authbindのダウンロードからインストール、設定をします。
先程も試した通り、本来であればTomcatの受付ポートはデフォルトで8080になっていますが、80に変更してもそのままではページが表示できません。
これは1024以下のポートの場合はシステムで予約されている領域になるため、rootユーザーで実行をしないと80ポートで機能しないためだそうです。
なので、今回はtomcatユーザーでも80ポートが使用できるようにするauthbindというミドルウェアを使用してみます。
authbindはRHEL系のLinuxではdnfやrpmでのインストールが提供されていないので、ソースを落として自前でインストールする必要がありました。
まずはUbuntuの公式から、authbindのソースを落としてきます。
cd /usr/local/src/
wget http://archive.ubuntu.com/ubuntu/pool/main/a/authbind/authbind_2.1.2.tar.gz
cd ./authbind_2.1.2
make install
解凍したのち、make installでauthbindをインストールします。
手順としてはたったこれだけなので、特に何も難しい作業ではないです。
authbindでtomcatユーザーに80ポートの使用許可を与えてみます、authbindはここが変わっていて作成したファイルの名前と所有者がそれぞれ設定になります。
cd /etc/authbind/byport
touch 80
chown tomcat 80
chmod 755 80
設定ファイルは/etc/authbind/byportの配下に作成します、なんだか不思議な感じですね。
後はTomcatの起動ファイル内でauthbindを経由して起動する様に仕込んであげるだけで終了です。
cd /usr/local/tomcat/bin
nano startup.sh
startup.shの一番最後の行を以下の形に変更します。
# ↓元の記述
#exec "$PRGDIR"/"$EXECUTABLE" start "$@"
# ↓書き換え後の記述
exec authbind --deep "$PRGDIR"/"$EXECUTABLE" start "$@"
この状態でTomcatを起動すれば、tomcatユーザーでありながら80ポートのリッスンを行えます、結構便利なミドルウェアなのでこういった場合には是非使ってみてください。